Laravel邮件发送异常求助:发件箱有副本但收件方未收到
我碰到过好几个和你一模一样的情况——发件箱能看到副本,但收件方完全没踪影(垃圾邮件里也找不到),结合你的配置和代码,给你梳理几个最可能的问题点和解决步骤:
1. Gmail SMTP 密码用错了(最常见的坑)
如果你的Gmail账号开了两步验证(2FA),直接填登录密码当MAIL_PASSWORD肯定不行,必须去生成一个应用专用密码(App Password):
- 登进你的Google账号,进入「安全」设置页
- 找到「应用专用密码」选项(前提是已经开启2FA)
- 生成一个16位的密码,替换掉
.env里的MAIL_PASSWORD
要是没开2FA,现在Gmail也已经取消了「不太安全的应用访问」选项,还是得先开2FA再用App Password,这是目前唯一合法的SMTP验证方式。
2. 发件人地址和配置的MAIL_USERNAME不匹配
你的.env里MAIL_USERNAME是email@gmail.com,但代码里from写的是mail@gmail.com——这会直接触发邮件服务商的SPF/DKIM验证失败,邮件会被悄悄拦截(不会进垃圾邮件,直接被丢弃)。
把代码里的发件人改成和MAIL_USERNAME一致就行:
$message->from('email@gmail.com', 'Administrator');
3. 配置缓存没更新
你执行了php artisan config:cache,但如果之后修改过.env,得先清除旧缓存再重新生成:
# 先清掉旧缓存 php artisan config:clear # 开发环境其实不用缓存配置,嫌麻烦的话这步可以跳过 php artisan config:cache
开发阶段真的不建议开配置缓存,每次改个参数都要清缓存,太折腾。
4. 查看Laravel日志里的隐藏错误
有时候邮件发送看起来成功,但底层其实有错误(比如验证失败)。去storage/logs/laravel.log里搜搜和邮件相关的日志,比如有没有Swift_TransportException这类报错,能直接帮你定位问题。
5. 换个收件邮箱测试试试
有时候同一个Gmail账号给自己发邮件,会被Google的内部规则处理,可能不会出现在收件箱里。你换个非Gmail邮箱(比如Outlook、QQ邮箱)试试,看看能不能收到,排除是收件方Gmail的特殊规则问题。
按上面的步骤挨个排查,应该就能解决问题了。
内容的提问来源于stack exchange,提问作者Morphi

