public function auth($uid, $pwd , $method = '', $tls = true, $authz = '')
    {
        /* We can only attempt a TLS connection if one has been requested,
         * 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. */
        if ($tls && version_compare(PHP_VERSION, '5.1.0', '>=')
            && extension_loaded('openssl') && isset($this->esmtp['STARTTLS'])
            && strncasecmp($this->host, 'ssl://', 6) !== 0
        ) {
            /* Start the TLS connection attempt. */
            if (PEAR::isError($result = $this->put('STARTTLS'))) {
                return $result;
            }
            if (PEAR::isError($result = $this->parseResponse(220))) {
                return $result;
            }
            if (isset($this->socket_options['ssl']['crypto_method'])) {
                $crypto_method = $this->socket_options['ssl']['crypto_method'];
            } else {
                /* STREAM_CRYPTO_METHOD_TLS_ANY_CLIENT constant does not exist
                 * and STREAM_CRYPTO_METHOD_SSLv23_CLIENT constant is
                 * inconsistent across PHP versions. */
                $crypto_method = STREAM_CRYPTO_METHOD_TLS_CLIENT
                                 | @STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT
                                 | @STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT;
            }
            if (PEAR::isError($result = $this->socket->enableCrypto(true, $crypto_method))) {
                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'])) {
            return PEAR::raiseError('SMTP server does not support authentication');
        }

        /* If no method has been specified, get the name of the best
         * supported method advertised by the SMTP server. */
        if (empty($method)) {
            if (PEAR::isError($method = $this->getBestAuthMethod())) {
                /* Return the PEAR_Error object from _getBestAuthMethod(). */
                return $method;
            }
        } else {
            $method = strtoupper($method);
            if (!array_key_exists($method, $this->auth_methods)) {
                return PEAR::raiseError("$method is not a supported authentication method");
            }
        }

        if (!isset($this->auth_methods[$method])) {
            return PEAR::raiseError("$method is not a supported authentication method");
        }

        if (!is_callable($this->auth_methods[$method], false)) {
            return PEAR::raiseError("$method authentication method cannot be called");
        }

        if (is_array($this->auth_methods[$method])) {
            list($object, $method) = $this->auth_methods[$method];
            $result = $object->{$method}($uid, $pwd, $authz, $this);
        } else {
            $func   = $this->auth_methods[$method];
            $result = $func($uid, $pwd, $authz, $this);
        }

        /* If an error was encountered, return the PEAR_Error object. */
        if (PEAR::isError($result)) {
            return $result;
        }

        return true;
    }
public function auth($uid, $pwd , $method = '', $tls = true, $authz = '')
    {
        /* We can only attempt a TLS connection if one has been requested,
         * 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. */
        if ($tls && version_compare(PHP_VERSION, '5.1.0', '>=')
            && extension_loaded('openssl') && isset($this->esmtp['STARTTLS'])
            && strncasecmp($this->host, 'ssl://', 6) !== 0
        ) {
            /* Start the TLS connection attempt. */
            if (PEAR::isError($result = $this->put('STARTTLS'))) {
                return $result;
            }
            if (PEAR::isError($result = $this->parseResponse(220))) {
                return $result;
            }
            if (isset($this->socket_options['ssl']['crypto_method'])) {
                $crypto_method = $this->socket_options['ssl']['crypto_method'];
            } else {
                /* STREAM_CRYPTO_METHOD_TLS_ANY_CLIENT constant does not exist
                 * and STREAM_CRYPTO_METHOD_SSLv23_CLIENT constant is
                 * inconsistent across PHP versions. */
                $crypto_method = STREAM_CRYPTO_METHOD_TLS_CLIENT
                                 | @STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT
                                 | @STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT;
            }
            if (PEAR::isError($result = $this->socket->enableCrypto(true, $crypto_method))) {
                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'])) {
            return PEAR::raiseError('SMTP server does not support authentication');
        }

        /* If no method has been specified, get the name of the best
         * supported method advertised by the SMTP server. */
        if (empty($method)) {
            if (PEAR::isError($method = $this->getBestAuthMethod())) {
                /* Return the PEAR_Error object from _getBestAuthMethod(). */
                return $method;
            }
        } else {
            $method = strtoupper($method);
            if (!array_key_exists($method, $this->auth_methods)) {
                return PEAR::raiseError("$method is not a supported authentication method");
            }
        }

        if (!isset($this->auth_methods[$method])) {
            return PEAR::raiseError("$method is not a supported authentication method");
        }

        if (!is_callable($this->auth_methods[$method], false)) {
            return PEAR::raiseError("$method authentication method cannot be called");
        }

        if (is_array($this->auth_methods[$method])) {
            list($object, $method) = $this->auth_methods[$method];
            $result = $object->{$method}($uid, $pwd, $authz, $this);
        } else {
            $func   = $this->auth_methods[$method];
            $result = $func($uid, $pwd, $authz, $this);
        }

        /* If an error was encountered, return the PEAR_Error object. */
        if (PEAR::isError($result)) {
            return $result;
        }

        return true;
    }
public function auth ( $ uid , $ pwd , $ method = '' , $ tls = true , $ authz = '' ) { /* We can only attempt a TLS connection if one has been requested,
         * 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. */ if ( $ tls && version_compare ( PHP_VERSION , '5.1.0' , '>=' ) && extension_loaded ( 'openssl' ) && isset ( $ this -> esmtp [ 'STARTTLS' ] ) && strncasecmp ( $ this -> host , 'ssl://' , 6 ) !== 0 ) { /* Start the TLS connection attempt. */ if ( PEAR :: isError ( $ result = $ this -> put ( 'STARTTLS' ) ) ) { return $ result ; } if ( PEAR :: isError ( $ result = $ this -> parseResponse ( 220 ) ) ) { return $ result ; } if ( isset ( $ this -> socket_options [ 'ssl' ] [ 'crypto_method' ] ) ) { $ crypto_method = $ this -> socket_options [ 'ssl' ] [ 'crypto_method' ] ; } else { /* STREAM_CRYPTO_METHOD_TLS_ANY_CLIENT constant does not exist
                 * and STREAM_CRYPTO_METHOD_SSLv23_CLIENT constant is
                 * inconsistent across PHP versions. */ $ crypto_method = STREAM_CRYPTO_METHOD_TLS_CLIENT | @ STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT | @ STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT ; } if ( PEAR :: isError ( $ result = $ this -> socket -> enableCrypto ( true , $ crypto_method ) ) ) { 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' ] ) ) { return PEAR :: raiseError ( 'SMTP server does not support authentication' ) ; } /* If no method has been specified, get the name of the best
         * supported method advertised by the SMTP server. */ if ( empty ( $ method ) ) { if ( PEAR :: isError ( $ method = $ this -> getBestAuthMethod ( ) ) ) { /* Return the PEAR_Error object from _getBestAuthMethod(). */ return $ method ; } } else { $ method = strtoupper ( $ method ) ; if ( ! array_key_exists ( $ method , $ this -> auth_methods ) ) { return PEAR :: raiseError ( "$method is not a supported authentication method" ) ; } } if ( ! isset ( $ this -> auth_methods [ $ method ] ) ) { return PEAR :: raiseError ( "$method is not a supported authentication method" ) ; } if ( ! is_callable ( $ this -> auth_methods [ $ method ] , false ) ) { return PEAR :: raiseError ( "$method authentication method cannot be called" ) ; } if ( is_array ( $ this -> auth_methods [ $ method ] ) ) { list ( $ object , $ method ) = $ this -> auth_methods [ $ method ] ; $ result = $ object -> { $ method } ( $ uid , $ pwd , $ authz , $ this ) ; } else { $ func = $ this -> auth_methods [ $ method ] ; $ result = $ func ( $ uid , $ pwd , $ authz , $ this ) ; } /* If an error was encountered, return the PEAR_Error object. */ if ( PEAR :: isError ( $ result ) ) { return $ result ; } return true ; }
Attempt to do SMTP authentication.

@param string $uid    The userid to authenticate as.
@param string $pwd    The password to authenticate with.
@param string $method The requested authentication method.  If none is
specified, the best supported method will be used.
@param bool   $tls    Flag indicating whether or not TLS should be attempted.
@param string $authz  An optional authorization identifier.  If specified, this
identifier will be used as the authorization proxy.

@return mixed Returns a PEAR_Error with an error message on any
kind of failure, or true on success.
@since 1.0
Attempt to do SMTP authentication .