
本文详解 laravel 8 中使用 gmail smtp 发送邮件时出现 “failed loading cafile stream” 错误的原因及修复方法,核心是通过 homebrew 重装 openssl 并校准证书路径。
本文详解 laravel 8 中使用 gmail smtp 发送邮件时出现 “failed loading cafile stream” 错误的原因及修复方法,核心是通过 homebrew 重装 openssl 并校准证书路径。
在 Laravel 8 中配置 Gmail SMTP(如 MAIL_MAILER=smtp、MAIL_HOST=smtp.gmail.com)后,若遇到如下异常:
Swift_TransportException: Connection could not be established with host smtp.gmail.com : failed loading cafile stream: /opt/homebrew/etc/[email protected]/cert.pem
该错误并非 Laravel 或 Swift Mailer 配置问题,而是 PHP 的 OpenSSL 扩展无法正确加载系统 CA 证书包(CA bundle),常见于 macOS 使用 Homebrew 安装 PHP 和 OpenSSL 的开发环境。
? 根本原因
Homebrew 更新或重装 OpenSSL 后,其证书文件路径(如 /opt/homebrew/etc/[email protected]/cert.pem)可能失效或权限异常;而 PHP 的 openssl.cafile 或 curl.cainfo 配置仍指向该旧路径,导致 TLS 握手时无法验证 Gmail 服务器证书,连接被拒绝。
✅ 解决方案:重装 OpenSSL 并刷新证书
在终端执行以下命令(适用于 Apple Silicon Mac,路径为 /opt/homebrew;Intel Mac 请将 /opt/homebrew 替换为 /usr/local):
brew reinstall [email protected]
该命令会:
- 卸载并重新安装 OpenSSL 1.1(Laravel 8 兼容性更稳定);
- 自动重建并部署最新 CA 证书包(
cert.pem)到标准路径; - 修复文件权限与符号链接,确保 PHP 可读取。
? 补充建议:运行后可手动验证证书路径是否有效:
ls -l /opt/homebrew/etc/[email protected]/cert.pem若输出显示文件存在且权限为
-rw-r--r--,说明已就绪。
?️ (可选)显式配置 PHP 的 CA 路径
为避免未来因环境变更再次出错,推荐在 php.ini 中显式指定 CA 文件路径:
; 编辑 php.ini(可通过 `php --ini` 查找位置) openssl.cafile=/opt/homebrew/etc/[email protected]/cert.pem curl.cainfo=/opt/homebrew/etc/[email protected]/cert.pem
修改后重启 Web 服务器(如 brew services restart php)或 PHP-FPM。
✅ 验证修复
运行以下 Artisan 命令测试邮件连通性(需已配置 .env 中的 Gmail 凭据与应用专用密码):
php artisan tinker
>>> Mail::raw('Test email body', function ($message) { $message->to('your@email.com')->subject('Test from Laravel'); });
无异常即表示 TLS 连接与证书验证已恢复正常。
⚠️ 注意事项
- Gmail SMTP 要求启用「两步验证」并生成「应用专用密码」,不可使用账户明文密码;
- 确保
MAIL_ENCRYPTION=tls(Gmail 端口 587)或ssl(端口 465),避免协议不匹配; - 若使用 Valet、Laravel Sail 或 Docker,请确认容器内同样安装了有效 OpenSSL 并挂载了证书路径。
通过重装 [email protected],你不仅修复了证书加载路径,也同步更新了安全协议支持,为后续 HTTPS、API 调用等 TLS 场景奠定可靠基础。











