2017-02-21 19 views
0

Я использую рельсы 5.Как отправить почту на 5 пользователей в минуту с использованием задержек

Я хочу отправить электронную почту 100 пользователям из моего приложения rails.

Я добавил анимированное письмо delayed_job для отправки писем асинхронно.

Ниже приводится код:

контроллер:

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

Mailer:

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

Q. Мне нужно знать, как отправить почту на 5 пользователей в минуту?

Q. Если я использовал delayed_job для отправки писем 100 пользователям, в таблице delayed_job есть 100 заданий. Могу ли я отправлять почту в партии?

+0

Можете ли вы добавить еще код с контроллера, вокруг вызова 'UserMailer.send_mail'? У вас есть цикл вокруг него или он называется только один раз? Если у вас есть все электронные письма перед вызовом 'send_mail', решение должно быть довольно простым. Если, с другой стороны, вам нужно как-то собрать электронные письма один за другим, а затем отправить их партиями, для этого потребуется совершенно другой подход. – Teoulas

+0

Извлечь всех пользователей, запустить цикл и отправить письма. – puneet18

+0

Как отправлять письма до 5 пользователей в минуту? – puneet18

ответ

2

Предполагая, что вы хотите отправить один и тот же объект и тело каждому получателю, я бы использовал find_in_batches и параметр run_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

Как использовать функцию активной записи, чтобы добавлять электронные письма в очереди, а затем запустить его? – puneet18

+0

Вы пытались написать подкласс ActiveJob? Там действительно мало что нужно сделать. Вам просто нужно переместить вызов 'UserMailer.send_email_batch' с контроллера на метод' execute' вашего класса Job. Просто следуйте инструкциям здесь: http://guides.rubyonrails.org/active_job_basics.html#creating-a-job – Teoulas

+0

Хорошо попробует. Спасибо за вашу помощь. – puneet18

 Смежные вопросы

  • Нет связанных вопросов^_^