Help us understand the problem. What is going on with this article?

Rails + Heroku でメール認証

概要

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認証のエラーが出て詰まった時の解決方法

chabudai
Rails学習者。細かいエラーなんかに囚われてなかなか前に進めないのですが、そのぶん成長できると信じて格闘中。
https://w-muro.github.io/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした