Invalid initialization of To: header (#1772893).
[squirrelmail.git] / class / deliver / Deliver.class.php
index 0907faaf39a3cc5c2a0d56267b1a99d6d8b8f6bc..45ed6ab8375faaa5033d7f57d713ed9e8f137991 100644 (file)
@@ -31,12 +31,21 @@ class Deliver {
     /**
      * function mail - send the message parts to the SMTP stream
      *
-     * @param Message  $message  Message class to send
-     * @param resource $stream   file handle to the SMTP stream
+     * @param Message  $message      Message object to send
+     * @param resource $stream       Handle to the SMTP stream
+     * @param string   $reply_id     Identifies message being replied to
+     *                               (OPTIONAL; caller should ONLY specify
+     *                               a value for this when the message
+     *                               being sent is a reply)
+     * @param string   $reply_ent_id Identifies message being replied to
+     *                               in the case it was an embedded/attached
+     *                               message inside another (OPTIONAL; caller
+     *                               should ONLY specify a value for this 
+     *                               when the message being sent is a reply)
      *
      * @return integer $raw_length
      */
-    function mail($message, $stream=false) {
+    function mail($message, $stream=false, $reply_id=0, $reply_ent_id=0) {
         $rfc822_header = $message->rfc822_header;
         if (count($message->entities)) {
             $boundary = $this->mimeBoundary();
@@ -45,6 +54,37 @@ class Deliver {
             $boundary='';
         }
         $raw_length = 0;
+
+
+        // calculate reply header if needed
+        //
+        if ($reply_id) {
+            global $imapConnection, $username, $imapServerAddress, 
+                   $imapPort, $mailbox;
+            if (!$imapConnection)
+                $imapConnection = sqimap_login($username, FALSE,
+                                               $imapServerAddress, $imapPort, 0);
+
+            sqimap_mailbox_select($imapConnection, $mailbox);
+            $reply_message = sqimap_get_message($imapConnection, $reply_id, $mailbox);
+
+            if ($reply_ent_id) {
+                /* redefine the messsage in case of message/rfc822 */
+                $reply_message = $message->getEntity($reply_ent_id);
+                /* message is an entity which contains the envelope and type0=message
+                 * and type1=rfc822. The actual entities are childs from
+                 * $reply_message->entities[0]. That's where the encoding and is located
+                 */
+
+                $orig_header = $reply_message->rfc822_header; /* here is the envelope located */
+
+            } else {
+                $orig_header = $reply_message->rfc822_header;
+            }
+        }
+        $message->reply_rfc822_header = $orig_header;
+
+
         $reply_rfc822_header = (isset($message->reply_rfc822_header)
                              ? $message->reply_rfc822_header : '');
         $header = $this->prepareRFC822_Header($rfc822_header, $reply_rfc822_header, $raw_length);
@@ -151,8 +191,10 @@ class Deliver {
                 }
                 $last = $body_part;
             } elseif ($message->att_local_name) {
+                global $username, $attachment_dir;
+                $hashed_attachment_dir = getHashedDir($username, $attachment_dir);
                 $filename = $message->att_local_name;
-                $file = fopen ($filename, 'rb');
+                $file = fopen ($hashed_attachment_dir . '/' . $filename, 'rb');
                 while ($body_part = fgets($file, 4096)) {
                     // remove NUL characters
                     $body_part = str_replace("\0",'',$body_part);
@@ -176,8 +218,10 @@ class Deliver {
                     $this->writeToStream($stream, $body_part);
                 }
             } elseif ($message->att_local_name) {
+                global $username, $attachment_dir;
+                $hashed_attachment_dir = getHashedDir($username, $attachment_dir);
                 $filename = $message->att_local_name;
-                $file = fopen ($filename, 'rb');
+                $file = fopen ($hashed_attachment_dir . '/' . $filename, 'rb');
                 while ($tmp = fread($file, 570)) {
                     $body_part = chunk_split(base64_encode($tmp));
                     // Up to 4.3.10 chunk_split always appends a newline,