首页 > 解决方案 > 如何将 ApplicationMailer(或 ActionMailer)设置为默认使用 Activejob/sidekiq

问题描述

我们需要使用 sidekiq 发送我们所有的 Rails 5 电子邮件,我发现多个链接(链接 #1链接 #2)显示了我们如何为特定的新邮件程序执行此操作,但没有资源说明如何将其作为默认设置(覆盖 ApplicationMailer(或 ActionMailer)的行为)

我可以使用devise_async gem 来设计电子邮件,但我想让它成为跨应用程序发送的所有电子邮件的默认行为

那么如何将deliver_later方法链接到默认邮件程序或注入默认邮件程序始终使用的 sidekiq 作业?

我尝试了几种将deliver_later方法添加到的变体,application_mailer.rb但没有一个起作用

更新:

我想覆盖ApplicationMailerActionMailer避免deliver_later单独调用每个邮件程序,目标是在所有邮件程序继承的父类中执行此操作以避免重复并保持 DRY 原则

我期待更新此文件application_mailer.rb

class ApplicationMailer < ActionMailer::Base
  default from: 'xxxxxx'
  layout 'mailer'

  # Maybe adding a way here to chain the deliver_later method
  def initialize
    # somehow chain deliver_later method after the object creation from this class
  end
end

标签: ruby-on-railsactionmailersidekiqrails-activejob

解决方案


只要您使用#deliver_later 并且活动作业设置为使用 Sidekiq,它就会使用 sidekiq 异步发送电子邮件(您的电子邮件在后台作业中发送)。

这是您可以将 Active Job 适配器设置为 :sidekiq 的方法,在config/application.rb

class Application < Rails::Application
  # ...
  config.active_job.queue_adapter = :sidekiq
end

然后启动sidekiq:

bundle exec sidekiq -q default -q mailers

并且您的异步邮件将显示在队列中

UserMailer.welcome_email(@user).deliver_later

推荐阅读