Laravel 5.6定时邮件发送任务未执行,求排查思路
排查Laravel定时邮件任务未执行的遗漏方向
让我帮你梳理几个容易被忽略的排查点,毕竟这种“看起来配置全对但就是不工作”的定时任务问题太常见了😅
确认任务是否真的触发
哪怕其他定时任务正常运行,也不能默认这个邮件任务一定被执行了。可以在闭包开头加个日志记录,验证任务是否启动:use Illuminate\Support\Facades\Log; $schedule->call(function() { Log::info('Unread links email task triggered at ' . now()); // 原有的查询和邮件逻辑... })->dailyAt('20:00')->appendOutputTo(storage_path('logs/unread_email_task.log'));之后检查
storage/logs下的日志文件,看有没有对应的触发记录。验证生产环境的查询结果是否为空
本地调试查询正常,但生产环境可能存在数据或时区差异:- 检查数据库中
links.read_at字段是否真的存在NULL值(会不会被其他逻辑意外更新) - 确认Laravel应用时区和数据库时区一致,避免时区偏移导致查询条件不匹配
可以在任务中打印查询结果到日志:
Log::info('Unread users count: ' . $unreadLinks->count()); Log::info('Unread users emails: ', $unreadLinks->pluck('email')->toArray());- 检查数据库中
检查邮件是否被放入队列但未执行
如果你的UnreadLinks邮件类使用了ShouldQueuetrait,邮件会被推送到队列而非同步发送。这时候需要确认:- 队列worker是否在后台持续运行(可以用
php artisan queue:work命令启动,或配置supervisor守护进程) - 临时改用
sendNow()代替send()测试同步发送是否生效:Mail::to($unreadLink->email)->sendNow(new UnreadLinks());
- 队列worker是否在后台持续运行(可以用
排查Mailgun端的发送限制
去Mailgun后台查看发送日志,确认:- 这批用户的邮箱是否存在硬退/软退记录
- 邮件是否被标记为垃圾邮件或触发了Mailgun的发送限制
- 有没有针对这批收件人的退订记录
验证Cron任务的运行环境
Cron任务是用特定系统用户执行的(比如www-data或root),可能和你手动调试时的环境变量不一致:- 手动用Cron用户身份执行任务,看是否有报错:
sudo -u www-data php /path/to/your/project/artisan schedule:run - 确认Cron命令中的项目路径、PHP路径完全正确,避免路径错误导致任务无法加载Laravel环境
- 手动用Cron用户身份执行任务,看是否有报错:
检查服务器层面的拦截规则
服务器的防火墙、SELinux或安全软件可能拦截出站邮件请求:- 用
telnet smtp.mailgun.org 587测试服务器能否连接Mailgun的SMTP端口 - 查看服务器系统日志(比如
/var/log/secure或/var/log/firewall),有没有相关拦截记录
- 用
内容的提问来源于stack exchange,提问作者Pierre Le Bot
相关产品推荐
相关产品推荐

