Laravel 8 使用Gmail发邮件报stream_socket_client连接超时如何解决
问题排查与修复步骤
1. 验证服务器到Gmail SMTP的网络连通性
- 登录Ubuntu 18.04服务器,先使用telnet测试端口连通性,测试587端口运行命令:
telnet smtp.gmail.com 587,测试465端口运行命令:telnet smtp.gmail.com 465。如果返回连接超时,说明是服务器网络层面不通,和Laravel配置无关。 - 若telnet不通,运行
traceroute -T -p 587 smtp.gmail.com查看链路拦截节点,常见拦截原因包括云服务商默认封禁邮件端口、服务器本地防火墙拦截出站请求。
2. 网络层面修复方案
- 检查本地防火墙规则:运行
ufw status查看是否禁止了587/465端口的出站规则,若存在拦截则添加放行规则:ufw allow out 587、ufw allow out 465,执行完成后重载防火墙:ufw reload。 - 若使用云服务器,前往云服务商的安全组/防火墙控制台,添加587、465端口的TCP出站放行规则,部分云厂商需要单独提交申请解封邮件端口。
- 若服务器所在网络本身屏蔽Gmail服务,可配置网络代理,或更换为其他可正常访问的第三方邮件服务。
3. 确认Laravel配置正确性
- 核对.env文件内的邮件配置项,完整的Gmail标准配置如下:
MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=你的Gmail完整邮箱地址
MAIL_PASSWORD=你的Gmail密码/应用专用密码
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=你的Gmail完整邮箱地址
MAIL_FROM_NAME="${APP_NAME}"
- 注意:如果Gmail账号开启了两步验证,「less secure app」选项会自动失效,必须生成应用专用密码填入MAIL_PASSWORD字段,不能使用账号原登录密码
- 配置修改完成后运行
php artisan config:clear清空配置缓存,避免旧缓存导致配置不生效。
4. 功能验证
可以使用Laravel自带的tinker命令测试发信,确认配置生效后再走业务逻辑测试。
内容的提问来源于stack exchange,提问作者Han Hsu
相关产品推荐
相关产品推荐

