🐻‍❄️

【Ruby on Rails】Action Mailerを使用した本番環境でのパスワードリセットメールの実装

2024/07/06に公開

はじめに

今回Ruby on Railsで、Action Mailerを使用して、パスワードリセット機能を実装しました。
ローカル環境では、letter openerを使用し、メールが送られることを確認しました。その後本番環境(今回はRenderを使用しました)で、メールの送信を確認できるまで1日弱かかりました。
今回は、本番環境でのメールを確認できるまでを備忘録として記していきたいと思います。
間違い等ありましたら、優しくご指摘いただけますと幸いです。

環境

Rails7.1.3.4
Render
Gmail

前提条件

・ gem 'sorcery'を使用して、パスワードリセット機能を実装済み
・ Action Mailerを使用して、メール文面等作成済み
・ ローカル環境では、letter openerでメールが受信できることを確認済み

今回は、私自身が苦戦した本番環境でのメール受信の実装のみ記載させていただきます。
上記に関しては説明を省略させていただきます。

今回詰まったところ

Net::SMTPAuthenticationError (535-5.7.8 Username and Password not accepted. For more information, go toがなかなか解消できなかった。
-> 色々試したため、このエラーを解消できた理由が定かではないですが、下記を試したところこちらのエラーが解消しました。

・ アプリパスワードの再設定
・ gem 'dotenv-rails'の導入
・ config/application.rbへ、dotenvをロードするよう記載
・ Secret Filesへ、.envで記載した内容を入力

上記エラー解消後は、
・ Gmailに届いたメールが迷惑メールに振り分けられてしまうこと
・ yahooメール、捨てメアドのアカウントには、何回かメールが届かない
という現象に陥りました。こちら2点に関しては原因究明中であり、判明しましたら改めて記事を書きたいと思っています。

今回の実装手順

まずはじめに今回の実装の簡単な流れを記載します。

Gmailの設定
1, 新規gmailアカウントの作成
2, 2段階認証プロセスを有効にする
3, アプリパスワードの作成  ※パスワードは必ずメモしておくこと

実装コード記載箇所
1, config/environments/production.rbへ、本番環境でのメール設定をする
2, .envファイルに、環境変数を記載
3, gem 'dotenv-rails'の導入
4, config/application.rbへ、dotenvをロードするよう記載

Render側での設定
1, Environmentへ、.envで記載した内容を入力
2, Secret Filesへ、.envで記載した内容を入力

詳細な実装方法

Gmailの設定
1, 新規gmailアカウントの作成
今回は、正式なPFとしてのアプリ開発をしているため、gmailのアカウントを新規作成いたしました。
(info@gmail.comのようなメールアドレスを作成しました)
Gmailアカウントの追加に関しては、こちらの記事を参考にしました。
比較的簡単にメールアドレスは追加できました。

2, 2段階認証プロセスを有効にする
2段階認証プロセスの有効化に関しては、こちらの記事を参考にしました。
Railsでは、2段階認証プロセスを有効化していないと、メールの送信が出来ないようになっているようです。
この旨は、Railsガイドにも記載してあります。

3, アプリパスワードの作成 
アプリパスワードの作成 に関しても、こちらの記事を参考にしました。

Googleは、安全性が低いと判断したアプリからのサインインをブロックしています。 Gmailの設定をここで変更することで、サインイン試行を許可できます。Gmailアカウントで2要素認証が有効になっている場合は、アプリケーションのパスワードを設定し、通常のパスワードの代わりにそれを使用する必要があります。

上記Railsガイドの内容ですが、アプリパスワードを使用しないと、メールの送信ができないのでこちらも発行する必要があります。

ただ、個人的にこの設定がトラップでした...
1, そもそもどこにアプリパスワード作成項目があるか、わからなかった。
-> こちらは検索窓で検索し、見つけることができました。
2, 最初に提示されたパスワードでは、うまく設定できなかった
->他の実装内容が悪かったのかもしれませんが、最初に提示されたパスワードを.envに記載すると下記のようになりました。(現在はこのパスワードは使用していないのと、一部改変しているので載せております)
Image from Gyazo

VSC上で見ると、この空白が気になります...。
rails consoleで、下記実行すると空白が無視されて出力されました。

irb> ENV['GMAIL_PASSWORD']
=> "yfwgkrsvcofckc"

Net::SMTPAuthenticationError (535-5.7.8 Username and Password not accepted. For more information, go toのエラーがなかなか解消できなかったので、アプリパスワードを再発行したところ、上記の謎の空白はないパスワードが発行されたので、そちらを使用しています。

実装コード記載箇所
1, config/environments/production.rbへ、本番環境でのメール設定は、こちらを参照し記載しました。

config.action_mailer.default_url_options = { host: '〇〇.onrender.com', protocol: 'https' }
  config.action_mailer.raise_delivery_errors = true

  config.action_mailer.delivery_method = :smtp

  config.action_mailer.smtp_settings = {
    address: "smtp.gmail.com",
    port: 587,
    domain: "〇〇.onrender.com",
    user_name: ENV['GMAIL_USERNAME'],
    password: ENV['GMAIL_PASSWORD'],
    authentication: "plain",
    enable_starttls_auto: true
  }

  config.action_mailer.perform_caching = false

各記載に関して、簡単に説明いたします。

config.action_mailer.default_url_options: 
・ host: '〇〇.onrender.com':メール内のリンクで使うドメイン。
・ protocol: 'https':メール内のリンクで使うプロトコル。
つまり、メール内のリンク設定をしています。hostに記載する、'〇〇.onrender.com'はhttps://〇〇.onrender.com'の部分の、https://を省いた箇所になります。

config.action_mailer.raise_delivery_errors:
メール送信エラーが発生した場合には、エラーが表示されます。

config.action_mailer.delivery_method:
メール送信にSMTPプロトコルを使用する設定です。

config.action_mailer.smtp_settings:
SMTPサーバの設定。hostは先ほどと同じく、https://を省いた箇所になります。

config.action_mailer.perform_caching = false
メールのキャッシュを無効化する。

以上が、config/environments/production.rbへ、本番環境でのメール設定内容になります。

2, .envファイルに、環境変数を記載
こちらも少し書き方を迷いました...。どの記事も書き方を濁しているため、''や"" ""が必要なのかどうかの判断に迷いました。
下記で設定すれば、.envファイルの書き方としては正しいと思います。(''や"" ""は不要)
Image from Gyazo

・ GMAIL_USERNAMEは、メール送信元となるメールアドレス(今回アカウントを新規作成された方は、そのメールアドレス)を記載
・GMAIL_PASSWORDは、アプリパスワードで表示されたパスワードを記載

3, gem 'dotenv-rails'の導入
なかなか Net::SMTPAuthenticationError (535-5.7.8 Username and Password not accepted. For more information, go toのエラーが解消しないため、導入しました。
最初参考にしていた記事ではgem 'dotenv-rails'の導入の記載は無かったですが、こちらにもあるとおり、.envファイルをrailsで扱うためには`gem 'dotenv-rails'が必要と判断し導入しました。

4, config/application.rbへ、dotenvをロードするよう記載
こちらも、 Net::SMTPAuthenticationError (535-5.7.8 Username and Password not accepted. For more information, go toのエラーが解消しないため追記しました。

config/application.rb

# Dotenvの設定をロードする
require 'dotenv/load'

Render側での設定
1, Environmentへ、.envで記載した内容を入力
.envファイルで設定した環境変数は、Render側でも必要なので設定していきます。
Renderのダッシュボード > 設定したいWebアプリ > Environmentsを開き、KeyにGMAIL_USERNAME、GMAIL_PASSWORDを入力、Valueに.envで設定したGoogleのメールアドレス、アプリパスワードを設定します。
設定後は、「Save Changes」を押さないと、保存されないので注意が必要です。

Image from Gyazo

2, Secret Filesへ、.envで記載した内容を入力
こちらは、Environmentへ、.envで記載した内容を入力しただけではエラー内容が変更しなかったため、こちらの記事を参考にしながら入力しました。
これまでEnvironmentへの設定は何度かしたことはあるものの、Secret Filesへ.envで記載した内容を入力は初めてだったのでここは盲点でした。

Renderのログを確認

ここまで実装し、やっとエラーが解消できました...。何が原因で Net::SMTPAuthenticationError (535-5.7.8 Username and Password not accepted. For more information, go toのエラーが出続けていたのかは不明ですが、少しでもお役に立ちましたら幸いです。

エラー解消後、パスワードリセット項目へ、メールアドレスを入力し送信すると下記のようなログが残ります。

I, [2024-07-06T09:46:10.563923 #107]  INFO -- : [bbd73b76-243d-4338-931f-01708dc6a1e8] Started GET "/" for 122.209.120.202 at 2024-07-06 09:46:10 +0000
I, [2024-07-06T09:46:10.564537 #107]  INFO -- : [bbd73b76-243d-4338-931f-01708dc6a1e8] Processing by StaticpagesController#top as HTML
I, [2024-07-06T09:46:10.566049 #107]  INFO -- : [bbd73b76-243d-4338-931f-01708dc6a1e8]   Rendered layout layouts/application.html.erb (Duration: 1.1ms | Allocations: 642)
I, [2024-07-06T09:46:10.566212 #107]  INFO -- : [bbd73b76-243d-4338-931f-01708dc6a1e8] Completed 200 OK in 2ms (Views: 1.4ms | ActiveRecord: 0.0ms | Allocations: 826)
I, [2024-07-06T09:46:12.559903 #107]  INFO -- : [c72294b3-5b21-4d22-bd9b-45e4772efec5] Started GET "/login" for 122.209.120.202 at 2024-07-06 09:46:12 +0000
I, [2024-07-06T09:46:12.560707 #107]  INFO -- : [c72294b3-5b21-4d22-bd9b-45e4772efec5] Processing by UsersessionsController#new as HTML
I, [2024-07-06T09:46:12.563623 #107]  INFO -- : [c72294b3-5b21-4d22-bd9b-45e4772efec5]   Rendered layout layouts/application.html.erb (Duration: 2.2ms | Allocations: 878)
I, [2024-07-06T09:46:12.563804 #107]  INFO -- : [c72294b3-5b21-4d22-bd9b-45e4772efec5] Completed 200 OK in 3ms (Views: 2.7ms | ActiveRecord: 0.0ms | Allocations: 1077)
I, [2024-07-06T09:46:17.154140 #107]  INFO -- : [e6b3c3fc-1680-4add-b152-cc26078cc346] Started POST "/password_resets" for 122.209.120.202 at 2024-07-06 09:46:17 +0000
I, [2024-07-06T09:46:17.155726 #107]  INFO -- : [e6b3c3fc-1680-4add-b152-cc26078cc346] Processing by PasswordResetsController#create as HTML
I, [2024-07-06T09:46:17.155897 #107]  INFO -- : [e6b3c3fc-1680-4add-b152-cc26078cc346]   Parameters: {"authenticity_token"=>"[FILTERED]", "email"=>"〇〇〇〇@gmail.com", "commit"=>"パスワード再発行"}
I, [2024-07-06T09:46:17.200566 #107]  INFO -- : [e6b3c3fc-1680-4add-b152-cc26078cc346] Redirected to https://miniita.onrender.com/
I, [2024-07-06T09:46:17.200694 #107]  INFO -- : [e6b3c3fc-1680-4add-b152-cc26078cc346] Completed 302 Found in 45ms (ActiveRecord: 20.6ms | Allocations: 3370)
I, [2024-07-06T09:46:17.495008 #114]  INFO -- : [bad22ed0-6633-419b-b861-4888f76e97b1] Started GET "/" for 122.209.120.202 at 2024-07-06 09:46:17 +0000
I, [2024-07-06T09:46:17.495635 #114]  INFO -- : [bad22ed0-6633-419b-b861-4888f76e97b1] Processing by StaticpagesController#top as HTML
I, [2024-07-06T09:46:17.497442 #114]  INFO -- : [bad22ed0-6633-419b-b861-4888f76e97b1]   Rendered layout layouts/application.html.erb (Duration: 1.3ms | Allocations: 636)
I, [2024-07-06T09:46:17.497606 #114]  INFO -- : [bad22ed0-6633-419b-b861-4888f76e97b1] Completed 200 OK in 2ms (Views: 1.7ms | ActiveRecord: 0.0ms | Allocations: 820)

Parameters: {"authenticity_token"=>"[FILTERED]", "email"=>"〇〇〇〇@gmail.com", "commit"=>"パスワード再発行"}で、パラメーターが問題なく飛んでいることがわかります。

しかし、最初はエラーが出ていないのにメールが届きませんでした...。
少し考え、もしかしたらと思い迷惑メールを確認すると、迷惑メールボックスに振り分けられていました。
原因は現在不明ですが、こちらに記載あるような文言で迷惑メールに入っていたので、文面か件名がよくないのかもしれません...。

また、yahooメール、捨てメアドのアカウントには、何回かメールが届かない現状メールが届かない場合もあるので、そこも原因を確認していきたいと思います。
ありがとうございました。

2024/7/13追記

  • 捨てアドアカウントにメールが届かなかった原因: メールアドレス間違い
  • Gmailで迷惑メールに入ってしまっていた件: 別アカウントでは迷惑メールに入っていないこと確認
  • yahooメールで受信できない: 日をおいて数回試したところ、メールは全て受信できている
    -> 上記より、メール件名をいじったのみで特に変更はしませんでした。

参考記事

Discussion