我正在配置一个Magento1.9.1使用外部SMTP发送电子邮件,使用SMTP PRO (https://www.magentocommerce.com/magento-connect/smtp-pro-email-free-custom-smtp-email.html)。
我已经设置了配置(主机名、端口、用户名、密码),但当我试图发送测试电子邮件时,它会失败,出现“无法打开套接字”错误消息。如果深入研究代码,就会发现此错误是从lib/Zend/Mail/Protocol/acuact.php中的代码中生成的:
$this->_socket = @stream_socket_client($remote, $errorNum, $errorStr, self::TIMEOUT_CONNECTION);
if ($this->_socket === false) {
if ($errorNum == 0) {
$errorStr = $remote.' Could not open socket '.phpversion();
}
/**
* @see Zend_Mail_Protocol_Exception
*/
#require_once 'Zend/Mail/Protocol/Exception.php';
throw new Zend_Mail_Protocol_Exception($errorStr);
}我的PHP环境(5.6.30)支持openssl (请参阅下面的图片和片段)

[root@ns3023903 httpdocs]# php -r 'print_r(stream_get_transports());'
Array
(
[0] => tcp
[1] => udp
[2] => unix
[3] => udg
[4] => ssl
[5] => sslv3
[6] => sslv2
[7] => tls
)没有防火墙问题,因为我既可以将端口465上的telnet发送到目标主机,也可以使用phpmailer与运行站点虚拟主机的用户使用相同的SMTP发送电子邮件。
我在CentOS 7 64位服务器上,禁用了SELinux,如果这很重要,我将使用Plesk 12来配置虚拟主机。
名称解析也正常工作(我可以正确地平分SMTP名称,并且IP地址被查找得很好)。
我显然错过了什么here...but什么?
发布于 2017-06-14 17:06:00
结果发现,在PHP5.6.30版本中,stream_socket_client()假定的默认选项发生了变化。
首先,在摆脱Magento核心代码中的stream_socket_client调用之前的愚蠢@之前,我实际上无法理解到底发生了什么。我甚至与PHP开发人员并不亲近,所以我总是忘记这个愚蠢的@前缀是什么(老实说,我甚至不知道它为什么存在)。
删除@我看到了以下内容:
Warning: stream_socket_client(): Peer certificate CN=`*.aruba.it' did not match expected CN=`mail.myclientreserveddomain.com'我看了一下PHP文档,并给出了核心代码的两行差异(我知道这是不对的,我现在就重构它,但我想先分享一下快速解决方案)。
基本上,我正在创建一个上下文,并使用另一个版本的stream_socket_client调用
$context = stream_context_create(['ssl' => [
'verify_peer' => false,
'verify_peer_name' => false
]]);
// open connection
$this->_socket = stream_socket_client($remote, $errorNum, $errorStr, 120, STREAM_CLIENT_CONNECT, $context); 跳过对等名验证是关键。不知道为什么/如何/当它从php前5.6.30变成PHP5.6.30(我说过我不是PHP吗?)但很管用。我还试图在PHP5.4.x下运行原始代码,但是没有解决办法,所以肯定是这样的。
https://stackoverflow.com/questions/44547978
复制相似问题