Rails — как узнать, было ли отправлено электронное письмо на прошлой неделе

#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 .

РЕДАКТИРОВАТЬ: я должен был прочитать последнее предложение предыдущего ответа… Именно то, что я только что описал… Извините!