X-Git-Url: https://vcs.fsf.org/?p=squirrelmail.git;a=blobdiff_plain;f=class%2Fdeliver%2FDeliver_SendMail.class.php;h=7e4a82011c8f9ffbc0c3d8c0701aa5082dc19640;hp=87e2a329d0f854aedc1f8f25788728f7d5f1d7ac;hb=0606cc1075a37e8d65b22f21768fa41e1355e374;hpb=11a01a02be0cb01bb0ece8644c356ced5a89ee01;ds=sidebyside diff --git a/class/deliver/Deliver_SendMail.class.php b/class/deliver/Deliver_SendMail.class.php index 87e2a329..7e4a8201 100644 --- a/class/deliver/Deliver_SendMail.class.php +++ b/class/deliver/Deliver_SendMail.class.php @@ -1,30 +1,158 @@ sendmail_args = $params['sendmail_args']; + } + } + } + + /** + * function preWriteToStream + * + * Sendmail needs LF's as line endings instead of CRLF. + * This function translates the line endings to LF and should be called + * before each line is written to the stream. + * + * @param string $s Line to process + * @return void + * @access private + */ function preWriteToStream(&$s) { if ($s) { - if ($s{0} == '.') $s = '.' . $s; - $s = str_replace("\n.","\n..",$s); - $s = str_replace("\r\n", "\n", $s); + $s = str_replace("\r\n", "\n", $s); } } - + + /** + * function initStream + * + * Initialise the sendmail connection. + * + * @param Message $message Message object containing the from address + * @param string $sendmail_path Location of sendmail binary + * @return resource + * @access public + */ function initStream($message, $sendmail_path) { $rfc822_header = $message->rfc822_header; - $from = $rfc822_header->from[0]; - $envelopefrom = $from->mailbox.'@'.$from->host; - if (strstr($sendmail_path, "qmail-inject")) { - $stream = popen (escapeshellcmd("$sendmail_path -f$envelopefrom"), "w"); - } else { - $stream = popen (escapeshellcmd("$sendmail_path -t -f$envelopefrom"), "w"); - } + $from = $rfc822_header->from[0]; + $envelopefrom = trim($from->mailbox.'@'.$from->host); + $envelopefrom = str_replace(array("\0","\n"),array('',''),$envelopefrom); + // save executed command for future reference + $this->sendmail_command = "$sendmail_path $this->sendmail_args -f$envelopefrom"; + // open process handle for writing + $stream = popen (escapeshellcmd($this->sendmail_command), "w"); + return $stream; } - + + /** + * Closes process handle. + * + * @param resource $stream + * @return boolean + * @access public + */ function finalizeStream($stream) { - pclose($stream); + $ret = true; + $status = pclose($stream); + // check pclose() status. + if ($status!=0) { + $ret = false; + $this->dlv_msg=_("Email delivery error"); + $this->dlv_ret_nr=$status; + // we can get better error messsage only if we switch to php 4.3+ and proc_open(). + $this->dlv_server_msg=sprintf(_("Can't execute command '%s'."),$this->sendmail_command); + } + return $ret; } + + /** + * function getBcc + * + * In case of sendmail, the rfc822header must contain the bcc header. + * + * @return boolean true if rfc822header should include the bcc header. + * @access private + */ + function getBcc() { + return true; + } + + /** + * function clean_crlf + * + * Cleans each line to only end in a LF + * Returns the length of the line including a CR, + * so that length is correct when the message is saved to imap + * Implemented to fix sendmail->postfix rejection of messages with + * attachments because of stray LF's + * + * @param string $s string to strip of CR's + * @return integer length of string including a CR for each LF + * @access private + */ + function clean_crlf(&$s) { + $s = str_replace("\r\n", "\n", $s); + $s = str_replace("\r", "\n", $s); + $s2 = str_replace("\n", "\r\n", $s); + return strlen($s2); + } + + } -?>