メール認証の仕組みを利用できるようにしましたが、これだけではメールの送信を行うことは出来ません。Railsアプリでメール送信を行う為の設定が必要になります。どのような設定が必要になるか、Railsアプリでメールの送信を行う時の流れを見ながら確認しましょう。
まず、メールの送受信にはメールサーバーが必要になります。以下のSMTPサーバーとは、メールを送信・配信する為のサーバーです。受信の為のサーバーはPOP3サーバーといいます。この2つは総称してメールサーバーと呼ばれます。
以下は、メールの送信~受信までの流れを図にしたものです。
SMTPサーバーに対して、送信者がメールの送信を依頼します。これは、Railsに標準搭載されているActionMalerという機能を使用して行います。次に、SMTPサーバーがDNSサーバーに対して受信者のメールサーバーのIPアドレスを問い合わせています。そして、受信者のサーバーのIPが分かったらそのIPを、SMTPサーバーに伝えています。
そして、受信者のPOP3サーバーにメールが送られます。そして最後に、受信者のPOP3サーバーから受信者へメールが送られます。これが、メールの送受信の簡単な流れです。
この中で、準備する必要があるのはActionMailerとSMTPサーバーです。ですが、ActionMailerの設定は、Devise側で既に行われています。ですので今回は、SMTPサーバーの準備のみ行います。
SMTPサーバーは、Gmailのものを使用します。その為には、Gmail側とRails側の両方で準備が必要です。まずは、Gmail側での準備を行っていきましょう。
Gmailでは、2段階認証とアプリパスワードの生成を行います。2段階認証とは、ログインの際にアカウント取得時に設定したパスワードの他、登録した電話番号あてに届く、ログインのたびに変更される認証コードの入力を必須とする設定です。Railsでは、この設定を行っていないとメールの送信が出来ないようになっていますので設定しておきましょう。
また、アプリパスワードとは、2段階認証システムが使えないサービスでGmailへのログインを行う為に必要なパスワードです。
※ Gmailを作成するレッスンは以下になります。まだアカウントを取得してない人はこちらを参考にしてください。
https://skillhub.jp/courses/134/lessons/770
では、Googleのアカウントページにログインして下さい。
https://myaccount.google.com/intro?hl=ja
ログインしたら、ログインとセキュリティに進みます。
二段階認証プロセスをクリックします。
その次に表示された画面で開始をクリックします。その後パスワードの入力を行います。
2段階認証コードを受け取る為の電話番号を入力します。コードの取得方法は、どちらでも構いません。
次に進むと、テキストメッセージか電話で、コードが届きます。そのコードを入力して次に進みます。
有効にするをクリックします。
左上の矢印をクリックして、メニュー画面に戻ります。
次に、アプリパスワードに進みます。パスワードの入力と、2段階認証コードの入力を行います。
アプリを選択というセレクトボックスを展開して、その他(名前を入力)を選択します。
Railsアプリ名を入力して、生成をクリックします。
お使いのデバイスのアプリパスワードをコピーしてメモ帳などに張り付けておいてください。後ほど使用します。完了をクリックします。これで、Gmailでの準備は完了です。
では、Railsアプリ側でSMTPサーバーの設定を行います。config/environments/development.rbを開いてください。
まず、config.action_mailer.raise~の部分をtrueに変更します。変更する事で、メール送信時のエラーを確認できるようになります。
そして、メーラーの設定をしましょう。以下のように記述します。
すべてを変更したコードは以下のようになります。
# config/environments/development.rb
config.action_mailer.raise_delivery_errors = true
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
address: 'smtp.gmail.com',
enable_starttls_auto: true,
port: 587,
domain: 'gmail.com',
user_name: '自分のGmailアドレス',
password: 'アプリパスワード',
authentication: :plain
}
今まで設定したのは、「開発環境用」でしたので、本番環境用のメーラー設定をしましょう。今回はHerokuを使用しますので、Heroku用の設定も行いましょう。config/environments/production.rbを開いて下さい。
そして、以下のように追加して下さい。記述する場所はproduction.rbの【Rails.application.configure do】~【end】内のどこでも構いません。(筆者は一番下に書くことが多いです)
config.action_mailer.default_url_options = { host: 'app-name.herokuapp.com' }
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
address: 'smtp.gmail.com',
enable_starttls_auto: true,
port: 587,
domain: 'gmail.com',
user_name: 'Gmailアドレス',
password: 'アプリパスワード',
authentication: :plain
}
開発環境ではdevelopment.rb内のdefaulturloptionsにAWS Cloud9プレビューページのURLを設定しました。今回は本番で使用するドメインを記述する必要があります。今回の場合、本番で使用するのはHerokuになりますので、Herokuで取得したドメインを記述してください。
production.rb
config.action_mailer.default_url_options = { protocol: 'https',host:'Herokuドメイン'}
protocolは'https'、host'〇〇'の〇〇の部分は上記の通り、サーバーを起動し、のブラウザのアドレスバーに表示されたhttps://以外の英数字~.comまでをコピーして貼り付けてください
これで、メールの設定は完了です。
Railsのメーラーが設定されて、本当にメールが飛ぶかどうかをチェックしたいと思います。
今回は自分宛てにメールをRailsコンソールから送ってみます。
その場合はRailsコンソールを使用すると良いでしょう。まずはRailsコンソールを起動してください。
rails c
そして以下のコマンドを打ち込みます。するとメールが飛ぶはずです。
ActionMailer::Base.mail(
from: 'newstarouchan@gmail.com',
to: "newstarouchan@gmail.com",
subject: "テストメール",
body: "これはテストです。"
).deliver_now
コピペで貼り付けても良いでしょう。コンソールはこんな状態になります。
Enterキーで送信されます。メールを確認すると届いているはずです。
ログインユーザーの場合・そうでない場合で、閲覧出来るページを制限してみましょう。ログインユーザーのみarticleのページを閲覧できるように設定します。articles_controllerに以下オレンジ部分を追加します。
# articles_controller.rb
class ArticlesController < ApplicationController
before_action :set_article, only: ...
before_action :authenticate_user!
では、実際にブラウザで見てみましょう。
以下のようにログイン画面が表示されて閲覧できないはずです。
次に、サインアップをしてもう1度見てみましょう。サインアップすると閲覧、作成、削除が可能になります。
次に、ログアウト・ログイン・編集リンクを作成します。
views/layouts/application.html.erbに以下を追加して下さい。
<%= link_to "ログアウト", destroy_user_session_path, method: :delete %>
<%= link_to "ログイン", new_user_session_path %>
<%= link_to "編集", edit_user_registration_path %>
ブラウザを更新すると【ログアウト】【ログイン】【編集】リンクが作成されていることが確認できます。
他のRailsアプリがあれば、それにも認証をかけてみましょう。
無料ビデオ講座のお知らせ
Skillhub [スキルハブ]では無料の動画講座を多数公開しています。他校だと数万円するような講座が無料で受講できます。