lmtp.php.svn-base

来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· SVN-BASE 代码 · 共 730 行 · 第 1/2 页

SVN-BASE
730
字号
     *                  supported authentication method or a PEAR_Error object     *                  if a failure condition is encountered.     * @access private     * @since  1.0     */    function _getBestAuthMethod()    {        $available_methods = explode(' ', $this->_esmtp['AUTH']);        foreach ($this->supportedAuthMethods as $method) {            if (in_array($method, $available_methods)) {                return $method;            }        }        return new PEAR_Error('No supported authentication methods');    }    /**     * Attempt to do LMTP authentication.     *     * @param string The userid to authenticate as.     * @param string The password to authenticate with.     * @param string The requested authentication method.  If none is     *               specified, the best supported method will be used.     *     * @return mixed Returns a PEAR_Error with an error message on any     *               kind of failure, or true on success.     * @access public     * @since  1.0     */    function auth($uid, $pwd , $method = '')    {        if (!array_key_exists('AUTH', $this->_esmtp)) {            return new PEAR_Error('LMTP server does no support authentication');        }        /*         * If no method has been specified, get the name of the best supported         * method advertised by the LMTP server.         */        if (empty($method) || $method === true ) {            if (PEAR::isError($method = $this->_getBestAuthMethod())) {                /* Return the PEAR_Error object from _getBestAuthMethod(). */                return $method;            }         } else {            $method = strtoupper($method);        }        switch ($method) {            case 'DIGEST-MD5':                $result = $this->_authDigest_MD5($uid, $pwd);                break;            case 'CRAM-MD5':                $result = $this->_authCRAM_MD5($uid, $pwd);                break;            case 'LOGIN':                $result = $this->_authLogin($uid, $pwd);                break;            case 'PLAIN':                $result = $this->_authPlain($uid, $pwd);                break;            default :                 $result = new PEAR_Error("$method is not a supported authentication method");                break;        }        /* If an error was encountered, return the PEAR_Error object. */        if (PEAR::isError($result)) {            return $result;        }        /* RFC-2554 requires us to re-negotiate ESMTP after an AUTH. */        if (PEAR::isError($error = $this->_negotiate())) {            return $error;        }        return true;    }    /* Authenticates the user using the DIGEST-MD5 method.     *     * @param string The userid to authenticate as.     * @param string The password to authenticate with.     *     * @return mixed Returns a PEAR_Error with an error message on any     *               kind of failure, or true on success.     * @access private     * @since  1.0     */    function _authDigest_MD5($uid, $pwd)    {        if (PEAR::isError($error = $this->_put('AUTH', 'DIGEST-MD5'))) {            return $error;        }        if (PEAR::isError($error = $this->_parseResponse(334))) {            return $error;        }        $challenge = base64_decode($this->_arguments[0]);        $digest = &Auth_SASL::factory('digestmd5');        $auth_str = base64_encode($digest->getResponse($uid, $pwd, $challenge,                                                       $this->_host, "smtp"));        if (PEAR::isError($error = $this->_put($auth_str ))) {            return $error;        }        if (PEAR::isError($error = $this->_parseResponse(334))) {            return $error;        }        /*         * We don't use the protocol's third step because LMTP doesn't allow         * subsequent authentication, so we just silently ignore it.         */        if (PEAR::isError($error = $this->_put(' '))) {            return $error;        }        if (PEAR::isError($error = $this->_parseResponse(235))) {            return $error;        }    }    /* Authenticates the user using the CRAM-MD5 method.     *     * @param string The userid to authenticate as.     * @param string The password to authenticate with.     *     * @return mixed Returns a PEAR_Error with an error message on any     *               kind of failure, or true on success.     * @access private     * @since  1.0     */    function _authCRAM_MD5($uid, $pwd)    {        if (PEAR::isError($error = $this->_put('AUTH', 'CRAM-MD5'))) {            return $error;        }        if (PEAR::isError($error = $this->_parseResponse(334))) {            return $error;        }        $challenge = base64_decode($this->_arguments[0]);        $cram = &Auth_SASL::factory('crammd5');        $auth_str = base64_encode($cram->getResponse($uid, $pwd, $challenge));        if (PEAR::isError($error = $this->_put($auth_str))) {            return $error;        }        if (PEAR::isError($error = $this->_parseResponse(235))) {            return $error;        }    }    /**     * Authenticates the user using the LOGIN method.     *     * @param string The userid to authenticate as.     * @param string The password to authenticate with.     *     * @return mixed Returns a PEAR_Error with an error message on any     *               kind of failure, or true on success.     * @access private      * @since  1.0     */    function _authLogin($uid, $pwd)    {        if (PEAR::isError($error = $this->_put('AUTH', 'LOGIN'))) {             return $error;        }        if (PEAR::isError($error = $this->_parseResponse(334))) {            return $error;        }        if (PEAR::isError($error = $this->_put(base64_encode($uid)))) {            return $error;        }        if (PEAR::isError($error = $this->_parseResponse(334))) {            return $error;        }        if (PEAR::isError($error = $this->_put(base64_encode($pwd)))) {            return $error;        }        if (PEAR::isError($error = $this->_parseResponse(235))) {            return $error;        }        return true;    }    /**     * Authenticates the user using the PLAIN method.     *     * @param string The userid to authenticate as.     * @param string The password to authenticate with.     *     * @return mixed Returns a PEAR_Error with an error message on any     *               kind of failure, or true on success.     * @access private      * @since  1.0     */    function _authPlain($uid, $pwd)    {        if (PEAR::isError($error = $this->_put('AUTH', 'PLAIN'))) {            return $error;        }        if (PEAR::isError($error = $this->_parseResponse(334))) {            return $error;        }        $auth_str = base64_encode(chr(0) . $uid . chr(0) . $pwd);        if (PEAR::isError($error = $this->_put($auth_str))) {            return $error;        }        if (PEAR::isError($error = $this->_parseResponse(235))) {            return $error;        }        return true;    }    /**     * Send the MAIL FROM: command.     *     * @param string The sender (reverse path) to set.     *     * @return mixed Returns a PEAR_Error with an error message on any     *               kind of failure, or true on success.     * @access public     * @since  1.0     */    function mailFrom($sender)    {        if (PEAR::isError($error = $this->_put('MAIL', "FROM:<$sender>"))) {            return $error;        }        if (PEAR::isError($error = $this->_parseResponse(250))) {            return $error;        }        return true;    }    /**     * Send the RCPT TO: command.     *     * @param string The recipient (forward path) to add.     *     * @return mixed Returns a PEAR_Error with an error message on any     *               kind of failure, or true on success.     * @access public     * @since  1.0     */    function rcptTo($recipient)    {        if (PEAR::isError($error = $this->_put('RCPT', "TO:<$recipient>"))) {            return $error;        }        if (PEAR::isError($error = $this->_parseResponse(array(250, 251)))) {            return $error;        }        return true;    }    /**     * Send the DATA command.     *     * @param string The message body to send.     *     * @return mixed Returns a PEAR_Error with an error message on any     *               kind of failure, or true on success.     * @access public     * @since  1.0     */    function data($data)    {        if (isset($this->_esmtp['SIZE']) && ($this->_esmtp['SIZE'] > 0)) {            if (strlen($data) >= $this->_esmtp['SIZE']) {                $this->disconnect();                return new PEAR_Error('Message size excedes the server limit');            }        }            /*         * Change Unix (\n) and Mac (\r) linefeeds into Internet-standard CRLF         * (\r\n) linefeeds.         */        $data = preg_replace("/([^\r]{1})\n/", "\\1\r\n", $data);        $data = preg_replace("/\n\n/", "\n\r\n", $data);        /*         * Because a single leading period (.) signifies an end to the data,         * legitimate leading periods need to be "doubled" (e.g. '..').         */        $data = preg_replace("/\n\./", "\n..", $data);        if (PEAR::isError($error = $this->_put('DATA'))) {            return $error;        }        if (PEAR::isError($error = $this->_parseResponse(354))) {            return $error;        }        if (PEAR::isError($this->_send($data . "\r\n.\r\n"))) {            return new PEAR_Error('write to socket failed');        }        if (PEAR::isError($error = $this->_parseResponse(250))) {            return $error;        }        return true;    }    /**     * Send the RSET command.     *     * @return mixed Returns a PEAR_Error with an error message on any     *               kind of failure, or true on success.     * @access public     * @since  1.0     */    function rset()    {        if (PEAR::isError($error = $this->_put('RSET'))) {            return $error;        }        if (PEAR::isError($error = $this->_parseResponse(250))) {            return $error;        }        return true;    }    /**     * Send the NOOP command.     *     * @return mixed Returns a PEAR_Error with an error message on any     *               kind of failure, or true on success.     * @access public     * @since  1.0     */    function noop()    {        if (PEAR::isError($error = $this->_put('NOOP'))) {            return $error;        }        if (PEAR::isError($error = $this->_parseResponse(250))) {            return $error;        }        return true;    }}?>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?