В Rails 4, как сохранить все отправленные электронные письма с вложениями и повторно отправить их позже?

В моем приложении Rails 4 я уже храню все исходящие электронные письма в БД с помощью наблюдателя. В config/initializers/all_emails_observer.rb у меня есть примерно следующий код:

class AllEmailObserver
  def self.delivered_email(message)
    sent_email = SentEmail.new(
       sender: message.from.join(';'),
       recipients: message.to,
       subject: message.subject
    )

    sent_email.body = if message.html_part || message.text_part
                         message.html_part.blank? ? message.text_part.body.raw_source : message.html_part.body.raw_source
                      else
                         message.body.raw_source
                      end

    sent_email.save!
  end
end

ActionMailer::Base.register_observer(AllEmailObserver)

Теперь мне нужно добавить еще одну функцию, позволяющую администраторам повторно отправлять любые электронные письма из журнала электронной почты.

Есть пара решений, которые я сразу увидел:

  1. Добавьте код для хранения всех вложений (обычных и встроенных), затем реализуйте метод, который будет генерировать новое электронное письмо и повторно его отправлять. Я работаю над этим сейчас.
  2. Сохраните класс почтовой программы, метод почтовой программы и аргументы (например, сериализованные с использованием GlobalId). Когда администратору необходимо повторно отправить электронное письмо, создайте новое электронное письмо с нуля. Мне не нравится этот метод, потому что в идеале я хочу, чтобы повторно отправленные электронные письма имели точно такое же содержание (включая вложения), как и при первоначальной отправке. С тех пор в почтовых программах могли быть исправлены ошибки/опечатки, но я хочу, чтобы все эти ошибки и опечатки оставались там, когда электронное письмо отправляется повторно.

Теперь, когда выпущен Rails 4.2 и ActiveJob стабилен, я не нашел стандартного способа сделать это: все электронные письма в очереди сразу удаляются после их отправки (я только что проверил бэкэнд delayed_job). Должен быть способ, возможно, сохранить завершенное задание почтовой программы в какой-то отдельной таблице БД, а затем повторно поставить это задание в очередь, когда это необходимо.

Я хотел бы повторно использовать механизм сериализации электронной почты ActiveJob для достижения своей цели, если это возможно, потому что я не хочу переписывать свой наблюдатель, когда выйдет Rails 6 с полностью измененным API-интерфейсом наблюдателя.

Как лучше включить повторную отправку отправленных писем?

Обратите внимание, что я уже рассматривал подобные вопросы здесь:

Однако оба они о том, как хранить отправленные электронные письма, а не о том, как повторно отправить их позже как есть.

Спасибо! Алекс.


person Alex Kovshovik    schedule 08.02.2015    source источник
comment
Вы проверили stackoverflow.com/ вопросов/19782574/ и stackoverflow.com/questions/4850484/?   -  person Benj    schedule 09.02.2015
comment
Да, я забыл упомянуть в своем вопросе. Эти ответы о том, как хранить отправленные электронные письма, но не о том, как повторно отправить их позже. Я отредактирую свой вопрос, чтобы включить эти ссылки - спасибо!   -  person Alex Kovshovik    schedule 09.02.2015