Gem sorceryを使い倒す④ 本番環境でメイラー設定

## 使用環境
ruby:3.2.2
rails:7.0.7
Docker
Gmail
render

今回のデプロイ先はrenderを使用しました。
メールはGmailを設定します。

## 本番環境でパスワードリセットする挙動

https://railstutorial.jp/chapters/password_reset?version=5.1

　　
１．ユーザーがパスワードの再設定をリクエストすると、ユーザーが送信したメールアドレスをキーにしてデータベースからユーザーを見つける
２．該当のメールアドレスがデータベースにある場合は、再設定用トークンとそれに対応する再設定ダイジェストを生成する
３．再設定用ダイジェストはデータベースに保存しておき、再設定用トークンはメールアドレスと一緒に、ユーザーに送信する有効化用メールのリンクに仕込んでおく
４．ユーザーがメールのリンクをクリックしたら、メールアドレスをキーとしてユーザーを探し、データベース内に保存しておいた再設定用ダイジェストと比較する (トークンを認証する)
５．認証に成功したら、パスワード変更用のフォームをユーザーに表示する

https://qiita.com/joinus_ibuki/items/ce2fcdb9abb980959a9d

　　
ここまでは前回実装済みです。今回は本番環境の設定を行っていきます。

# Gmail.comを使った実装手順
　　
①.Googleでアプリパスワードを取得
②.環境設定ファイルに通信設定を記述
③.renderの設定

