search
LoginSignup
75

More than 3 years have passed since last update.

posted at

updated at

【Rails】メール送信設定 〜gmail利用〜

はじめに

某プログラミングスクールでのチーム開発振り返り編。

どうせなら、ちゃんとメール送信できる環境にしたいな…と、考えました。
が、メールサーバたてるの?!どうすりゃいっけ?!って思っていたら、gmailが使えるようなので、お試しでgmailアカウントからメール送信してみました。

間違っている点などあれば、ご指摘・指南いただけると嬉しいです!

実現したいこと

開発環境および、本番環境でgmailを使ったメール送信

全体の流れ

今回はこんな感じの流れです。
[gmailアカウントで2段階認証用のパスワード取得]
 ↓
[Railsのconfig設定変更]

設定手順

それでは、コチラもちゃきちゃき行きましょう。

gmailアカウント/2段階認証用のパスワード取得

gmailのアカウント取得が必要です。
今回は、gmailアカウントの2段階認証をオンにして、専用の認証パスワードを取得した上で設定を行いました。
※通常の認証パスワードを使用するとエラーとなります。(Net::SMTPAuthenticationErrorとか出ちゃいます)

① 送信用に利用するgmailのアカウントでログイン
 googleアカウント画面を表示してください。
② [セキュリティ]設定
 画面左のメニューから[セキュリティ]を選択し、セキュリティの設定画面を開きます。
   Image from Gyazo
③ 2段階認証を有効化
 [Googleへのログイン]にある[2段階認証プロセス]を選択し、画面に沿って設定を完了させてください。
 ※既に有効な場合は、手順をスキップしてください
  Image from Gyazo
④ アプリで利用するためのパスワードを取得します。
 [Googleへのログイン]にある[アプリパスワード]を選択し、パスワードを発行してください。
Image from Gyazo
⑤ パスワード取得完了
 発行完了すると、下図の用に16桁の番号が払い出されます。
 この番号をメールアカウントの認証パスワードとして、利用してください。
Image from Gyazo

Railsのconfigファイル編集

メール送信設定はconfig/environment配下にある各環境ごとの設定ファイルに定義すればOKです。
開発環境と本番環境の違いはdefault_url_optionsくらいかなと思います。
ほぼ一緒ですが、とりあえず羅列^^;

【フォルダ構成】
 config
  ∟environments
   ∟development.rb ・・・ 開発環境
   ∟test.rb     ・・・ テスト環境(今回は対象外)
   ∟product.rb    ・・・ 本番環境

①開発環境

config/environments/development.rb
Rails.application.configure do
 #中略#
  #deviseが認証用のURLなどを生成するのに必要になる(らしい)
  config.action_mailer.default_url_options = {  host: 'localhost', port: 3000 }
  #送信方法を指定(この他に:sendmail/:file/:testなどがあります)
  config.action_mailer.delivery_method = :smtp
  #送信方法として:smtpを指定した場合は、このconfigを使って送信詳細の設定を行います
  config.action_mailer.smtp_settings = {
    #gmail利用時はaddress,domain,portは下記で固定
    address:"smtp.gmail.com",
    domain: 'gmail.com',
    port:587,
    #gmailのユーザアカウント(xxxx@gmail.com)※念のため、credentials.yml.enc行き
    user_name: Rails.application.credentials.gmail[:user_name],
    #gmail2段階認証回避のためにアプリケーションでの利用パスワードを取得、必ずcredentials.yml.endに設定を!!
    password: Rails.application.credentials.gmail[:password],
    #パスワードをBase64でエンコード
    authentication: :login
  }
#中略#
end

②本番環境

config/environments/product.rb
Rails.application.configure do
 #中略#
  #deviseが認証用のURLなどを生成するのに必要になる(らしい)
  config.action_mailer.default_url_options = {  :host => 'http://ipアドレス'or'ドメイン名' }
  #送信方法を指定(この他に:sendmail/:file/:testなどがあります)
  config.action_mailer.delivery_method = :smtp
  #送信方法として:smtpを指定した場合は、このconfigを使って送信詳細の設定を行います
  config.action_mailer.smtp_settings = {
    #gmail利用時はaddress,domain,portは下記で固定
    address:"smtp.gmail.com",
    domain: 'gmail.com',
    port:587,
    #gmailのユーザアカウント(xxxx@gmail.com)※念のため、credentials.yml.enc行き
    user_name: Rails.application.credentials.gmail[:user_name],
    #gmail2段階認証回避のためにアプリケーションでの利用パスワードを取得、必ずcredentials.yml.endに設定を!!
    password: Rails.application.credentials.gmail[:password],
    #パスワードをBase64でエンコード
    authentication: :login
  }
#中略#
end

smtp送信の設定項目

以下のような設定項目が用意されているようです。
色々試してみると楽しいです。

項目名 概要 設定値
:address リモートメールサーバーの利用を許可する。 デフォルト:localhost
異なる場合は適宜設定を行う
:port smtp(メール)サーバのポート番号 デフォルト:25
異なる場合は適宜設定を行う
:domain リモートメールサーバーのドメインの指定 デフォルt指定なし
必要に応じHELOドメインを指定
:user_name smtp(メール)サーバのユーザ認証アカウント デフォルト:指定なし
必要な場合は設定する
:password smtp(メール)サーバのユーザ認証パスワード デフォルト:指定なし
必要な場合は設定する
:authentication 認証パスワードのやりとり方法 認証アカウントの設定がある場合は、下記のいずれかを選択
:plain/平文
:login/Base64でエンコード
:cram_md5/チャレンジ/レスポンスによる情報交換と、MD5アルゴリズムによる重要情報のハッシュ化の組み合わせ(gmailはこの設定だとエラー)
:enable_starttls_auto SMTPサーバーでSTARTTLSが有効かどうかを検出して有効にする デフォルト:true
gmailではfalseにするとエラーになりました
:openssl_verify_mode TLSを利用する場合にOpenSSLが認証をチェックする方法を指定 OpenSSL検証定数の名前('none'、'peer'、'client_once'、'fail_if_no_peer_cert')

その他のオプション

raise_delivery_errors
メール配信に失敗した場合にエラーを発生するかどうかを指定します。このオプションは、外部のメールサーバーが即時配信を行っている場合にのみ機能します。
trueにしておくことで、送信元のメールboxに送信エラーとなったメールがそのまま届きます!

補足説明

gmailアカウントの秘匿
 credential.yml.encに追加することをお勧めします。(Rails5.2以上)
 具体的な設定方法はコチラを参照ください。

まとめ

AWSでお試し環境動かす方が苦労して、あまり感想が・・・と言う^^;
メールには様々なセキュリティ対策のための仕組みがあると思うので、その実現のための方法を模索したりするのも楽しそうです。AWSのメールサービスとか使うとフィルタ機能も使えるみたいなんで、少し心が動く所。。

参考

Action Mailer の基礎
 → 殆どがこちらの記載内容を参考に書いたものです^^;

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
What you can do with signing up
75