Gmail を使って Net::SMTPAuthenticationError が出力される場合の解決法
たとえば、 Ruby でこんなコードを書いてメールを送信したいとする。
require 'mail' options = { address: 'smtp.gmail.com', port: 587, domain: 'gmail.com', user_name: USER_NAME, password: PASSWORD, authentication: 'plain', enable_starttls_auto: true } Mail.defaults do delivery_method :smtp, options end mail = Mail.new do to 'karuran.f@gmail.com' from 'karuran@gmail.com' subject 'test ' html_part do content_type 'text/html; charset=UTF-8 ' body '<h1 style="border-bottom: 5px solid green;">This is HTML</h1>' end end mail.deliver!
送信元アドレスは Gmail のものだ。で、こういう場合だいたい Net::SMTPAuthenticationError
が出力される。
解決法
2 つある。楽だけどセキリティ的に危ないのと、ちょっとめんどいけど堅牢なの。おすすめは面倒なほう。
その1 楽なの
Google はセキュリティ上、ユーザー名・パスワードが正しいアクセスでも、安全性が低いアプリケーションからのアクセスをデフォルトでは弾く。この弾くことを無効にしてやればよい。
アカウント設定 から「安全性の低いアプリのアクセス」 → 「許可」にする。「安全性の低いアプリのアクセス」の位置は、下の雑な画像を見れば分かる。
その2 堅牢なの ☆ おすすめ
「2 段階認証プロセス」をオンにしてアプリパスワードを生成する。
2 段階認証プロセスをオンにすると、「その1」の「安全性の低いアプリからのアクセス」は表示されなくなるくらい、Google 的にもこちらが良い。
require 'mail' options = { address: 'smtp.gmail.com', port: 587, domain: 'gmail.com', user_name: USER_NAME, password: PASSWORD, # 先ほど作成したアプリパスワード authentication: 'plain', enable_starttls_auto: true } Mail.defaults do delivery_method :smtp, options end mail = Mail.new do to 'karuran.f@gmail.com' from 'karuran@gmail.com' subject 'test ' html_part do content_type 'text/html; charset=UTF-8 ' body '<h1 style="border-bottom: 5px solid green;">This is HTML</h1>' end end mail.deliver!
参考
こういう Tips 記事って
前に「こういう Tips 記事は Qiita みたいなプラットフォームに書いたほうが見てもらえるから、そっちに書くわ。」って宣言したんだけど、このブログを価値を高めたいので、こちらに投稿した。