Devise自身插件中不带异步邮件处理。
如果想用异步如何处理?
自己扩展Devise?
没必要。大家可以在rubygems中搜到devise-async这一gem包,该包即可解决devise邮件异步问题。
配置流程如下:
(注:确保rails版本在5以上)
1. Gemfile中加入gem包
gem 'devise-async'
2. bundle
bundle install
3. 对应models中添加参数:async(拿models/user.rb为参考)
class User < ApplicationRecord
devise :database_authenticatable, :registerable, :async, ...
...
end
4. 配置相关参数
-
4-1. application.rb(config/application.rb)
class Application < Rails::Application
...
# 配置 active job adapter
config.active_job.queue_adapter = :sidekiq
...
end
-
4-2. devise-async.rb(config/initializers/devise_async.rb)
Devise::Async.setup do |config|
config.enabled = true
# Rails5版本以上,取消下面的配置
# Supported options: :resque, :sidekiq, :delayed_job, :queue_classic
# config.backend = :sidekiq # 这个已经同步config/application.rb中的config.active_job.queue_adapter设置
# config.queue = :mailers # 这个需要在config/sidekiq.yml中配置
end
-
4-3. sidekiq.yml(config/sidekiq.yml)
:queues:
- default # 默认的
- mailers # 这个是新增的,虽然不加,devise不会报错,但devise-async必须通过这个配置来识别。
使用方式如下:
- 启动redis
- 启动sidekiq(最直观验证就是监控log/sidekiq.log)
- 启动项目
- 访问web页面,如:注册、找回密码等,提交后就可以异步收到邮件。
后记:
经过验证,该Gem包可以将sidekiq队列mailers中所有邮件自动异步发出。
也就是说只要满足以下条件,使用该Gem包即可异步邮件:
- 使用rails自带的mail方法
- 队列设置为mailers(默认)
- 邮件发送时使用deliver_later