0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ActionMailerでメールを送る

Last updated at Posted at 2023-05-09

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
app/controllers/users_controller.rb
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先として使用しているだけなので、別のところに飛ばすのであればなくてもいいです。

登録画面を作成

new.html.haml
%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を使用します。

app/mailers/user_mailer.rb
class UserMailer < ApplicationMailer
  def welcome_email(user)
    mail to: user.email, subject: "Welcome To Our Site!!"
  end
end
app/mailers/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
  default from: 'from@example.com'
  layout 'mailer'
end

メールの内容を決定

デバイスによってはhtmlを読み込めない可能性があるため、メールの内容をviewファイルとtextファイルの二種類作成していきます。内容は好きに変えてみてください。

html.haml

app/views/user_mailer/welcome_email.html.haml
!!!
%html
  %head
    %meta{'http-equiv' => 'Content-Type', 'content' => 'text/html; charset=UTF-8'}
  %body
    %p 本サイトにユーザー登録いただきありがとうございます。

text.haml

app/views/user_mailer/welcome_email.text.haml
本サイトにユーザー登録いただきありがとうございます。

メール設定

config/environments/development.rb
.
.
.
  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'ファイルを作成して、そこに環境変数を書きます。

.env
GMAIL_PASSWORD='your password'
GMAIL_ADDRESS='your email'

当然ですが、gitにこれをプッシュしたら意味がないので、gitignoreするのを忘れないようにしましょう。

.gitignore
.
.
.
/.env

(補足)googleのアドレスを使用する場合は要注意

googleアドレスのパスワードは通常のものは使用できません。前はできたみたいですが、セキュリティの要件が数年前に変更されたためアプリパスワードを使用する必要があります。

参考サイトを見てもらえれば分かりますが、2段階認証が必須なのでその点だけ注意してください。

次回は、ActionMailerとrake/task/wheneverを組み合わせて、定期的なメール配信を実現しようと思います。

【参考サイト】

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?