大ちゃんの駆け出し技術ブログ

RUNTEQ受講生のかわいいといわれるアウトプットブログ

【Rails】Action Mailer

はじめに

こんにちは!大ちゃんの駆け出し技術ブログです。

今回はRails標準機能であるAction Mailerという機能について紹介します!名前から類推できる通りメールの送信機能になります。

※Action Mailboxという別の標準機能もありますが、こちらはメールの受信機能です。

導入方法

今回はアプリケーションからユーザーに対しアカウントアクティベーションのメールを送ることを想定してます。アカウントアクティベーションとはよくある本人確認方法の1つですね。Webサイトなどでアカウント登録時に登録したメールに対し、本人確認メールが送られるシチュエーションです。

では早速実装していきましょう。

いつものようにscafflodを使用してアプリの雛形を作成します。

$ rails new action_mailer_sample
$ cd action_mailer_sample
$ rails g scaffold user name:string email:string
$ rails db:create
$ rails db:migrate

次にmailerのファイルを作成します。

$ rails g mailer UserMailer
      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

作成されたapp/mailers/user_mailer.rbに対してactivation_emailメソッドを定義します。

# app/mailers/user_mailer.rb
class UserMailer < ApplicationMailer
  def activation_email
    @user = params[:user]
    @url  = 'http://example.com/login'
    mail(to: @user.email, subject: 'アカウントのアクティベーションメール')
  end
end

インスタンス変数である@user@urlを定義しています。

このインスタンス変数はRailsのコントローラと同様に、ビューに渡されるようになっています。このビューがメール本文自体を表示するようになっています。

mail(to: @user.email, subject: 'アカウントのアクティベーションメール')は見て理解できると思います。to: の部分で宛先を、subject: の部分で件名を指定しています。

次はメール本文にあたるビューを作成します。メソッド名に対応したerbファイルを作成する必要があるため、ファイル名は「activation_email~」となります。

しかし、先ほど実行したコマンドではビューのフォルダであるapp/views/user_mailerのみ作成しています。従って、ビュー自体は雛形が作成されていないので手動でファイルを作成し、本文も手動で実装します。テキスト形式とHTML形式の2つのフォーマットで表示させるために、activation_email.html.erbactivation_email.text.erbを作成します。 ※メールの閲覧方法はアプリ上やwebブラウザ上など表示するフォーマットが異なる場合があるため、

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

<p><%= @user.name %>様</p>

<p>この度は、「○○○○○○」にお申し込み頂きまして誠にありがとうございます。</p>

<p>お申し込み頂きましたアカウント情報は以下となります。</p>

<p>ログインID:○○○○○</p>
<p>パスワード:個人情報のため表示を伏せています</p>

<p>下記URLをクリックしてログインしてください。</p>
<p><%= @url %></p>

# app/views/user_mailer/activation_email.text.erb

<%= @user.name %>様

この度は、「○○○○○○」にお申し込み頂きまして誠にありがとうございます。

お申し込み頂きましたアカウント情報は以下となります。

ログインID:○○○○○
パスワード:個人情報のため表示を伏せています

下記URLをクリックしてログインしてください。
<%= @url %>

erbファイルなので<%= %>の記法が使用できます。

ここでプレビュー機能を使ってメール本文を確認してみたいと思います。

プレビュー機能を使うために、コンソール上で前もって1つのユーザーを登録しておきましょう。

$ rails c

irb(main):001:0> User.create(name: "dai-chan", email: "daichan@example.com")
   (0.1ms)  begin transaction
  User Create (1.3ms)  INSERT INTO "users" ("name", "email", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["name", "dai-chan"], ["email", "daichan@example.com"], ["created_at", "2021-02-02 10:58:11.562336"], ["updated_at", "2021-02-02 10:58:11.562336"]]
   (0.9ms)  commit transaction
=> #<User id: 1, name: "dai-chan", email: "daichan@example.com", created_at: "2021-02-02 10:58:11", updated_at: "2021-02-02 10:58:11">

プレビュー機能を使うためにはUserMailer作成時に作成されたtest/mailers/previews/user_mailer_preview.rbにメソッドを追記します。

class UserMailerPreview < ActionMailer::Preview
  def activation_email
    UserMailer.with(user: User.first).activation_email
  end
end

rails sを実行して[http://localhost:3000/rails/mailers/user_mailer/activation_email.html]にアクセスしましょう。すると下の画像のようなプレビューを見ることができると思います。こちらでどのような見た目で送信されているのかが確認できますね。

Image from Gyazo

最後にUsersコントローラのユーザー作成アクションであるcreateアクションで、ユーザー作成時にメールが送信されるように記述します。

def create
    @user = User.new(user_params)

    respond_to do |format|
      if @user.save
        UserMailer.with(to: @user.email, name: @user.name).activation_email.deliver_now # 追記
        format.html { redirect_to @user, notice: "User was successfully created." }
        format.json { render :show, status: :created, location: @user }
      else
        format.html { render :new, status: :unprocessable_entity }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

これでユーザー作成時にメールを送信するように実装できました。

終わりに

ActionMailerなどのメール機能は他にもたくさんあるそうです。 正直プログラミング言語は勉強しきれないので、他にもたくさんあるそうですとしか言っていませんが、、、、

最近は技術ブログ多めなので、技術ブログだけでなく、個人的な体験談も近日アップします!

以上、大ちゃんの駆け出し技術ブログでした!