
Laravel 8 使用 Gmail SMTP 发送邮件时出现 “failed loading cafile stream” 错误,本质是 PHP 无法读取 OpenSSL CA 证书路径,通常由 Homebrew 安装的 openssl@3 证书配置缺失或路径错误导致。
laravel 8 使用 gmail smtp 发送邮件时出现 “failed loading cafile stream” 错误,本质是 php 无法读取 openssl ca 证书路径,通常由 homebrew 安装的 openssl@3 证书配置缺失或路径错误导致。
该错误完整提示为:
Swift_TransportException: Connection could not be established with host smtp.gmail.com : failed loading cafile stream: /opt/homebrew/etc/openssl@3/cert.pem
它表明 Laravel(通过 Swift Mailer)在建立 TLS 连接时,尝试加载指定路径下的 CA 证书文件失败——文件不存在、权限不足,或路径与当前安装的 OpenSSL 版本不匹配。
? 根本原因
macOS 上使用 Homebrew 安装 PHP(如 via php@8.2)时,PHP 默认会查找 openssl@3 提供的证书 bundle。但 openssl@3 自 2023 年起不再自动链接 cert.pem 到 /opt/homebrew/etc/openssl@3/cert.pem,而是将证书生成逻辑交由 mk-ca-bundle.pl 脚本管理,导致该路径为空或无效。
✅ 推荐解决方案:重装并生成证书
在终端中执行以下命令(确保已安装 Homebrew):
brew reinstall openssl@3
该命令会:
- 重新安装
openssl@3; - 自动运行证书生成脚本(
mk-ca-bundle.pl),在/opt/homebrew/etc/openssl@3/cert.pem创建有效证书链文件; - 修复 PHP 的
openssl.cafile配置依赖。
? 补充验证:执行
ls -l /opt/homebrew/etc/openssl@3/cert.pem确认文件存在且大小 > 100KB;也可运行php -r "print_r(openssl_get_cert_locations());"检查 PHP 实际读取的cafile路径是否一致。
⚙️ 其他可选方案(不推荐优先使用)
-
临时绕过(仅开发环境):在
.env中设置MAIL_ENCRYPTION=tls(非ssl)并确保端口为587,但不解决证书问题,且存在安全风险; -
手动指定证书路径:在
php.ini中显式配置openssl.cafile=/opt/homebrew/etc/openssl@3/cert.pem,但需确保路径真实存在——而brew reinstall openssl@3已一并解决此前提。
✅ 验证修复效果
完成重装后,运行以下命令测试邮件发送是否恢复正常:
php artisan tinker
>>> Mail::raw('Test email body', function ($m) { $m->to('your@email.com')->subject('Test'); });若无异常抛出,即表示 SMTP 连接与证书加载均已恢复。
总结:该问题并非 Laravel 或 Gmail 配置错误,而是 macOS + Homebrew + OpenSSL 版本演进引发的证书路径断裂。brew reinstall openssl@3 是最直接、安全且符合官方维护规范的修复方式,无需修改 Laravel 代码或降级组件。


















