public function connect($timeout = self::TIMEOUT, $test = false) { Eden_Mail_Error::i()->argument(1, 'int')->argument(2, 'bool'); $host = $this->_host; if ($this->_ssl) { $host = 'ssl://' . $host; } else { $host = 'tcp://' . $host; } $errno = 0; $errstr = ''; $this->_socket = @stream_socket_client($host . ':' . $this->_port, $errno, $errstr, $timeout); if (!$this->_socket || strlen($errstr) > 0 || $errno > 0) { Eden_Mail_Error::get()->setMessage(Eden_Mail_Error::SERVER_ERROR)->addVariable($host . ':' . $this->_port)->trigger(); } $this->_receive(); if (!$this->_call('EHLO ' . $_SERVER['HTTP_HOST'], 250) && !$this->_call('HELO ' . $_SERVER['HTTP_HOST'], 250)) { $this->disconnect(); Eden_Mail_Error::get()->setMessage(Eden_Mail_Error::SERVER_ERROR)->addVariable($host . ':' . $this->_port)->trigger(); } if ($this->_tls && !$this->_call('STARTTLS', 220, 250)) { if (!stream_socket_enable_crypto($this->_socket, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) { $this->disconnect(); Eden_Mail_Error::get()->setMessage(Eden_Mail_Error::TLS_ERROR)->addVariable($host . ':' . $this->_port)->trigger(); } if (!$this->_call('EHLO ' . $_SERVER['HTTP_HOST'], 250) && !$this->_call('HELO ' . $_SERVER['HTTP_HOST'], 250)) { $this->disconnect(); Eden_Mail_Error::get()->setMessage(Eden_Mail_Error::SERVER_ERROR)->addVariable($host . ':' . $this->_port)->trigger(); } } if ($test) { $this->disconnect(); return $this; } if (!$this->_call('AUTH LOGIN', 250, 334)) { $this->disconnect(); Eden_Mail_Error::i(Eden_Mail_Error::LOGIN_ERROR)->trigger(); } if (!$this->_call(base64_encode($this->_username), 334)) { $this->disconnect(); Eden_Mail_Error::i()->setMessage(Eden_Mail_Error::LOGIN_ERROR); } if (!$this->_call(base64_encode($this->_password), 235, 334)) { $this->disconnect(); Eden_Mail_Error::i()->setMessage(Eden_Mail_Error::LOGIN_ERROR); } return $this; }
/** * Connects to the server * * @return this */ public function connect($test = false) { Eden_Mail_Error::i()->argument(1, 'bool'); if ($this->_loggedin) { return $this; } $host = $this->_host; if ($this->_ssl) { $host = 'ssl://' . $host; } $errno = 0; $errstr = ''; $this->_socket = fsockopen($host, $this->_port, $errno, $errstr, self::TIMEOUT); if (!$this->_socket) { //throw exception Eden_Mail_Error::get()->setMessage(Eden_Mail_Error::SERVER_ERROR)->addVariable($host . ':' . $this->_port)->trigger(); } $welcome = $this->_receive(); strtok($welcome, '<'); $this->_timestamp = strtok('>'); if (!strpos($this->_timestamp, '@')) { $this->_timestamp = null; } else { $this->_timestamp = '<' . $this->_timestamp . '>'; } if ($this->_tls) { $this->_call('STLS'); if (!stream_socket_enable_crypto($this->_socket, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) { $this->disconnect(); //throw exception Eden_Mail_Error::get()->setMessage(Eden_Mail_Exception::TLS_ERROR)->addVariable($host . ':' . $this->_port)->trigger(); } } //login if ($this->_timestamp) { try { $this->_call('APOP ' . $this->_username . ' ' . md5($this->_timestamp . $this->_password)); return; } catch (Exception $e) { // ignore } } $this->_call('USER ' . $this->_username); $this->_call('PASS ' . $this->_password); return $this; }