大学生からの Web 開発

廃れない技術よ 我が身に

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 はセキュリティ上、ユーザー名・パスワードが正しいアクセスでも、安全性が低いアプリケーションからのアクセスをデフォルトでは弾く。この弾くことを無効にしてやればよい。

アカウント設定 から「安全性の低いアプリのアクセス」 → 「許可」にする。「安全性の低いアプリのアクセス」の位置は、下の雑な画像を見れば分かる。

f:id:karur4n:20150307232612p:plain

その2 堅牢なの ☆ おすすめ

「2 段階認証プロセス」をオンにしてアプリパスワードを生成する。

f:id:karur4n:20150307234022p:plain

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!

参考

Ruby - 【メール送信エラー】Net::SMTPAuthenticationError - 534-5.7.14 <https://accounts.google.com/ContinueSignIn ... - Qiita

こういう Tips 記事って

前に「こういう Tips 記事は Qiita みたいなプラットフォームに書いたほうが見てもらえるから、そっちに書くわ。」って宣言したんだけど、このブログを価値を高めたいので、こちらに投稿した。