2017-06-14 28 views
0

我配置的Magento 1.9.1使用外部SMTP发送邮件,使用SMTP PRO(https://www.magentocommerce.com/magento-connect/smtp-pro-email-free-custom-smtp-email.html)。Zend框架无法打开SSL套接字(Abstract.php)

我设置的配置(主机名,端口,用户名,密码),但是当我尝试发送测试电子邮件失败与“无法打开套接字”错误消息。如果我深入到代码中,我看到,从这段代码在lib中产生的错误/的Zend /邮件/协议/ Abstract.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环境(30年6月5日)有OpenSSL的支持(看到图像及以下摘录) SSL Support

[[email protected] 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 
) 

没有防火墙问题,因为我可以用用PHPMailer的使用相同的用户相同的SMTP端口465上两个远程登录到目标主机或发送电子邮件我用于运行站点虚拟主机。

我是一个CentOS 7 64位服务器上,在SELinux禁用,如果该事项,我使用的Plesk 12来配置虚拟主机。

名称分辨率也工作确定(我可以正确地ping到SMTP名称和IP地址进行查找就好了)。

我明明在这里的东西......但什么?

回答

1

原来那件事,在PHP版本30年6月5日改变,在()由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文件和我想出了一个两线DIFF到核心代码(我知道这是不对的,我现在会重构它,但我想先分享快速解决方法)。

基本上我创建上下文,并使用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更改为PHP 5.6.30(我说我不是PHP开发人员?),但它工作。我也尝试在PHP 5.4.x下运行原始代码,并且它没有解决方法,所以它确实如此。