Railsガイドにきちんと目を通して新しい知識を得る - Action Mailer の基礎編 -

ドキュメントを読み込むのは大事、ということでRailsガイドを頭から読んでいく取り組みをしています。 各章ごとに、(Railsガイドにちゃんと書いてあるのに)知らなかった機能を雑にまとめていきます。

今回は、Action Mailer の基礎の章です。

railsguides.jp

with

リンクはこちら

withを使うことでメーラーにパラメータを渡せます。送ったパラメータはメーラー側でparamsで受け取れます。
普段使うときはMailerアクションの引数に渡していたので使うことがなく、知りませんでした。

class BookMailer < ApplicationMailer
  def sample
    @book = params(:book)
    mail(to: 'sample@example.com', subject: 'sample件名')
  end
end

BookMailer.with(book: Book.first).sample
#=> メールが送信される

attachments.inlineでメールに画像等を埋め込む

リンクはこちら

attachments.inlineを使うことでメール内に画像を簡単に埋め込むことができます。
メールをリッチにしたいときに使えそうです。

# メールアクション内で
attachments.inline['image.png'] = File.read('image.png')
# メールテンプレート内で
<%= image_tag attachments['image.png'].url %>

アプリケーションのホスト情報とメーラー

リンクはこちら

メーラーインスタンスは、サーバーが受信するHTTPリクエストのコンテキストと無関係である

したがって、

*_pathヘルパーは、この動作の性質上メール内では一切利用できない

という理屈です。
_pathが使えないというのはコーディングする上で知ってはいたものの、理屈まできちんと理解できていなかったので知れてよかったです。

delivery_method_options

リンクはこちら

メールの送信に使用するSMTPサーバの設定をdelivery_method_optionsでカスタマイズできます。

ActionMailerのコールバック

リンクはこちら

_deliver_actionが使えます。
メーラー.アクション.deliverメソッドの場合、before_actionafter_actionbefore_deliverafter_deliverの順で実行されました。

class BookMailer < ApplicationMailer
  before_action -> { puts 'before_action called!' }
  before_deliver -> { puts 'before_deliver called!' }
  after_action -> { puts 'after_action called!' }
  after_deliver -> { puts 'after_deliver called!' }

  def sample
    ...
  end
end

BookMailer.sample.deliver_now!
# before_action called!
# Rendered...(アクションの処理)
# after_action called!
# before_deliver called!
# after_deliver called!