はじめに
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