XAMPP 中 PHPMailer SMTP 连接失败主因是 OpenSSL 缺失可信 CA 证书;需下载 cacert.pem 并在 php.ini 中正确配置 openssl.cafile 路径,重启后验证路径生效,方可完成 TLS 握手。
XAMPP 本地开发环境默认不提供可信任的 SSL/TLS 证书,直接用 PHPMailer 连 Gmail、QQ 等外部 SMTP 服务时,SMTP connect() failed 报错往往不是配置错,而是 OpenSSL 拒绝验证对方证书链——尤其在 Windows 上启用 openssl.cafile 后仍失败,说明本地 CA 证书缺失或路径无效。
PHPMailer 调用 OpenSSL 建立连接时,会校验 SMTP 服务器(如 smtp.gmail.com)返回的证书是否由可信 CA 签发。XAMPP 自带的 PHP 不自带完整 CA 证书包(cacert.pem),且 php.ini 中的 openssl.cafile 默认为空或指向不存在路径。结果就是:端口连得上,但 TLS 协商失败,send() 抛出超时或空错误。
SMTP connect() failed + stream_socket_enable_crypto(): SSL operation failed(日志里可见)extension=openssl,也不等于有可用 CA 包curl 可能通但 PHP 的 OpenSSL 不通,因两者证书路径独立最直接有效的方式是下载权威 CA 包并显式告诉 PHP 使用它。不要依赖系统证书,XAMPP 是隔离环境。
cacert.pem:访问 https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251,保存为 C:xamppphpextrassslcacert.pem(路径可自定义,但需一致)C:xamppphpphp.ini,取消注释并修改:openssl.cafile="C:xamppphpextrassslcacert.pem"
php -r "print_r(openssl_get_cert_locations());" 确认输出中 default_cert_file 指向你刚设的路径$mail->SMTPSecure = 'tls' 或 'ssl' 就能走通某些托管环境(如 OVH 共享主机)可能屏蔽了证书下载或限制了 OpenSSL 行为,此时强制跳过验证是唯一快速验证逻辑的方式——但仅限本地调试或测试,生产环境禁止。
立即学习“PHP免费学习笔记(深入)”;
send() 前加一行:$mail->SMTPOptions = ['ssl' => ['verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true]];
ssl0.ovh.net:465,先加这行确认是否纯证书问题;确认后立刻删掉,改用真实证书方案verify_peer_name = false 必须和 verify_peer = false 同时设,否则 PHP 7.4+ 会报 warning 并拒绝连接本地 XAMPP 不需要生成自签名证书、不用配 Nginx/Apache SSL、更不用折腾 Let’s Encrypt。你只是让 PHP 能验证远端 SMTP 服务器的证书,而不是让浏览器访问你的 localhost。重点始终是:确保 openssl.cafile 指向有效的 CA 包,且路径中不含中文、空格或长路径名(Windows 下尤其敏感)。很多“配置成功但发不出”的案例,根源只是 cacert.pem 放在桌面,而 php.ini 里写了 "C:Users张三Desktopcacert.pem" —— PHP 解析失败,静默回退到无证书状态。
语言模型能帮白领解决哪些日常问题:附超实用实战场景与选型攻略
第一次用 Gemini 3.5 如何选择任务?新手可以试试这 5 个实操场景(附避坑指南)
Gemini 3.5 到底是什么:普通人怎样选:一篇看懂它的定位与实操指南
AI写公众号/头条文章怎么用?从选题到润色的4步实战教程与避坑指南
Claude 4.8 写 PRD 怎么选:从需求分析到验收标准的实战教程
Claude 4.8准备面试怎么选:岗位分析与模拟问答避坑指南