4

Rails 4 アプリケーションでは、オブザーバーを使用してすべての送信メールを DB に保存しています。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 バックエンドを確認しました)。完了したメーラー ジョブを別の DB テーブルに保存し、必要に応じてそのジョブを再キューイングする方法が必要です。

Rails 6 が完全に変更されたオブザーバー API でリリースされたときにオブザーバーを書き直したくないので、可能であれば ActiveJob の電子メールのシリアル化メカニズムを再利用して目標を達成したいと考えています。

送信済みメールの再送信を有効にするより良い方法は何ですか?

ここで同様の質問をすでに確認したことに注意してください。

ただし、どちらも送信したメールを保存する方法に関するものであり、後でそのまま再送信する方法に関するものではありません。

ありがとうございました!アレックス。

4

0 に答える 0