/** * Connects to the IMAP server. * * @throws Horde_Imap_Client_Exception */ protected function _connect() { if (!is_null($this->_stream)) { return; } if (!empty($this->_params['secure']) && !extension_loaded('openssl')) { throw new InvalidArgumentException('Secure connections require the PHP openssl extension.'); } switch ($this->_params['secure']) { case 'ssl': case 'sslv2': case 'sslv3': $conn = $this->_params['secure'] . '://'; $this->_isSecure = true; break; case 'tls': default: $conn = 'tcp://'; break; } $this->_stream = @stream_socket_client($conn . $this->_params['hostspec'] . ':' . $this->_params['port'], $error_number, $error_string, $this->_params['timeout']); if ($this->_stream === false) { $this->_stream = null; $this->_isSecure = false; $e = new Horde_Imap_Client_Exception(Horde_Imap_Client_Translation::t("Error connecting to mail server."), Horde_Imap_Client_Exception::SERVER_CONNECT); $e->details = sprintf("[%u] %s", $error_number, $error_string); throw $e; } stream_set_timeout($this->_stream, $this->_params['timeout']); // If we already have capability information, don't re-set with // (possibly) limited information sent in the inital banner. if (isset($this->_init['capability'])) { $this->_temp['no_cap'] = true; } /* Get greeting information. This is untagged so we need to specially * deal with it here. */ try { $this->_getLine(); } catch (Horde_Imap_Client_Exception_ServerResponse $e) { if ($e->status == Horde_Imap_Client_Interaction_Server::BYE) { /* Server is explicitly rejecting our connection (RFC 3501 * [7.1.5]). */ $e->setMessage(Horde_Imap_Client_Translation::t("Server rejected connection.")); $e->setCode(Horde_Imap_Client_Exception::SERVER_CONNECT); } throw $e; } // Check for IMAP4rev1 support if (!$this->queryCapability('IMAP4REV1')) { throw new Horde_Imap_Client_Exception(Horde_Imap_Client_Translation::t("The mail server does not support IMAP4rev1 (RFC 3501)."), Horde_Imap_Client_Exception::SERVER_CONNECT); } // Set language if NOT using imapproxy if (empty($this->_init['imapproxy'])) { if ($this->queryCapability('XIMAPPROXY')) { $this->_setInit('imapproxy', true); } else { $this->setLanguage(); } } // If pre-authenticated, we need to do all login tasks now. if (!empty($this->_temp['preauth'])) { $this->login(); } }