从Devise发送延迟邮件

7
有没有简单的方法告诉Devise通过delayed_job发送所有电子邮件?

https://dev59.com/_m855IYBdhLWcg3w0H53 - Zabba
对于那些在2019年寻找直接答案的人,请查看此答案 - Patrick Cyiza
4个回答

12

如果不想使用Delayed::Mailer宝石(gem),你可以很容易地实现并使用自己的ActionMailer“delivery method”,这个方法:

  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

就是这样...希望这可以帮到你!


3

我不知道Devise是什么,但我猜它是第三方的gem,你不想修改它。试试delayed_job_mailer。你可以通过猴子补丁来扩展Devise邮件发送功能,以使用延迟工作。

class SomeExistingMailer
  include Delayed::Mailer
end

如果您想默认通过延迟任务发送所有应用程序电子邮件:

# config/initializers/delayed_mailer.rb
class ActionMailer::Base
  include Delayed::Mailer
end

我尝试了你的第二个建议,如果它能够正常工作那将是很棒的,但是出现了一个错误 "/Users/bhellman/Sites/cline/config/initializers/delayed_mailer.rb:3: uninitialized constant Delayed::Mailer (NameError)"。 - AnApprentice
这对我来说似乎是Delayed mailer gem没有被加载。你在Gemfile中指定了它吗?最终在environment.rb中需要引用它吗? - gertas

2
我发现以上方法都对我无效。我使用的是Devise 2.0.4和Rails 3.2.2与delayed_job_active_record 0.3.2。
Devise在代码注释中提到处理此类问题的方法是覆盖用户类(User class)中的方法。因此,我按照如下方式解决此问题,它完美运行:
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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接