【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.erb
とactivation_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
]にアクセスしましょう。すると下の画像のようなプレビューを見ることができると思います。こちらでどのような見た目で送信されているのかが確認できますね。
最後に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などのメール機能は他にもたくさんあるそうです。 正直プログラミング言語は勉強しきれないので、他にもたくさんあるそうですとしか言っていませんが、、、、
最近は技術ブログ多めなので、技術ブログだけでなく、個人的な体験談も近日アップします!
以上、大ちゃんの駆け出し技術ブログでした!