ActionMailerの基本的な使い方を確認したので、忘備録としてまとめておこうと思います。
メール送信の際にUsername and Password not accepted. Learn more at
というエラーが出る方の参考になるかもしれません。私はここで詰まりました、、、
mailerとは直接関係しない部分(下準備)
mailerとは直接関係しませんが、今回はユーザー登録をした際にメールを送るようにしたいので、ユーザーを作成しました。本当にメーラーの挙動を確認するために最小限なので、バリデーションなども設定していません。
ユーザーモデルを作成
rails g model User name:string email:string
ユーザーコントローラーを作成
users_controller.rbの中に'UserMailer.welcome_email(@user).deliver'という記述がありますが、これが今回の本題です。後にこのクラスとクラスメソッドを定義していきます。
rails g controller users new show create
class UsersController < ApplicationController
def new
@user = User.new
end
def show
@user = User.find(params[:id])
end
def create
@user = User.create(user_params)
if @user.save
UserMailer.welcome_email(@user).deliver
redirect_to @user
else
render :new
end
end
private
def user_params
params.require(:user).permit(:name, :email)
end
end
viewファイルを作成
以下のviewファイルを作成します。
- new.html.haml
- show.html.haml
showについては、登録完了後にrender先として使用しているだけなので、別のところに飛ばすのであればなくてもいいです。
登録画面を作成
%h1 create account
= form_with model: @user, method: :post, local: true do |f|
= f.label :name, :name
= f.text_field :name
= f.label :email, :email
= f.email_field :email
= f.submit '作成'
ここから本題
さて、ここからいよいよ本題です。今回はメールをgmailを使用して送信しています。
ユーザーメーラの大きな流れは、以下の通りです。
- メーラー作成
- メーラークラスとメソッド作成
- メール内容を決定
- メール設定
メーラーを作成
まずは、以下のコードでメーラーを作成します。
rails g mailer User
create app/mailers/user_mailer.rb
invoke erb
create app/views/user_mailer
invoke test_unit
create test/mailers/user_mailer_test.rb
create test/mailers/previews/user_mailer_preview.rb
色々作成されますが、送る上で重要なのは以下の2つです。
今回はこの2つの設定をしていきます。
- app/mailers/user_mailer.rb
- app/views/user_mailer
メーラークラスとクラスメソッドを作成
今回はuser_mailerの方を使用します。
application_mailerは放置でいいです。これは全体で共通的に使用するものなので、その必要がある場合はapplication_mailerを使用します。
class UserMailer < ApplicationMailer
def welcome_email(user)
mail to: user.email, subject: "Welcome To Our Site!!"
end
end
class ApplicationMailer < ActionMailer::Base
default from: 'from@example.com'
layout 'mailer'
end
メールの内容を決定
デバイスによってはhtmlを読み込めない可能性があるため、メールの内容をviewファイルとtextファイルの二種類作成していきます。内容は好きに変えてみてください。
html.haml
!!!
%html
%head
%meta{'http-equiv' => 'Content-Type', 'content' => 'text/html; charset=UTF-8'}
%body
%p 本サイトにユーザー登録いただきありがとうございます。
text.haml
本サイトにユーザー登録いただきありがとうございます。
メール設定
.
.
.
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: 'gmail.com',
user_name: ENV['GMAIL_ADDRESS'],
password: ENV['GMAIL_PASSWORD'],
authentication: 'login',
enable_starttls_auto: true
}
end
(補足)user_name&passwordは直書きするとエラーが出るので注意
今回、まずは挙動だけ確認したかったので、user_nameとpasswordを直書きして、さっくり終わらせようと思ったのですが送ろうとするとエラーが出ました...
セキュリティ的に環境変数を使用する必要があるようでした。
したがって今回はdot_envを使用しました。
gem 'dotenv-rails'
gemをインストールしたら、'.env'ファイルを作成して、そこに環境変数を書きます。
GMAIL_PASSWORD='your password'
GMAIL_ADDRESS='your email'
当然ですが、gitにこれをプッシュしたら意味がないので、gitignoreするのを忘れないようにしましょう。
.
.
.
/.env
(補足)googleのアドレスを使用する場合は要注意
googleアドレスのパスワードは通常のものは使用できません。前はできたみたいですが、セキュリティの要件が数年前に変更されたためアプリパスワードを使用する必要があります。
参考サイトを見てもらえれば分かりますが、2段階認証が必須なのでその点だけ注意してください。
次回は、ActionMailerとrake/task/wheneverを組み合わせて、定期的なメール配信を実現しようと思います。
【参考サイト】