Laravel邮件配置主入口在.env,但最终生效的是config/mail.php读取的值;改完.env必须运行php artisan config:clear,否则缓存导致发信失败。

SMTP 配置写在哪?不是 .env 就是 config/mail.php
Laravel 的邮件配置主入口在 .env,但最终生效的是 config/mail.php 里读取的值。改完 .env 必须运行 php artisan config:clear,否则缓存会用旧配置发信失败。
常见错误现象:Connection could not be established with host smtp.gmail.com 或 535 Authentication failed,大概率是 .env 里填错了 MAIL_HOST、MAIL_PORT、MAIL_USERNAME(Gmail 要用 App Password,不是登录密码),或没清缓存。
-
MAIL_MAILER=smtp是必须的,别写成sendmail或留空 - Gmail 用户:开启两步验证后,
MAIL_PASSWORD填「App password」16位字母数字组合,不是邮箱密码 - QQ 邮箱:
MAIL_HOST=smtp.qq.com,MAIL_PORT=587(TLS)或465(SSL),注意端口和加密方式要匹配MAIL_ENCRYPTION=tls或ssl
发邮件时提示 Class 'App\Mail\WelcomeMail' not found
这是类名或命名空间写错,或者没生成 Mailable 类。Laravel 不允许直接用 Mail::to()->send() 写内联内容,必须走 Mailable 类。
正确做法是先生成类:php artisan make:mail WelcomeMail,然后在 app/Mail/WelcomeMail.php 里写逻辑,再用 Mail::to('x@example.com')->send(new WelcomeMail()) 调用。
- 类文件路径必须是
app/Mail/xxx.php,命名空间固定为App\Mail - 如果改过命名空间(比如加了子目录),
use语句和new实例化时必须同步更新 - 别在
build()方法里漏掉return $this,否则链式调用中断,静默失败
本地开发用 log 驱动代替真实发送
开发阶段不该真发邮件,既慢又污染收件箱。把 MAIL_MAILER 改成 log,所有邮件内容会写进 storage/logs/laravel.log,还能看到完整 HTML 和收件人信息。
这个配置只影响当前环境,.env 里设 MAIL_MAILER=log 即可,无需改代码。上线前切回 smtp 并确认其他 SMTP 参数已按生产环境配好。
-
log驱动不校验MAIL_HOST等字段,填错也不会报错,容易掩盖配置问题 - 测试模板渲染时,
log模式下看不到实际发送效果,建议配合preview路由(需启用MAIL_MAILER=smtp+ 临时配个可用的测试邮箱) - 有些第三方服务(如 Mailgun)要求域名验证,本地
log模式跳过这步,但上线前必须补上
队列发邮件为什么没反应?QUEUE_CONNECTION 和 php artisan queue:work 得配齐
加了 ->onQueue() 或用了 ShouldQueue 接口,但邮件迟迟不发,八成是队列根本没跑起来。
检查三件事:一是 .env 里 QUEUE_CONNECTION 是不是设成了 database 或 redis;二是对应数据库表(jobs)或 Redis 是否可连;三是有没有在后台执行 php artisan queue:work(开发用)或 supervisor(生产)。
- 用
database驱动时,记得先运行php artisan queue:table+migrate - 开发时别用
sync驱动测试队列逻辑,它会同步执行,掩盖异步问题 - 邮件失败不会自动重试,要手动在
failed_jobs表里查原因,常见是 SMTP 认证失效或网络超时
.env 忘清缓存,以及本地用 log 驱动时误以为“能跑通”就直接上线。










