7

有没有一种简单的方法可以告诉 Devise 通过 delay_job 发送所有电子邮件?

4

4 回答 4

12

或者,您可以很容易地实现和使用您自己的 ActionMailer “传递方法”,而不是使用 Delayed::Mailer gem,它...

  1. 拦截来自 ActionMailer 的邮件传递
  2. 将电子邮件存储在表格中(可选)
  3. 创建一个引用存储的电子邮件的 Delayed::Job
  4. 在延迟作业执行时传递存储的电子邮件

做一些类似的事情:

# 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 将......

  1. 从数据库中检索存储的电子邮件——email = ::Email.find_by_id(email_id)
  2. 通过邮件 gem 发送电子邮件——Mail::Message.new(email.message).deliver

就是这样......希望这有帮助!

于 2010-11-30T17:22:39.443 回答
3

我不知道 Devise 是什么,但我猜它是您不想修改的第三方 gem。尝试延迟作业邮件程序。您可以通过猴子修补它们来扩展 Devise 邮件程序以使用 delay_job。

class SomeExistingMailer
  include Delayed::Mailer
end

或者如果您想默认通过延迟作业发送所有应用程序电子邮件:

# config/initializers/delayed_mailer.rb
class ActionMailer::Base
  include Delayed::Mailer
end
于 2010-09-18T16:10:44.460 回答
2

我发现上述方法都不适合我。我正在使用 Devise 2.0.4 和 Rails 3.2.2 和 delay_job_active_record 0.3.2

devise 在代码的注释中实际上谈论做这样的事情的方式是覆盖 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
于 2012-03-14T22:23:18.423 回答
0

现在有一个 devise-async 项目可以实现这一点:

于 2013-11-20T01:44:19.663 回答