WordPress 升级 PHP 8 后 QQ 邮箱 SMTP 无法发送邮件的排查与解决方法

WordPress 升级 PHP 8 后 QQ 邮箱 SMTP 无法发送邮件的排查与解决方法
SmallJiaWordPress 升级 PHP 8 后 QQ 邮箱 SMTP 无法发送邮件的排查与解决方法
如果你的 WordPress 网站原本在 PHP 7.x 下可以正常使用 QQ 邮箱 SMTP 发信,但升级到 PHP 8.0、8.1、8.2、8.3 或 8.4 后突然无法发送邮件,并出现类似:
1 | SMTP Error: Could not connect to SMTP host |
那么问题通常并不是 QQ 邮箱不支持 PHP 8,而是 PHP 8 环境中的 SSL/TLS CA 证书配置异常。
本文记录一次实际排查过程和最终解决方法,方便以后快速处理。

一、问题表现
WordPress 使用 WP Mail SMTP 配置 QQ 邮箱:
1 | SMTP Host: smtp.qq.com |
QQ 邮箱授权码也填写正确。
但测试邮件发送失败。
错误日志类似:
1 | PHP: 8.4.2 |
关键错误:
1 | SMTP Error: Could not connect to SMTP host |
其中最关键的一句是:
1 | certificate verify failed |
这说明 PHP 已经尝试连接 QQ SMTP 服务器,但是在 SSL/TLS 握手阶段无法验证服务器证书。
二、真正的问题原因
正常发送流程大致是:
1 | WordPress |
本次故障发生在:
1 | 验证 QQ SMTP 服务器证书 |
因此实际上还没有进入:
1 | QQ邮箱用户名 |
这些步骤。
也就是说:
问题不是 QQ 邮箱密码、授权码或 SMTP 地址错误,而是 PHP/OpenSSL 无法找到正确的 CA 根证书来验证
smtp.qq.com的证书。
三、为什么 PHP 7 可以,PHP 8 却不行
PHP 7 和 PHP 8 往往并不是共用同一套运行环境。
虚拟主机升级 PHP 后,可能同时变化:
1 | php.ini |
因此经常会出现:
1 | PHP 7.4 |
这并不代表 QQ SMTP 不支持 PHP 8,而是 PHP 8 环境没有正确配置 CA 证书。
四、第一次尝试:在 PHPMailer 中指定 WordPress CA
WordPress 本身自带一个 CA 证书文件:
1 | /wp-includes/certificates/ca-bundle.crt |
因此可以尝试在 functions.php 中指定 CA 文件。
例如:
1 | add_action( 'phpmailer_init', function ( $phpmailer ) { |
但是实际测试后仍然报错。
日志虽然显示:
1 | cafile => /data/user/htdocs/wp-includes/certificates/ca-bundle.crt |
但仍然出现:
1 | stream_socket_client not available, falling back to fsockopen |
这说明当前虚拟主机无法使用:
1 | stream_socket_client |
PHPMailer 因此退回使用:
1 | fsockopen |
这种情况下,仅通过 PHPMailer 的 SMTPOptions 指定 CA 文件并没有解决底层证书验证问题。
五、最终解决方法:使用 .user.ini
由于虚拟主机没有开放完整的 php.ini 设置权限,因此无法直接修改:
1 | openssl.cafile |
最终使用 .user.ini 成功解决。
第一步:进入 WordPress 网站根目录
例如:
1 | /data/user/htdocs/ |
这个目录通常可以看到:
1 | wp-admin |
六、新建 .user.ini
在 WordPress 根目录新建文件:
1 | .user.ini |
注意文件名前面有一个英文句点 .。
文件内容只需要写:
1 | openssl.cafile="/data/user/htdocs/wp-includes/certificates/ca-bundle.crt" |
保存即可。
如果原本已经存在 .user.ini,不要删除原有内容,只需要在最后增加:
1 | openssl.cafile="/data/user/htdocs/wp-includes/certificates/ca-bundle.crt" |
七、等待配置生效
很多虚拟主机使用 PHP-FPM。
.user.ini 修改后不一定立即生效。
建议等待:
1 | 5~10分钟 |
然后重新进入:
1 | WordPress后台 |
再次发送测试邮件。
八、最终测试结果
增加:
1 | openssl.cafile="/data/user/htdocs/wp-includes/certificates/ca-bundle.crt" |
后,测试邮件成功发送。
WP Mail SMTP 显示:
1 | Test email sent successfully! |
说明问题已经定位并解决。
九、最终保留的配置
QQ 邮箱 SMTP 保持:
1 | SMTP Host: smtp.qq.com |
SMTP 用户名:
1 | 完整QQ邮箱地址 |
例如:
1 | 123456@qq.com |
SMTP 密码:
1 | QQ邮箱生成的SMTP授权码 |
不是 QQ 登录密码。
WordPress 根目录保留:
1 | .user.ini |
内容:
1 | openssl.cafile="/data/user/htdocs/wp-includes/certificates/ca-bundle.crt" |
之前为了测试而加入子主题 functions.php 的 PHPMailer CA 代码可以删除,因为已经不再需要。
十、不要使用这种错误解决方法
网上有很多教程会建议关闭 SSL 证书验证:
1 | 'verify_peer' => false, |
虽然这样可能可以立即发送邮件,但并不推荐。
因为它本质上是:
1 | 不再验证 SMTP 服务器证书 |
并没有真正解决 CA 证书问题。
正确做法应该是:
1 | verify_peer = true |
并为 PHP 指定正确的 CA 根证书文件。
十一、完整故障链总结
整个问题可以简化为:
1 | PHP 7.x 下 SMTP 正常 |
十二、如果仍然无法发送,可以继续检查
如果添加 .user.ini 后仍然失败,可以检查:
1 | openssl.cafile |
如果日志仍然出现:
1 | stream_socket_client not available |
说明虚拟主机可能禁用了这个函数。
如果仍然出现:
1 | certificate verify failed |
说明 .user.ini 可能没有生效,或者 CA 文件路径填写错误。
最终结论
QQ 邮箱 SMTP 可以正常运行在 PHP 8.x 环境中。
如果升级 PHP 后出现:
1 | certificate verify failed |
应优先检查 PHP/OpenSSL 的 CA 根证书配置,而不是反复修改:
1 | SMTP授权码 |
对于无法直接修改 php.ini 的虚拟主机,一个非常实用的解决办法就是在 WordPress 根目录创建:
1 | .user.ini |
并写入:
1 | openssl.cafile="/data/user/htdocs/wp-includes/certificates/ca-bundle.crt" |
本次实际测试中,该方法成功解决了 PHP 8.4 环境下 QQ 邮箱 SMTP 无法发送邮件的问题。











