ActionMailer Preview のススメ


Railsでメールを送信するためには ActionMailer という機能がある。内容の確認には letter_opener などの素晴らしいGemがある他、テストも作成できる。ここではメールの内容を確認するためのもう一つの方法、 ActionMailer::Preview (以下単に「プレビュー」)を紹介する。

作成

特別なコマンドはなく、 rails generate mailer の時に同時に作成される。

$ rails g mailer sample
      create  app/mailers/sample_mailer.rb
      invoke  slim
      create    app/views/sample_mailer
      invoke  rspec
      create    spec/mailers/sample_spec.rb
      create    spec/mailers/previews/sample_preview.rb

この中の spec/mailers/previews/sample_preview.rb がプレビューである。中身を見てみよう。

spec/mailers/previews/sample_preview.rb
# Preview all emails at http://localhost:3000/rails/mailers/sample
class SamplePreview < ActionMailer::Preview

end

ActionMailer::Preview を継承したクラスであることが分かる。コメントにURLが書いてあるので、サーバーを立ち上げてアクセスしてみる。

メールクラスの名前 "Sample" のみ表示されている。ここから内容を実装していく。

使い方

準備

プレビューの前にまずメールを実装する。シンプルにこんな感じ。

app/mailers/sample_mailer.rb
class SampleMailer < ApplicationMailer
  def welcome(member)
    @member = member
    mail to: @member.email, subject: 'Sample mailer'
  end
end
app/views/sample_mailer/welcome.text.erb
<%= @member.name_sei + ' ' + @member.name_mei %> 様

ご登録ありがとうございます。

プレビューの実装

プレビューには、メールオブジェクトを return するメソッドを実装する。シンプルな例だとこうなる。

spec/mailers/previews/sample_preview.rb
# Preview all emails at http://localhost:3000/rails/mailers/sample
class SamplePreview < ActionMailer::Preview
  def welcome
    member = Member.new(name_sei: '菅田', name_mei: '将暉', email: '[email protected]')
    SampleMailer.welcome(member)
  end
end

先ほどのURLにアクセスすると、項目が一つ増えている。

リンクをクリックすると、メールの内容が確認できる。

応用編

プレビューには、同じ(※)メーラーを呼び出す別のメソッドが定義されていてもよい。条件によって内容が変わるメールだと重宝する。
※違うメーラーを呼び出してもいいのだが、混乱の元なのでお勧めしない。
また、seedデータがあればそれも利用できる。

spec/mailers/previews/sample_preview.rb
# Preview all emails at http://localhost:3000/rails/mailers/sample
class SamplePreview < ActionMailer::Preview
  def welcome
    member = Member.new(name_sei: '菅田', name_mei: '将暉', email: '[email protected]')
    SampleMailer.welcome(member)
  end

  def welcome_db
    member = Member.first
    SampleMailer.welcome(member)
  end
end

使い所

メールを送る条件が複雑な場合、画面操作をすっ飛ばしてメールの内容が確認できる。これは letter_opener にない利点である。

  • 項目の多い入力フォームを埋めて submit しなければ送信されないメール
  • rake task で送信されるメール
  • 特定の条件を満たす宛先にのみ送信されるメール etc...

特に業務システムの場合、メールの活躍機会はまだまだ多いはず。うまく使えば確認作業が大幅に楽になる ActionMailer::Preview をぜひ活用しよう。