- PEAR::Net_SMTP 1.5.2, fixed timeout issue (#1487843)

release-0.6
alecpl 14 years ago
parent f62468d3ec
commit 462de2d202

@ -1,6 +1,7 @@
CHANGELOG Roundcube Webmail CHANGELOG Roundcube Webmail
=========================== ===========================
- PEAR::Net_SMTP 1.5.2, fixed timeout issue (#1487843)
- Added plugin hook for request token creation - Added plugin hook for request token creation
- Replace LDAP vars in group queries (#1487837) - Replace LDAP vars in group queries (#1487837)
- Fix vcard folding with uncode characters (#1487868) - Fix vcard folding with uncode characters (#1487868)
@ -17,7 +18,6 @@ CHANGELOG Roundcube Webmail
- Enable TinyMCE's contextmenu (#1487014) - Enable TinyMCE's contextmenu (#1487014)
- TinyMCE 3.4.1 - TinyMCE 3.4.1
- Stateless request tokens. No keep-alive necessary on login page (#1487829) - Stateless request tokens. No keep-alive necessary on login page (#1487829)
- PEAR::Net_SMTP 1.5.1
- Allow multiple concurrent compose sessions - Allow multiple concurrent compose sessions
- Force names of unique constraints in PostgreSQL DDL - Force names of unique constraints in PostgreSQL DDL
- Add code for prevention from IMAP connection hangs when server closes socket unexpectedly - Add code for prevention from IMAP connection hangs when server closes socket unexpectedly

@ -105,7 +105,7 @@ class rcube_smtp
$this->conn = new Net_SMTP($smtp_host, $smtp_port, $helo_host); $this->conn = new Net_SMTP($smtp_host, $smtp_port, $helo_host);
if($RCMAIL->config->get('smtp_debug')) if ($RCMAIL->config->get('smtp_debug'))
$this->conn->setDebug(true, array($this, 'debug_handler')); $this->conn->setDebug(true, array($this, 'debug_handler'));
// try to connect to server and exit on failure // try to connect to server and exit on failure
@ -118,6 +118,13 @@ class rcube_smtp
return false; return false;
} }
// workaround for timeout bug in Net_SMTP 1.5.[0-1] (#1487843)
if (method_exists($this->conn, 'setTimeout')
&& ($timeout = ini_get('default_socket_timeout'))
) {
$this->conn->setTimeout($timeout);
}
$smtp_user = str_replace('%u', $_SESSION['username'], $CONFIG['smtp_user']); $smtp_user = str_replace('%u', $_SESSION['username'], $CONFIG['smtp_user']);
$smtp_pass = str_replace('%p', $RCMAIL->decrypt($_SESSION['password']), $CONFIG['smtp_pass']); $smtp_pass = str_replace('%p', $RCMAIL->decrypt($_SESSION['password']), $CONFIG['smtp_pass']);
$smtp_auth_type = empty($CONFIG['smtp_auth_type']) ? NULL : $CONFIG['smtp_auth_type']; $smtp_auth_type = empty($CONFIG['smtp_auth_type']) ? NULL : $CONFIG['smtp_auth_type'];

@ -105,6 +105,14 @@ class Net_SMTP
*/ */
var $_socket = null; var $_socket = null;
/**
* Array of socket options that will be passed to Net_Socket::connect().
* @see stream_context_create()
* @var array
* @access private
*/
var $_socket_options = null;
/** /**
* The socket I/O timeout value in seconds. * The socket I/O timeout value in seconds.
* @var int * @var int
@ -156,12 +164,13 @@ class Net_SMTP
* @param string $localhost The value to give when sending EHLO or HELO. * @param string $localhost The value to give when sending EHLO or HELO.
* @param boolean $pipeling Use SMTP command pipelining * @param boolean $pipeling Use SMTP command pipelining
* @param integer $timeout Socket I/O timeout in seconds. * @param integer $timeout Socket I/O timeout in seconds.
* @param array $socket_options Socket stream_context_create() options.
* *
* @access public * @access public
* @since 1.0 * @since 1.0
*/ */
function Net_SMTP($host = null, $port = null, $localhost = null, function Net_SMTP($host = null, $port = null, $localhost = null,
$pipelining = false, $timeout = 0) $pipelining = false, $timeout = 0, $socket_options = null)
{ {
if (isset($host)) { if (isset($host)) {
$this->host = $host; $this->host = $host;
@ -175,6 +184,7 @@ class Net_SMTP
$this->pipelining = $pipelining; $this->pipelining = $pipelining;
$this->_socket = new Net_Socket(); $this->_socket = new Net_Socket();
$this->_socket_options = $socket_options;
$this->_timeout = $timeout; $this->_timeout = $timeout;
/* Include the Auth_SASL package. If the package is not /* Include the Auth_SASL package. If the package is not
@ -405,7 +415,8 @@ class Net_SMTP
{ {
$this->_greeting = null; $this->_greeting = null;
$result = $this->_socket->connect($this->host, $this->port, $result = $this->_socket->connect($this->host, $this->port,
$persistent, $timeout); $persistent, $timeout,
$this->_socket_options);
if (PEAR::isError($result)) { if (PEAR::isError($result)) {
return PEAR::raiseError('Failed to connect socket: ' . return PEAR::raiseError('Failed to connect socket: ' .
$result->getMessage()); $result->getMessage());
@ -417,8 +428,10 @@ class Net_SMTP
* timeout values for the initial connection (our $timeout parameter) * timeout values for the initial connection (our $timeout parameter)
* and all other socket operations. * and all other socket operations.
*/ */
if (PEAR::isError($error = $this->setTimeout($this->_timeout))) { if ($this->_timeout > 0) {
return $error; if (PEAR::isError($error = $this->setTimeout($this->_timeout))) {
return $error;
}
} }
if (PEAR::isError($error = $this->_parseResponse(220))) { if (PEAR::isError($error = $this->_parseResponse(220))) {

Loading…
Cancel
Save