我在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中没有任何警告。
如何捕获该错误,因此我知道存在问题但仍然会发送消息?
答案 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');
答案 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 限制 也可以直接)
b) 或者同样的事情可以通过调整设置来完成(直接去< strong>Home »Server Configuration »Tweak Settings 或者您可以点击上图中显示的调整设置链接)
答案 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子级别)中退出,其中*是一个组包含多个邮件帐户。
你必须去:
您将看到您的邮件服务器属于哪个组,因此您将知道在mail.php中使用哪个主机。
我的是homiemail-sub4,然后我用了 'host'=&gt; 'sub4.mail.dreamhost.com',
然后没有证书问题。 如果使用来自其他提供商的邮件服务器,则尝试检查它是否也用于您的邮件证书。