LoginSignup
4
7

More than 3 years have passed since last update.

Rails5 Cloud9でdeviseのメール送信用サーバーsmtpの設定まで

Last updated at Posted at 2019-06-29

Rails5 Cloud9でdeviseのメール送信用サーバーsmtpの設定まで

Railsでwebアプリケーションの開発に必要なユーザー登録やログイン機能を実装するにはdeviseというgemを使います。

登録方法として、ユーザーのメールアドレスに確認メールを送信し、受け取ったユーザーがワンクリックで登録を行なうといったよくあるやつが可能になります。

今回はAWSのcloud9環境において、smtpサーバーの設定に挑戦しましたので、記しておきたいと思います。

手順

  • AWS cloud9でsmtpサーバーを使うためにGmailを使用する
  • アプリパスワードを取得する
  • 補足
  • deviseを導入する
  • 認証メールのURL設定
  • deviseのviewsを生成する
  • Userモデルを作成する
  • migrationファイルを確認し、コメントアウトを外す
  • rake db:migrateでテーブルを作成する
  • 補足
  • メール認証モジュールを読み込む
  • smtpサーバーの設定
  • トークンの設定
  • 登録テストを行う

AWS Cloud9でsmtpサーバーを使うためにGmailを使用する

smtpサーバーとはメールを送信する時に使用する機能を持ったメールサーバーです。メールを受信する機能を持ったサーバーはpopサーバーと言います。Simple Mail Transfer Protocol の略になります。

設定方法ですが、Cloud9自体がGoogle Cloud Engineを利用しており、Gmailアカウント以外の通信を許可しておりません。設定にGmailを必要としますので、捨てアカウントを作成してください。
通信の許可を得るために、アプリパスワードを使用します。

Gmailを使った必要なプロセスとしましては、二段階認証を行なったgoogleアカウントでアプリパスワードを発行します。まずはアプリパスワードを取得しましょう。

アプリパスワードを取得する

gmailアプリパスワード
アプリパスワードの生成方法をクリックします
app_password01.png

googleアカウントをクリックします

app_password02.png

セキュリティをクリックします

app_password03.png

二段階認証をクリックします

app_password04.png

開始をクリックします

app_password05.png

認証にスマホを使用します。今すぐ送信をクリックします。

app_password06.png

googleからメッセージが送信されます

app_password07.png

送信をクリックします

app_password08.png

スマホに受信されたパスコードを入力します。次へをクリックします。

app_password09.png

認証されたら二段階認証を有効にします

app_password10.png

googleアカウントに戻って二段階認証がonであることを確認したら、アプリパスワードをクリックします

app_password11.png

アプリパスワードのページにアクセスする際にパスワードやスマホを使った認証を行います。それらのプロセスを進めます。
表示されたらアプリを選択をクリックします。その他を選択します。

app_password12.png

名称を決めます。開発中のアプリケーション名でも良いですね。生成をクリックします

app_password13.png

パスワードが生成されました。こちらのパスワードを開発環境で使用します。
忘れない様に保存します。

app_password14.png

確認が取れました。

スクリーンショット 2019-06-29 6.27.04.png
これで二段階認証のプロセスとアプリパスワードの取得は完了です。

補足

アプリパスワードを使用しない場合は有効化を無効にしておくと良いでしょう。
その手続きは先ほど行なったスマートフォンなどでのやり取りが必要になります。
発行されたパスワードはこの手続きでは確認取れませんので、発行した段階で忘れない様に保存しましょう。

deviseを導入する

前提として、dbとサーバーは導入済みとします。
gemファイルにインストールしたいdeviseを記述します。

myapp/gemfile
gem 'devise'

作業ディレクトリでインストールします。

~/environment/myapp $ 
~/environment/myapp $  bundle install

deviseの設定ファイルを生成します。

~/environment/myapp $ rails g devise:install

新規作成されるファイル

  • config/initializers/devise.rb
  • config/locales/devise.en.yml
ファイル名 概要
config/initializers/devise.rb deviseに関する設定ファイル。カスタマイズ時に使用します
config/locales/devise.en.yml 表示されるバリデーションがデフォルトで英語になっています

認証メールのURL設定

登録に使用されたメールアドレスにアプリケーションから認証ファイルがメールで送信されます。
ここでは認証ファイルに記載されるはずのリンク先を設定します。要はアプリケーションの開発先のトップアドレスです。

config/environments/development.rb
Rails.application.configure do
#省略
#一番下に記述します
config.action_mailer.default_url_options = { protocol: 'https', host:'https://~~~'}
end

フラッシュメッセージのタグを記述する

フラッシュメッセージとはログイン時やログアウトの時に、一時的にだす「ログインしました」の様なメッセージのことです。deviseのインストール時にターミナルに表示されていた様に記述することを推奨されています。一般的にはapp/view/layouts/application.html.erbに埋め込む様です。

app/views/layouts/application.html.erb
<p class="notice"><%= notice%></p>
<p class="alert"><%= alert %></p>
#bootstrapの場合は
<%= bootstrap_flash %>

deviseのviewsを生成する

サインアップやログイン、パスワードの再設定など必要なファイルがあらかじめ用意されています。
それらをカスタマズして作成していくことがほとんどになると思います。

$ cd myapp
$ pwd 
$ rails g devise:views

新規作成されるファイル
- app/views/devise/mailer/confirmation_instructions.html.erb
- app/views/devise/mailer/reset_password_instructions.html.erb
- app/views/devise/mailer/unlock_instructions.html.erb
- app/views/devise/passwords/edit.html.erb
- app/views/devise/passwords.new.html.erb
- app/views/devise/registrations/edit.html.erb
- app/views/devise/registrations/new.html.erb
- app/views/devise/sessions/new.html.erb
- app/views/devise/shared/_links.html.erb
- app/views/devise/unlocks/new.html.erb

