X-Git-Url: https://vcs.fsf.org/?p=squirrelmail.git;a=blobdiff_plain;f=class%2Fdeliver%2FDeliver_SendMail.class.php;h=658e7a9a7e7085ff8be6a2c77639f5b1371d7e16;hp=d44c2efcb2824ea12e0231ce1e1c12ca73fa77e8;hb=7c8a0b77c97d211c8900a47a88f9065f85605510;hpb=760c84a3b226747ea762935eecc91a990cf29f2d diff --git a/class/deliver/Deliver_SendMail.class.php b/class/deliver/Deliver_SendMail.class.php index d44c2efc..658e7a9a 100644 --- a/class/deliver/Deliver_SendMail.class.php +++ b/class/deliver/Deliver_SendMail.class.php @@ -1,40 +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); + } + + } -?>