Преглед изворни кода

Sort out DSN functionality

pdontthink пре 3 година
родитељ
комит
b7697a3db8
4 измењених фајлова са 18 додато и 10 уклоњено
  1. 4 0
      class/deliver/Deliver.class.php
  2. 3 3
      class/mime/Rfc822Header.class.php
  3. 4 5
      src/compose.php
  4. 7 2
      src/read_body.php

+ 4 - 0
class/deliver/Deliver.class.php

@@ -741,6 +741,10 @@ class Deliver {
             /* RFC 2298 */
             /* RFC 2298 */
             $header[] = 'Disposition-Notification-To: '.$dnt. $rn;
             $header[] = 'Disposition-Notification-To: '.$dnt. $rn;
         }
         }
+        if ($rfc822_header->dsn) {
+            $dsn = $rfc822_header->getAddr_s('dsn');
+            $header[] = 'Return-Receipt-To: '.$dsn. $rn;
+        }
         if ($rfc822_header->priority) {
         if ($rfc822_header->priority) {
             switch($rfc822_header->priority)
             switch($rfc822_header->priority)
             {
             {

+ 3 - 3
class/mime/Rfc822Header.class.php

@@ -122,10 +122,10 @@ class Rfc822Header {
      */
      */
     var $dnt = '';
     var $dnt = '';
     /**
     /**
-     * Delivery notification (DR)
+     * Address for requesting message delivery status notification (DSN)
      * @var mixed
      * @var mixed
      */
      */
-    var $drnt = '';
+    var $dsn = '';
     /**
     /**
      * @var mixed
      * @var mixed
      */
      */
@@ -289,7 +289,7 @@ class Rfc822Header {
                 break;
                 break;
             case 'return-receipt-to':
             case 'return-receipt-to':
                 $value = $this->stripComments($value);
                 $value = $this->stripComments($value);
-                $this->drnt = $this->parseAddress($value);
+                $this->dsn = $this->parseAddress($value);
                 break;
                 break;
             case 'mime-version':
             case 'mime-version':
                 $value = $this->stripComments($value);
                 $value = $this->stripComments($value);

+ 4 - 5
src/compose.php

@@ -946,7 +946,7 @@ function newMail ($mailbox='', $passed_id='', $passed_ent_id='', $action='', $se
 
 
                 // Remember the receipt settings
                 // Remember the receipt settings
                 $request_mdn = $mdn_user_support && !empty($orig_header->dnt) ? '1' : '0';
                 $request_mdn = $mdn_user_support && !empty($orig_header->dnt) ? '1' : '0';
-                $request_dr = $mdn_user_support && !empty($orig_header->drnt) ? '1' : '0';
+                $request_dr = $mdn_user_support && !empty($orig_header->dsn) ? '1' : '0';
 
 
                 /* remember the references and in-reply-to headers in case of an reply */
                 /* remember the references and in-reply-to headers in case of an reply */
 //FIXME: it would be better to fiddle with headers inside of the message object or possibly when delivering the message to its destination (drafts folder?); is this possible?
 //FIXME: it would be better to fiddle with headers inside of the message object or possibly when delivering the message to its destination (drafts folder?); is this possible?
@@ -1771,10 +1771,9 @@ function deliverMessage(&$composeMessage, $draft=false) {
 
 
     /* Receipt: On Delivery */
     /* Receipt: On Delivery */
     if (!empty($request_dr)) {
     if (!empty($request_dr)) {
-//FIXME: it would be better to fiddle with headers inside of the message object or possibly when delivering the message to its destination; is this possible?
-        $rfc822_header->more_headers['Return-Receipt-To'] = $from_addr;
-    } elseif (isset($rfc822_header->more_headers['Return-Receipt-To'])) {
-        unset($rfc822_header->more_headers['Return-Receipt-To']);
+        $rfc822_header->dsn = $rfc822_header->parseAddress($from_addr,true);
+    } elseif (isset($rfc822_header->dsn)) {
+        unset($rfc822_header->dsn);
     }
     }
 
 
     /* multipart messages */
     /* multipart messages */

+ 7 - 2
src/read_body.php

@@ -145,7 +145,10 @@ function SendMDN ( $mailbox, $passed_id, $message, $imapConnection) {
         $content_type->properties['charset']=$default_charset;
         $content_type->properties['charset']=$default_charset;
     }
     }
     $rfc822_header->content_type = $content_type;
     $rfc822_header->content_type = $content_type;
-    $rfc822_header->to[] = $header->dnt;
+    if (!empty($header->dnt))
+        $rfc822_header->to[] = $header->dnt;
+    else
+        $rfc822_header->to[] = $header->dsn;
     $rfc822_header->subject = _("Read:") . ' ' . decodeHeader($header->subject,true,false);
     $rfc822_header->subject = _("Read:") . ' ' . decodeHeader($header->subject,true,false);
 
 
     $idents = get_identities();
     $idents = get_identities();
@@ -410,7 +413,9 @@ function formatEnvheader($aMailbox, $passed_id, $passed_ent_id, $message,
 
 
     if ($default_use_mdn) {
     if ($default_use_mdn) {
         if ($mdn_user_support) {
         if ($mdn_user_support) {
-            if ($header->dnt) {
+            // We are generous to the sender because DSNs are commonly ignored by servers and
+            // technically offering a return receipt in the MUA for a DSN is overstepping the RFCs
+            if ($header->dnt || $header->dnt) {
                 $mdn_url = $PHP_SELF;
                 $mdn_url = $PHP_SELF;
                 $mdn_url = set_url_var($mdn_url, 'mailbox', urlencode($mailbox));
                 $mdn_url = set_url_var($mdn_url, 'mailbox', urlencode($mailbox));
                 $mdn_url = set_url_var($mdn_url, 'passed_id', $passed_id);
                 $mdn_url = set_url_var($mdn_url, 'passed_id', $passed_id);