Action Mailerをつかいユーザー登録を行なった際にメール送信するようにする

Action Mailerとは

Action Mailerを使うと、アプリケーションのメイラークラスやビューでメールを送信することができます。メイラーの動作はコントローラときわめて似通っています。

引用: Action Mailer の基礎 - Railsガイド

メールを送信する際によく使われていて、パスワードリセット、お問い合わせ、ユーザー登録などなど様々な用途で使用されていて、誰もが利用したことがあると思います。 また、Rakeタスクを組み合わせると設定したタイミングでメールを自動送信することも可能です。
今回は、ユーザーの新規登録をした際に通知メールが届く機能を実装します。

実装手順

簡易的なアプリを使って説明していきます。

まずは簡易的なアプリをscaffoldで作成します。

まずはrails newしたあとにscaffoldでuserテーブルに今回の実装に必要なカラムを追加します。

rails generate scaffold user name email login

以下のコマンドを実行し適用させます。

rails db:migrate

これでアプリの設定は終わりです!


メイラー生成

メールを送信するにはメイラー(コントローラーと似ている)とビューを作成する必要があります。
これからメイラーとビューを作成していきます。
ターミナルで以下のコマンドを実行します。

rails g mailer UserMailer

下記のログがでているはずです!

   Running via Spring preloader in process 28545
      create  app/mailers/user_mailer.rb
      invoke  erb
      create    app/views/user_mailer
      invoke  test_unit
      create    test/mailers/user_mailer_test.rb
      create    test/mailers/previews/user_mailer_preview.rb

ちなみにscaffoldでアプリを作成した場合にはapp/mailers/application_mailer.rbが自動で生成されています。 scaffoldは便利ですね。
これでメイラー生成は終了です!


ビューを作成する

先程作成したapp/views/user_mailerディレクトリの中にビューを作成してきます。
app/views/user_mailerディレクトリ下のファイルがレイアウトファイルのapp/views/layouts/application.html.erbに読み込まれます。
また、 scaffoldでアプリを作成した際にはレイアウトファイルも自動生成されています!

以下のファイルを作成してください

# app/views/user_mailer/welcome_email.html.erb

<!DOCTYPE html>
<html>
  <head>
    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
  </head>
  <body>
    <h1><%= @user.name %>様、example.comへようこそ。</h1>
      <p>
      example.comへのサインアップが成功しました。
      your username is: <%= @user.login %>.<br>
    </p>
    <p>
      このサイトにログインするには、<%= @url %>をクリックしてください。
    </p>
    <p>ご入会ありがとうございます。どうぞお楽しみくださいませ。</p>
  </body>
</html>
# app/views/user_mailer/welcome_email.text.erb

<%= @user.name %>様、example.comへようこそ。
===============================================

example.comへのサインアップが成功しました。ユーザー名は「<%= @user.login %>」です。

このサイトにログインするには、<%= @url %>をクリックしてください。

本サイトにユーザー登録いただきありがとうございます。

html形式とtext形式のファイルを作成する理由は、顧客によってフォーマットを使い分けるためです。 これでビューの作成は終了です!

メイラー編集

app/mailers/user_mailer.rbに空のメイラーがあるので、メールを送信するためのメソッドを定義していきます。

# output_app/app/mailers/user_mailer.rb

class UserMailer < ApplicationMailer
  default from: 'notifications@example.com'

  def welcome_email
    @user = params[:user]
    @url  = 'http://example.com/login'
    mail(to: @user.email, subject: '私の素敵なサイトへようこそ')
  end
end

上記のコードを解説していきます。
default from:はメールの送信元名です。
メールにはユーザーのname、login、emailを表示したいので、メソッドの中にインスタンス変数を作成しておきます。
ここで定義したwelcome_emailメソッドをビューやRakeタスクで実行することでメール送信のタイミングを使い分けています。
mailメソッドで使われているsubjectはメールの件名になります。

controllerを編集する

ユーザーが新規登録された際に登録したメールアドレスに登録完了メールが送信されるようにコードを追記していきます。
scaffoldで生成されたoutput_app/app/controllers/users_controller.rbのcreateメソッドを編集します。

class UsersController < ApplicationController
    def create
    @user = User.new(user_params)

    respond_to do |format|
      if @user.save
        # 保存後にUserMailerを使ってwelcomeメールを送信
        UserMailer.with(user: @user).welcome_email.deliver_later

        format.html { redirect_to(@user, notice: 'ユーザーが正常に作成されました。') }
        format.json { render json: @user, status: :created, location: @user }
      else
        format.html { render action: 'new' }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

実装確認

それでは実際にユーザーを作成しメールが送られてくるか確認します。 letter_opener_webを使いメールを受信します。
上記についても記事を書いたのでどうぞ

letter_opener_web実装方法 - Mekun’s blog


ユーザー新規登録

f:id:Mekun:20210925062208p:plain


letter_opener_web

f:id:Mekun:20210925062218p:plain


上記の通りユーザー新規登録時に入力した情報をもとにメールが届いていました。実装完了です!