【问题标题】:PHPMailer - OpenSSL ErrorPHPMailer - OpenSSL 错误
【发布时间】:2015-12-18 02:05:33
【问题描述】:

根据 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 错误消息:错误:14090086:SSL 例程:SSL3_GET_SERVER_CERTIFICATE:/opt/lampp/htdocs/webmail_client_practise/class 中的证书验证失败.smtp.php 在第 344 行 SMTP 错误:无法连接到 SMTP 主机。

注意:我的 php.ini 文件中的 OpenSSL 扩展已经打开。

【问题讨论】:

    标签: php ssl phpmailer


    【解决方案1】:

    这是因为您正在运行 PHP 5.6 并且它正在验证您的证书,但您的服务器提供的证书无效,所以它失败了。 PHPMailer 和 PHP 在他们所做的事情上都是正确的——代码没有错。您可以修复您的邮件服务器,也可以按照the troubleshooting guide 中的建议进行操作,即:

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

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

    【讨论】:

    • 现在一切都变得有意义了!谢谢同步!
    • 这有帮助。谢谢:)
    • NO - 修复证书错误的正确方法是在 openssl 中安装证书颁发机构的签名证书 - gagravarr.org/writing/openssl-certs/others.shtml#ca-openssl
    • 你真的读过这个答案吗,比如它说“你不应该这样做”?这个答案来自几年前,当时这个错误的最常见原因是不是丢失或过期的 CA 证书,而是因为 ISP 透明地将 SMTP 流量重定向到他们自己的服务器,导致证书名称不匹配,这是一种更合理的特定情况,以建议的方式抑制错误。就在最近(2017 年 12 月),过期的 CA 证书一直在为 gmail 触发相同的错误,通过更新 CA 证书而不是抑制确实会更好地解决这个问题。
    【解决方案2】:

    我遇到了与原始问题完全相同的错误(是 4 年后),并且能够通过更改 class.smtp.php 中的以下内容(在 /includes/classes 和 /admin/includes /classes 如果它们存在 - 否则仅在 PHPMailer 主目录中)。

    变化:

    STREAM_CRYPTO_METHOD_TLS_CLIENT
    

    到:

    STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT
    

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

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

    【讨论】:

    • 这应该是认可的答案!不妥协,但提高安全性! +1
    • 这也是我的问题 - 通过 smtp.office365.com 发送电子邮件有时有效,有时无效。这完全是随机的。这也是我的解决办法。
    【解决方案3】:

    太棒了!

    对我来说也很好用。

    我将 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

    现在邮件工作正常。

    【讨论】:

    • 看起来这是对an answer to this question 的评论。如果一个答案解决了您的问题,并且您有关于您如何使用您想要分享的答案的有用详细信息,那么您将能够以 50 名声望对这些详细信息发表评论。在此之前,其他答案的 cmets 不应作为新答案提交。您可以通过提供有用且详细的答案、提出清晰详细的问题以及提出有用的修改建议来获得声誉。
    猜你喜欢
    • 1970-01-01
    • 2010-09-24
    • 2023-03-30
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多