邮件配置不生效需先执行php artisan config:clear清除缓存,确认mail_mailer为合法值(smtp/mailgun等),检查mail_encryption、port、host三者匹配,发信卡顿应改用队列,gmail需用app专用密码。

邮件配置不生效,.env 里改了 MAIL_MAILER 还是走 log
常见现象:调用 Mail::to(...)->send(...) 后没发邮件,日志里却看到 “Message sent” —— 实际是因为 MAIL_MAILER=log 没改过来,或者缓存没清。
关键点在于 Laravel 会缓存配置,.env 修改后必须执行:
php artisan config:clear否则永远读的是旧值。另外注意
MAIL_MAILER 的合法值只有 smtp、mailgun、postmark、log、array 等几个,拼错(比如写成 smtps 或 gmail)会静默退化为 log。
SMTP 连接被拒绝或超时,MAIL_HOST 和端口对不上
典型错误信息:Connection could not be established with host smtp.gmail.com :stream_socket_client(): unable to connect to tls://smtp.gmail.com:587。
这不是密码错,而是协议/端口不匹配。Gmail 必须用 MAIL_ENCRYPTION=tls + MAIL_PORT=587;Outlook/Hotmail 是 tls + 587;而一些企业 SMTP(如阿里云邮件推送)可能强制要求 ssl + 465。
务必确认三者一致:
-
MAIL_ENCRYPTION(tls或ssl) -
MAIL_PORT(587 对应 tls,465 对应 ssl) -
MAIL_HOST(不能带https://,也不能漏掉smtp.前缀)
API 接口里发邮件卡住,没报错但请求一直 pending
根本原因是默认同步发送 —— Mail::send() 会阻塞当前 HTTP 请求,等 SMTP 返回才结束。一旦网络抖动或服务商限流,接口就拖到超时。
正确做法是丢进队列:
- 确保
QUEUE_CONNECTION已配(如database或redis) - 邮件类继承
Mailable后,加implements ShouldQueue - 调用时用
Mail::to(...)->queue(new WelcomeEmail())而非send() - 别忘了跑
php artisan queue:work
使用 Gmail 发送被拒,534-5.7.9 错误反复出现
这是 Google 的安全拦截,不是 Laravel 问题。2022 年起 Gmail 已全面停用“低安全性应用访问权限”,MAIL_USERNAME 不能再填完整邮箱密码。
必须:
- 开启 Google 账户的两步验证
- 在 App Passwords 页面 生成 16 位专用密码
- 把
MAIL_PASSWORD改成这个密码(不是账户密码) - 如果用的是 G Suite 或 Google Workspace,管理员还需在后台开启“允许使用应用专用密码”策略
邮件服务最麻烦的从来不是代码怎么写,而是每家 SMTP 提供商对加密方式、认证流程、IP 白名单的细节要求都不一样,而且这些规则还经常变。调试时先盯死 config:clear 和 MAIL_MAILER 值,再看日志里实际连的是哪个 host 和 port,比翻文档快得多。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