Userモデルを作成する

登録者用のモデルを用意します。rails g model model名がありますが、devise用のモデルの作成コマンドを使用します。
rails g devise model名により、deviseを利用するために初期設定されたファイルを生成することが出来ます。今回はUserモデルを生成します。rake db:migrateをすぐに実行しないで下さい。

$ cd myapp
$ pwd
$ rails g devise user

新規作成されるファイル
- app/models/user.rb
- db/migrate/xxxxx_devise_create_users.rb
- test/fixtueres/users.yml
- test/models/user_test.rb

更新されるファイル
- config/routes.rb

config/routes.rb
Rails.application.routes.draw do
 devise_for :users
 roots to: "top#index"
end

devise_for
サインインやログイン周りのルーティングを生成してくれます。rake routesを実行しルーティングを確認します。

$ rake routes

migrationファイルを確認し、コメントアウトを外す

rails g devise userにより生成されたmigrationファイルを確認します。

db/migrate/xxxxxx_devise_create_users.rb
# frozen_string_literal: true

class DeviseCreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
      ## Database authenticatable
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""

      ## Recoverable
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at

      ## Rememberable
      t.datetime :remember_created_at

      # Trackable
      t.integer  :sign_in_count, default: 0, null: false
      t.datetime :current_sign_in_at
      t.datetime :last_sign_in_at
      t.string   :current_sign_in_ip
      t.string   :last_sign_in_ip

      # Confirmable
      t.string   :confirmation_token
      t.datetime :confirmed_at
      t.datetime :confirmation_sent_at
      t.string   :unconfirmed_email # Only if using reconfirmable

      ## Lockable
      # t.integer  :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
      # t.string   :unlock_token # Only if unlock strategy is :email or :both
      # t.datetime :locked_at


      t.timestamps null: false
    end

    add_index :users, :email,                unique: true
    add_index :users, :reset_password_token, unique: true
    # add_index :users, :confirmation_token,   unique: true
    # add_index :users, :unlock_token,         unique: true
  end
end

#Trackable#Confirmableのコメントアウトを外します。
こちらは認証メールのトークンや再設定のカラムなど、登録周りのカラムがデフォルトでコメントアウトされています。rake db:migrateする前に外しましょう。

rake db:migrateでテーブルを作成します

設定したmigrationファイルを実行してテーブルやカラムをdbに作成します。

$ rake db:migrate

サーバーを再起動します

補足

登録ページにアクセスするにはtop pageアドレスに/users/sign_inをつけます。ログインしなければtop pageにアクセス出来ない様にする方法を取ることがあると思います。smtpメールとの関連程度に記述します。
authenticate_user!
authenticate_user!はdeviseのメソッドです。
ユーザーがログインしているか確認し、そうでない場合はログインページに飛ばします。このサービスはどんな場合でも優先されるものとするならば、Application_Controller.rbに設定すると有効だそうです。その他のControllerが継承しているからでしょう。

app/controllers/application_controller.rb
before_action :authenticate_user!
protect_from_forgery with: :exception
end

サーバーを再起動します。

メール認証モジュールを読み込む

今回ログインに使用するモデルはUserモデルです。deviseのメール認証を有効にするためにはdeviseのモジュールをモデルに読み込んでもらいます。

app/models/user.rb
class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, 
         :registerable,
         :recoverable,
         :trackable,
         :rememberable,
         :validatable,
         :confirmable

end

smtpサーバーの設定

開発段階での設定となりますが、gmailアドレスやパスワードを含みます。Gitを使用している場合は公開しない様に注意しましょう。

config/environments/development.rb
Rails.application.configure do
 config.file_watcher = ActiveSupport::EventedFileUpdateChecker
  config.action_mailer.default_url_options = { protocol: 'https', host: 'https://xxxxx.vfs.cloud9.ap-southeast-1.amazonaws.com'}
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    :enable_starttls_auto => true,
    :address => "smtp.gmail.com",
    :port => 587,
    :domain => 'smtp.gmail.com',
    :user_name => "xxx@gmail.com",
    :password => "取得したアプリパスワード",
    :authentication => 'login'
  }
end

次にアプリパスワードの取得に使用したGmailを記述します。

config/initialiezers/devise.rb
config.mailer_sender = 'xxx@gmail.com'

トークンの設定

トークンの設定を下記の通りに変更しました。stackoverflowplataformatec/deviseを参考にしました。変更する前はエラーが出ました。E-mail内のトークンとdb内のトークンが一致することが必要な様です。

devise/mailer/confirmation_instructions.html.erb
<p>Welcome <%= @email %>!</p>
<p>You can confirm your account email through the link below:</p>
<!--@tokenを変更した-->
<p><%= link_to 'Confirm my account', confirmation_url(@resource, :confirmation_token => @token) %></p>

登録テストを行う

登録方法として、ユーザーのメールアドレスに確認メールを送信し、受け取ったユーザーがワンクリックで登録を行なうをテストしましょう。
登録したメールアドレスに上記のHTMLファイルが送信されます。confirm my accountをクリックしてエラーが出ずにログインページに飛ばされた、そのままログイン出来たら成功です。

まとめ

Rails5 cloud 9でdeviseのメール送信用サーバーsmtpの設定でした。
deviseのログイン機能はとても便利な機能を持っています。カスタマイズも色々と出来そうなので色々挑戦していきたいと思います。

4
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
7