【发布时间】:2011-04-13 19:00:00
【问题描述】:
有没有一种简单的方法可以告诉 Devise 通过以下方式发送所有电子邮件 延迟工作?
【问题讨论】:
-
对于那些在 2019 年寻找直接答案的人,请查看 this answer。
标签: ruby-on-rails delayed-job devise
有没有一种简单的方法可以告诉 Devise 通过以下方式发送所有电子邮件 延迟工作?
【问题讨论】:
标签: ruby-on-rails delayed-job devise
或者,您可以很容易地实现和使用自己的 ActionMailer“传递方法”,而不是使用 Delayed::Mailer gem,这种方法...
按照以下方式做一些事情:
# 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 邮件程序以使用 delay_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
devise 实际上谈到在代码中的 cmets 中执行此类操作的方式是覆盖 User 类中的方法。因此,我就这样解决了,而且效果很好:
app/models/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
【讨论】: