前景提要
在博客中安装 Comment2Mail 插件时,在所有配置正确的情况下,测试邮件功能提示 exception 'PHPMailer\PHPMailer\Exception' with message 'SMTP connect() failed.
;
按照提示,在 https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting 页面中对所列举的导致出现这个报错的几个解决方案进行了尝试都没有解决掉;
下图是我的 Comment2Mail 插件配置:
尝试过的解决方案:
- 邮件服务器是否正常;
- 防火墙设置;
- 是否开启了 IPv6;
- PHP 环境是否开启了 php_openssl 和 php_sockets 扩展,在 php.ini 文件中设置;
- 协议或者端口是否正确,协议 ssl 和 tls 切换试试,端口 25/587;
- 是否开启 IMAP/SMTP 服务(去邮箱设置开启),这个一般邮箱服务商都是默认开启的;
得益于我的电脑和远程服务器上各有一套开发环境,然后本地开发环境是可以正常发送测试邮件的,服务器环境提示以上错误,所以上述解决方案中 1、2、5、6 都可以排除了;
检查了服务器配置,PHP 环境确实没有开启 php_openssl 和 php_sockets 扩展,开启后测试,依然报错;
排查 IPv6 服务器是开启的,然后按照 https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting 的解决方案设置,还是不行;
偶然看到 PHPmailer 可以开启 Debug 模式,设置 $mail->SMTPDebug = 4;
;
设置之后就能看到详细的报错信息了:
提示 OpenSSL Error messages:error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify
;
查了一下这个是因为域名配置 HTTPS 协议,SSL 需要验证服务器证书,这时才想起来博客的域名是配置了 HTTPS 的;继而查到了解决方案,在 PHPmailer 的配置中添加以下配置:
$mail->SMTPOptions = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
)
);
这时候再发送邮件显示成功了;
最后又翻看 https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting 页面时才发现是有关于 CA 证书的处理方法的;
所以以后一定要【仔细】看官方文档;