1

我有并且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 个电子邮件帐户。

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

谢谢!

4

3 回答 3

0

看看resque_mailer和这个问题

于 2012-11-27T13:04:34.003 回答
0

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

于 2012-11-28T17:30:30.087 回答
0

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

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

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

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

于 2012-12-14T04:27:18.530 回答