RailsGuideにも記述があるのですが、Railsでメールを送る前に任意の処理を挟む方法があります。
https://railsguides.jp/action_mailer_basics.html#%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%92%E9%85%8D%E4%BF%A1%E7%9B%B4%E5%89%8D%E3%81%AB%E5%8A%A0%E5%B7%A5%E3%81%99%E3%82%8Bself.delivering_email
を定義したクラスを用意しておいて、ActionMailerに登録しておくと送信前に呼んでくれるようになります。登録するのはdelivering_email
に応答するクラスであればなんでもいいはずです。
# ロードパスのどこか
class HogehogeInterceptor
def self.delivering_email(message)
# 何かする
end
end
# initallizerのどこか
ActionMailer::Base.register_interceptor(SandboxEmailInterceptor) if Rails.env.staging?
サブジェクトを加工する
引数に渡ってくるmessage
はMail::Message
のインスタンスで、
- subject
- body
- from
- to
などの値を変更できます。
よくメールのサブジェクトに【サービス名】
みたいなのをつけて、【サービス名】登録完了のお知らせ
として送るようなケースがあるかと思います。
Interceptorではmessage.subject
を↓のように加工することで、
class SubjectInterceptor
def self.delivering_email(message)
message.subject = "【サービス名】" + message.subject
end
end
全てのメールに一括で挿入でき、メールが増えたときにも個別対応が要らないのでとても楽です。
メール送信をやめる
あまりない例になっちゃって申し訳ないですが、例えば夜間はメール送信しないみたいなことがもしかしたらあるかもしれません。ステージング環境とか。
そういった場合にはInteceptorにてmessage.perform_deliveries
をfalse
にしてあげるとメールが送られなくなります。↓こんな感じ。
class NightTimeInterceptor
def self.delivering_email(message)
hour = Time.current.hour
if hour < 8 || hour >= 20
message.perform_deliveries = false
end
end
end
他にも活用できそうですけど、考えたのはこのぐらいです。