【问题标题】:Sending delayed email from devise从设备发送延迟的电子邮件
【发布时间】:2011-04-13 19:00:00
【问题描述】:

有没有一种简单的方法可以告诉 Devise 通过以下方式发送所有电子邮件 延迟工作?

【问题讨论】:

标签: ruby-on-rails delayed-job devise


【解决方案1】:

或者,您可以很容易地实现和使用自己的 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

就是这样...希望对您有所帮助!

【讨论】:

    【解决方案2】:

    我不知道 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
    

    【讨论】:

    • 我尝试了您的第二个建议,如果它有效,那将是惊人的,但出现错误“/Users/bhellman/Sites/cline/config/initializers/delayed_mailer.rb:3: uninitialized constant Delayed::邮件程序 (NameError)"
    • 在我看来,延迟邮件 gem 没有加载。你在 Gemfile 中指定了吗,最终在 environment.rb 中需要它
    【解决方案3】:

    我发现以上方法都不适合我。我正在使用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
    

    【讨论】:

      【解决方案4】:
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-26
      • 2018-01-17
      • 2010-10-08
      • 2011-07-01
      • 1970-01-01
      • 2013-03-31
      相关资源
      最近更新 更多