先确认 mail_mailer 配置值是否为 smtp,再清缓存 php artisan config:clear;检查 mail_port 与 mail_encryption 是否匹配(587→tls,465→ssl);确保邮件视图 utf-8 无 bom;队列需独立配置 queue_connection,且验证 jobs 表或 failed_jobs 日志。

邮件发不出去但没报错?先确认 MAIL_MAILER 配置值
很多 laravel 项目卡在“调用 Mail::to()->send() 没反应”,其实根本没走到 SMTP 或 Mailgun,因为默认配置是 sync(同步队列)或更隐蔽的 log。Laravel 9+ 默认环境变量里写的是 MAIL_MAILER=smtp,但如果你用的是旧项目或未运行 php artisan config:clear,实际生效的可能是缓存里的 log 或 Array。
- 检查
.env:必须有MAIL_MAILER=smtp(不是MAIL_DRIVER,那是旧版键名) - 运行
php artisan config:clear再试,别信缓存 - 临时加一行日志验证是否真发了:
Log::info('About to send mail', ['to' => $user->email]);
SMTP 连接被拒绝或超时?重点看 MAIL_PORT 和 TLS/SSL 设置
Laravel 的 MAIL_ENCRYPTION 不是“开就安全”,它直接决定底层 PHPMailer 用什么协议握手。Gmail、outlook、腾讯企业邮箱等对端口和加密组合极其敏感,配错就 Connection could not be established with host。
-
MAIL_PORT=587→ 必须配MAIL_ENCRYPTION=tls -
MAIL_PORT=465→ 必须配MAIL_ENCRYPTION=ssl(注意不是tls) - 阿里云邮件推送、SendGrid 等 SaaS 服务通常只支持
587 + tls,不认465 - 本地开发用 MailHog?改用
MAIL_MAILER=smtp+MAIL_HOST=127.0.0.1+MAIL_PORT=1025,别碰加密
邮件内容乱码或收件箱显示为附件?Content-Type 和视图编码要对齐
Laravel 默认用 Blade 渲染邮件视图,但一旦你在视图里写了中文、emoji 或用了 @include 引入非 UTF-8 文件,PHPMailer 可能误判字符集,把整封邮件当 application/octet-stream 处理。
- 所有 Blade 邮件视图文件保存为 UTF-8 无 BOM 格式(VS Code 右下角点编码可改)
- 不要在视图顶部手动写
<meta charset="gbk">鈥斺