从设计发送延迟的电子邮件
有没有一种简单的方法告诉Devise通过delayed_job发送所有电子邮件?
或者,您可以非常轻松地实现和使用自己的ActionMailer“交付方法”,而不是使用Delayed :: Mailer gem。
- 拦截来自ActionMailer的邮件传递
- 将电子邮件存储在表格中(可选)
- 创建一个引用存储的电子邮件的Delayed :: Job
- 执行延迟作业时传送存储的电子邮件
做一些事情:
# 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
那么你需要实施的延迟::工作……
- 从数据库中检索存储的电子邮件 –
email = ::Email.find_by_id(email_id)
- 通过邮件gem发送电子邮件 –
Mail::Message.new(email.message).deliver
就是这样……希望这有帮助!
我不知道Devise是什么,但我想这是你不想修改的第三方gem。 试试delayed_job_mailer 。 您可以通过猴子修补它们来扩展Devise邮件程序以使用delayed_job。
class SomeExistingMailer include Delayed::Mailer end
或者如果您希望默认情况下通过延迟作业发送所有应用程序电子邮件:
# config/initializers/delayed_mailer.rb class ActionMailer::Base include Delayed::Mailer end
我发现以上都不适合我。 我正在使用Devise 2.0.4和Rails 3.2.2以及delayed_job_active_record 0.3.2
设计实际上谈论在代码中的注释中执行类似操作的方式是覆盖User类中的方法。 因此,我这样解决了它,它完美地工作:
应用程序/模型/ User.rb
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