我将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的变化有关(我对此并不满意)。
-
verify_peer和verify_peer_name现在默认设置为true -在流端口涉及的两台机器之间需要额外的安全级别。当我处理SMTP时,我不希望这样,STARTTLS加密对我来说已经足够了。把这些关掉我在net/smtp。php文件
中添加了一些代码$ =选项数组("ssl"=>数组(verify_peer_name => false,"verify_peer"=> false));
$ = $ this ->结果_socket ->连接($ this ->主机,$ this ->港口,
-
php.ini中指定的套接字超时默认值未被此函数使用。所以我将'smtp.php'中的默认值更改为:
$timeout = 60;
希望这能帮助到别人。干杯穆雷