【问题标题】:send newsletter with delayed_job使用延迟作业发送时事通讯
【发布时间】:2012-12-14 12:27:18
【问题描述】:

我有和admin_mailer:

class AdminMailer < ActionMailer::Base
 def send_message_to_all_users(user, subject, body, locale)
    @user = user
    @body = body
    @locale = locale
    mail(:to => user.email, :subject => subject)
  end
end

在我对控制器用户的操作中:

def send_email_to_all_users

   users = User.all
   subject = params[:subject]
   body = params[:body]
   locale = params[:locale]
   for user in users
    User.delay(queue: "Email", priority: 20).send_message_to_all_users(user, subject, body, locale)
   end

   respond_to do |format|
    .........
   end
end

在我的模型User

class User
 include Mongoid::Document
 include Mongoid::Timestamps::Created
.
.
.

#delayed jobs methods
  def self.send_message_to_all_users(user, subject, body, locale)
     AdminMailer.send_message_to_all_users(user, subject, body, locale).deliver
  end

 def deliver
  sleep 15
 end

end

users 的邮件列表非常长,超过 20.000 个电子邮件帐户。

我的问题是,用这种方式发送带有大邮件列表的时事通讯是否正确,或者我可以用更好的方式完成这项任务。

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1 delayed-job


    【解决方案1】:

    如果您被锁定使用delayed_job,请查看此railscast。演员表专门解决了延迟邮寄问题。

    【讨论】:

      【解决方案2】:

      看看resque_mailer,还有这个question

      【讨论】:

      • 谢谢,但我正在使用 delayed_job 并且无法添加其他后台作业 gem。非常感谢!
      【解决方案3】:

      我认为你应该在这里查看 find_in_batches 方法:http://guides.rubyonrails.org/active_record_querying.html

      在您的情况下,您可以首先分批查找所有用户,然后从那里将每个批次分配给您的 send_email_to_all_users 方法调用(用每个批次替换 User.all。

      或者,更好的是,您可以将整个时事通讯流程移动到它自己的类中并稍微封装一下(因此,仍然从控制器调用方法,但运行类中的所有逻辑。)

      无论如何,我认为 find_in_batches 是您所需要的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-05
        • 2012-06-16
        • 2012-10-30
        • 1970-01-01
        • 2012-02-25
        • 2012-01-07
        • 1970-01-01
        • 2013-11-10
        相关资源
        最近更新 更多