【Rails】ActionMailerを使用してメール送信ができる!letter_opener_webをセットでデバックを簡易的に!

はじめに

こんにちは株式会社TOKOSのナオキです!
今回は、RailsのActionMailerを使用したメール処理とletter_opener_webを使用したデバック方法を解説します。

この記事では以下の内容について取り上げています。

  • ActionMailerの説明と基本的な使い方
  • letter_opener_webを使用したメール送信のデバック方法

対象読者

  • rails初学者の方
  • 開発でメール送信機能を実装する方

ActionMailerの説明と基本的な使い方

説明

ActionMailerは、Railsに標準で組み込まれているメール送信を行うためのライブラリです。
例えば、ユーザー登録後の確認やパスワードリセット通知等で必要になるメール送信機能を簡単に実装できます。

基本的な使い方

Mailerクラス作成

まず、ActionMailerで使うMailerクラスを作成します。
以下のコマンドで新しいMailerを作成できます。
※ UserMailerは任意のクラス名です。ユーザー関連のメールを送信したいためUserMailerにしています。

rails generate mailer UserMailer

上記のコマンドを実行したら以下が作成されます。

  • app/mailers/user_mailer.rb → メール送信用のクラス
  • app/views/user_mailer → 対応するメールテンプレート用ディレクトリ

UserMailerクラスの実装

app/mailers/user_mailer.rbファイルのUserMailerクラスにユーザー登録時に送信する完了メールの実装をします。

class UserMailer < ApplicationMailer
  # ユーザー登録完了メールのメソッド
  def registration_completed_mail(user)
    @user = user

    mail(
      to: @user.email,
      subject: "ユーザー登録完了"
    )
  end
end

上記のregistration_completed_mailでは引数でuserの情報を受け取っています。
mail内のtoには宛先を入れ、subjectには件名を入れます。

メール本文の作成

メールの本文を作成するためapp/views/user_mailerディレクトリ配下に、以下のHTML形式、テキスト形式の2つのファイルを作成します。

  • app/views/user_mailer/registration_completed_mail.html.erb → HTML形式
  • app/views/user_mailer/registration_completed_mail.text.erb → テキスト形式

なぜ2つのファイルを作成するのかは、受信者のメールを見る環境が違う場合があるからです。

HTML形式は、画像やデザインが使用でき見た目的にも良いメールを作成することができます。
多くの人が使っているメールアプリ(Gmail等)では、このHTML形式で表示されます。

テキスト形式は、HTMLが使用できないメールアプリやシンプルな表示が好まれる場合に使用されます。
例えば古いデバイスや、HTMLメールをブロックしている設定のメールアプリではテキスト形式しか見ることができません。

なので、どちらの形式も用意しておくことで受信者のメールを見る環境が違っていても対応できます。

<h1>ユーザー登録完了のお知らせ</h1>
<p><%= @user.name %>様の登録が完了しました。</p>
ユーザー登録完了のお知らせ
<%= @user.name %>様の登録が完了しました。

メールの送信

コントローラーからメールの送信を行います!
今回はユーザー登録時にメールを送信したいので、ユーザーが@user.saveによって登録された後にメール送信のコードを記述します。

class UsersController < ApplicationController
  def create
    @user = User.new(user_params)
    if @user.save
      # ユーザー登録後に登録完了メールを送信
      UserMailer.registration_completed_mail(@user).deliver_now
      redirect_to @user
    else
      render :new
    end
  end
end

deliver_nowはRailsのActionMailerでメールを即時に同期的に送信するためのメソッドです。

上記のようにコントローラーに記述することでメールの送信が実行できます。
ただ開発環境でメールの送信を確認するにはSMTPサーバーを設定するなどをしなければいけません。
そんなときに簡単にメール送信の確認が出来るライブラリがあります。
それがletter_opener_webです。

letter_openerとletter_opener_webを使用したメール送信のデバック方法

letter_openerとletter_opener_webの説明

letter_openerは、Railsアプリケーションでのメール送信のデバッグに便利なGemです
通常、開発環境ではSMTPサーバーを通してメール送信を行いますが、誤送信のリスクやSMTPの設定の手間がかかったりします。
それに比べletter_openerを使用することでメールの内容をブラウザ上で簡単に確認することができます。

letter_opener_webは、これまでに送信されたメールの履歴を一覧管理できるライブラリです。
letter_openerと組み合わせることで、これまでに送信されたメールの履歴をブラウザ上で確認できるようになります。
通常のletter_openerでは、メール送信後にブラウザに表示されます。なのでletter_openerだけではメール履歴の管理ができません。単発のみのメール送信であればこちらでも大丈夫です。
それに対してletter_opener_webを使用したら、ブラウザで履歴として一覧表示させることができるので、過去に送信したメールを一覧で確認することができます。

使い方とメール送信のデバック方法

Gemのインストール

まずはGemfileに以下のコードを追加します。

gem 'letter_opener_web', group: :development

その後、ターミナルにて以下のコマンドでインストールします。

bundle install

ルーティングの設定

開発環境のみでletter_openerを使用したいので、開発環境に限定してメール履歴管理のエンドポイントを作成します。config_routes.rbに以下の設定を追加します。

if Rails.env.development?
  mount LetterOpenerWeb::Engine, at: "/letter_opener"
end

上記のコードにより、開発環境でhttp://localhost:3000/letter_openerにアクセスすることで、メールの履歴を確認できるようになります!

ActionMailerの設定

config/environments/development.rbに以下を追加します。

config.action_mailer.delivery_method = :letter_opener_web
config.action_mailer.perform_deliveries = true

上記により、メール送信がletter_opener_webを通って行われ、ブラウザ上の履歴ページで確認できるようになります。
実際にブラウザ上では以下の画像のように表示されます。
これによりメールの内容があっているのか等の確認をすることができます!

さいごに

RailsのActionMailerletter_openerを活用することで、開発環境でのメール送信がとても簡単になります。

Railsのメール機能を最大限に活用して、便利なアプリケーションを開発してみてください!