ActionMailer
RubyOnRails

Mail::Messageをオーバーライドする方法


Mail::Messageオーバーライドできない問題

Rails4くらいから、Mail::MessageActionMailer::MessageDeliveryオブジェクトにラップされている為、普通にMail::Messageのメソッドをオープンクラスして上書こうとしてもできないようになっています。

というのも、ActionMailer::MessageDeliveryDelegator

Delegatorは動的に委譲先を設定するので、MessageDelivery.newされた時にクラスが評価されます。

オープンクラスはロード済みのクラスに対してオーバーライドやメソッド追加できる機能なので、この場合オープンクラスできない…ということになるのだと思います…(自信薄)


じゃあどうする

今回の場合delivery自体を上書きたかったので、ActionMailer::MessageDeliveryをオープンクラスしてsuperしました。


パッチ

module ActionMailer

class MessageDelivery < Delegator
def deliver
...()...
super
...()...
end
end
end

ActionMailerの解説は下記が詳しいですが、機能が込み入りすぎてあと10回読み直したい。

ActionMailerは何をしているのか

なお、変にパッチをあてるよりも、Railに乗れるなら本来そっちのがベター。

コールバックやフックもちゃんと準備されています。

Action Mailer の基礎


おまけ

REPLでhoge = Mail::Message.newすると、inspectされるので

ちゃんと上書かれているように見えます。これで余計にハマったのでした。

Railsでの観察者効果