LoginSignup
6
7

More than 3 years have passed since last update.

Gmailを用いた ActionMailer の使い方

Last updated at Posted at 2019-10-12

はじめに

ActionMailerの実装は割と簡単にできたのですが、エラーコードが出ずにGmailの設定でかなりの時間を費やしてしまいました。
次にやるときには時間がかけずにすむようにまとめておきたいと思います。

コーディング

コマンド(自動生成)

rails g mailer UserMailer

create  app/mailers/user_mailer.rb
create  app/mailers/application_mailer.rb
invoke  erb
create    app/views/user_mailer
create    app/views/layouts/mailer.text.erb
create    app/views/layouts/mailer.html.erb
invoke  test_unit
create    test/mailers/user_mailer_test.rb
create    test/mailers/previews/user_mailer_preview.rb

Mailer

app/mailers/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
  default from: "from@example.com"
  layout 'mailer'
end
app/mailers/user_mailer.rb
class UserMailer < ApplicationMailer
  default from: '~~~@gmail.com'

  # ここのメソッド名をメール文面の view ファイルの名前にする。
  # user と url は呼び出し元の コントローラーのメソッドから渡される。
  def user_create(user, url)
    # @user, @url に値を入れて view に渡す。
    @user = user
    @url = url
    mail(to: "user.name", subject: "ユーザーを新規登録しました。")
  end

Controller

user_controller.rb
class UsersController < ApplicationController

  def index
  end

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)

    if @user.save
      @url = request.url + "/" + @user.id.to_s
      NotificationMailer.user_create(@user, @url).deliver
      redirect_to(user_path(@user))
    else
      render :new
    end
  end

  def show
    @user = User.find(params[:id])
  end

  def edit
    @user = User.find(params[:id])
  end

  def update
    @user = User.find(params[:id])
    if @user.update(user_params)

      @user = current_user
      @url = request.url
      NotificationMailer.user_update(@user, @url).deliver
      redirect_to(user_path(@user))
    else
      render :new
    end
  end
end

View

メール本文のテンプレートはデフォルトで二種類の形式が提供されています。

views/user_create/user_create.html.erb
<h1>UserMailer#user_create</h1>
<p>
<%= @user %> 様
</p>
<p>
  <%= @url %>, find me in app/views/user_mailer/user_create.html.erb
</p>
views/user_create/user_create.text.erb
UserMailer#user_create
<%= @user %> 様
<%= @url %>, find me in app/views/user_mailer/user_create.text.erb

Gmail googleの設定(重要)

google 二段階認証プロセスの設定
https://myaccount.google.com/signinoptions/two-step-verification/enroll-welcome

google アプリパスワードの作成
https://security.google.com/settings/security/apppasswords

config/initializers/mail.rb
ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.smtp_settings = {
  # address のところは変更しないので注意。自分はここでハマりました。
  address: 'smtp.gmail.com', 
  domain: 'gmail.com',
  port: 587,
  # user_name は自分のメールアドレスを記載。
  user_name: 'Gmail のメールアドレス',
  # password は作成したアプリパスワードを記載。
  password: 'Gmail のパスワード',
  authentication: 'plain',
  enable_starttls_auto: true
}

まとめ

駆け出しのエンジニアですので、何か不備がありましたらご連絡をお願いします。

参考

https://railsguides.jp/action_mailer_basics.html
https://qiita.com/hirotakasasaki/items/ec2ca5c611ed69b5e85e
https://thr3a.hatenablog.com/entry/20171202/1512175059

6
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
6
7