В моем приложении 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)
Теперь мне нужно добавить еще одну функцию, позволяющую администраторам повторно отправлять любые электронные письма из журнала электронной почты.
Есть пара решений, которые я сразу увидел:
- Добавьте код для хранения всех вложений (обычных и встроенных), затем реализуйте метод, который будет генерировать новое электронное письмо и повторно его отправлять. Я работаю над этим сейчас.
- Сохраните класс почтовой программы, метод почтовой программы и аргументы (например, сериализованные с использованием GlobalId). Когда администратору необходимо повторно отправить электронное письмо, создайте новое электронное письмо с нуля. Мне не нравится этот метод, потому что в идеале я хочу, чтобы повторно отправленные электронные письма имели точно такое же содержание (включая вложения), как и при первоначальной отправке. С тех пор в почтовых программах могли быть исправлены ошибки/опечатки, но я хочу, чтобы все эти ошибки и опечатки оставались там, когда электронное письмо отправляется повторно.
Теперь, когда выпущен Rails 4.2 и ActiveJob стабилен, я не нашел стандартного способа сделать это: все электронные письма в очереди сразу удаляются после их отправки (я только что проверил бэкэнд delayed_job). Должен быть способ, возможно, сохранить завершенное задание почтовой программы в какой-то отдельной таблице БД, а затем повторно поставить это задание в очередь, когда это необходимо.
Я хотел бы повторно использовать механизм сериализации электронной почты ActiveJob для достижения своей цели, если это возможно, потому что я не хочу переписывать свой наблюдатель, когда выйдет Rails 6 с полностью измененным API-интерфейсом наблюдателя.
Как лучше включить повторную отправку отправленных писем?
Обратите внимание, что я уже рассматривал подобные вопросы здесь:
Однако оба они о том, как хранить отправленные электронные письма, а не о том, как повторно отправить их позже как есть.
Спасибо! Алекс.