2017-06-14 59 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下運行原始代碼,並且它沒有解決方法,所以它確實如此。