概要
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アカウント管理画面の「セキュリティ」 > 「二段階認証プロセス」から設定をして二段階認証をオンにしてください。
コードの追加
# 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認証のエラーが出て詰まった時の解決方法