4 * Deliver_SendMail.class.php
6 * Delivery backend for the Deliver class.
8 * @author Marc Groot Koerkamp
9 * @copyright 1999-2020 The SquirrelMail Project Team
10 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
12 * @package squirrelmail
16 if (!defined('SM_PATH')) define('SM_PATH','../../');
18 /** This of course depends upon Deliver */
19 require_once(SM_PATH
. 'class/deliver/Deliver.class.php');
22 * Delivers messages using the sendmail binary
23 * @package squirrelmail
25 class Deliver_SendMail
extends Deliver
{
27 * Extra sendmail arguments
29 * Parameter can be set in class constructor function.
31 * WARNING: Introduction of this parameter broke backwards compatibility
32 * with workarounds specific to qmail-inject.
34 * If parameter needs some security modifications, it should be set to
35 * private in PHP 5+ in order to prevent uncontrolled access.
39 var $sendmail_args = '-i -t';
42 * Stores used sendmail command
43 * Private variable that is used to inform about used sendmail command.
47 var $sendmail_command = '';
50 * Constructor (PHP5 style, required in some future version of PHP)
51 * @param array configuration options. array key = option name,
52 * array value = option value.
56 function __construct($params=array()) {
57 if (!empty($params) && is_array($params)) {
58 // set extra sendmail arguments
59 if (isset($params['sendmail_args'])) {
60 $this->sendmail_args
= $params['sendmail_args'];
66 * Constructor (PHP4 style, kept for compatibility reasons)
67 * @param array configuration options. array key = option name,
68 * array value = option value.
72 function Deliver_SendMail($params=array()) {
73 self
::__construct($params);
77 * function preWriteToStream
79 * Sendmail needs LF's as line endings instead of CRLF.
80 * This function translates the line endings to LF and should be called
81 * before each line is written to the stream.
83 * @param string $s Line to process
87 function preWriteToStream(&$s) {
89 $s = str_replace("\r\n", "\n", $s);
96 * Initialise the sendmail connection.
98 * @param Message $message Message object containing the from address
99 * @param string $sendmail_path Location of sendmail binary
100 * @param mixed $ignore_x Eight extra arguments that the parent class
101 * requires which are not used here
105 function initStream($message, $sendmail_path, $ignore_1=0, $ignore_2='', $ignore_3='', $ignore_4='', $ignore_5='', $ignore_6=false, $ignore_7='', $ignore_8=array()) {
106 $rfc822_header = $message->rfc822_header
;
107 $from = $rfc822_header->from
[0];
108 $envelopefrom = trim($from->mailbox
.'@'.$from->host
);
109 // save executed command for future reference
110 $this->sendmail_command
= escapeshellcmd("$sendmail_path $this->sendmail_args -f") . escapeshellarg($envelopefrom);
111 // open process handle for writing
112 $stream = popen($this->sendmail_command
, "w");
117 * Closes process handle.
119 * @param resource $stream
123 function finalizeStream($stream) {
125 $status = pclose($stream);
126 // check pclose() status.
129 $this->dlv_msg
=_("Email delivery error");
130 $this->dlv_ret_nr
=$status;
131 // we can get better error messsage only if we switch to php 4.3+ and proc_open().
132 $this->dlv_server_msg
=sprintf(_("Can't execute command '%s'."),$this->sendmail_command
);
140 * In case of sendmail, the rfc822header must contain the bcc header.
142 * @return boolean true if rfc822header should include the bcc header.
150 * function clean_crlf
152 * Cleans each line to only end in a LF
153 * Returns the length of the line including a CR,
154 * so that length is correct when the message is saved to imap
155 * Implemented to fix sendmail->postfix rejection of messages with
156 * attachments because of stray LF's
158 * @param string $s string to strip of CR's
159 * @return integer length of string including a CR for each LF
162 function clean_crlf(&$s) {
163 $s = str_replace("\r\n", "\n", $s);
164 $s = str_replace("\r", "\n", $s);
165 $s2 = str_replace("\n", "\r\n", $s);