有没有简单的方法告诉Devise通过delayed_job发送所有电子邮件?
如果不想使用Delayed::Mailer宝石(gem),你可以很容易地实现并使用自己的ActionMailer“delivery method”,这个方法:
可以按照以下方式操作:
# in config/application.rb
ActionMailer::Base.add_delivery_method :queued, Mail::QueuedDelivery
# in config/environment.rb (or one of the config/environments/*.rb files)
config.action_mailer.delivery_method = :queued # ie. Mail::QueuedDelivery
# in lib/mail/queued_delivery.rb
module Mail
class QueuedDelivery
def initialize(values = {})
# (optional)
end
def deliver!(mail)
email = Email.create!(:delivery_handler => mail.delivery_handler.name, :message => mail.to_s)
Delayed::Job.enqueue Jobs::Email::DeliverEmail.new(email.id)
end
end # class QueueDelivery
end # module Mail
你需要实现的Delayed::Job应该按照以下步骤进行:
email = ::Email.find_by_id(email_id)
Mail::Message.new(email.message).deliver
就是这样...希望这可以帮到你!
我不知道Devise是什么,但我猜它是第三方的gem,你不想修改它。试试delayed_job_mailer。你可以通过猴子补丁来扩展Devise邮件发送功能,以使用延迟工作。
class SomeExistingMailer
include Delayed::Mailer
end
如果您想默认通过延迟任务发送所有应用程序电子邮件:
# config/initializers/delayed_mailer.rb
class ActionMailer::Base
include Delayed::Mailer
end
def send_on_create_confirmation_instructions
Devise::Mailer.delay.confirmation_instructions(self)
end
def send_reset_password_instructions
Devise::Mailer.delay.reset_password_instructions(self)
end
def send_unlock_instructions
Devise::Mailer.delay.unlock_instructions(self)
end