Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
7
Help us understand the problem. What is going on with this article?
@mi-1109

【Rails】 Action Mailerとdeviseをつかって登録完了メールを自動送信してみる

deviseのユーザー認証機能を利用することを前提に、ユーザーの新規登録完了後にActionMailerを使って登録完了メールを送信する方法をまとめています。

大まかな流れ

  1. メール送信用サーバーの設定
  2. アプリパスワードの取得
  3. WelcomeMailerを生成
  4. ApplicationMailerとWelcomeMailerの編集
  5. deviseのcontrollerのcreateアクションをオーバーライドして、WelcomeMailerを呼び出す
  6. メール本文の作成
  7. おまけ:dotenv-railsでメールアドレスやパスワードをGitHubにあげないようにする

前提

  • deviseでUserモデルを作成した、かつusersテーブルにはnameとemailカラムがあることを前提としています
  • deviseの設定については、こちらの記事等を参考に設定できればOKかと思います(上記の記事を参考にする場合:メール認証についてはこの記事でもSTEP1でまとめていきますが、どちらの記事を参照していただいても構いません)
  • STEP1の「メール送信用サーバの設定」ではGmailを使用するので、Googleアカウントを一つ用意してください。練習用の場合は、サブのアカウントや練習用アカウントで試される方が安心かと思います

実装手順

では実装を進めていきましょう!

STEP1. メール送信用サーバーの設定

Gmailアカウントからメールを送れるようにするために、メール送信用のサーバーを設定します。以下のsmtpというのがメール送信に必要なSMTPサーバーのことですね。

(余談ですが、メール送信周りのサーバーについてはこちらがコンパクトでわかりやすかったです)

config/environments/development.rb

Rails.application.configure do
  # ----- 中略 -----  #
  config.action_mailer.raise_delivery_errors = true
  # ----- 中略 -----  #

  #  以下を末尾に追記   #
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    port:                 587,
    address:              'smtp.gmail.com',
    domain:               'smtp.gmail.com',
    user_name:            '送信元となるGmailアドレスを記入',
    password:             'STEP2で取得するアプリパスワードを記入',
    authentication:       'login',
    enable_starttls_auto: true
  }
end

上記について、具体的に見ていきましょう:

  • まず、development.rbに記述されている、config.action_mailer.raise_delivery_errorsfalseになっていれば、trueに変更する
  • 「以下を末尾に追記」とコメントした部分は、コピペする
  • user_namepasswordには、個々のGmailアドレスなりアプリパスワードの入力が必要。アプリパスワードはSTEP2で取得するので、ここではまずuser_nameに、新規登録完了メールの送信元となる(自分や運営組織の)Gmailアドレスをシングルクオテーション内に記述

STEP2. アプリパスワードの取得

STEP1で指定したGmailのGoogleアカウントページから、アプリパスワードを取得します👇

① Googleのトップページ右上のアカウントアイコンをクリック。「Googleアカウントを管理」をクリックして、Googleアカウントページにいく
image.png

② サイドバーから「セキュリティ」をクリック
image.png

③「Googleへのログイン」セクションの「2段階認証プロセス」をクリック
image.png

④「使ってみる」をクリック
image.png

⑤ Googleアカウントへのパスワードを要求されたら入力してログイン。「ログインの2つ目の手順としてスマートフォンを使用」画面が表示されたら、適当な方法を選択し「続行」をクリック(私は「他のオプションを表示」→「テキストメッセージまたは音声通話」を利用しました)。
image.png

⑥ 指示に従って進めていき「2段階認証プロセスを有効にしますか?」が出たら「有効にする」をクリック
image.png

⑦ 有効にできたら、画面上部の「←」をクリックし、「セキュリティ」画面に戻る
image.png

⑧ 再び「Googleへのログイン」セクションを見ると、「アプリパスワード」の行が追加されているので、クリック
image.png

⑨ 再びGoogleアカウントのパスワードを要求されるので、入力してログインし、「アプリパスワード」画面に遷移したら、まず「アプリを選択」から「その他(名前を入力)」を選択
image.png

⑩ 作成しているアプリケーションの名前を記入し「生成」をクリック
image.png

⑪ 黄枠内に生成されたアプリパスワードが表示されるので、コピーしてどこかメモなどに張り付けておく(なくすとアプリパスワードを生成し直すことになるのでメモしておいた方が良いです)
image.png

⑫ 開発環境に戻って、development.rbpasswordに、⑪で取得したアプリパスワードをペースト

devise.rbconfig.mailer_senderに、送信元となるGmailアドレス(development.rbuserに記述したのと同じアドレス)を記入

