2017-02-21 2 views
0

レールを使用しています。遅延ジョブを使用して1分間に5人のユーザーにメールを送信する方法

私のレールアプリケーションから100人のユーザーに電子メールを送信します。

私はdelayed_job gemを追加して電子メールを非同期で送信しました。続き

はコードです:

コントローラ:

UserMailer.delay.send_mail(email, subject, body) 

メーラー:私は毎分5ユーザーにメールを送信する方法を、知っておく必要があり

def send_mail(email, subject, body) 
    mail(to: email, subject: subject, body: body, content_type: "text/html") 
end 

Q.?

Q. delayed_jobを使用して100人のユーザーにメールを送信した場合、delayed_jobテーブルの下に100のジョブがあります。バッチでメールを送信できますか?

+0

コントローラのコードを 'UserMailer.send_mail'呼び出しの周りに追加できますか?あなたはその周りにループを持っていますか、それは一度だけ呼び出されていますか?あなたが 'send_mail'を呼び出す前にすべての電子メールを持っていれば、解決策はかなりシンプルでなければなりません。一方で、何らかの形で電子メールを1つずつ収集して一括して送信する必要がある場合は、全く異なるアプローチが必要です。 – Teoulas

+0

すべてのユーザーを取得し、ループを実行してメールを送信します。 – puneet18

+0

1分間に5人のユーザーにメールを送信する方法は? – puneet18

答えて

2

すべての受信者に同じ件名と本文を送信すると仮定すると、find_in_batchesrun_atというパラメータを使用します。

# UserMailer 
def send_email_batch(emails, subject, body) 
    emails.each do |email| 
    send_email(email, subject, body) 
    end 
end 

# Controller 
now = Time.current 
User.find_in_batches(batch_size: 5).with_index do |users, batch| 
    UserMailer.delay(run_at: now + batch * 60).send_email_batch(users.map(&:email), subject, body) 
end 
+0

Active Record Job機能を使用して電子メールを追加する方法キューの下でそれを実行しますか? – puneet18

+0

ActiveJobサブクラスを作成しようとしましたか?本当にやることはあまりありません。 'UserMailer.send_email_batch'呼び出しをコントローラーからJobクラスの' perform'メソッドに移動するだけです。ここのガイドに従ってください:http://guides.rubyonrails.org/active_job_basics.html#creating-a-job – Teoulas

+0

Okが試します。ご協力いただきありがとうございます。 – puneet18

関連する問題