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

#はじめに

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

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

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

#実現したいこと
開発環境および、本番環境でgmailを使ったメール送信

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


#設定手順
それでは、コチラもちゃきちゃき行きましょう。

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

**① 送信用に利用するgmailのアカウントでログイン**
　[googleアカウント](https://myaccount.google.com/intro?utm_source=OGB&tab=mk&utm_medium=act)画面を表示してください。
**② [セキュリティ]設定**
　画面左のメニューから[セキュリティ]を選択し、セキュリティの設定画面を開きます。
　　　[![Image from Gyazo](https://i.gyazo.com/77306966faf453b588b84ecefae74d1f.png)](https://gyazo.com/77306966faf453b588b84ecefae74d1f)
**③ 2段階認証を有効化**
　[Googleへのログイン]にある[２段階認証プロセス]を選択し、画面に沿って設定を完了させてください。
　※既に有効な場合は、手順をスキップしてください
　　[![Image from Gyazo](https://i.gyazo.com/d83355acf3027ff8489ac44a68832ecf.png)](https://gyazo.com/d83355acf3027ff8489ac44a68832ecf)
**④　アプリで利用するためのパスワードを取得します。**
　[Googleへのログイン]にある[アプリパスワード]を選択し、パスワードを発行してください。
[![Image from Gyazo](https://i.gyazo.com/4ba0d252102f4ffc1195f4d1c54889c9.png)](https://gyazo.com/4ba0d252102f4ffc1195f4d1c54889c9)
**⑤　パスワード取得完了**
　発行完了すると、下図の用に１６桁の番号が払い出されます。
　この番号をメールアカウントの認証パスワードとして、利用してください。
[![Image from Gyazo](https://i.gyazo.com/5aae169fca99de0d9e110e4141b1472c.png)](https://gyazo.com/5aae169fca99de0d9e110e4141b1472c)

##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],
    #gmail２段階認証回避のためにアプリケーションでの利用パスワードを取得、必ず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],
    #gmail２段階認証回避のためにアプリケーションでの利用パスワードを取得、必ずcredentials.yml.endに設定を！！
    password: Rails.application.credentials.gmail[:password],
    #パスワードをBase64でエンコード
    authentication: :login
  }
#中略#
end
```
###smtp送信の設定項目
以下のような設定項目が用意されているようです。
色々試してみると楽しいです。

| 項目名 | 概要  | 設定値 |
|:------|:-----|:----|
| :address |リモートメールサーバーの利用を許可する。|デフォルト：localhost<br>異なる場合は適宜設定を行う|
| :port |smtp（メール）サーバのポート番号|デフォルト：25<br>異なる場合は適宜設定を行う|
| :domain |リモートメールサーバーのドメインの指定|デフォルt指定なし<br>必要に応じHELOドメインを指定|
| :user_name |smtp(メール）サーバのユーザ認証アカウント|デフォルト：指定なし<br>必要な場合は設定する|
| :password |smtp(メール）サーバのユーザ認証パスワード|デフォルト：指定なし<br>必要な場合は設定する|
| :authentication | 認証パスワードのやりとり方法 | 認証アカウントの設定がある場合は、下記のいずれかを選択<br> :plain/平文<br> :login/Base64でエンコード<br>:cram_md5/チャレンジ/レスポンスによる情報交換と、MD5アルゴリズムによる重要情報のハッシュ化の組み合わせ(gmailはこの設定だとエラー） |
| :enable_starttls_auto |SMTPサーバーでSTARTTLSが有効かどうかを検出して有効にする|デフォルト：true<br>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以上）
　具体的な設定方法は[コチラ](https://qiita.com/ozackiee/items/e7ecf0bbba7434111b0a)を参照ください。

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

#参考
[Action Mailer の基礎](https://railsguides.jp/action_mailer_basics.html)
　→ 殆どがこちらの記載内容を参考に書いたものです^^;