Prevent endless recursive sent subfolder names - see: http://thread.gmane.org/gmane...
[squirrelmail.git] / class / deliver / Deliver_SendMail.class.php
1 <?php
2
3 /**
4 * Deliver_SendMail.class.php
5 *
6 * Delivery backend for the Deliver class.
7 *
8 * @author Marc Groot Koerkamp
9 * @copyright 1999-2012 The SquirrelMail Project Team
10 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
11 * @version $Id$
12 * @package squirrelmail
13 */
14
15 /** @ignore */
16 if (!defined('SM_PATH')) define('SM_PATH','../../');
17
18 /** This of course depends upon Deliver */
19 require_once(SM_PATH . 'class/deliver/Deliver.class.php');
20
21 /**
22 * Delivers messages using the sendmail binary
23 * @package squirrelmail
24 */
25 class Deliver_SendMail extends Deliver {
26 /**
27 * Extra sendmail arguments
28 *
29 * Parameter can be set in class constructor function.
30 *
31 * WARNING: Introduction of this parameter broke backwards compatibility
32 * with workarounds specific to qmail-inject.
33 *
34 * If parameter needs some security modifications, it should be set to
35 * private in PHP 5+ in order to prevent uncontrolled access.
36 * @var string
37 * @since 1.5.1
38 */
39 var $sendmail_args = '-i -t';
40
41 /**
42 * Stores used sendmail command
43 * Private variable that is used to inform about used sendmail command.
44 * @var string
45 * @since 1.5.1
46 */
47 var $sendmail_command = '';
48
49 /**
50 * Constructor function
51 * @param array configuration options. array key = option name,
52 * array value = option value.
53 * @return void
54 * @since 1.5.1
55 */
56 function Deliver_SendMail($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'];
61 }
62 }
63 }
64
65 /**
66 * function preWriteToStream
67 *
68 * Sendmail needs LF's as line endings instead of CRLF.
69 * This function translates the line endings to LF and should be called
70 * before each line is written to the stream.
71 *
72 * @param string $s Line to process
73 * @return void
74 * @access private
75 */
76 function preWriteToStream(&$s) {
77 if ($s) {
78 $s = str_replace("\r\n", "\n", $s);
79 }
80 }
81
82 /**
83 * function initStream
84 *
85 * Initialise the sendmail connection.
86 *
87 * @param Message $message Message object containing the from address
88 * @param string $sendmail_path Location of sendmail binary
89 * @param mixed $ignore Seven extra arguments that the parent class
90 * requires which are not used here
91 * @return resource
92 * @access public
93 */
94 function initStream($message, $sendmail_path, $ignore=0, $ignore='', $ignore='', $ignore='', $ignore='', $ignore=false, $ignore='') {
95 $rfc822_header = $message->rfc822_header;
96 $from = $rfc822_header->from[0];
97 $envelopefrom = trim($from->mailbox.'@'.$from->host);
98 $envelopefrom = str_replace(array("\0","\n"),array('',''),$envelopefrom);
99 // save executed command for future reference
100 $this->sendmail_command = "$sendmail_path $this->sendmail_args -f$envelopefrom";
101 // open process handle for writing
102 $stream = popen (escapeshellcmd($this->sendmail_command), "w");
103 return $stream;
104 }
105
106 /**
107 * Closes process handle.
108 *
109 * @param resource $stream
110 * @return boolean
111 * @access public
112 */
113 function finalizeStream($stream) {
114 $ret = true;
115 $status = pclose($stream);
116 // check pclose() status.
117 if ($status!=0) {
118 $ret = false;
119 $this->dlv_msg=_("Email delivery error");
120 $this->dlv_ret_nr=$status;
121 // we can get better error messsage only if we switch to php 4.3+ and proc_open().
122 $this->dlv_server_msg=sprintf(_("Can't execute command '%s'."),$this->sendmail_command);
123 }
124 return $ret;
125 }
126
127 /**
128 * function getBcc
129 *
130 * In case of sendmail, the rfc822header must contain the bcc header.
131 *
132 * @return boolean true if rfc822header should include the bcc header.
133 * @access private
134 */
135 function getBcc() {
136 return true;
137 }
138
139 /**
140 * function clean_crlf
141 *
142 * Cleans each line to only end in a LF
143 * Returns the length of the line including a CR,
144 * so that length is correct when the message is saved to imap
145 * Implemented to fix sendmail->postfix rejection of messages with
146 * attachments because of stray LF's
147 *
148 * @param string $s string to strip of CR's
149 * @return integer length of string including a CR for each LF
150 * @access private
151 */
152 function clean_crlf(&$s) {
153 $s = str_replace("\r\n", "\n", $s);
154 $s = str_replace("\r", "\n", $s);
155 $s2 = str_replace("\n", "\r\n", $s);
156 return strlen($s2);
157 }
158
159
160 }