【问题标题】:Upgrading PHP results in SMTP authorization failure升级 PHP 导致 SMTP 授权失败
【发布时间】:2016-10-05 11:12:38
【问题描述】:

我将我在 centos 服务器上的 PHP 升级到 5.6.25 升级完成后,一切正常,但几个小时后,我接到客户的电话,称外发邮件未送达收件人。

然后我发现外发邮件是从 webmail 发送的,但是使用我们的 PHP 代码发送的邮件没有发送。

检查PHP代码结果后发现错误

身份验证失败[SMTP:STARTTLS 失败(代码:220,响应:TLS 继续)]

请帮我解决这个问题。

【问题讨论】:

    标签: php email smtp


    【解决方案1】:

    我找到了解决这个问题的方法...

    只需转到 usr/local/lib/php/Net 路径可能因操作系统而异,但最终它是 php 目录中的 Net 目录。

    在此目录中找到文件 SMTP.php。 在这个文件中找到这个文件中的函数 auth(--parameter list--) 他第一个 if 语句是

    if ($tls && version_compare(PHP_VERSION, '5.1.0', '>=')
            && extension_loaded('openssl') && isset($this->esmtp['STARTTLS'])
            && strncasecmp($this->host, 'ssl://', 6) !== 0
        )
    

    只需按如下方式进行更改

    if ($tls && version_compare(PHP_VERSION, '6.1.0', '>=')
            && extension_loaded('openssl') && isset($this->esmtp['STARTTLS'])
            && strncasecmp($this->host, 'ssl://', 6) !== 0
        )
    

    因为我已经更新了系统,它现在得到了以下条件,它正在检查 openssl 和 STARTTLS 并且系统在这个阶段失败

    version_compare(PHP_VERSION, '5.1.0', '>=')
    

    所以只需将您的版本更改为必须高于升级版本的其他版本,这样第一个条件就会再次为假,系统不会进一步检查,并且会在不使用 TLS 的情况下进行连接。

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题并偶然发现了解决方案,而这些显然与 PHP 5.6 中的更改有关(我对此并不满意)。

      1. verify_peer 和 verify_peer_name 现在默认设置为 true - 需要在流式端口中涉及的两台机器之间提供额外的安全级别。当我处理 SMTP 时,我不想要这个,STARTTLS 加密对我来说就足够了。 所以关闭这些我在 Net/SMTP.php 文件中添加了一些代码

        $options = array('ssl' => array('verify_peer_name' => false, 'verify_peer' => false));

        $result = $this->_socket->connect($this->host, $this->port, $persistent, $timeout, $options);

      2. 此函数未使用 php.ini 中指定的套接字超时默认值。所以我将'smtp.php'中的默认值更改为:

        $超时 = 60; // 以前为空;

      希望对其他人有所帮助。 干杯 穆雷

      【讨论】:

        猜你喜欢
        • 2017-07-09
        • 2022-09-26
        • 2015-01-10
        • 2022-09-23
        • 2021-08-08
        • 2013-07-03
        • 1970-01-01
        • 2015-12-25
        • 1970-01-01
        相关资源
        最近更新 更多