thomascube
2008-02-04 0ea884099afbe57b12faa29f2d676c44faa1cbf5
Make sending of read receipts configurable

6 files modified
180 ■■■■■ changed files
CHANGELOG 6 ●●●● patch | view | raw | blame | history
config/main.inc.php.dist 4 ●●●● patch | view | raw | blame | history
program/localization/en_US/messages.inc 2 ●●● patch | view | raw | blame | history
program/steps/mail/func.inc 72 ●●●●● patch | view | raw | blame | history
program/steps/mail/sendmdn.inc 81 ●●●● patch | view | raw | blame | history
program/steps/mail/show.inc 15 ●●●● patch | view | raw | blame | history
CHANGELOG
@@ -1,11 +1,15 @@
CHANGELOG RoundCube Webmail
---------------------------
2008/02/04 (thomasb)
----------
- Fix regular expression for checking e-mail address (#1484710)
- Make sending of read receipts configurable
2008/02/02 (thomasb)
----------
- Always update $CONFIG with user prefs (#1484729)
- Don't ask for MDN confirmations on drafted messages (#1484691)
-
2008/01/31 (robin)
- Remember search results (closes #1483883), patch by the_glu
config/main.inc.php.dist
@@ -176,6 +176,10 @@
// false causes deleted messages to be permanantly removed if there is no Trash folder
$rcmail_config['flag_for_deletion'] = TRUE;
// Behavior if a received message requests a message delivery notification (read receipt)
// 0 = ask the user, 1 = send automatically, 2 = ignore (never send or ask)
$rcmail_config['mdn_requests'] = 0;
// Make use of the built-in spell checker. It is based on GoogieSpell.
// Since Google only accepts connections over https your PHP installatation
// requires to be compiled with Open SSL support
program/localization/en_US/messages.inc
@@ -74,7 +74,7 @@
$messages['sourceisreadonly'] = 'This address source is read only';
$messages['errorsavingcontact'] = 'Could not save the contact address';
$messages['movingmessage'] = 'Moving message...';
$messages['receiptsent'] = 'Successfully send the receipt message';
$messages['receiptsent'] = 'Successfully sent a read receipt';
$messages['errorsendingreceipt'] = 'Could not send the receipt';
?>
program/steps/mail/func.inc
@@ -1318,6 +1318,78 @@
}
function rcmail_send_mdn($uid)
{
  global $CONFIG, $USER, $IMAP;
  $message = array('UID' => $uid);
  $message['headers'] = $IMAP->get_headers($message['UID']);
  $message['subject'] = rcube_imap::decode_mime_string($message['headers']->subject, $message['headers']->charset);
  if ($message['headers']->mdn_to && !$message['headers']->mdn_sent)
  {
    $identity = $USER->get_identity();
    $sender = format_email_recipient($identity['email'], $identity['name']);
    $recipient = array_shift($IMAP->decode_address_list($message['headers']->mdn_to));
    $mailto = $recipient['mailto'];
    $compose = new rc_mail_mime(rcmail_header_delm());
    $compose->setParam(array(
      'text_encoding' => 'quoted-printable',
      'html_encoding' => 'quoted-printable',
      'head_encoding' => 'quoted-printable',
      'head_charset'  => RCMAIL_CHARSET,
      'html_charset'  => RCMAIL_CHARSET,
      'text_charset'  => RCMAIL_CHARSET,
    ));
    // compose headers array
    $headers = array(
      'Date' => date('r'),
      'From' => $sender,
      'To'   => $message['headers']->mdn_to,
      'Subject' => rcube_label('receiptread') . ': ' . $message['subject'],
      'Message-ID' => sprintf('<%s@%s>', md5(uniqid('rcmail'.rand(),true)), rcmail_mail_domain($_SESSION['imap_host'])),
      'X-Sender' => $identity['email'],
      'Content-Type' => 'multipart/report; report-type=disposition-notification',
    );
    if (!empty($CONFIG['useragent']))
      $headers['User-Agent'] = $CONFIG['useragent'];
    $body = rcube_label("yourmessage") . "\r\n\r\n" .
      "\t" . rcube_label("to") . ': ' . rcube_imap::decode_mime_string($message['headers']->to, $message['headers']->charset) . "\r\n" .
      "\t" . rcube_label("subject") . ': ' . $message['subject'] . "\r\n" .
      "\t" . rcube_label("sent") . ': ' . format_date(strtotime($message['headers']->date), $CONFIG['date_long']) . "\r\n" .
      "\r\n" . rcube_label("receiptnote") . "\r\n";
    $ua = !empty($CONFIG['useragent']) ? $CONFIG['useragent'] : "RoundCube Webmail (Version ".RCMAIL_VERSION.")";
    $report = "Reporting-UA: $ua\r\n";
    if ($message['headers']->to)
        $report .= "Original-Recipient: {$message['headers']->to}\r\n";
    $report .= "Final-Recipient: rfc822; {$identity['email']}\r\n" .
               "Original-Message-ID: {$message['headers']->messageID}\r\n" .
               "Disposition: manual-action/MDN-sent-manually; displayed\r\n";
    $compose->headers($headers, true);
    $compose->setTXTBody($body);
    $compose->addAttachment($report, 'message/disposition-notification', 'MDNPart2.txt', false, '7bit', 'inline');
    $sent = rcmail_deliver_message($compose, $identity['email'], $mailto);
    if ($sent)
    {
      $IMAP->set_flag($message['UID'], 'MDNSENT');
      return true;
    }
  }
  return false;
}
// register UI objects
$OUTPUT->add_handlers(array(
  'mailboxlist' => 'rcmail_mailbox_list',
program/steps/mail/sendmdn.inc
@@ -5,7 +5,7 @@
 | program/steps/mail/sendmdn.inc                                        |
 |                                                                       |
 | This file is part of the RoundCube Webmail client                     |
 | Copyright (C) 2007, RoundCube Dev. - Switzerland                      |
 | Copyright (C) 2008, RoundCube Dev. - Switzerland                      |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 | PURPOSE:                                                              |
@@ -22,76 +22,19 @@
require_once('lib/rc_mail_mime.inc');
if (!empty($_POST['_uid']))
 {
  $MESSAGE = array('UID' => get_input_value('_uid', RCUBE_INPUT_POST));
  $MESSAGE['headers'] = $IMAP->get_headers($MESSAGE['UID']);
  $MESSAGE['subject'] = rcube_imap::decode_mime_string($MESSAGE['headers']->subject, $MESSAGE['headers']->charset);
  if ($MESSAGE['headers']->mdn_to && !$MESSAGE['headers']->mdn_sent)
  {
    $identity = $USER->get_identity();
    $sender = format_email_recipient($identity['email'], $identity['name']);
    $recipient = array_shift($IMAP->decode_address_list($MESSAGE['headers']->mdn_to));
    $mailto = $recipient['mailto'];
    $COMPOSE = new rc_mail_mime(rcmail_header_delm());
    $COMPOSE->setParam(array(
      'text_encoding' => 'quoted-printable',
      'html_encoding' => 'quoted-printable',
      'head_encoding' => 'quoted-printable',
      'head_charset'  => RCMAIL_CHARSET,
      'html_charset'  => RCMAIL_CHARSET,
      'text_charset'  => RCMAIL_CHARSET,
    ));
    // compose headers array
    $headers = array(
      'Date' => date('r'),
      'From' => $sender,
      'To'   => $MESSAGE['headers']->mdn_to,
      'Subject' => rcube_label('receiptread') . ': ' . $MESSAGE['subject'],
      'Message-ID' => sprintf('<%s@%s>', md5(uniqid('rcmail'.rand(),true)), rcmail_mail_domain($_SESSION['imap_host'])),
      'X-Sender' => $identity['email'],
      'Content-Type' => 'multipart/report; report-type=disposition-notification',
    );
    if (!empty($CONFIG['useragent']))
      $headers['User-Agent'] = $CONFIG['useragent'];
    $body = rcube_label("yourmessage") . "\r\n\r\n" .
      "\t" . rcube_label("to") . ': ' . rcube_imap::decode_mime_string($MESSAGE['headers']->to, $MESSAGE['headers']->charset) . "\r\n" .
      "\t" . rcube_label("subject") . ': ' . $MESSAGE['subject'] . "\r\n" .
      "\t" . rcube_label("sent") . ': ' . format_date(strtotime($MESSAGE['headers']->date), $CONFIG['date_long']) . "\r\n" .
      "\r\n" . rcube_label("receiptnote") . "\r\n";
    $report = "Reporting-UA: RoundCube Webmail (Version ".RCMAIL_VERSION.")\r\n";
    if ($MESSAGE['headers']->to)
        $report .= "Original-Recipient: {$MESSAGE['headers']->to}\r\n";
    $report .= "Final-Recipient: rfc822; {$identity['email']}\r\n" .
               "Original-Message-ID: {$MESSAGE['headers']->messageID}\r\n" .
               "Disposition: manual-action/MDN-sent-manually; displayed\r\n";
    $COMPOSE->headers($headers, true);
    $COMPOSE->setTXTBody($body);
    $COMPOSE->addAttachment($report, 'message/disposition-notification', 'MDNPart2.txt', false, '7bit', 'inline');
    $sent = rcmail_deliver_message($COMPOSE, $identity['email'], $mailto);
    if ($sent)
    {
      $IMAP->set_flag($MESSAGE['UID'], 'MDNSENT');
      $OUTPUT->set_env('mdn_request', false);
      $OUTPUT->show_message('receiptsent', 'confirmation');
      $OUTPUT->send();
    }
  }
if (!empty($_POST['_uid'])) {
  $sent = rcmail_send_mdn(get_input_value('_uid', RCUBE_INPUT_POST));
}
// Error if arrive here
$OUTPUT->show_message('errorsendingreceipt', 'error');
// show either confirm or error message
if ($sent) {
  $OUTPUT->set_env('mdn_request', false);
  $OUTPUT->show_message('receiptsent', 'confirmation');
}
else {
  $OUTPUT->show_message('errorsendingreceipt', 'error');
}
$OUTPUT->send();
?>
program/steps/mail/show.inc
@@ -5,7 +5,7 @@
 | program/steps/mail/show.inc                                           |
 |                                                                       |
 | This file is part of the RoundCube Webmail client                     |
 | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
 | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 | PURPOSE:                                                              |
@@ -20,6 +20,7 @@
*/
require_once('Mail/mimeDecode.php');
require_once('lib/rc_mail_mime.inc');
$PRINT_MODE = $_action=='print' ? TRUE : FALSE;
@@ -76,8 +77,16 @@
  // check for unset disposition notification
  if ($MESSAGE['headers']->mdn_to && !$MESSAGE['headers']->mdn_sent && $IMAP->get_mailbox_name() != $CONFIG['drafts_mbox'])
  {
    rcube_add_label('mdnrequest');
    $OUTPUT->set_env('mdn_request', true);
    if (intval($CONFIG['mdn_requests']) === 1)
    {
      if (rcmail_send_mdn($MESSAGE['UID']))
        $OUTPUT->show_message('receiptsent', 'confirmation');
    }
    else if (empty($CONFIG['mdn_requests']))
    {
      rcube_add_label('mdnrequest');
      $OUTPUT->set_env('mdn_request', true);
    }
  }