首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Zend无法打开socket (Abstract.php)

Zend无法打开socket (Abstract.php)
EN

Stack Overflow用户
提问于 2017-06-14 14:43:39
回答 1查看 1.7K关注 0票数 1

我正在配置一个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中的代码中生成的:

代码语言:javascript
复制
$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 (请参阅下面的图片和片段)

代码语言:javascript
复制
[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什么?

EN

回答 1

Stack Overflow用户

发布于 2017-06-14 17:06:00

结果发现,在PHP5.6.30版本中,stream_socket_client()假定的默认选项发生了变化。

首先,在摆脱Magento核心代码中的stream_socket_client调用之前的愚蠢@之前,我实际上无法理解到底发生了什么。我甚至与PHP开发人员并不亲近,所以我总是忘记这个愚蠢的@前缀是什么(老实说,我甚至不知道它为什么存在)。

删除@我看到了以下内容:

代码语言:javascript
复制
Warning: stream_socket_client(): Peer certificate CN=`*.aruba.it' did not match expected CN=`mail.myclientreserveddomain.com'

我看了一下PHP文档,并给出了核心代码的两行差异(我知道这是不对的,我现在就重构它,但我想先分享一下快速解决方案)。

基本上,我正在创建一个上下文,并使用另一个版本的stream_socket_client调用

代码语言:javascript
复制
 $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下运行原始代码,但是没有解决办法,所以肯定是这样的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44547978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档