* @author Michael Slusarz * @category Horde * @copyright 2010-2017 Horde LLC * @license http://www.horde.org/licenses/bsd New BSD License * @package Mail */ class Horde_Mail_Transport_Sendmail extends Horde_Mail_Transport { /** * Any extra command-line parameters to pass to the sendmail or * sendmail wrapper binary. * * @var string */ protected $_sendmailArgs = '-i'; /** * The location of the sendmail or sendmail wrapper binary on the * filesystem. * * @var string */ protected $_sendmailPath = '/usr/sbin/sendmail'; /** * Constructor. * * @param array $params Additional parameters: * - sendmail_args: (string) Any extra parameters to pass to the sendmail * or sendmail wrapper binary. * DEFAULT: -i * - sendmail_path: (string) The location of the sendmail binary on the * filesystem. * DEFAULT: /usr/sbin/sendmail */ public function __construct(array $params = array()) { if (isset($params['sendmail_args'])) { $this->_sendmailArgs = $params['sendmail_args']; } if (isset($params['sendmail_path'])) { $this->_sendmailPath = $params['sendmail_path']; } } /** */ public function send($recipients, array $headers, $body) { $recipients = implode(' ', array_map('escapeshellarg', $this->parseRecipients($recipients))); $headers = $this->_sanitizeHeaders($headers); list($from, $text_headers) = $this->prepareHeaders($headers); $from = $this->_getFrom($from, $headers); $mail = @popen($this->_sendmailPath . (empty($this->_sendmailArgs) ? '' : ' ' . $this->_sendmailArgs) . ' -f ' . escapeshellarg($from) . ' -- ' . $recipients, 'w'); if (!$mail) { throw new Horde_Mail_Exception('Failed to open sendmail [' . $this->_sendmailPath . '] for execution.'); } // Write the headers following by two newlines: one to end the headers // section and a second to separate the headers block from the body. fputs($mail, $text_headers . $this->sep . $this->sep); if (is_resource($body)) { stream_filter_register('horde_eol', 'Horde_Stream_Filter_Eol'); stream_filter_append($body, 'horde_eol', STREAM_FILTER_READ, array('eol' => $this->sep)); rewind($body); while (!feof($body)) { fputs($mail, fread($body, 8192)); } } else { fputs($mail, $this->_normalizeEOL($body)); } $result = pclose($mail); if (!$result) { return; } switch ($result) { case 64: // EX_USAGE $msg = 'command line usage error'; break; case 65: // EX_DATAERR $msg = 'data format error'; break; case 66: // EX_NOINPUT $msg = 'cannot open input'; break; case 67: // EX_NOUSER $msg = 'addressee unknown'; break; case 68: // EX_NOHOST $msg = 'host name unknown'; break; case 69: // EX_UNAVAILABLE $msg = 'service unavailable'; break; case 70: // EX_SOFTWARE $msg = 'internal software error'; break; case 71: // EX_OSERR $msg = 'system error'; break; case 72: // EX_OSFILE $msg = 'critical system file missing'; break; case 73: // EX_CANTCREAT $msg = 'cannot create output file'; break; case 74: // EX_IOERR $msg = 'input/output error'; case 75: // EX_TEMPFAIL $msg = 'temporary failure'; break; case 76: // EX_PROTOCOL $msg = 'remote error in protocol'; break; case 77: // EX_NOPERM $msg = 'permission denied'; break; case 78: // EX_CONFIG $msg = 'configuration error'; break; case 79: // EX_NOTFOUND $msg = 'entry not found'; break; default: $msg = 'unknown error'; break; } throw new Horde_Mail_Exception('sendmail: ' . $msg . ' (' . $result . ')', $result); } }