无法连接到GMail SMTP(PHPMailer)-证书验证失败

无法连接到GMail SMTP(PHPMailer)-证书验证失败,php,smtp,gmail,phpmailer,Php,Smtp,Gmail,Phpmailer,最近在尝试通过SMTP和GMail发送邮件时遇到此错误 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 in C:\xampp\htdocs\portal\libraries\php_ma

最近在尝试通过SMTP和GMail发送邮件时遇到此错误

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 in C:\xampp\htdocs\portal\libraries\php_mailer\class.smtp.php on line 343
2017-12-05 09:48:03 SMTP Error: Could not connect to SMTP host. 
2017-12-05 09:48:03 CLIENT -> SERVER: QUIT 
2017-12-05 09:48:03 SMTP ERROR: QUIT command failed:
服务器地址为,SSL配置似乎正确(通过在线检查验证)

PHPMailer代码是

$mail = new PHPMailer();
$mail->isSMTP();
$mail->Host = "smtp.gmail.com";
$mail->SMTPAuth = true;
$mail->Username = $this->_config["EmailUser"];
$mail->Password = $this->_config["EmailPass"];
$mail->SMTPSecure = "tls";
$mail->SMTPDebug = 1;
$mail->Port = 587;
$mail->FromName = $this->_config["Brand"];  
$mail->From     = $this->_config["EmailFrom"];
$mail->AddCC("...emailAddress...");
$mail->Subject  = "...subject...";
$mail->Body     = "...content...";
$mail->IsHTML(true);  
$mail->WordWrap = 50;
if(!$mail->Send()) {
    echo ' Message was not sent.';
    echo 'Mailer error: ' . $mail->ErrorInfo;
}
我们已经阅读了文档,其中建议了证书问题,尽管如上所述,SSL设置似乎还不错。我已经在其他地方研究过这个问题,最流行的建议是绕过SSL(它可以工作),但是我不希望这样做

'context' => [
    'ssl' => [
        'verify_peer' => false,
        'verify_peer_name' => false,
        'allow_self_signed' => true
    ]
]
修正了我的问题 我在windows php环境中通过下载一个更新的根证书文件并将php.ini文件指向它,解决了这个问题。 问题似乎不在于gmail的证书,而在于一个过时的根证书文件,因为windows server 2012不再自动更新该文件。从此处下载cacert.pem:。然后在php.ini中使用以下行指向它(假设您已经安装了openssl.dll)

openssl.cafile={服务器上文件的路径}\cacert.pem

这修复了它,我不再需要像建议的那样绕过SSL/TLS验证。最终,我需要让windows使用GPO或WSU自动更新根证书。请参见《我的固定问题》 我在windows php环境中通过下载一个更新的根证书文件并将php.ini文件指向它,解决了这个问题。 问题似乎不在于gmail的证书,而在于一个过时的根证书文件,因为windows server 2012不再自动更新该文件。从此处下载cacert.pem:。然后在php.ini中使用以下行指向它(假设您已经安装了openssl.dll)

openssl.cafile={服务器上文件的路径}\cacert.pem


这修复了它,我不再需要像建议的那样绕过SSL/TLS验证。最终,我需要让windows使用GPO或WSU自动更新根证书。请参阅

在您自己的站点上发送邮件时的SSL问题与证书无关;这与Gmail的证书以及你的操作系统如何验证它们有关。最重要的是设置
SMTPDebug=2
(如指南所述),这样您就可以看到服务器的响应,否则您就瞎了眼。请使用最新版本的PHPMailer。Nick,你应该检查Jason的答案,如果它解决了你的问题,你应该接受它。检查后,Jason的答案有效-为延迟将问题标记为已解决而道歉。发送邮件时的SSL问题与你自己网站上的证书无关;这与Gmail的证书以及你的操作系统如何验证它们有关。最重要的是设置
SMTPDebug=2
(如指南所述),这样您就可以看到服务器的响应,否则您就瞎了眼。请使用最新版本的PHPMailer。Nick,你应该检查Jason的答案,如果它解决了你的问题,你应该接受它。检查,Jason的答案有效-为延迟将问题标记为已解决而道歉。从我在这里看到的所有帖子来看,这是唯一的实际修复。谢谢你,杰森。从我在这里看到的所有帖子来看,这是唯一的实际修复。谢谢你,杰森。