ruby-on-rails - 如何将 ApplicationMailer(或 ActionMailer)设置为默认使用 Activejob/sidekiq
问题描述
我们需要使用 sidekiq 发送我们所有的 Rails 5 电子邮件,我发现多个链接(链接 #1,链接 #2)显示了我们如何为特定的新邮件程序执行此操作,但没有资源说明如何将其作为默认设置(覆盖 ApplicationMailer(或 ActionMailer)的行为)
我可以使用devise_async gem 来设计电子邮件,但我想让它成为跨应用程序发送的所有电子邮件的默认行为
那么如何将deliver_later
方法链接到默认邮件程序或注入默认邮件程序始终使用的 sidekiq 作业?
我尝试了几种将deliver_later
方法添加到的变体,application_mailer.rb
但没有一个起作用
更新:
我想覆盖ApplicationMailer
或ActionMailer
避免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
解决方案
只要您使用#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
推荐阅读
- angular - 从 API 值更改字体颜色时出现角度错误
- docker - 由于端口限制,无法构建 dockerfile
- linux - noob - 语法错误:重定向意外
- neo4j - 是否可以在关系 NEO4J 上创建约束?
- javascript - 删除以前添加的类不起作用
- xamarin - Xamarin.Forms Shell - 不能使用 ShellContent,除非在
? - c# - 使用 ASP.NET MVC 应用程序与 Windows 服务的 Entity Framework 的行为不一致
- typescript - 为什么我的 outDir 包含一个(大部分重复的)src 目录?
- java - 使用 Spring Batch 从数据库中读取和处理完整的项目列表
- printing - Docusign 打印驱动程序无法识别锚标记