From 0ea884099afbe57b12faa29f2d676c44faa1cbf5 Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Mon, 04 Feb 2008 12:39:06 -0500
Subject: [PATCH] Make sending of read receipts configurable

---
 CHANGELOG                               |    6 +
 program/localization/en_US/messages.inc |    2 
 program/steps/mail/func.inc             |   72 ++++++++++++++++++++++++
 program/steps/mail/show.inc             |   15 ++++-
 config/main.inc.php.dist                |    4 +
 program/steps/mail/sendmdn.inc          |   81 ++++-----------------------
 6 files changed, 106 insertions(+), 74 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 8203ec5..87fd51e 100644
--- a/CHANGELOG
+++ b/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
diff --git a/config/main.inc.php.dist b/config/main.inc.php.dist
index fc7d283..1ac688d 100644
--- a/config/main.inc.php.dist
+++ b/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
diff --git a/program/localization/en_US/messages.inc b/program/localization/en_US/messages.inc
index e69ac9d..3576bf9 100644
--- a/program/localization/en_US/messages.inc
+++ b/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';
 
 ?>
\ No newline at end of file
diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc
index b508a1f..00de08c 100644
--- a/program/steps/mail/func.inc
+++ b/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',
diff --git a/program/steps/mail/sendmdn.inc b/program/steps/mail/sendmdn.inc
index 0944e76..530dcac 100644
--- a/program/steps/mail/sendmdn.inc
+++ b/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();
 
 ?>
\ No newline at end of file
diff --git a/program/steps/mail/show.inc b/program/steps/mail/show.inc
index e6aa192..2f0fb01 100644
--- a/program/steps/mail/show.inc
+++ b/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);
+    }
   }
 
 

--
Gitblit v1.9.1