17
8

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 3 years have passed since last update.

Rails + Heroku でメール認証

Last updated at Posted at 2020-06-25

概要

Railsアプリのメール認証をHerokuの本番環境で実装しました。
当初はRailsチュートリアルの通りSendGridを使用していたのですが、すぐにアカウントが凍結されてしまい一歩も先に進めなかったのでGmailに切り替えました。

logを確認したらNet::SMTPAuthenticationErrorの一文があったので、SendGridではなくそもそもGmailでエラーを起こしていた可能性も...?

SendGridで送信に失敗する場合確認するべきこと

存在するメールアドレスへ送信しているか?

開発環境でgemの「letter_opener_web」などを使用している場合、「test@mail.com」のような架空のアドレスでも送信をすることができましたが、本番環境では送信できません。(そもそもアドレスがなきゃ届かない...)
私ほどの間抜けでなければしないミスでしょうが、タイポの確認は最初にしてみても損はないでしょう。

Net::SMTPAuthenticationErrorが出ていないか?

送信元アドレスにGmailを設定している場合、「2 段階認証プロセス」をオンにしていないとエラーが発生するようです。
(他のメールサービスでも同様のセキュリティがあるのかな?)
次のコマンドから確認ができます。

heroku logs --tail

正常に送信されていれば次のようにメールの内容が表示されるので、どちらにしてもログは確認しておいたほうがいいでしょう。

 From:         please-change-me-at-config-initializers-devise@example.com
 Reply-To:     please-change-me-at-config-initializers-devise@example.com
 To:           test@mail.com
 Message-ID:   <5ef461204d29d_475308ddc-2ec6f04e388a.mail>
 Subject:      =?UTF-8?Q?
 Mime-Version: 1.0
 Content-Type: text/html;
 charset=UTF-8
 Content-Transfer-Encoding: base64
 ~メール本文~

SendGridのアカウントを凍結されていないか?

Railsチュートリアルに倣ってコンソールからSendGridに登録するとほぼ確実に凍結されました。(私は5/5で凍結されました...)
登録後すぐはHerokuのダッシュボード画面にある「Installed add-ons」のSendGridをクリックすると、SendGridへアクセスできるのですが、一度メールの送信に失敗するとクリックしてもアクセスが出来なくなりました。
この状態になるとアカウントが凍結されており、新しくappを作成し直すかSendGrid社へコンタクトを取って凍結を解除してもらうしかないようです。
ちなみに、SendGridで検索してトップに出てくる日本語ページ(構造計画研究所)ではサポート対象外になっているので本社に英語でコンタクトを取らなければならないようです。
Azure marketplace等のアドオンとしてSendGridを利用していますが、日本語サポートは受けられますか?

GmailのSMTPを利用する

Googleアカウントに2段階認証をオンにする

Googleアカウント管理画面の「セキュリティ」 > 「二段階認証プロセス」から設定をして二段階認証をオンにしてください。

コードの追加

config/environments/production.rb
  # herokuでメールを送信するための設定
  config.action_mailer.delivery_method = :smtp
  host = "#{ENV['HEROKU_APPNAME']}.herokuapp.com"
  config.action_mailer.default_url_options = { host: host, protocol: 'https' }
  ActionMailer::Base.smtp_settings = {
    :address        => 'smtp.gmail.com',
    :port           => '587',
    :authentication => :plain,
    :user_name      => ENV['GMAIL_USERNAME'],
    :password       => ENV['GMAIL_PASSWORD'],
    :domain         => 'gmail.com',
    :enable_starttls_auto => true
  }

{ENV['HEROKU_APPNAME']}は、変数にせず直接アプリの名前を入力しても問題ありません。

Herokuの環境変数を設定

バッシュボードの「Settings」 > 「Config Vars」で「Reveal Config Vars」をクリックすると環境変数の設定が出来ます。
コンソールからも出来ますがこちらの方が分かりやすいのでいつもこっちを使っています。

Key => Value
GMAIL_USERNAME => 送信元に設定するメールアドレス
GMAIL_PASSWORD => 二段階認証の設定で取得したパスワード
HEROKU_APPNAME => Herokuで設定しているアプリ名

参考

Heroku Add-onsのSendGridトラブルシューティング
Railsでgmailでメールを送ろうとしたけどsmtp認証のエラーが出て詰まった時の解決方法

17
8
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
17
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?