Laravel突然无法通过Mandrill账户发送邮件,SwiftMailer正常求助
排查Laravel无法发送Mandrill邮件的问题
结合你描述的情况——之前正常、单独用SwiftMailer能发但Laravel不行、Mail::failures()无返回,咱们可以从这几个方向逐一排查:
1. 配置缓存未刷新
Laravel会缓存配置文件来提升性能,如果你最近修改过.env或配置文件但没清理缓存,系统可能还在沿用旧的配置。你可以执行这两个命令清除缓存:
php artisan config:clear php artisan cache:clear
执行后再尝试发送邮件,看是否恢复正常。
2. 邮件驱动配置不匹配(关键排查点)
这里有个容易混淆的细节:Laravel的mandrill驱动是调用Mandrill的API发送邮件,而非SMTP协议。你现在.env里配置了SMTP的MAIL_HOST、MAIL_PORT等参数,但驱动设为mandrill,这其实是不匹配的:
- 如果你想和单独测试的SwiftMailer一样用SMTP发送,需要把
.env里的MAIL_DRIVER改成smtp,保留现有的SMTP配置项,这样Laravel就会用SwiftMailer的SMTP方式和Mandrill通信,和你单独测试的逻辑完全一致。 - 如果确实想使用Mandrill的API驱动,那不需要SMTP相关配置,只需要确保
MANDRILL_SECRET正确,且config/services.php里的配置如下:
'mandrill' => [ 'secret' => env('MANDRILL_SECRET'), ],
同时确认config/mail.php里的驱动配置指向mandrill(Laravel 7+版本是mailers数组)。
3. 邮件队列的隐藏问题
如果你的邮件是通过队列发送的,Mail::failures()不会返回即时错误,因为任务是异步执行的:
- 先执行
php artisan queue:restart重启队列进程,确保队列加载最新配置; - 再用
php artisan queue:failed查看失败的队列任务,里面可能有具体的错误信息; - 检查队列日志,看是否有连接或权限相关的报错。
4. 查看Laravel日志获取细节
Mail::failures()有时候不会暴露底层错误,但Laravel的日志文件会记录更详细的信息。你可以打开storage/logs/laravel.log,搜索和邮件相关的条目,比如mandrill、SwiftMailer、send等关键词,大概率能找到失败的具体原因(比如API密钥无效、请求频率超限、Mandrill账户状态异常等)。
5. Mandrill账户或API状态检查
虽然你用SMTP能发,但Mandrill的API可能存在单独的限制:
- 检查Mandrill后台的API密钥是否有效,有没有被禁用;
- 查看账户是否有发送量超限、违规记录等导致API无法使用的情况。
内容的提问来源于stack exchange,提问作者Veshraj Joshi
相关产品推荐
相关产品推荐

