RailsGuideにも記述があるのですが、Railsでメールを送る前に任意の処理を挟む方法があります。

self.delivering_emailを定義したクラスを用意しておいて、ActionMailerに登録しておくと送信前に呼んでくれるようになります。登録するのはdelivering_emailに応答するクラスであればなんでもいいはずです。

1# ロードパスのどこか
2class HogehogeInterceptor
3  def self.delivering_email(message)
4    # 何かする
5  end
6end
7
8# initallizerのどこか
9ActionMailer::Base.register_interceptor(SandboxEmailInterceptor) if Rails.env.staging?

サブジェクトを加工する

引数に渡ってくるmessageMail::Messageのインスタンスで、

  • subject
  • body
  • from
  • to

などの値を変更できます。

よくメールのサブジェクトに【サービス名】みたいなのをつけて、【サービス名】登録完了のお知らせとして送るようなケースがあるかと思います。

Interceptorではmessage.subjectを↓のように加工することで、

1class SubjectInterceptor
2  def self.delivering_email(message)
3    message.subject = "【サービス名】" + message.subject
4  end
5end

全てのメールに一括で挿入でき、メールが増えたときにも個別対応が要らないのでとても楽です。

メール送信をやめる

あまりない例になっちゃって申し訳ないですが、例えば夜間はメール送信しないみたいなことがもしかしたらあるかもしれません。ステージング環境とか。

そういった場合にはInteceptorにてmessage.perform_deliveriesfalseにしてあげるとメールが送られなくなります。↓こんな感じ。

1class NightTimeInterceptor
2  def self.delivering_email(message)
3    hour = Time.current.hour
4    if hour < 8 || hour >= 20
5      message.perform_deliveries = false
6    end
7  end
8end

他にも活用できそうですけど、考えたのはこのぐらいです。