#ruby-on-rails #ruby-on-rails-5 #actionmailer
#ruby-on-rails #ruby-on-rails-5 #actionmailer
Вопрос:
Я отправляю электронное письмо неактивным пользователям со словами «пожалуйста, войдите в систему в течение 7 дней, иначе ваша учетная запись будет деактивирована».
У меня есть служба, которая извлекает всех неактивных пользователей и отправляет электронное письмо, но я запускаю это ежедневно, и я хочу отправлять электронное письмо каждому пользователю только один раз, а не каждый день.
class DeactivateOldEmailsService
def run
to_deactivate = User.havent_signed_in_for_n_days(97)
to_deactivate.each { |user| user.update(active: false) }
to_warn = User.havent_signed_in_for_n_days(90)
to_warn.each do |user|
messages_for_user_per_employer = InactiveEmailsMailer.account_will_expire(user).deliver_later
end
end
end
Как я могу проверить, было ли пользователю уже отправлено электронное письмо?
Ответ №1:
Очень сложно проверить, было ли отправлено пользователю уведомление по электронной почте, если вы не сохранили время отправки электронного письма в базе данных. В файле журнала все еще могут быть какие-то данные, но любое задание отправки быстро удаляется из очереди, как только это электронное письмо было успешно отправлено.
Из вашего фрагмента исходного кода, я думаю, у вас может быть что-то вроде «last_signed_in» в вашей таблице users. Вы можете сделать это просто и отправлять электронные письма пользователям, если они не входили в систему ровно 90 дней, что-то вроде:
to_warn.each do |user|
if user.last_signed_in === 90.days.from_now
messages_for_user_per_employer = InactiveEmailsMailer.account_will_expire(user).deliver_later
end
end
Или вы можете создать новый столбец notice_deactivation_email_sent_at
в таблице users, чтобы проверить, получил ли пользователь уведомление по электронной почте или нет.
Ответ №2:
На самом деле я сталкиваюсь с чем-то очень похожим: отправляйте еженедельные электронные письма пользователю (который подписался на изменения, произошедшие с момента последней отправки), это задание выполняется каждый день, и я не хочу, чтобы пользователь получал более одного электронного письма в день.
Мой план состоит в том, чтобы сохранить эту информацию в выделенном столбце last_sent_at
в таблице users и отправлять электронную почту только в том случае, если условие DateTime.current - last_sent_at > 7.days
true
.
РЕДАКТИРОВАТЬ: я должен был прочитать последнее предложение предыдущего ответа… Именно то, что я только что описал… Извините!