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?
サブジェクトを加工する
引数に渡ってくるmessageはMail::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_deliveriesをfalseにしてあげるとメールが送られなくなります。↓こんな感じ。
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
他にも活用できそうですけど、考えたのはこのぐらいです。
