升级PHP导致SMTP授权失败


Upgrading PHP results in SMTP authorization failure

我将centos服务器上的PHP升级到5.6.25升级完成后,一切工作正常,但几个小时后,我接到客户的电话,说发送的邮件没有送到收件人。

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

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

验证失败[SMTP: STARTTLS failed (code: 220, response: TLS go ahead)]

请帮我解决这个问题

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

直接进入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连接。

我遇到了同样的麻烦,偶然发现了解决方案,这些显然与PHP 5.6的变化有关(我对此并不满意)。

  1. verify_peer和verify_peer_name现在默认设置为true -在流端口涉及的两台机器之间需要额外的安全级别。当我处理SMTP时,我不希望这样,STARTTLS加密对我来说已经足够了。把这些关掉我在net/smtp。php文件

    中添加了一些代码

    $ =选项数组("ssl"=>数组(verify_peer_name => false,"verify_peer"=> false));

    $ = $ this ->结果_socket ->连接($ this ->主机,$ this ->港口,

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

    $timeout = 60;

希望这能帮助到别人。干杯穆雷