【发布时间】:2016-10-05 11:12:38
【问题描述】:
我将我在 centos 服务器上的 PHP 升级到 5.6.25 升级完成后,一切正常,但几个小时后,我接到客户的电话,称外发邮件未送达收件人。
然后我发现外发邮件是从 webmail 发送的,但是使用我们的 PHP 代码发送的邮件没有发送。
检查PHP代码结果后发现错误
身份验证失败[SMTP:STARTTLS 失败(代码:220,响应:TLS 继续)]
请帮我解决这个问题。
【问题讨论】:
我将我在 centos 服务器上的 PHP 升级到 5.6.25 升级完成后,一切正常,但几个小时后,我接到客户的电话,称外发邮件未送达收件人。
然后我发现外发邮件是从 webmail 发送的,但是使用我们的 PHP 代码发送的邮件没有发送。
检查PHP代码结果后发现错误
身份验证失败[SMTP:STARTTLS 失败(代码:220,响应:TLS 继续)]
请帮我解决这个问题。
【问题讨论】:
我找到了解决这个问题的方法...
只需转到 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 文件中添加了一些代码
$options = array('ssl' => array('verify_peer_name' => false, 'verify_peer' => false));
$result = $this->_socket->connect($this->host, $this->port, $persistent, $timeout, $options);
此函数未使用 php.ini 中指定的套接字超时默认值。所以我将'smtp.php'中的默认值更改为:
$超时 = 60; // 以前为空;
希望对其他人有所帮助。 干杯 穆雷
【讨论】: