代码之家  ›  专栏  ›  技术社区  ›  Neil Middleton

从device发送延迟电子邮件

  •  7
  • Neil Middleton  · 技术社区  · 15 年前

    有没有一个简单的方法让设计发送所有电子邮件通过 延迟作业?

    4 回复  |  直到 12 年前
        1
  •  12
  •   pvandenberk    15 年前

    或者,您可以很容易地实现和使用自己的actionmailer“传递方法”,而不是使用delayed::mailer gem。

    1. 截取来自ActionMailer的邮件传递
    2. 将电子邮件存储在表格中 (可选)
    3. 创建一个引用存储电子邮件的延迟::作业
    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
    

    您需要实现的延迟::作业将…

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

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

        2
  •  3
  •   gertas    15 年前

    我不知道什么是设计,但我想这是第三方宝石,你不想修改。 尝试 delayed_job_mailer . 你可以通过猴子修补邮件来延长设计邮件的期限,以便使用延迟的工作。

    class SomeExistingMailer
      include Delayed::Mailer
    end
    

    或者,如果您希望默认情况下通过延迟作业发送所有应用程序电子邮件:

    # config/initializers/delayed_mailer.rb
    class ActionMailer::Base
      include Delayed::Mailer
    end
    
        3
  •  2
  •   hrdwdmrbl    13 年前

    我发现以上这些都不适合我。我正在使用device 2.0.4和rails 3.2.2,延迟的“作业”活动的“记录”是0.3.2。

    实际上,device在代码的注释中谈论这样做的方式是重写用户类中的方法。因此,我像这样解决了它,它工作得很好:

    应用程序/模型/用户.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