RailsGuideにも記述があるのですが、Railsでメールを送る前に任意の処理を挟む方法があります。
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?
サブジェクトを加工する
引数に渡ってくる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
他にも活用できそうですけど、考えたのはこのぐらいです。