| | |
| | | var $_debug = false; |
| | | |
| | | /** |
| | | * Debug output handler. |
| | | * @var callback |
| | | * @access private |
| | | */ |
| | | var $_debug_handler = null; |
| | | |
| | | /** |
| | | * The socket resource being used to connect to the SMTP server. |
| | | * @var resource |
| | | * @access private |
| | |
| | | * @access private |
| | | */ |
| | | var $_arguments = array(); |
| | | |
| | | /** |
| | | * Stores the SMTP server's greeting string. |
| | | * @var string |
| | | * @access private |
| | | */ |
| | | var $_greeting = null; |
| | | |
| | | /** |
| | | * Stores detected features of the SMTP server. |
| | |
| | | * @access public |
| | | * @since 1.1.0 |
| | | */ |
| | | function setDebug($debug) |
| | | function setDebug($debug, $handler = null) |
| | | { |
| | | $this->_debug = $debug; |
| | | $this->_debug_handler = $handler; |
| | | } |
| | | |
| | | /** |
| | | * Write the given debug text to the current debug output handler. |
| | | * |
| | | * @param string $message Debug mesage text. |
| | | * |
| | | * @access private |
| | | * @since 1.3.3 |
| | | */ |
| | | function _debug($message) |
| | | { |
| | | if ($this->_debug) { |
| | | if ($this->_debug_handler) { |
| | | call_user_func_array($this->_debug_handler, |
| | | array(&$this, $message)); |
| | | } else { |
| | | echo "DEBUG: $message\n"; |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | |
| | | */ |
| | | function _send($data) |
| | | { |
| | | if ($this->_debug) { |
| | | echo "DEBUG: Send: $data\n"; |
| | | } |
| | | $this->_debug("Send: $data"); |
| | | |
| | | if (PEAR::isError($error = $this->_socket->write($data))) { |
| | | return PEAR::raiseError('Failed to write to socket: ' . |
| | |
| | | |
| | | for ($i = 0; $i <= $this->_pipelined_commands; $i++) { |
| | | while ($line = $this->_socket->readLine()) { |
| | | if ($this->_debug) { |
| | | echo "DEBUG: Recv: $line\n"; |
| | | } |
| | | $this->_debug("Recv: $line"); |
| | | |
| | | /* If we receive an empty line, the connection has been closed. */ |
| | | if (empty($line)) { |
| | |
| | | } |
| | | |
| | | /** |
| | | * Return the SMTP server's greeting string. |
| | | * |
| | | * @return string A string containing the greeting string, or null if a |
| | | * greeting has not been received. |
| | | * |
| | | * @access public |
| | | * @since 1.3.3 |
| | | */ |
| | | function getGreeting() |
| | | { |
| | | return $this->_greeting; |
| | | } |
| | | |
| | | /** |
| | | * Attempt to connect to the SMTP server. |
| | | * |
| | | * @param int $timeout The timeout value (in seconds) for the |
| | |
| | | */ |
| | | function connect($timeout = null, $persistent = false) |
| | | { |
| | | $this->_greeting = null; |
| | | $result = $this->_socket->connect($this->host, $this->port, |
| | | $persistent, $timeout); |
| | | if (PEAR::isError($result)) { |
| | |
| | | if (PEAR::isError($error = $this->_parseResponse(220))) { |
| | | return $error; |
| | | } |
| | | |
| | | /* Extract and store a copy of the server's greeting string. */ |
| | | list(, $this->_greeting) = $this->getResponse(); |
| | | |
| | | if (PEAR::isError($error = $this->_negotiate())) { |
| | | return $error; |
| | | } |
| | |
| | | */ |
| | | function auth($uid, $pwd , $method = '') |
| | | { |
| | | if (version_compare(PHP_VERSION, '5.1.0', '>=') && isset($this->_esmtp['STARTTLS'])) { |
| | | /* We can only attempt a TLS connection if we're running PHP 5.1.0 or |
| | | * later, have access to the OpenSSL extension, are connected to an |
| | | * SMTP server which supports the STARTTLS extension, and aren't |
| | | * already connected over a secure (SSL) socket connection. */ |
| | | $tls = version_compare(PHP_VERSION, '5.1.0', '>=') && extension_loaded('openssl') && |
| | | isset($this->_esmtp['STARTTLS']) && strncasecmp($this->host, 'ssl://', 6) != 0; |
| | | |
| | | if (PEAR::isError($result = $this->_put('STARTTLS'))) { |
| | | return $result; |
| | | } |
| | | if (PEAR::isError($result = $this->_parseResponse(220))) { |
| | | return $result; |
| | | } |
| | | if (PEAR::isError($result = $this->_socket->enableCrypto(true, STREAM_CRYPTO_METHOD_TLS_CLIENT))) { |
| | | return $result; |
| | | } elseif ($result !== true) { |
| | | return PEAR::raiseError('STARTTLS failed'); |
| | | } |
| | | if ($tls) { |
| | | if (PEAR::isError($result = $this->_put('STARTTLS'))) { |
| | | return $result; |
| | | } |
| | | if (PEAR::isError($result = $this->_parseResponse(220))) { |
| | | return $result; |
| | | } |
| | | if (PEAR::isError($result = $this->_socket->enableCrypto(true, STREAM_CRYPTO_METHOD_TLS_CLIENT))) { |
| | | return $result; |
| | | } elseif ($result !== true) { |
| | | return PEAR::raiseError('STARTTLS failed'); |
| | | } |
| | | |
| | | /* Send EHLO again to recieve the AUTH string from the |
| | | * SMTP server. */ |
| | | $this->_negotiate(); |
| | | } |
| | | |
| | | if (empty($this->_esmtp['AUTH'])) { |
| | | /* Send EHLO again to recieve the AUTH string from the |
| | | * SMTP server. */ |
| | | $this->_negotiate(); |
| | | } |
| | | |
| | | if (empty($this->_esmtp['AUTH'])) { |
| | | return PEAR::raiseError('SMTP server does not support authentication'); |
| | | } |
| | | |
| | |
| | | if (isset($this->_esmtp['SIZE']) && ($this->_esmtp['SIZE'] > 0)) { |
| | | if (strlen($data) >= $this->_esmtp['SIZE']) { |
| | | $this->disconnect(); |
| | | return PEAR::raiseError('Message size exceedes the server limit'); |
| | | return PEAR::raiseError('Message size excedes the server limit'); |
| | | } |
| | | } |
| | | |