PHPMailer发送邮件SMTP connect() failed,故障排除详解

建站交流5年前 (2020-09-24)14920


排除PHPMailer发送邮件故障,首先开启debug调试模式

 $mail->SMTPDebug = SMTP::DEBUG_LOWLEVEL;

debug等级介绍:

SMTP::DEBUG_OFF(0):正常生产设置; 没有调试输出。
SMTP::DEBUG_CLIENT(1):仅显示客户端->服务器消息。 不要使用它-很难告诉您任何有用的信息。
SMTP::DEBUG_SERVER(2):显示客户端->服务器和服务器->客户端消息-这通常是您想要的设置
SMTP::DEBUG_CONNECTION(3):作为2,还显示有关初始连接的详细信息; 仅在连接出现问题时才使用此功能(例如,连接超时)
SMTP::DEBUG_LOWLEVEL(4):为3,但还显示详细的底层流量。 仅对分析协议级错误非常有用,非常冗长,可能不是您所需要的。

如果开了DEBUG_LOWLEVEL调试,调试进去会看到错误提示:

stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages:error:140900

最终提示是:Could not connect to SMTP host

原因是升到php5.6后默认开启验证

添加参数,去掉验证:

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

如果是使用163邮箱发送邮件,有可能会发送不出去,是因为163邮箱开启了反垃圾邮件政策。

我的解决办法是,抄送一份给发送邮件。

$phpmailer->addCC('[email protected]', 'name');

默认情况下,PHP 5.6验证SSL证书,如果您的证书不匹配,则会出现此错误。正确的解决方案是修复您的SSL配置 - 这不是PHP的错误! 如果您正在本地发送,您可以使用isMail(),而不会通过加密层。

不过,官方的建议是,为了安全起见,还是建议大家效验ssl证书的。关于PHP是如何效验ssl证书的

在PHPMailer里效验证书的方法,是有给出配置的:

$mail->SMTPOptions = array (    'ssl' => array(        'verify_peer'  => true,
        'verify_depth' => 3,
        'allow_self_signed' => true,
        'peer_name' => 'smtp.example.com',
        'cafile' => '/etc/ssl/ca_cert.pem',
    )
);


“PHPMailer发送邮件SMTP connect() failed,故障排除详解 ” 的相关文章

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。