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

devise-async配合Sidekiq入队的邮件任务未执行如何排查?

问题排查与修复方案

核心问题:队列名称不匹配

从你的运行日志可以明确看到,重置密码邮件任务被推送到了**mailers(复数)**队列:

I, [2021-09-16T19:20:07.853680 #51261]  INFO -- : [ActiveJob] Enqueued ActionMailer::MailDeliveryJob (Job ID: d49ca82c-6418-4848-8268-3ec72407f828) to Sidekiq(mailers) with arguments: ...

但你使用的Sidekiq启动命令仅监听了**mailer(单数)**和default队列:

sidekiq -q default -q mailer

Sidekiq只会消费启动参数中显式指定的队列,因此mailers队列中的任务会一直处于待处理状态,不会被执行。

修复方法二选一:

  1. 修改Sidekiq启动参数,监听正确的队列:
sidekiq -q default -q mailers
  1. 手动指定devise-async使用的队列名称,修改config/initializer/devise-async.rb配置:
Devise::Async.setup do |config|
  config.enabled = true
  config.queue = 'mailer' # 队列名和启动参数保持一致
end

其他可选排查点

如果修改队列配置后仍有问题,可以按以下顺序排查:

  • 检查版本兼容性:如果你近期升级过Rails(尤其是Rails 6+),请将devise-async升级到最新稳定版,旧版本对ActiveJob的适配存在已知问题
  • 查看Sidekiq错误队列:打开Sidekiq Web面板,检查「重试」「死信」标签下是否有相关任务,可查看具体报错信息(常见为SMTP服务配置错误、邮件模板渲染错误)
  • 验证同步投递是否正常:在Rails控制台执行以下命令,确认邮件同步发送逻辑无问题:
# 测试Devise重置邮件同步发送
User.find(2).send_reset_password_instructions
# 直接测试邮件服务连通性
Devise::Mailer.reset_password_instructions(User.find(2), "test_token").deliver_now

内容的提问来源于stack exchange,提问作者Humayun Naseer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 23:09:02