Laravel邮件本地正常但生产服务器无法发送问题求助
咱们先梳理下你遇到的核心情况:本地环境用Laravel通过Gmail SMTP发邮件完全正常,但部署到生产服务器后就失效了,试过开启低安全应用、切换到sendmail都没解决。下面我给你拆解几个生产环境常见的坑,以及对应的解决办法:
1. 优先检查Gmail账户的安全设置(别再依赖“低安全应用”了)
谷歌现在已经逐步淘汰了“允许低安全性应用访问”这个选项,取而代之的是两步验证+应用密码的方案,这才是当前Gmail SMTP认证的标准方式:
- 先确保你的谷歌账户开启了两步验证(没开的话去账户安全页开启)
- 进入谷歌账户【安全性】页面,找到【应用密码】选项(只有开了两步验证才会显示)
- 创建一个专门给Laravel邮件用的应用密码,把这个密码替换掉
.env里的MAIL_PASSWORD
2. 排查生产服务器的端口/防火墙限制
很多生产服务器会对外出的SMTP端口做拦截,尤其是465(SSL)或587(TLS)端口。你可以在服务器上用命令测试连通性:
# 测试465端口 telnet smtp.gmail.com 465 # 测试587端口 telnet smtp.gmail.com 587
如果连接失败,说明服务器防火墙或服务商封了端口,要么联系服务商解封,要么改用服务器自带的sendmail/postfix服务(前提是服务正常运行)。
3. 别忘清除Laravel的配置缓存
生产环境下Laravel会缓存配置文件,如果你修改了.env里的邮件配置,必须清除缓存才能生效:
# 清除旧的配置缓存 php artisan config:clear # 修改配置后重新缓存(可选) php artisan config:cache
这是很多人容易忽略的点——改了配置但没清缓存,应用一直用旧的设置在跑。
4. 切换到TLS端口试试兼容性
有时候SSL(465)在某些服务器上会有兼容性问题,你可以试试切换到TLS端口587,修改.env配置:
MAIL_DRIVER=smtp MAIL_HOST=smtp.gmail.com MAIL_PORT=587 MAIL_USERNAME=pranav.bitware@gmail.com MAIL_PASSWORD=你的应用密码 MAIL_ENCRYPTION=tls MAIL_FROM_ADDRESS=pranav.bitware@gmail.com MAIL_FROM_NAME="你的发件人名称"
修改后记得执行配置缓存清除命令。
5. Sendmail模式的细节排查
如果切换到sendmail还是不行,先确认服务器上的sendmail服务状态:
# 检查服务状态 service sendmail status # 重启服务(如果异常) service sendmail restart
另外要确保Laravel的sendmail路径配置正确,打开config/mail.php查看:
'sendmail' => '/usr/sbin/sendmail -bs',
如果路径不对,用which sendmail命令查看服务器上的实际路径,替换进去即可。
6. 查看日志定位具体错误
如果上面的方法都没用,一定要去看Laravel的日志文件(默认在storage/logs/laravel.log),里面会有具体的报错信息——比如认证失败、连接超时、端口不通等,根据日志信息再针对性解决会高效得多。
内容的提问来源于stack exchange,提问作者Pranav Mandlik

