You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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邮件类使用了ShouldQueue trait,邮件会被推送到队列而非同步发送。这时候需要确认:

    • 队列worker是否在后台持续运行(可以用php artisan queue:work命令启动,或配置supervisor守护进程)
    • 临时改用sendNow()代替send()测试同步发送是否生效:
      Mail::to($unreadLink->email)->sendNow(new UnreadLinks());
      
  • 排查Mailgun端的发送限制
    去Mailgun后台查看发送日志,确认:

    • 这批用户的邮箱是否存在硬退/软退记录
    • 邮件是否被标记为垃圾邮件或触发了Mailgun的发送限制
    • 有没有针对这批收件人的退订记录
  • 验证Cron任务的运行环境
    Cron任务是用特定系统用户执行的(比如www-data或root),可能和你手动调试时的环境变量不一致:

    • 手动用Cron用户身份执行任务,看是否有报错:
      sudo -u www-data php /path/to/your/project/artisan schedule:run
      
    • 确认Cron命令中的项目路径、PHP路径完全正确,避免路径错误导致任务无法加载Laravel环境
  • 检查服务器层面的拦截规则
    服务器的防火墙、SELinux或安全软件可能拦截出站邮件请求:

    • 用telnet smtp.mailgun.org 587测试服务器能否连接Mailgun的SMTP端口
    • 查看服务器系统日志(比如/var/log/secure或/var/log/firewall),有没有相关拦截记录

内容的提问来源于stack exchange,提问作者Pierre Le Bot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:25:45