При использовании Rails Action Mailer у вас есть возможность использовать deliver_now
для немедленной отправки электронной почты или deliver_later
для асинхронной отправки с использованием Active Job.Если в активном задании не указан адаптер, он будет использовать пул потоков в процессе, который не сохранится, если сервер остановится.В качестве альтернативы я могу создать работу для управления своей электронной почтой, которую я затем могу назвать с помощью perform_now
или perform_later
, что, как я понимаю, более или менее точно так же, как deliver_now
и deliver_later
.
У меня вопрос: если я укажу адаптер, скажем, Sidekiq, а затем создаю базу данных для хранения моих заданий, зачем мне создавать задания для обработки моих электронных писем?Есть ли какая-то дополнительная выгода или это ненужный шаг?С другой стороны, если я хочу создать работу для процесса, мой метод электронной почты должен иметь deliver_now
или просто ничего вообще?Я предполагаю, что если в электронном письме будет указано deliver_later
, будет ли оно отбрасывать письмо обратно в конец очереди и заставит его ждать снова, пока оно не будет отправлено?
Чтобы проиллюстрировать, что если у меня нет настроенной работы для обработки моих электронных писем, я мог бы просто иметь:
class UserMailer < ActionMailer::Base
def send_email(user)
mail(to: user.email, subject: "My Subject")
end
end
Чтобы позвонить, я бы использовал: UserMailer.send_email(my_user).deliver_later
.
Однако, если бы я хотел добавить работу, и обе опции были вызваны с помощью UserJob.perform_later(user)
, мои настройки были бы:
class UserJob < ActiveJob::Base
def perform(user)
UserMailer.send_email(user).deliver_now
end
end
или
def perform(user)
UserMailer.send_email(user)
end
Наконец, я недумаю, что это имеет смысл, но что бы произошло бы , если бы я использовал:
def perform(user)
UserMailer.send_email(user).deliver_later
end