PHPMailer - OpenSSL 错误

10
根据PHPMailer提供的示例,我编写了如下脚本:
date_default_timezone_set('Etc/UTC');
require './PHPMailerAutoload.php';
$mail = new PHPMailer;
$mail->isSMTP();
$mail->SMTPDebug = 2;
$mail->Debugoutput = 'html';
$mail->Host = 'smtp.gmail.com';
$mail->Port = 587;
$mail->SMTPSecure = 'tls';
$mail->SMTPAuth = true;
$mail->Username = "myemail@example.com";
$mail->Password = "********";
$mail->setFrom('myMail@example.com', 'First Last');
$mail->addReplyTo('myEmail@example.com', 'First Last');
$mail->addAddress('toEmail@example.com', 'first last');
$mail->Subject = 'PHPMailer GMail SMTP test';
$mail->Body = "example";
$mail->AltBody = 'This is a plain-text message body';

if (!$mail->send()) {
echo "Mailer Error: " . $mail->ErrorInfo;
} else {
echo "Message sent!";
}

即使这与原始示例完全相同,我也无法使其工作。
我得到的错误是:
警告:stream_socket_enable_crypto():SSL操作失败,代码为1。 OpenSSL错误消息:error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in /opt/lampp/htdocs/webmail_client_practise/class.smtp.php on line 344 SMTP错误:无法连接到SMTP主机。
注意:我的php.ini文件中的OpenSSL扩展已经打开。
4个回答

30

这是因为您正在运行PHP 5.6,它正在验证您的证书,但您的服务器提供的证书无效,因此验证失败。 PHPMailer和PHP在执行正确 - 代码没有问题。 您可以修复您的邮件服务器,或者按照故障排除指南中建议的操作进行。

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

正如指南所说,除非必须,否则您不应该这样做 - 这将危及您的安全。


现在一切都有意义了!谢谢Synchro! - Makis
1
这很有帮助。谢谢 :) - Ali
不要使用错误的方法来修复证书错误,正确的方法是在openssl中安装证书颁发机构的签名证书 - http://gagravarr.org/writing/openssl-certs/others.shtml#ca-openssl - symcbean
你真的读了这个答案吗,比如它说“你不应该这样做”的部分?这个答案是几年前的,当时导致这个错误最常见的原因不是缺少或过期的CA证书,而是因为ISP透明地将SMTP流量重定向到他们自己的服务器,导致证书名称不匹配,在这种特定情况下,在建议的方式下抑制错误更加合理。最近(2017年12月),一个过时的CA证书已经触发了同样的gmail错误,确实更好的方法是通过更新CA证书来修复它,而不是抑制它。 - Synchro

8

我遇到了与原问题完全相同的错误(4年后),并且通过更改class.smtp.php中的以下内容(如果存在,则在/includes/classes和/admin/includes/classes中都要更改,否则只需在PHPMailer主目录中更改)来解决它。

更改为:

STREAM_CRYPTO_METHOD_TLS_CLIENT

to:

STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT

这与较新的PHP版本中TLS版本的更新有关。

来源:https://forums.oscommerce.com/topic/410367-phpmailer-tls-12/


1
这应该是被批准的答案!不是妥协,而是提高安全性!+1 - Thilo
这也是我的问题 - 通过smtp.office365.com发送电子邮件有时有效,有时无效。这完全是随机的。这也是我的解决方法。 - Nick Constantine
我也遇到了CodeIgniter-3的同样问题。当尝试使用Mailtrap发送电子邮件时,现在这个解决方案对我有用。 - Nasik Ahd

0

太好了!

我也成功地解决了这个问题。

我将 PHP 版本从 5.5.9-1ubuntu4.14(邮件正常工作)升级到了 PHP 版本 5.6.40-52+ubuntu20.04.1+deb.sury.org+1(邮件发送失败)。

现在我刚刚更新了:

STREAM_CRYPTO_METHOD_TLS_CLIENT

STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT

现在邮件又可以正常工作了。


看起来这是对此问题的答案的评论。如果一个答案解决了你的问题,并且你有关于如何使用该答案的有用细节想要分享,当你达到50个声望时,你将能够留下带有这些细节的评论。在那之前,不应将其他答案的评论提交为新答案。您可以通过提供有用和详细的答案、提出清晰和详细的问题以及建议有帮助的编辑来获得声望。 - Paul

0

我通过在我的Ubuntu服务器上重新安装ca-certificates软件包来解决了一个类似的问题:

sudo apt-get install --reinstall ca-certificates


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接