deviseを活用してメールでユーザー認証をしたい話

# Why?
deviseでメールでの認証をしようとしたら、開発環境では Letter Opener で簡単に見れたけど、本番環境では使えない。何を設定しなきゃいけないんだ？
という初心者が頑張ってメールを送れるように色々設定した備忘録となっています。

実施するうえでカスタムドメインにしている前提なので未だの方はこちらの備忘録もご参考になれば。
[カスタムドメイン適応の話](https://qiita.com/piyonosuke/items/0a96eb352861d7037883)

# devise
ユーザーの新規登録からログイン、ログアウト、ユーザー情報のあれこれがこれさえあれば一通りそろうgem。ひとまず入れてカスタマイズしながら使っています。
[devisev の github](https://github.com/heartcombo/devise)

# SMTPサービス とは？
SMTP は Simple Mail Transfer Protocol の略らしい。
インターネット上で E メールメッセージを送受信するために使用される通信プロトコル。
詳しいところはこちらが分かりやすいので読んでみてください。

[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word14.html)

そんなこんなでEメールを送るためのサーバーが無いとダメだということらしい。

# 今回使わせて頂いたサービス
- heroku (デプロイ環境)
- mailjet (メール送信)
- cloudflare (DNS管理)

# 送信用のカスタムアドレスを作成する。
アプリからのメールであることを受け取り手に伝えるように送信用のカスタムアドレスを作成。cloudflare の Email Routingでカスタムアドレスを作成する。
- Outlookで新規メールアドレスを作成(メールアドレスを何で作成するかはご自由に)
- cloudflareにログイン
- メールアドレスの```Email Routing``` → カスタムアドレス
- カスタムアドレスを作成
![カスタムアドレスを作成](https://i.gyazo.com/b69b1f59452b60ffcb7379f5f429b0ae.png)
  - カスタムアドレス → 追加したいアドレスを記入
  - アクション → メールに送信
  - 宛先 → Outlookで作成したメールアドレス

- 保存
- cloudflareからメールが送られてくるのでメールのリンクからメールアドレスの確認をする。

これでカスタムアドレスの準備はok

# maijetのアカウント作成
まずはアカウント作成。
アプリごとにアカウントを作成しておくと管理がしやすい気がする。
ただアカウントを分けていることを忘れると設定で嵌る。（実体験）

# maijetのAPIキーの取得
- ```welcome Guide```の```Developer```から```Create API Key```
- ```APIキー```と```SECRETKEY```をメモするかどっかに保存しておく

# maijetにドメイン関係の設定をしていく
```welcome Guide```の```Marketer```から```Set up domain```
このページを起点に設定をしていく。

## ドメイン名の設定
- ```Domains and senders```の```Domains```にある```Add domain```を選択
![add a neu domain](https://i.gyazo.com/1e9d0c1c9067ad55c1eef39f9ca040bc.png)
   - Domain → 作成したアプリのドメイン名
   - Label → わかりやすいラベル ～officialとか
- 追加
- 追加した後ドメイン検証用のDNS設定が表示されたと思うので、それをCloudflareに登録するしてから確認ボタンを押す。(といけたと思うけどちょっと忘れた。)

## メール送信に使うアドレスの設定
mailjetに送信で使うアドレスを前もって登録しておかなければならないので、送信用のカスタムアドレスをここに登録。
- ```Domains and senders```の```Sender addresses```にある```Add a sender address```を選択
(先ほどのドメイン名を設定した下側)
![add a sender address](https://i.gyazo.com/088d6a24511cef56e1f7e8fa59d92010.png)
   - Label → わかりやすいラベル
   - Email → 先ほどcloudflareで設定したカスタムアドレス
   - 用途 → 認識に使うのであれば一番上
- 追加
- mailjetからメールが届くのでメールのリンク```Activate now```でアクティブにする

これで追加完了

## SPF/DKIM認証の設定
- ```SPF/DKIM Aurhentication```の下のドメインの右端にある歯車から```Setup SPF/DKIM Authentication```を選択
- それぞれのsetup用のDNS設定がで表示されるのでこれらをCloudflareに設定
- ```SPF/DKIM Aurhentication```に戻ってどちらもokになっていれば完了

ここまで来たら大方mailjetでの設定は終了。
次はRails側。

# deviseのmodelを修正
:::note warn
注意
deviseはすでに入れてあってマイグレーションとか終了しているという前提で話しています。
まだの方はこちらの記事がとても参考になったので活用して実装してください。
[[*Rails*] deviseの使い方（rails5版）](https://qiita.com/cigalecigales/items/f4274088f20832252374#3-user%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E8%A8%AD%E5%AE%9A)
:::
```confirmable```を有効にする。
以下一部抜粋

```diff_app/models/user.rb
class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable,
         :confirmable, :timeoutable
```

# mailjetのgemを入れる
- gemfileにmailjet.gemを入れる。
[mailjet-gem の github](https://github.com/mailjet/mailjet-gem?tab=readme-ov-file#send-emails-with-actionmailer)

``` Gemfile
gem "mailjet"
```
入れるとき```group```に入れると開発環境でエラーが出た気がするから入れない方がいいかも。

- ```bundle install```でインストール

# Railsの設定
- ```config/environments/production.rb```に以下の設定を追加
```config/environments/production.rb
config.action_mailer.delivery_method = :mailjet
config.action_mailer.default_url_options = { host: "カスタムドメイン名", protocol: "https" }
```
- ```config/initializers/mailjet.rb```を作成し以下を設定
```config/initializers/mailjet.rb
Mailjet.configure do |config|
  config.api_key = ENV["MAILJET_API_KEY"] 
  config.secret_key = ENV["MAILJET_SECRET_KEY"]
  config.default_from = "info@syn-on.com"
  config.api_version = "v3.1"
end
```
- ```.env```を作成し、以下を追加
```.env
# MailJet
MAILJET_API_KEY = 'mailjetで取得したAPIキー'
MAILJET_SECRET_KEY = 'mailjetで取得したシークレットキー'
```

:::note warn
注意
一応```.gitignore```で```.env```が対象になっていることを確認しておくと安心。
このファイルに記載してあるファイルはgithubには表示されない。
```.gitignore
# Ignore all environment files (except templates).
/.env*
!/.env*.erb
```
:::

- ```config/initializers/devise.rb```の```Devise.setup do |cinfig|```の中に以下の設定を追加
```config/initializers/devise.rb
Devise.setup do |config|
  
  config.mailer_sender = "送信用のカスタムアドレス"
  config.mailer = "Devise::Mailer"
  
end
```

ここまでくれば後はHerokuだけ。

# Herokuの設定
Herokuのアプリの```Settings```から、```Config Vars```にAPIキーとシークレットキーを登録する。

![Heroku入力フォーム](https://i.gyazo.com/b1ddd4efa7b1c91a7b4325f66a888c7a.png)
  - KEY → MAILJET_API_KEY と MAILJET_SECRET_KEY（.envで登録した名前）
  - VALUE → それぞれのキーの値

以上。

# 終わりに
ここまで読んで頂きありがとうございます。
そんなこんなで送れるようになりましたでしょうか？

この記事は私が実装した後にできるだけ忘れないように書いているのですが、色々模索しながら進めたのでちょっと抜けていたり、余計なことが書いてあるかもしれません。
もし、ここ違くないか？と思うことがありましたらコメント等でご指摘頂けると幸いです。

それではまた。

# 参照
- [SMTP とは何ですか?](https://aws.amazon.com/jp/what-is/smtp/#:~:text=SMTP%20%E3%81%AF%20Simple%20Mail%20Transfer,%E3%80%81%E5%8F%97%E4%BF%A1%E3%80%81%E4%B8%AD%E7%B6%99%E3%81%97%E3%81%BE%E3%81%99%E3%80%82)
- [devise の github](https://github.com/heartcombo/devise)
- [「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word14.html)
- [[*Rails*] deviseの使い方（rails5版）](https://qiita.com/cigalecigales/items/f4274088f20832252374#3-user%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E8%A8%AD%E5%AE%9A)
- [mailjet-gem の github](https://github.com/mailjet/mailjet-gem?tab=readme-ov-file#send-emails-with-actionmailer)
-