added patch from feature request to use getFrom function.
[squirrelmail.git] / functions / smtp.php
index 0730b2aa452095f256e4cc0765c43e6ee74554ef..5e75527d6bfbf9584f022de6282066fb44887690 100644 (file)
@@ -34,18 +34,13 @@ if (!$domain) {
 /* Returns true only if this message is multipart */
 function isMultipart ($session) {
     global $attachments;
-    return true;
-/*    
-    if (count($attachments)>0) {
-       for ($i=0 ; $i < count($attachments) ; $i++) {
-           if ($attachments[$i]->session == $session) {
-               return true;
-           }
-       }
-    } else {
-        return false;
+
+    foreach ($attachments as $info) {
+        if ($info['session'] == $session) {
+            return true;
+        }
     }
-*/
+    return false;
 }
 
 /* looks up aliases in the addressbook and expands them to
@@ -115,7 +110,7 @@ function expandRcptAddrs ($array) {
 
 /* Attach the files that are due to be attached
  */
-function attachFiles ($fp, $session) {
+function attachFiles ($fp, $session, $rn="\r\n") {
     global $attachments, $attachment_dir, $username;
 
     $length = 0;
@@ -123,58 +118,67 @@ function attachFiles ($fp, $session) {
     $hashed_attachment_dir = getHashedDir($username, $attachment_dir);
     if (isMultipart($session)) {
         foreach ($attachments as $info) {
-         if ($info['session'] == $session) {
-            if (isset($info['type'])) {
-                $filetype = $info['type'];
-            }
-            else {
-                $filetype = 'application/octet-stream';
-            }
-
-            $header = '--' . mimeBoundary() . "\r\n";
-            if ( isset($info['remotefilename']) && $info['remotefilename'] != '') {
-                $header .= "Content-Type: $filetype; name=\"" .
-                    $info['remotefilename'] . "\"\r\n";
-                $header .= "Content-Disposition: attachment; filename=\"" .
-                    $info['remotefilename'] . "\"\r\n";
-            } else {
-                $header .= "Content-Type: $filetype;\r\n";
-            }
-
+            if ($info['session'] == $session) {
+                if (isset($info['type'])) {
+                    $filetype = $info['type'];
+                }
+                else {
+                    $filetype = 'application/octet-stream';
+                }
+                
+                $header = '--' . mimeBoundary() . "$rn";
+                if ( isset($info['remotefilename']) 
+                     && $info['remotefilename'] != '') {
+                    $header .= "Content-Type: $filetype; name=\"" .
+                        $info['remotefilename'] . "\"$rn";
+                    $header .= "Content-Disposition: attachment; filename=\""
+                        . $info['remotefilename'] . "\"$rn";
+                } else {
+                    $header .= "Content-Type: $filetype$rn";
+                }
 
-            /* Use 'rb' for NT systems -- read binary
-             * Unix doesn't care -- everything's binary!  :-)
-             */
-
-            $filename = $hashed_attachment_dir . '/' . $info['localfilename'];
-            $file = fopen ($filename, 'rb');
-            if (substr($filetype, 0, 5) == 'text/' ||
-                substr($filetype, 0, 8) == 'message/' ) {
-                $header .= "\r\n";
-                fputs ($fp, $header);
-                $length += strlen($header);
-                while ($tmp = fgets($file, 4096)) {
-                    $tmp = str_replace("\r\n", "\n", $tmp);
-                    $tmp = str_replace("\r", "\n", $tmp);
-                    $tmp = str_replace("\n", "\r\n", $tmp);
-                    if (feof($fp) && substr($tmp, -2) != "\r\n") {
-                        $tmp .= "\r\n";
+                
+                /* Use 'rb' for NT systems -- read binary
+                 * Unix doesn't care -- everything's binary!  :-)
+                 */
+                
+                $filename = $hashed_attachment_dir . '/' 
+                    . $info['localfilename'];
+                $file = fopen ($filename, 'rb');
+                if (substr($filetype, 0, 5) == 'text/' ||
+                    substr($filetype, 0, 8) == 'message/' ) {
+                    $header .= "$rn";
+                    fputs ($fp, $header);
+                    $length += strlen($header);
+                    while ($tmp = fgets($file, 4096)) {
+                        $tmp = str_replace("\r\n", "\n", $tmp);
+                        $tmp = str_replace("\r", "\n", $tmp);
+                        if ($rn == "\r\n"){
+                            $tmp = str_replace("\n", "\r\n", $tmp);
+                        }
+                        /**
+                         * Check if the last line has newline ($rn) in it
+                         * and append if it doesn't.
+                         */
+                        if (feof($fp) && !strstr($tmp, "$rn")){
+                            $tmp .= "$rn";
+                        }
+                        fputs($fp, $tmp);
+                        $length += strlen($tmp);
+                    }
+                } else {
+                    $header .= "Content-Transfer-Encoding: base64" 
+                        . "$rn" . "$rn";
+                    fputs ($fp, $header);
+                    $length += strlen($header);
+                    while ($tmp = fread($file, 570)) {
+                        $encoded = chunk_split(base64_encode($tmp));
+                        $length += strlen($encoded);
+                        fputs ($fp, $encoded);
                     }
-                    fputs($fp, $tmp);
-                    $length += strlen($tmp);
-                }
-            } else {
-                $header .= "Content-Transfer-Encoding: base64\r\n\r\n";
-                fputs ($fp, $header);
-                $length += strlen($header);
-                while ($tmp = fread($file, 570)) {
-                    $encoded = chunk_split(base64_encode($tmp));
-                    $length += strlen($encoded);
-                    fputs ($fp, $encoded);
                 }
+                fclose ($file);
             }
-            fclose ($file);
-         }
         }
     }
     return $length;
@@ -188,36 +192,18 @@ function deleteAttachments($session) {
 
     $rem_attachments = array();
     foreach ($attachments as $info) {
-       if ($info['session'] == $session) {
+        if ($info['session'] == $session) {
            $attached_file = "$hashed_attachment_dir/$info[localfilename]";
            if (file_exists($attached_file)) {
-               unlink($attached_file);
+                unlink($attached_file);
            }
-       } else {
-           $rem_attachments[] = $info;
-       }
+        } else {
+            $rem_attachments[] = $info;
+        }
     }
     $attachments = $rem_attachments;
 }
 
-
-
-    
-//    $hashed_attachment_dir = getHashedDir($username, $attachment_dir);
-//    if (isMultipart($ses)) {
-//        reset($attachments);
-//        while (list($localname, $remotename, $session) = each($attachments)) {
-//       if ($session == $ses) {
-///            if (!ereg ("\\/", $localname)) {
-//                $filename = $hashed_attachment_dir . '/' . $localname;
-//                unlink ($filename);
-//                unlink ("$filename.info");
-//            }
-//       }
-//        }
-//    }
-//}
-
 /* Return a nice MIME-boundary
  */
 function mimeBoundary () {
@@ -226,7 +212,7 @@ function mimeBoundary () {
     if ( !isset( $mimeBoundaryString ) ||
          $mimeBoundaryString == '') {
         $mimeBoundaryString = '----=_' . date( 'YmdHis' ) . '_' .
-                              mt_rand( 10000, 99999 );
+            mt_rand( 10000, 99999 );
     }
 
     return $mimeBoundaryString;
@@ -253,17 +239,18 @@ function timezone () {
     $diff_minute = floor (($diff_second-3600*$diff_hour) / 60);
     
     $zonename = '('.strftime('%Z').')';
-    $result = sprintf ("%s%02d%02d %s", $sign, $diff_hour, $diff_minute, $zonename);
+    $result = sprintf ("%s%02d%02d %s", $sign, $diff_hour, $diff_minute, 
+                       $zonename);
     return ($result);
 }
 
 /* Print all the needed RFC822 headers */
-function write822Header ($fp, $t, $c, $b, $subject, $more_headers, $session) {
+function write822Header ($fp, $t, $c, $b, $subject, $more_headers, $session, $rn="\r\n") {
     global $REMOTE_ADDR, $SERVER_NAME, $REMOTE_PORT;
     global $data_dir, $username, $popuser, $domain, $version, $useSendmail;
     global $default_charset, $HTTP_VIA, $HTTP_X_FORWARDED_FOR;
     global $REMOTE_HOST, $identity;
-    
+
     /* Storing the header to make sure the header is the same
      * everytime the header is printed.
      */
@@ -276,15 +263,11 @@ function write822Header ($fp, $t, $c, $b, $subject, $more_headers, $session) {
         if (isset($identity) && $identity != 'default') {
             $reply_to = getPref($data_dir, $username, 'reply_to' . $identity);
             $from = getPref($data_dir, $username, 'full_name' . $identity);
-            $from_addr = getPref($data_dir, $username, 'email_address' . $identity);
+            $from_addr = getFrom();
         } else {
             $reply_to = getPref($data_dir, $username, 'reply_to');
             $from = getPref($data_dir, $username, 'full_name');
-            $from_addr = getPref($data_dir, $username, 'email_address');
-        }
-        
-        if ($from_addr == '') {
-            $from_addr = $popuser.'@'.$domain;
+            $from_addr = getFrom();
         }
         
         $to_list = getLineOfAddrs($to);
@@ -322,17 +305,17 @@ function write822Header ($fp, $t, $c, $b, $subject, $more_headers, $session) {
             $received_from .= " (proxying for $HTTP_X_FORWARDED_FOR)";
         }
 
-        $header  = "Received: from $received_from\r\n";
-        $header .= "        (SquirrelMail authenticated user $username)\r\n";
-        $header .= "        by $SERVER_NAME with HTTP;\r\n";
-        $header .= "        $date\r\n";
+        $header  = "Received: from $received_from" . $rn;
+        $header .= "        (SquirrelMail authenticated user $username)" . $rn;
+        $header .= "        by $SERVER_NAME with HTTP;" . $rn;
+        $header .= "        $date" . $rn;
 
         /* Insert the rest of the header fields */
-        $header .= "Message-ID: $message_id\r\n";
-        $header .= "Date: $date\r\n";
-        $header .= "Subject: $subject\r\n";
-        $header .= "From: $from\r\n";
-        $header .= "To: $to_list\r\n";    // Who it's TO
+        $header .= "Message-ID: $message_id" . $rn;
+        $header .= "Date: $date" . $rn;
+        $header .= "Subject: $subject" . $rn;
+        $header .= "From: $from" . $rn;
+        $header .= "To: $to_list" . $rn;    // Who it's TO
 
         if (isset($more_headers["Content-Type"])) {
             $contentType = $more_headers["Content-Type"];
@@ -356,39 +339,43 @@ function write822Header ($fp, $t, $c, $b, $subject, $more_headers, $session) {
         if(is_array($more_headers)) {
             reset($more_headers);
             while(list($h_name, $h_val) = each($more_headers)) {
-                $header .= sprintf("%s: %s\r\n", $h_name, $h_val);
+               if ($h_name == 'References') {
+                   $h_val = str_replace(' ', "$rn        ", $h_val);
+               }    
+                $header .= sprintf("%s: %s%s", $h_name, $h_val, $rn);
             }
         }
 
         if ($cc_list) {
-            $header .= "Cc: $cc_list\r\n"; // Who the CCs are
+            $header .= "Cc: $cc_list" . $rn; // Who the CCs are
         }
 
         if ($reply_to != '') {
-            $header .= "Reply-To: $reply_to\r\n";
+            $header .= "Reply-To: $reply_to" . $rn;
         }
 
         if ($useSendmail) {
             if ($bcc_list) {
                 // BCCs is removed from header by sendmail
-                $header .= "Bcc: $bcc_list\r\n";
+                $header .= "Bcc: $bcc_list" . $rn;
             }
         }
 
-        $header .= "X-Mailer: SquirrelMail (version $version)\r\n"; /* Identify SquirrelMail */
+        /* Identify SquirrelMail */
+        $header .= "X-Mailer: SquirrelMail (version $version)" . $rn; 
 
         /* Do the MIME-stuff */
-        $header .= "MIME-Version: 1.0\r\n";
+        $header .= "MIME-Version: 1.0" . $rn;
 
         if (isMultipart($session)) {
             $header .= 'Content-Type: '.$contentType.' boundary="';
             $header .= mimeBoundary();
-            $header .= "\"\r\n";
+            $header .= "\"$rn";
         } else {
-            $header .= 'Content-Type: '.$contentType."\r\n";
-            $header .= "Content-Transfer-Encoding: 8bit\r\n";
+            $header .= 'Content-Type: ' . $contentType . $rn;
+            $header .= "Content-Transfer-Encoding: 8bit" . $rn;
         }
-        $header .= "\r\n"; // One blank line to separate header and body
+        $header .= $rn; // One blank line to separate header and body
         
         $headerlength = strlen($header);
     }     
@@ -401,36 +388,36 @@ function write822Header ($fp, $t, $c, $b, $subject, $more_headers, $session) {
 
 /* Send the body
  */
-function writeBody ($fp, $passedBody, $session) {
+function writeBody ($fp, $passedBody, $session, $rn="\r\n") {
     global $default_charset;
-    
+
     $attachmentlength = 0;
     
     if (isMultipart($session)) {
-        $body = '--'.mimeBoundary()."\r\n";
+        $body = '--'.mimeBoundary() . $rn;
         
         if ($default_charset != "") {
-            $body .= "Content-Type: text/plain; charset=$default_charset\r\n";
+            $body .= "Content-Type: text/plain; charset=$default_charset".$rn;
         }
         else {
-            $body .= "Content-Type: text/plain\r\n";
+            $body .= "Content-Type: text/plain" . $rn;
         }
         
-        $body .= "Content-Transfer-Encoding: 8bit\r\n\r\n";
-        $body .= $passedBody . "\r\n\r\n";
+        $body .= "Content-Transfer-Encoding: 8bit" . $rn . $rn;
+        $body .= $passedBody . $rn . $rn;
         fputs ($fp, $body);
         
-        $attachmentlength = attachFiles($fp, $session);
+        $attachmentlength = attachFiles($fp, $session, $rn);
         
         if (!isset($postbody)) { 
             $postbody = ""; 
         }
-        $postbody .= "\r\n--".mimeBoundary()."--\r\n\r\n";
+        $postbody .= $rn . "--" . mimeBoundary() . "--" . $rn . $rn;
         fputs ($fp, $postbody);
     } else {
-        $body = $passedBody . "\r\n";
+        $body = $passedBody . $rn;
         fputs ($fp, $body);
-        $postbody = "\r\n";
+        $postbody = $rn;
         fputs ($fp, $postbody);
     }
 
@@ -446,23 +433,27 @@ function sendSendmail($t, $c, $b, $subject, $body, $more_headers, $session) {
      * spaces or other "weird" chars that would allow a user to
      * exploit the shell/pipe it is used in.
      */
-    $envelopefrom = "$popuser@$domain";
+    $envelopefrom = getFrom();
     $envelopefrom = ereg_replace("[[:blank:]]",'', $envelopefrom);
     $envelopefrom = ereg_replace("[[:space:]]",'', $envelopefrom);
     $envelopefrom = ereg_replace("[[:cntrl:]]",'', $envelopefrom);
     
-    /* open pipe to sendmail or qmail-inject (qmail-inject doesn't accept -t param) */
+    /**
+     * open pipe to sendmail or qmail-inject 
+     * (qmail-inject doesn't accept -t param) 
+     */
     if (strstr($sendmail_path, "qmail-inject")) {
         $fp = popen (escapeshellcmd("$sendmail_path -f$envelopefrom"), "w");
     } else {
         $fp = popen (escapeshellcmd("$sendmail_path -t -f$envelopefrom"), "w");
     }
     
-    $headerlength = write822Header ($fp, $t, $c, $b, $subject, $more_headers, $session);
-    $bodylength = writeBody($fp, $body, $session);
+    $headerlength = write822Header ($fp, $t, $c, $b, $subject, 
+                                    $more_headers, $session, "\n");
+    $bodylength = writeBody($fp, $body, $session, "\n");
     
     pclose($fp);
-    
+
     return ($headerlength + $bodylength);
 }
 
@@ -486,7 +477,8 @@ function sendSMTP($t, $c, $b, $subject, $body, $more_headers, $session) {
     $cc = expandRcptAddrs(parseAddrs($c));
     $bcc = expandRcptAddrs(parseAddrs($b));
     if (isset($identity) && $identity != 'default') {
-        $from_addr = getPref($data_dir, $username, 'email_address' . $identity);
+        $from_addr = getPref($data_dir, $username, 
+                             'email_address' . $identity);
     }
     else {
         $from_addr = getPref($data_dir, $username, 'email_address');
@@ -495,8 +487,42 @@ function sendSMTP($t, $c, $b, $subject, $body, $more_headers, $session) {
     if (!$from_addr) {
         $from_addr = "$popuser@$domain";
     }
+
+    /* POP3 BEFORE SMTP CODE HERE */
+    global $pop_before_smtp;
+    if (isset($pop_before_smtp) && $pop_before_smtp === true) {
+        if (!isset($pop_port)) {
+            $pop_port = 110;
+        }
+        if (!isset($pop_server)) {
+            $pop_server = $smtpServerAddress; /* usually the same host! */
+        }
+        $popConnection = fsockopen($pop_server, $pop_port, $err_no, $err_str);
+        if (!$popConnection) {
+            error_log("Error connecting to POP Server ($pop_server:$pop_port)"
+                  . " $err_no : $err_str");
+        } else {
+            $tmp = fgets($popConnection, 1024); /* banner */
+            if (!eregi("^\+OK", $tmp, $regs)) {
+                return(0);
+            }
+            fputs($popConnection, "USER $username\r\n");
+            $tmp = fgets($popConnection, 1024);
+            if (!eregi("^\+OK", $tmp, $regs)) {
+                return(0);
+            }
+            fputs($popConnection, 'PASS ' . OneTimePadDecrypt($key, $onetimepad) . "\r\n");
+            $tmp = fgets($popConnection, 1024);
+            if (!eregi("^\+OK", $tmp, $regs)) {
+                return(0);
+            }
+            fputs($popConnection, "QUIT\r\n"); /* log off */
+            fclose($popConnection);
+        }
+    }
     
-    $smtpConnection = fsockopen($smtpServerAddress, $smtpPort, $errorNumber, $errorString);
+    $smtpConnection = fsockopen($smtpServerAddress, $smtpPort, 
+                                $errorNumber, $errorString);
     if (!$smtpConnection) {
         echo 'Error connecting to SMTP Server.<br>';
         echo "$errorNumber : $errorString<br>";
@@ -511,7 +537,8 @@ function sendSMTP($t, $c, $b, $subject, $body, $more_headers, $session) {
     $cc_list = getLineOfAddrs($cc);
     
     /* Lets introduce ourselves */
-    if (! isset ($use_authenticated_smtp) || $use_authenticated_smtp == false) {
+    if (! isset ($use_authenticated_smtp) 
+        || $use_authenticated_smtp == false) {
         fputs($smtpConnection, "HELO $domain\r\n");
         $tmp = fgets($smtpConnection, 1024);
         if (errorCheck($tmp, $smtpConnection)!=5) return(0);
@@ -532,7 +559,8 @@ function sendSMTP($t, $c, $b, $subject, $body, $more_headers, $session) {
             return(0);
         }
         
-        fputs($smtpConnection, base64_encode (OneTimePadDecrypt($key, $onetimepad)) . "\r\n");
+        fputs($smtpConnection, base64_encode 
+              (OneTimePadDecrypt($key, $onetimepad)) . "\r\n");
         $tmp = fgets($smtpConnection, 1024);
         if (errorCheck($tmp, $smtpConnection)!=5) {
             return(0);
@@ -577,7 +605,8 @@ function sendSMTP($t, $c, $b, $subject, $body, $more_headers, $session) {
     }
 
     /* Send the message */
-    $headerlength = write822Header ($smtpConnection, $t, $c, $b, $subject, $more_headers, $session);
+    $headerlength = write822Header ($smtpConnection, $t, $c, $b, 
+                                    $subject, $more_headers, $session);
     $bodylength = writeBody($smtpConnection, $body, $session);
     
     fputs($smtpConnection, ".\r\n"); /* end the DATA part */
@@ -703,16 +732,50 @@ function errorCheck($line, $smtpConnection, $verbose = false) {
     return $err_num;
 }
 
-function sendMessage($t, $c, $b, $subject, $body, $reply_id, $MDN, $prio = 3, $session) {
+/* create new reference header per rfc2822 */
+
+function calculate_references($refs, $inreplyto, $old_reply_to) {
+
+    $refer = "";
+    for ($i=1;$i<count($refs[0]);$i++) {
+        if (!empty($refs[0][$i])) {
+            if (preg_match("/^References:(.+)$/", $refs[0][$i], $regs)) {
+                $refer = trim($regs[1]);
+            }
+            else {   
+                $refer .= ' ' . trim($refs[0][$i]);
+            }
+        }
+    }
+    $refer = trim($refer);
+    if (strlen($refer) > 2) {
+        $refer .= ' ' . $inreplyto;
+    }
+    else {
+        if (!empty($old_reply_to)) {
+            $refer .= $old_reply_to . ' ' . $inreplyto;
+        }
+        else {
+            $refer .= $inreplyto;
+        }                        
+    }
+    trim($refer);
+    return $refer;
+}
+
+function sendMessage($t, $c, $b, $subject, $body, $reply_id, $MDN, 
+                     $prio = 3, $session) {
     global $useSendmail, $msg_id, $is_reply, $mailbox, $onetimepad,
-           $data_dir, $username, $domain, $key, $version, $sent_folder, $imapServerAddress, 
-           $imapPort, $default_use_priority, $more_headers, $request_mdn, $request_dr;
+        $data_dir, $username, $domain, $key, $version, $sent_folder, 
+        $imapServerAddress, $imapPort, $default_use_priority, $more_headers, 
+        $request_mdn, $request_dr;
 
     $more_headers = Array();
     
     do_hook('smtp_send');
 
-    $imap_stream = sqimap_login($username, $key, $imapServerAddress, $imapPort, 1);
+    $imap_stream = sqimap_login($username, $key, $imapServerAddress, 
+                                $imapPort, 1);
 
     if (isset($reply_id) && $reply_id) {
         sqimap_mailbox_select ($imap_stream, $mailbox);
@@ -721,13 +784,33 @@ function sendMessage($t, $c, $b, $subject, $body, $reply_id, $MDN, $prio = 3, $s
         /* Insert In-Reply-To and References headers if the
          * message-id of the message we reply to is set (longer than "<>")
          * The References header should really be the old Referenced header
-         * with the message ID appended, but it can be only the message ID too.
+         * with the message ID appended, and now it is (jmunro)
          */
-        $hdr = sqimap_get_small_header ($imap_stream, $reply_id, false);
-        if(strlen($hdr->message_id) > 2) {
-            $more_headers['In-Reply-To'] = $hdr->message_id;
-            $more_headers['References']  = $hdr->message_id;
+       $sid = sqimap_session_id(); 
+       $query = "$sid FETCH $reply_id (BODY.PEEK[HEADER.FIELDS (Message-Id In-Reply-To)])\r\n";
+       fputs ($imap_stream, $query);
+       $read = sqimap_read_data($imap_stream, $sid, true, $response, $message);
+       $message_id = '';
+       $in_reply_to = '';
+
+       foreach ($read as $r) {
+               if (preg_match("/^message-id:(.*)/iA", $r, $regs)) {
+                   $message_id = trim($regs[1]);
+               }
+               if (preg_match("/^in-reply-to:(.*)/iA", $r, $regs)) {
+                   $in_reply_to = trim($regs[1]);
+               }
+       }
+
+        if(strlen($message_id) > 2) {
+            $refs = get_reference_header ($imap_stream, $reply_id);
+            $inreplyto = $message_id;
+            $old_reply_to = $in_reply_to;
+            $refer = calculate_references ($refs, $inreplyto, $old_reply_to);
+            $more_headers['In-Reply-To'] = $inreplyto;
+            $more_headers['References']  = $refer;
         }
+
     }
     if ($default_use_priority) {
         $more_headers = array_merge($more_headers, createPriorityHeaders($prio));
@@ -754,8 +837,8 @@ function sendMessage($t, $c, $b, $subject, $body, $reply_id, $MDN, $prio = 3, $s
     /* this is to catch all plain \n instances and
      * replace them with \r\n.  All newlines were converted
      * into just \n inside the compose.php file.
+     * But only if delimiter is, in fact, \r\n.
      */
-    $body = ereg_replace("\n", "\r\n", $body);
     
     if ($MDN) {
         $more_headers["Content-Type"] = "multipart/report; ".
@@ -763,13 +846,18 @@ function sendMessage($t, $c, $b, $subject, $body, $reply_id, $MDN, $prio = 3, $s
     }
 
     if ($useSendmail) {
-        $length = sendSendmail($t, $c, $b, $subject, $body,  $more_headers, $session);
+        $length = sendSendmail($t, $c, $b, $subject, $body, $more_headers, 
+                               $session);
     } else {
-        $length = sendSMTP($t, $c, $b, $subject, $body, $more_headers, $session);
+        $body = ereg_replace("\n", "\r\n", $body);
+        $length = sendSMTP($t, $c, $b, $subject, $body, $more_headers, 
+                           $session);
     }
     if (sqimap_mailbox_exists ($imap_stream, $sent_folder)) {
+        if ($useSendmail) $body = ereg_replace("\n", "\r\n", $body);
         sqimap_append ($imap_stream, $sent_folder, $length);
-        write822Header ($imap_stream, $t, $c, $b, $subject, $more_headers, $session);
+        write822Header ($imap_stream, $t, $c, $b, $subject, $more_headers, 
+                        $session);
         writeBody ($imap_stream, $body, $session);
         sqimap_append_done ($imap_stream);
     }
@@ -807,11 +895,19 @@ function createPriorityHeaders($prio) {
 
 function createReceiptHeaders($receipt) {
 
-    GLOBAL $data_dir, $username;
+    GLOBAL $data_dir, $username, $identity, $popuser, $domain;
 
     $receipt_headers = Array();
-    $from_addr = getPref($data_dir, $username, 'email_address');
-    $from = getPref($data_dir, $username, 'full_name');
+    if (isset($identity) && $identity != 'default') {
+        $from = getPref($data_dir, $username, 'full_name' . $identity);
+        $from_addr = getPref($data_dir, $username, 'email_address' . $identity);
+    } else {
+        $from = getPref($data_dir, $username, 'full_name');
+        $from_addr = getPref($data_dir, $username, 'email_address');
+    }
+    if ($from_addr == '') {
+        $from_addr = $popuser.'@'.$domain;
+    }
 
     if ($from == '') {
         $from = "<$from_addr>";
@@ -836,5 +932,24 @@ function createReceiptHeaders($receipt) {
     return $receipt_headers;
 }
 
+/* Figure out what the 'From:' address is
+ */
+
+function getFrom() {
+    global $username, $popuser, $domain, $data_dir, $identity;
+    if (isset($identity) && $identity != 'default') {
+        $from_addr = getPref($data_dir, $username, 
+                             'email_address' . $identity);
+    }
+    else {
+        $from_addr = getPref($data_dir, $username, 'email_address');
+    }
+    
+    if (!$from_addr) {
+        $from_addr = "$popuser@$domain";
+    }
+    return $from_addr;
+}
+
 
 ?>