# アプリパスワード取得
　　
まず、アプリで使用する[Googleアカウント](https://myaccount.google.com/)を作成します。

2段階認証が設定されていない場合は、まず2段階認証をオンにしてください。

[![Image from Gyazo](https://i.gyazo.com/c27b3defd9a5c0cb95d7a4de14a7aedf.png)](https://gyazo.com/c27b3defd9a5c0cb95d7a4de14a7aedf)
　　
設定が有効になったら、2段階認証プロセスのページをもう一度開き一番下までスクロールするとアプリパスワードがあります。
[![Image from Gyazo](https://i.gyazo.com/69b92ac550e9413dcb82be292c5bec55.png)](https://gyazo.com/69b92ac550e9413dcb82be292c5bec55)

分かりやすい名前をつけて作成を押すだけ！(サンプル)
[![Image from Gyazo](https://i.gyazo.com/9e6a215040aa24b52c2ec166d78b1302.png)](https://gyazo.com/9e6a215040aa24b52c2ec166d78b1302)

このパスワードを覚えておく必要はないので、とおっしゃっていますが嘘です絶対にこのページで控えておいてください。


　　
# Railsの環境設定
　　
**【開発環境の設定変更】**
開発環境でのメールの送信先を変更します。
```ruby:config/environments/production.rb
  config.action_mailer.default_url_options = Settings.default_url_options.to_h
  config.action_mailer.raise_delivery_errors = true

  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    address:              'smtp.gmail.com',
    port:                 587,
    domain:               '***.onrender.com',
    user_name:            ENV['GMAIL_USERNAME'],
    password:             ENV['GMAIL_PASSWORD'],
    authentication:       'plain',
    enable_starttls_auto: true 
  }
```
64行目に`  config.action_mailer.perform_caching = false
`という行があるので、その下に記述すと分かりやすいです。

　　
**【解説】**

`config.action_mailer.delivery_method = :letter_opener_web`
Railsアプリケーションでメールを送信する際に使用する配送方法（delivery method）を設定しています。

　　
`config.action_mailer.raise_delivery_errors = true`
この設定は、メールの配信中にエラーが発生した場合に、例外を発生させるかどうかを設定します。trueに設定することで、メール送信時のエラーが発生した際にアプリケーションが例外を投げ、これによって開発者は問題を認識しやすくなります。
　　

`config.action_mailer.delivery_method = :smtp`
メールの送信方法をSMTP（Simple Mail Transfer Protocol）に設定しています。SMTPはインターネットでメールを転送するための標準プロトコルです。

　　
`config.action_mailer.smtp_settings = {}`
smtp_settingsハッシュでは、SMTPサーバーの詳細設定を行っています。これらの設定によりRailsはメールを送信するためにGmailのSMTPサーバーを利用することができます。

<table>
  <caption>カラムの役割</caption>
  <thead>
    <tr>
      <th></th> <th>説明</th>
    </tr>
  </thead>
  <tr>
    <td> address: </td> <td>SMTPサーバーのアドレスです。Gmailの場合はsmtp.gmail.comを使用します。</td>
  </tr>
  <tr>
    <td> port: </td> <td>SMTPサーバーのポート番号です。587はメール送信に一般的に使われるTLS（Transport Layer Security）を使用するポートです。</td>
  </tr>
  <tr>
    <td> domain: </td> <td>メールを送信する際に使用されるドメイン名です。ここでは例として＊＊＊.onrender.comが設定されています。</td>
  </tr>
  <tr>
    <td> user_name:
    password: </td> <td>環境変数を通して設定されるGmailのユーザー名とパスワードです。</td>
  </tr>
  <tr>
    <td> authentication: </td> <td>SMTPの認証タイプです。ここでは'plain'が使われていますが、他にも'login'や'cram_md5'などがあります。</td>
  </tr>
  <tr>
    <td> enable_starttls_auto: </td> <td>trueに設定することで、メール送信のセキュリティを強化するためにTLSを使用することをSMTPサーバーに対して指示します。</td>
  </tr>
</table>

# .envファイルの設定
　　
今回、少人数のチーム開発だったので、credentials.yml.encで環境変数を管理すると、変更の際毎回EDITORを開くのがめんどくさくて.envで作成しました。

**【gemのインストール】**

https://github.com/bkeepers/dotenv

`.env`ファイルをrailsで扱うためには、`gem 'dotenv-rails'が必要です。

```ruby:Gemfile
gem 'dotenv-rails'
```
```
bundle install
```
`.env`ファイルはGitHubに上げないよう、`.gitignore`に追記します。
```ruby:.gitignore
.env
```
中身を編集していきます。
```ruby:.env
GMAIL_USERNAME=***********@gmail.com #アプリキーを設定したメールアドレス
GMAIL_PASSWORD=ltxc **** **** scrd #アプリキー
```
USERNAMEにはアプリキーを設定したメールアドレスを記述します。このアドレスがメールの送信元になります。
PASSWORDに先ほどメモしたアプリキーを設定します。

```ruby
    user_name:            ENV['GMAIL_USERNAME'],
    password:             ENV['GMAIL_PASSWORD'],
```
この形で変数を呼び出せます。


# renderの設定
　　
最後にrenderで環境変数を読み込めるようにします。
renderの設定したいアプリをDashboardから選び、EnvironmentのSecretFilesを設定します。
[![Image from Gyazo](https://i.gyazo.com/84339f1dc2e730c4ad7b7b4609ba6966.png)](https://gyazo.com/84339f1dc2e730c4ad7b7b4609ba6966)
Filenameを`.env`に設定します。
次にContentsをクリックすると開かれるファイルに、Railsの`.env`と同じ設定を記述します。
最後にSave Changesを押して内容を保存しましょう。(忘れると保存されません😂)
　　
# 関連記事

https://qiita.com/joinus_ibuki/items/6cdf5368d4b858abfb51

https://qiita.com/joinus_ibuki/items/d09435418704c666ad30

https://qiita.com/joinus_ibuki/items/ce2fcdb9abb980959a9d

https://qiita.com/joinus_ibuki/items/3a0d264abe510bfdd98a



# 参考資料


https://railsguides.jp/v6.1/action_mailer_basics.html#gmail%E7%94%A8%E3%81%AEaction-mailer%E8%A8%AD%E5%AE%9A

https://labo.kon-ruri.co.jp/rails-send-mail-via-gmail-smtp/