config/initializers/devise.rb
  # ----- 前略 -----  #

  config.mailer_sender = '送信元となるGmailアドレスを記入'

  # ----- 後略 -----  #

STEP3. WelcomeMailerを生成

ターミナルで以下のコマンドを実行し、WelcomeMailersend_when_signupメソッドを一緒に生成します。Mailer名とメソッド名は好きなものを指定してOKです。

terminal
$ rails g mailer WelcomeMailer send_when_signup
# rails g mailer   <Mailer名>     <メソッド名>

これにより、以下が生成されます:

  • app/mailers配下に、application_mailer.rbwelcome_mailer.rb
  • app/views/welcome_mailer配下に、viewファイル( html.erbファイルとtext.erb

※メソッドは、Mailerと一緒に生成しなくても大丈夫ですが、STEP6でメール本文を作成する際に自分でviewファイルを作成する工程が発生するので、この段階でメソッドごと生成してしまう方が手間がないかと思います。

STEP4. ApplicationMailerとWelcomeMailerの編集

まず、application_mailer.rbには、すべてのMailerに共通の設定を記述します。これに対し、welcome_mailer.rbには、WelcomeMailerに固有の設定を記述します。

なお、application_mailer.rbはデフォルトの記述のままでも動作するので、単に練習用・勉強用ということであれば、welcome_mailer.rbの編集に進んでもOKです

application_mailer.rbを編集

app/mailers/application_mailer.rb
#デフォルトの記述
class ApplicationMailer < ActionMailer::Base
  default from: 'from@example.com'
  layout 'mailer'
end

#編集例
class ApplicationMailer < ActionMailer::Base
  default from:     "〇〇事務局",
          cc:       "hogehoge@gmail.com"
          bcc:      "hoge_hoge@gmail.com"
  layout 'mailer'
end

👆のdefalutメソッドは、共通の設定を記述する際に使用するもので、以下のような項目についてデフォルト値の指定が可能です:

項目 内容
to メインの送信先
cc メインではないが、共有しておきたい送信先
bcc 他の人に見られずに共有しておきたい送信先
subject メールのタイトル
from メールの送信元の名前
reply_to 返信先のメールアドレス ​
date メールの送信日時 ​

welcome_mailer.rbを編集

app/mailers/welcome_mailer.rb

def send_when_signup(email, name) 
    @name = name
    mail to: email, subject: 'Registration Complete! Thanks for Joining!'
end

ここで何をしているかですが…

  • send_when_signupメソッドの引数として、emailnameを定義
  • mailメソッドが実行されると、メールの内容が記述されたviewファイル( html.erbファイルとtext.erb)が読まれる
  • @nameはviewファイル上に、userの登録氏名(name)を表示するために定義したインスタンス変数
  • subjectには任意の件名を指定できる

ちょっとこの段階ではわかりづらいかもしれませんが、controllerとviewの記述を見ていけば、send_when_signupメソッドで定義した内容もわかりやすくなると思うので、先に進めていきましょう!

STEP5. deviseのcontrollerのcreateアクションをオーバーライドして、WelcomeMailerを呼び出す

STEP4で定義したWelcomeMailerは、controllerから呼び出してあげないと実行されません。

ユーザーの新規登録処理はdeviseのregistrations_controllerのcreateアクションに定義されています。そして、WelcomeMailerを呼び出す記述をcreateアクションに加えるには、「オーバーライド」が必要です。


そもそも「オーバーライド」とは…?
 『プロを目指す人のためのRuby入門』(伊藤淳一著)の定義をかりると、「サブクラスではスーパークラスと同名のメソッドを定義することで、スーパークラスの処理を上書きすること」ができ、「これをオーバーライドと言います」。
 オーバーライドを伴う処理の実装には「クラスの継承」に関する理解が必要になってきます。こちらの記事や、上述の本の第7章にとてもわかりやすく整理されているので、「継承??スーパークラス??オーバーライド??」な方にも理解しやすいかと思います。

やっていきましょう

① deviseのregistrations_controllerクラス(スーパークラス)を継承した、users/registrations_controller.rb(サブクラス)を作成

  • app/controllers配下に、usersフォルダを作成(手動で、右クリック→フォルダ作成でOK)
  • usersフォルダ配下に、registrations_controller.rbを作成し、以下のように記述して、usersのregistraions_controllerに継承させる
app/controllers/users/registrations_controller.rb

class Users::RegistrationsController < Devise::RegistrationsController

end

② createアクションをオーバーライドする
 ①で作成したusers/registrations_controller.rbにcreateメソッドを追記

app/controllers/users/registrations_controller.rb

class Users::RegistrationsController < Devise::RegistrationsController

  def create
    #スーパークラス(devise)のcreateアクションを呼ぶ 
    super 
    #WelcomeMailerクラスのsend_when_signupメソッドを呼び、POSTから受け取ったuserのemailとnameを渡す
    WelcomeMailer.send_when_signup(params[:user][:email],params[:user][:name]).deliver
  end

end

どうなっているかというと…

  • superメソッドは、スーパークラスであるdeviseのregistrations_controllerのcreateアクションを呼んでいる(ちなみにdevise側のcreateアクションの定義がどうなっているかは、オーバーライドする前に確認しておいた方がいいと思います。こちらから確認できます)
  • POSTから受け取ったuserのemailnameの値は、welcome_mailer.rbsend_when_signupメソッドに定義した引数にそれぞれ渡る
  • send_when_signupメソッドの最終結果が、deliverメソッドで送信される

users/registrations_controllerを呼び出す記述をルーティングに追加

config/routes.rb

devise_for :users, controllers: {
  registrations: "users/registrations"
}

# ---- 後略 ---- #

👆 もともとdeviseを導入したときにdevise_for :usersは記述されているはずですが、それ以降の部分を追記して、deviseのregistrations_controllerを継承したusers/registrations_controllerへのルーティングが行えるようにしてあげましょう。

STEP6. メール本文の作成

ここまでくればもう少しです!
まだメールのviewファイルを編集できていないので、記述していきましょう。
(viewファイルの記述内容は適宜変更してください)

HTMLファイルで受け取れない/受け取りたくないuserがいる可能性もあるので、テキストファイルもあわせて用意しておくのが推奨されているようです。

app/views/welcome_mailer/send_when_signup.html.erb

<h2><%= @name %> さま</h2>

<p>この度は、〇〇へのご登録ありがとうございました。</p>
<p>今後とも 〇〇 をよろしくお願いいたします。</p>

<p>〇〇事務局</p>

app/views/welcome_mailer/send_when_signup.text.erb
-------------------------------
      <%= @name %> さま
-------------------------------

この度は、〇〇へのご登録ありがとうございました。
今後とも 〇〇 をよろしくお願いいたします。

〇〇事務局

これでユーザーの新規登録後にメールが送信されるはずです。
メールが届くかどうか、実際に確認してみてください。

おまけ:dotenv-railsでメールアドレスやパスワードをGitHubにあげないようにする

GitHubにpushする前に、ここまで記述してきたメールアドレスやパスワードが、GitHubにあがらないように環境変数とを定義しておいた方がセキュアかと思います。

ここでは一例だけ取り上げますが、どこに環境変数の定義が必要かは、必ずご自身で確認されてから、push するようにしてくださいね。ということで、やっていきましょう!

👇dotenv-railsを入れる

Gemfile
# ---- 前略 ---- #
gem 'dotenv-rails'
end
terminal
$ bundle install

👇 アプリケーションのフォルダ直下に、.envファイルを作成

terminal
$ touch .env

👇 .envファイルに環境変数を定義
 「xxx」の部分には、元々ソースコードに記述していた値を記入

.env
WELCOME_MAILER_ADDRESS=xxx
WELCOME_MAILER_PASSWORD=xxx

👇 ソースコードで .envに記述した環境変数を使用

config/environments/development.rb

Rails.application.configure do
  # ----- 中略 -----  #
  config.action_mailer.raise_delivery_errors = true
  # ----- 中略 -----  #

  #  以下を末尾に追記   #
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    port:                 587,
    address:              'smtp.gmail.com',
    domain:               'smtp.gmail.com',
    user_name:            ENV['WELCOME_MAILER_ADDRESS'],
    password:             ENV['WELCOME_MAILER_PASSWORD'],
    authentication:       'login',
    enable_starttls_auto: true
  }
end

👇 .gitignore.envを追加

.gitignore

# ---- 前略 ---- #
/.env

👇 .envファイルがGit管理から外れたか確認(.envが表示されなければOK)

Terminal
$ git status

👇 環境変数が正しく設定できているか一応確認

Terminal
#rails c を起動
$ rails c

#以下を記述
> ENV['WELCOME_MAILER_ADDRESS']

#クオテーション内に.envに定義した値が出力されていればOK
=> "xxxxx@gmail.com"

#rails c を終了
>exit

他にも環境変数として定義しておきたい箇所は👆を繰り返します。
全部問題なくgit管理から外れたら、pushしましょう。

参考文献・資料

7
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
mi-1109
プログラミング勉強中です。 Qiitaでは、初心者としてつまづいて、調べて、どう解決したかであったり、 学んだ概念等について整理したりしたいと思っています。 よろしくお願いいたします:)

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
7
Help us understand the problem. What is going on with this article?