PIYO - Tech & Life -

Railsでメールを配信する直前に処理を挟んで加工する方法

Rails Tips

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

Action Mailer の基礎 - Railsガイド
Action Mailerを使用してメールを送受信する方法について解説します。

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

# ロードパスのどこか
class HogehogeInterceptor
  def self.delivering_email(message)
    # 何かする
  end
end

# initallizerのどこか
ActionMailer::Base.register_interceptor(SandboxEmailInterceptor) if Rails.env.staging?

サブジェクトを加工する

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

  • subject
  • body
  • from
  • to

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

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

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

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

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

メール送信をやめる

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

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

class NightTimeInterceptor
  def self.delivering_email(message)
    hour = Time.current.hour
    if hour < 8 || hour >= 20
      message.perform_deliveries = false
    end
  end
end

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