X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=functions%2Fsmtp.php;h=1e5395857566865e61ff9e3d1ecd1fac88b96f5a;hb=4cb1746c0df09e049ec1a79dcf76b181eb82595c;hp=03ad8a581ea4c3936e2af8e8aac3338f283eb92d;hpb=604e2c03146d9912e6b8e3343d4e3b5e71a6e922;p=squirrelmail.git diff --git a/functions/smtp.php b/functions/smtp.php index 03ad8a58..1e539585 100644 --- a/functions/smtp.php +++ b/functions/smtp.php @@ -32,15 +32,15 @@ if (!$domain) { } /* Returns true only if this message is multipart */ -function isMultipart () { +function isMultipart ($session) { global $attachments; - - if (count($attachments)>0) { - 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 @@ -55,7 +55,7 @@ function expandAddrs ($array) { /* don't show errors -- kinda critical that we don't see * them here since the redirect won't work if we do show them */ - $abook = addressbook_init(false); + $abook = addressbook_init(false, true); for ($i=0; $i < count($array); $i++) { $result = $abook->lookup($array[$i]); $ret = ""; @@ -89,7 +89,7 @@ function expandRcptAddrs ($array) { /* don't show errors -- kinda critical that we don't see * them here since the redirect won't work if we do show them */ - $abook = addressbook_init(false); + $abook = addressbook_init(false, true); for ($i=0; $i < count($array); $i++) { $result = $abook->lookup($array[$i]); $ret = ""; @@ -110,14 +110,15 @@ function expandRcptAddrs ($array) { /* Attach the files that are due to be attached */ -function attachFiles ($fp) { +function attachFiles ($fp, $session) { global $attachments, $attachment_dir, $username; $length = 0; $hashed_attachment_dir = getHashedDir($username, $attachment_dir); - if (isMultipart()) { + if (isMultipart($session)) { foreach ($attachments as $info) { + if ($info['session'] == $session) { if (isset($info['type'])) { $filetype = $info['type']; } @@ -168,6 +169,7 @@ function attachFiles ($fp) { } } fclose ($file); + } } } return $length; @@ -175,20 +177,22 @@ function attachFiles ($fp) { /* Delete files that are uploaded for attaching */ -function deleteAttachments() { - global $attachments, $attachment_dir; - +function deleteAttachments($session) { + global $username, $attachments, $attachment_dir; $hashed_attachment_dir = getHashedDir($username, $attachment_dir); - if (isMultipart()) { - reset($attachments); - while (list($localname, $remotename) = each($attachments)) { - if (!ereg ("\\/", $localname)) { - $filename = $hashed_attachment_dir . '/' . $localname; - unlink ($filename); - unlink ("$filename.info"); - } - } + + $rem_attachments = array(); + foreach ($attachments as $info) { + if ($info['session'] == $session) { + $attached_file = "$hashed_attachment_dir/$info[localfilename]"; + if (file_exists($attached_file)) { + unlink($attached_file); + } + } else { + $rem_attachments[] = $info; + } } + $attachments = $rem_attachments; } /* Return a nice MIME-boundary @@ -231,7 +235,7 @@ function timezone () { } /* Print all the needed RFC822 headers */ -function write822Header ($fp, $t, $c, $b, $subject, $more_headers) { +function write822Header ($fp, $t, $c, $b, $subject, $more_headers, $session) { global $REMOTE_ADDR, $SERVER_NAME, $REMOTE_PORT; global $data_dir, $username, $popuser, $domain, $version, $useSendmail; global $default_charset, $HTTP_VIA, $HTTP_X_FORWARDED_FOR; @@ -293,72 +297,72 @@ function write822Header ($fp, $t, $c, $b, $subject, $more_headers) { $HTTP_X_FORWARDED_FOR = 'unknown'; } $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"; - + /* 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 - + if (isset($more_headers["Content-Type"])) { - $contentType = $more_headers["Content-Type"]; - unset($more_headers["Content-Type"]); - } + $contentType = $more_headers["Content-Type"]; + unset($more_headers["Content-Type"]); + } else { - if (isMultipart()) { - $contentType = "multipart/mixed;"; - } - else { - if ($default_charset != '') { - $contentType = 'text/plain; charset='.$default_charset; + if (isMultipart($session)) { + $contentType = "multipart/mixed;"; } else { - $contentType = 'text/plain;'; - } - } + if ($default_charset != '') { + $contentType = 'text/plain; charset='.$default_charset; + } + else { + $contentType = 'text/plain;'; + } + } } - - /* Insert headers from the $more_headers array */ - if(is_array($more_headers)) { + + /* Insert headers from the $more_headers array */ + 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 ($cc_list) { $header .= "Cc: $cc_list\r\n"; // Who the CCs are } - + if ($reply_to != '') { $header .= "Reply-To: $reply_to\r\n"; } - + if ($useSendmail) { if ($bcc_list) { // BCCs is removed from header by sendmail - $header .= "Bcc: $bcc_list\r\n"; + $header .= "Bcc: $bcc_list\r\n"; } } - + $header .= "X-Mailer: SquirrelMail (version $version)\r\n"; /* Identify SquirrelMail */ /* Do the MIME-stuff */ $header .= "MIME-Version: 1.0\r\n"; - - if (isMultipart()) { + + if (isMultipart($session)) { $header .= 'Content-Type: '.$contentType.' boundary="'; $header .= mimeBoundary(); $header .= "\"\r\n"; } else { - $header .= 'Content-Type: '.$contentType."\r\n"; + $header .= 'Content-Type: '.$contentType."\r\n"; $header .= "Content-Transfer-Encoding: 8bit\r\n"; } $header .= "\r\n"; // One blank line to separate header and body @@ -374,12 +378,12 @@ function write822Header ($fp, $t, $c, $b, $subject, $more_headers) { /* Send the body */ -function writeBody ($fp, $passedBody) { +function writeBody ($fp, $passedBody, $session) { global $default_charset; $attachmentlength = 0; - if (isMultipart()) { + if (isMultipart($session)) { $body = '--'.mimeBoundary()."\r\n"; if ($default_charset != "") { @@ -393,7 +397,7 @@ function writeBody ($fp, $passedBody) { $body .= $passedBody . "\r\n\r\n"; fputs ($fp, $body); - $attachmentlength = attachFiles($fp); + $attachmentlength = attachFiles($fp, $session); if (!isset($postbody)) { $postbody = ""; @@ -406,13 +410,13 @@ function writeBody ($fp, $passedBody) { $postbody = "\r\n"; fputs ($fp, $postbody); } - + return (strlen($body) + strlen($postbody) + $attachmentlength); } /* Send mail using the sendmail command */ -function sendSendmail($t, $c, $b, $subject, $body, $more_headers) { +function sendSendmail($t, $c, $b, $subject, $body, $more_headers, $session) { global $sendmail_path, $popuser, $username, $domain; /* Build envelope sender address. Make sure it doesn't contain @@ -431,8 +435,8 @@ function sendSendmail($t, $c, $b, $subject, $body, $more_headers) { $fp = popen (escapeshellcmd("$sendmail_path -t -f$envelopefrom"), "w"); } - $headerlength = write822Header ($fp, $t, $c, $b, $subject, $more_headers); - $bodylength = writeBody($fp, $body); + $headerlength = write822Header ($fp, $t, $c, $b, $subject, $more_headers, $session); + $bodylength = writeBody($fp, $body, $session); pclose($fp); @@ -450,7 +454,7 @@ function smtpReadData($smtpConnection) { } } -function sendSMTP($t, $c, $b, $subject, $body, $more_headers) { +function sendSMTP($t, $c, $b, $subject, $body, $more_headers, $session) { global $username, $popuser, $domain, $version, $smtpServerAddress, $smtpPort, $data_dir, $color, $use_authenticated_smtp, $identity, $key, $onetimepad; @@ -476,7 +480,9 @@ function sendSMTP($t, $c, $b, $subject, $body, $more_headers) { exit; } $tmp = fgets($smtpConnection, 1024); - if (errorCheck($tmp, $smtpConnection)!=5) return(0); + if (errorCheck($tmp, $smtpConnection)!=5) { + return(0); + } $to_list = getLineOfAddrs($to); $cc_list = getLineOfAddrs($cc); @@ -548,18 +554,13 @@ function sendSMTP($t, $c, $b, $subject, $body, $more_headers) { } /* Send the message */ - $headerlength = write822Header ($smtpConnection, $t, $c, $b, $subject, $more_headers); - $bodylength = writeBody($smtpConnection, $body); + $headerlength = write822Header ($smtpConnection, $t, $c, $b, $subject, $more_headers, $session); + $bodylength = writeBody($smtpConnection, $body, $session); fputs($smtpConnection, ".\r\n"); /* end the DATA part */ $tmp = fgets($smtpConnection, 1024); $num = errorCheck($tmp, $smtpConnection, true); if ($num != 250) { - $tmp = nl2br(htmlspecialchars($tmp)); - displayPageHeader($color, 'None'); - include_once('../functions/display_messages.php'); - $msg = "Message not sent!
\nReason given: $tmp"; - plain_error_message($msg, $color); return(0); } @@ -572,7 +573,7 @@ function sendSMTP($t, $c, $b, $subject, $body, $more_headers) { function errorCheck($line, $smtpConnection, $verbose = false) { - global $color; + global $color, $compose_new_win; /* Read new lines on a multiline response */ $lines = $line; @@ -661,10 +662,15 @@ function errorCheck($line, $smtpConnection, $verbose = false) { $error_num = '001'; break; } - + if ($status == 0) { include_once('../functions/page_header.php'); - displayPageHeader($color, 'None'); + if ($compose_new_win == '1') { + compose_Header($color, 'None'); + } + else { + displayPageHeader($color, 'None'); + } include_once('../functions/display_messages.php'); $lines = nl2br(htmlspecialchars($lines)); $msg = $message . "
\nServer replied: $lines"; @@ -674,7 +680,7 @@ function errorCheck($line, $smtpConnection, $verbose = false) { return $err_num; } -function sendMessage($t, $c, $b, $subject, $body, $reply_id, $MDN, $prio = 3) { +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; @@ -734,14 +740,14 @@ function sendMessage($t, $c, $b, $subject, $body, $reply_id, $MDN, $prio = 3) { } if ($useSendmail) { - $length = sendSendmail($t, $c, $b, $subject, $body, $more_headers); + $length = sendSendmail($t, $c, $b, $subject, $body, $more_headers, $session); } else { - $length = sendSMTP($t, $c, $b, $subject, $body, $more_headers); + $length = sendSMTP($t, $c, $b, $subject, $body, $more_headers, $session); } if (sqimap_mailbox_exists ($imap_stream, $sent_folder)) { sqimap_append ($imap_stream, $sent_folder, $length); - write822Header ($imap_stream, $t, $c, $b, $subject, $more_headers); - writeBody ($imap_stream, $body); + write822Header ($imap_stream, $t, $c, $b, $subject, $more_headers, $session); + writeBody ($imap_stream, $body, $session); sqimap_append_done ($imap_stream); } sqimap_logout($imap_stream); @@ -749,7 +755,7 @@ function sendMessage($t, $c, $b, $subject, $body, $reply_id, $MDN, $prio = 3) { * only if $length != 0 (if there was no error) */ if ($length) { - ClearAttachments(); + ClearAttachments($session); } return $length; @@ -777,33 +783,35 @@ function createPriorityHeaders($prio) { } function createReceiptHeaders($receipt) { - - $receipt_headers = Array(); - $from_addr = getPref($data_dir, $username, 'email_address'); - $from = getPref($data_dir, $username, 'full_name'); - - if ($from == '') { - $from = "<$from_addr>"; - } - else { - $from = '"' . encodeHeader($from) . "\" <$from_addr>"; - } - - /* On Delivery */ - if ( $receipt == 1 - || $receipt == 3 ) { - $receipt_headers["Return-Receipt-To"] = $from; - } - /* On Read */ - if ($receipt == 2 - || $receipt == 3 ) { - /* Pegasus Mail */ - $receipt_headers["X-Confirm-Reading-To"] = $from; - /* RFC 2298 */ - $receipt_headers["Disposition-Notification-To"] = $from; - } - return $receipt_headers; -} + + GLOBAL $data_dir, $username; + + $receipt_headers = Array(); + $from_addr = getPref($data_dir, $username, 'email_address'); + $from = getPref($data_dir, $username, 'full_name'); + + if ($from == '') { + $from = "<$from_addr>"; + } + else { + $from = '"' . encodeHeader($from) . "\" <$from_addr>"; + } + + /* On Delivery */ + if ( $receipt == 1 + || $receipt == 3 ) { + $receipt_headers["Return-Receipt-To"] = $from; + } + /* On Read */ + if ($receipt == 2 + || $receipt == 3 ) { + /* Pegasus Mail */ + $receipt_headers["X-Confirm-Reading-To"] = $from; + /* RFC 2298 */ + $receipt_headers["Disposition-Notification-To"] = $from; + } + return $receipt_headers; +} ?>