PHPMailer - OpenSSL 错误

问题描述 投票:0回答:5

根据 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 = "[email protected]";
$mail->Password = "********";
$mail->setFrom('[email protected]', 'First Last');
$mail->addReplyTo('[email protected]', 'First Last');
$mail->addAddress('[email protected]', '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:第344行/opt/lampp/htdocs/webmail_client_practise/class.smtp.php中的证书验证失败 SMTP 错误:无法连接到 SMTP 主机。

注意: 我的

php.ini
文件中的 OpenSSL 扩展已打开。

php ssl phpmailer
5个回答
31
投票

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

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

正如指南所说,除非迫不得已,否则不要这样做 - 这会危及您的安全。


11
投票

我遇到了与原始问题完全相同的错误(是的,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
投票

太棒了!

对我来说也很有效。

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

现在邮件工作正常。


0
投票

我通过在我的 ubuntu 服务器上重新安装 ca-certificates 包解决了类似的问题:

sudo apt-get install --reinstall ca-certificates


0
投票

就我而言,问题出在服务器网络配置上,并且没有对所提供证书的签名机构的本地引用。服务器不允许连接到互联网,因此无法使用提供的受信任证书颁发机构 (CA) 列表验证证书有效性。在这种情况下,PHP openSSL 模块尝试使用操作系统管理的证书存储或指定的 CA 列表文件来验证证书。

此问题有以下三种解决方案:

  1. 显然,您可以在防火墙中创建规则,以启用在线验证过程。在这种情况下,您需要允许服务器连接到证书签名者的 CA 存储的 URL。要查找所需的 URL,您可以使用本文:https://www.digicert.com/kb/util/utility-test-ocsp-and-crl-access-from-a-server.htm

  2. 您可以将 CA 的公钥添加到操作系统管理的证书存储中。在 Linux 上,请按照 这篇文章 或在 Windows 上,按照 这篇文章

  3. 您可以在 php.ini 文件中配置

    openssl.cafile
    属性。 为此,您需要来自可信来源的 cacert.pem 文件,例如: https://curl.se/docs/caextract.html 下载最新版本,并在 php.ini 中引用它,如下所示:
     openssl.cafile="c:/absolute/path/to/cacert/file/cacert.pem"

以上三个选项中的任何一个都可以解决问题,选择最适合您的一个。我认为,不。 3) 作为软件开发人员最容易实现。

© www.soinside.com 2019 - 2024. All rights reserved.