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