从设计发送延迟电子邮件 [英] Sending delayed email from devise

查看:122
本文介绍了从设计发送延迟电子邮件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

解决方案

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


  1. 拦截来自ActionMailer的邮件传递

  2. 将电子邮件存储在表(可选)

  3. 创建一个引用存储的电子邮件的Delayed :: Job;

  4. 延迟工作执行

按照以下方式执行某些操作:



<$ p $在config / application.rb中$ p
ActionMailer :: Base.add_delivery_method:Queued,Mail :: QueuedDelivery

#在config / environment.rb(或一个的config / environments / * .rb文件)
config.action_mailer.delivery_method =:queued#ie。 Mail :: QueuedDelivery

#在lib / mail / queued_delivery.rb
模块邮件
类QueuedDelivery

def initialize(values = {})
#(可选)
end

def deliver!(mail)
email = Email.create!(:delivery_handler => mail.delivery_handler.name,:message = mail.to_s)
延迟:: Job.enqueue工作::电子邮件:: DeliverEmail.new(email.id)
end

结束#class QueueDelivery
end#module Mail

需要实现的Delayed :: Job然后...


  1. 从数据库中检索存储的电子邮件 - email = :: Email.find_by_id(email_id)

  2. 通过邮件gem发送电子邮件 - Mail :: Message.new(email.message).deliver / li>

这是...希望这个帮助!


Is there a simple way of telling Devise to send all email via delayed_job?

解决方案

Alternatively, instead of using the Delayed::Mailer gem, you can quite easily implement and use your own ActionMailer "delivery method", one that...

  1. intercepts mail delivery from ActionMailer
  2. stores the email in a table (optional)
  3. creates a Delayed::Job that references the stored email
  4. delivers the stored email when the delayed job is executed

Do something along the lines of:

# 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

The Delayed::Job you need to implement would then...

  1. retrieve the stored email from the database -- email = ::Email.find_by_id(email_id)
  2. deliver the email via the mail gem -- Mail::Message.new(email.message).deliver

That's it... hope this help!

这篇关于从设计发送延迟电子邮件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