laravel 9+邮件发送失败的首要原因是未配置mail_mailer=smtp,因默认使用log驱动,其余smtp参数无效;必须明确定义mail_mailer、匹配加密方式与端口、使用应用专用密码,并放行服务器出站端口。

不配 MAIL_MAILER=smtp,其他全白搭——Laravel 9+ 默认用 log 驱动,根本不会连 SMTP 服务器。
为什么改了 MAIL_HOST 和 MAIL_PORT 还是发不出邮件
最常见原因是漏设或误设 MAIL_MAILER。Laravel 8 起废弃 MAIL_DRIVER,只认 MAIL_MAILER;9+ 版本默认值是 log,哪怕你填了一堆 SMTP 参数,只要没显式写 MAIL_MAILER=smtp,就只会把邮件内容记进日志,不发。
-
MAIL_MAILER必须在.env里明确定义,且不能被注释、不能有前后空格 - 升级项目时容易残留旧的
MAIL_DRIVER=smtp,它已被忽略,得删掉 - 本地开发常手动设成
log调试,上线前务必检查是否已切回smtp - 执行
php artisan config:clear后再测试,缓存不清理,.env改了也无效
MAIL_ENCRYPTION 和 MAIL_PORT 必须严格匹配
加密方式和端口错配会导致连接直接被拒绝,错误往往表现为超时或 “Connection refused”,而不是明确的认证失败。
- Gmail:用
tls+587,或ssl+465;不能tls+465 - QQ 邮箱:
ssl+465更稳,tls+587有时被拦截 - 163/126 邮箱:
ssl+465是主流,null+25在多数云服务器上被封禁 - 如果用
ssl,MAIL_ENCRYPTION值必须是ssl(小写),不是SSL或"ssl"
用 Gmail / QQ 邮箱时,密码不是登录密码
直接填邮箱登录密码必失败。Gmail 要用「应用专用密码」,QQ 邮箱要用「SMTP 授权码」,两者都需单独开启并生成。
- Gmail:必须开启两步验证,然后在账户安全页生成「应用专用密码」,16 位,复制粘贴到
MAIL_PASSWORD - QQ 邮箱:设置 → 账户 → 「POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV 服务」→ 开启 SMTP → 获取授权码
- 163 邮箱:设置 → POP3/SMTP/IMAP → 开启 SMTP → 「客户端授权密码」里设置并记录
- 授权码/应用密码一旦生成,就不能再查看,只能重置;建议存在密码管理器里,别只存
.env
发邮件前必须确认服务器出站端口放行
很多新手调通配置后仍失败,卡在防火墙或云厂商安全组——不是代码问题,是网络策略拦住了。
- 检查服务器本地防火墙:
sudo ufw status(Ubuntu)或sudo firewall-cmd --list-all(CentOS) - 检查云服务商控制台的安全组规则:确保出方向(egress)允许
465或587端口访问任意 IP(0.0.0.0/0) - 部分阿里云/腾讯云轻量应用服务器默认屏蔽 25 端口,465/587 也可能被限,需主动申请解封
- 本地开发用 Homestead/Valet 一般没问题;Docker 环境要注意容器网络是否透传主机防火墙策略
真正卡点往往不在代码里,而在 .env 第一行、邮箱后台的授权开关、以及云控制台那个被忽略的安全组规则——三者缺一不可。











