PHPMailer生成PHP警告:stream_socket_enable_crypto():对等证书与预期不匹配

时间:2015-05-21 11:05:36

标签: php ssl openssl phpmailer

我在PHP 5.6上使用PHPMailer,在PHP 5.6中获得认证的安全性增加肯定很有趣。

我正在尝试向dreamhost上托管的域发送测试消息,PHPMailer返回的错误是:无法连接到SMTP主机。

该错误不正确,我已启用日志记录,这是实际发生的事情。

  

连接:打开mx1.sub4.homie.mail.dreamhost.com:25,   timeout = 30,options = array()连接:打开S:220   homiemail-mx32.g.dreamhost.com ESMTP

     

C:EHLO s81a.ikbb.com

     

S:250-homiemail-mx32.g.dreamhost.com 250-PIPELINING 250-SIZE 40960000   250-ETRN 250-STARTTLS 250-ENHANCEDSTATUSCODES 250 8BITMIME

     

C:STARTTLS

     

S:220 2.0.0准备启动TLS

     

C:退出

     

S:SMTP ERROR:QUIT命令失败:连接:已关闭

我无法理解为什么PHPMailer会放弃,在应该开始发送消息时发出QUIT命令。我从另一个日志中获得了另一条线索:

PHP警告:stream_socket_enable_crypto():/home/ikbb/domains/dev.ikbb.com/public_html/includes/phpmailer中的对等证书CN = *.mail.dreamhost.com' did not match expected CN= mx1.sub4.homie.mail.dreamhost.com' /5.2.10/class.smtp.php

如果我使用一些自定义选项来阻止验证他们正在使用的证书,我可以让它继续。这就是我所拥有的:

        $mail->SMTPOptions = array (
        'ssl' => array(
            'verify_peer'  => false,
            'verify_peer_name'  => false,
            'allow_self_signed' => true));

如果我将SMTPOptions放在那里并跳过对等验证,则消息正常 - 在PHP中没有任何警告。

如何捕获该错误,因此我知道存在问题但仍然会发送消息?

7 个答案:

答案 0 :(得分:67)

我遇到了同样的问题,我在PHPMailer documentation找到了答案。

PHP 5.6证书验证失败

在早期版本的更改中,PHP 5.6验证SSL连接上的证书。如果您要连接的服务器的SSL配置不正确,您将收到如下错误:

Warning: stream_socket_enable_crypto(): SSL operation failed with code 1.
OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

对此的正确解决方法是将错误,错误配置或自签名的证书替换为好的证书。如果失败,您可以通过PHPMailer 5.2.10中引入的SMTPOptions属性允许不安全的连接。 (可以通过在早期版本中继承SMTP类来实现此目的),但不建议这样做:

$mail->SMTPOptions = array(
    'ssl' => array(
        'verify_peer' => false,
        'verify_peer_name' => false,
        'allow_self_signed' => true
    )
);

您也可以在php.ini中全局更改这些设置,但这是一个非常糟糕的主意; PHP 5.6做了这个改变的原因非常充分。

有时候这种行为并不那么明显;有时加密失败可能表现为客户端在尝试执行STARTTLS后立即发出QUIT。如果您发现这种情况,则应检查证书或验证设置的状态。

答案 1 :(得分:3)

对于PHP 5.6,请使用以下内容。添加“tls://”是关键。

$mail->Host = gethostbyname('tls://smtp.gmail.com');

请参阅:http://php.net/manual/en/context.ssl.php

答案 2 :(得分:1)

对于那些使用cPanel的人,我尝试了PHPMailer中examples文件夹中的SMTP check code,我也遇到了同样的错误:

PHP Warning: stream_socket_enable_crypto(): Peer certificate  CN=*.mail.dreamhost.com' did not match expected CN=mx1.sub4.homie.mail.dreamhost.com' in /home/ikbb/domains/dev.ikbb.com/public_html/includes/phpmailer/5.2.10/class.smtp.php

我意识到这不是与PHPMailer相关的错误,所以我搜索了与CentOS相关的类似错误,我发现这个链接有些亮点:Issue sending mails through 3rd party。你必须看看" SMTP限制"在cPanel。

答案 3 :(得分:0)

在我的WordPress机器上升级到PHP 5.6之后,我遇到了类似的问题。 WPForms WP编码器(wp-mail-smtp)插件配置为使用localhost作为SMTP主机。我已将其更改为FQHN(完全限定主机名),因为它在SSL证书中定义。 在这次改变之后它运作良好。

答案 4 :(得分:0)

在WHM中禁用SMTP限制

答案 5 :(得分:0)

WHM/cPanel(s) 的解决方案:通过以下过程禁用SMTP 限制

a) 打开 WHM 并搜索 SMTP 限制,确保它已禁用。(您可以通过 主页 »安全中心 »SMTP 限制 也可以直接)

enter image description here

b) 或者同样的事情可以通过调整设置来完成(直接去< strong>Home »Server Configuration »Tweak Settings 或者您可以点击上图中显示的调整设置链接)

enter image description here

答案 6 :(得分:-1)

您可能已经解决了问题。但是,由于其他开发人员可能会坚持这一点,我会提出一些对我有用的东西。 我在使用Laravel 4.2 Swiftmailer而不是PHPMailer时遇到了同样的问题,但是使用了Dreamhost VPS帐户。我不想破解SMTP选项verify_peer,allow_self_signed或将加密从ssl设置为null。 我不想为我的Staging VPS购买专业证书,而且我还没有参加制作。

我试过的东西在mail.php中没有用:

<?php
return array(

'driver' => 'smtp',

'host' => 'mail.mywebsite-staging.com',

'port' => 25,

'from' => array('address' => 'mywebsite@mywebsite-staging.com', 'name' => 'MyWebsite Staging'),

'encryption' => 'tls',

'username' => 'mywebsite@mywebsite-staging.com',

'password' => 'myPASS',

'sendmail' => '/usr/sbin/sendmail -bs',

'pretend' => false
);
?>

我发现这个Dreamhost Certificate Domain Mismatch Error文档告诉我们,我们的邮件服务器证书从dreamhost邮件(* .mail.dreamhost.com)的子域(2子级别)中退出,其中*是一个组包含多个邮件帐户。

你必须去:

  • Dreamhost Web Panel&gt;支持&gt;数据中心

您将看到您的邮件服务器属于哪个组,因此您将知道在mail.php中使用哪个主机。

  • homiemail-sub3 =&gt; sub3.mail.dreamhost.com
  • homiemail-sub4 =&gt; sub4.mail.dreamhost.com
  • homiemail-sub5 =&gt; sub5.mail.dreamhost.com
  • homiemail-master =&gt; homie.mail.dreamhost.com

我的是homiemail-sub4,然后我用了     'host'=&gt; 'sub4.mail.dreamhost.com',

然后没有证书问题。 如果使用来自其他提供商的邮件服务器,则尝试检查它是否也用于您的邮件证书。