从设计发送延迟的电子邮件

时间:2010-09-17 15:18:00

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

是否有一种简单的方式告诉Devise通过发送所有电子邮件 delayed_job的?

4 个答案:

答案 0 :(得分:12)

或者,您可以非常轻松地实现和使用自己的ActionMailer“交付方法”,而不是使用Delayed :: Mailer gem。

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

    # 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
    

    您需要实施的延迟::工作......

    1. 从数据库中检索存储的电子邮件 - email = ::Email.find_by_id(email_id)
    2. 通过邮件gem发送电子邮件 - Mail::Message.new(email.message).deliver
    3. 就是这样......希望有这个帮助!

答案 1 :(得分:3)

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

答案 2 :(得分:2)

我发现以上都不适合我。我正在使用Devise 2.0.4和Rails 3.2.2 with 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

答案 3 :(得分:0)