【AWS】Amazon SESを用いてRuby on Railsのdeviseでメールを送信する

# 目次
・経緯
・今回の前提条件
・注意事項
・AWS SES(Simple Email Service)とは
・料金
・大体の流れ(イメージ)
・1. AWS SESの設定
・2. AWSのCSに制限解除のメールを送る
・3. IAMユーザーの設定
・4. railsに設定
・用語解説
・最後に

## 経緯
私が***[Portfolio](https://notepro.work/)***を作成している段階でして、divise上のメールが飛んでいないことに気づきました。
改善策を模索している中、AWSSES(有料)なるものを見つけGmail(無料？)でも実装できることが分かったが、AWSでEC2なども利用していたので
・AWSでまとめて管理ができるのですっきりしそう
・いい経験になるかも
上記の理由で実装してみた。

***私自身も初学者なので、完全に鵜呑みにせずイメージをつかむ感覚で読んでいただければと！***

## 今回の前提条件
- Ruby on railsでappがありdeviseを導入している
- AWSのアカウントを所持している
- Route53の設定が完了していて、ドメインでのアクセス可能なサイトがある。

くらいですかね、、
 
## 注意事項
私がだいぶ躓いたところなので、、
2020/09/22現在AWSSESを東京リージョン(ap-northeast-1)で本番環境で実装するとメールが飛びません！！！！！
最近のリリースなのでまだバグが多いから？！
解決方法わかる方教えていただきたいです
[祝！Amazon SESが東京リージョンにやってきた！](childrenraku.work/login/select)
私はアイルランドリージョン(eu-west-1)で実装しました。
AWS SES以外の設定は東京リージョンで済ませております。（EC2,Route53など）

あとサンドボックスの制限解除に1日かかります！
ご利用は計画的に!

##AWS SES(Simple Email Service)とは
AWSで提供されているクラウドベースの電子メール送信サービスです。

##料金
AWS SESは有料で、一定量送信毎での従量課金制ぽいです。
> SES の料金は、送信する各 1,000 通の E メールにつき、0.10USD であり、非常に低コストです。

上記の通り、高額な金額が発生するわけではなさそうなので試しに利用してみるのもありでしょう！

##大体の流れ(イメージ)
1. AWS SESの設定
2. AWSのCSに制限解除のメールを送る
3. IAMユーザーの設定 
4. railsに設定

##1. AWS SESの設定
![AWS-マネジメントコンソール (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632795/a2f69ed1-44c6-f228-b743-0346b0f63263.png)
1-1. AWSにログイン
1-2. ヘッダーのサービスをクリック
1-3. SESと検索してエンター

![SES-Management-Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632795/deb97b26-2d1f-88d1-0249-13ea0a6d7915.png)
1-4. IdentityManagement>Domainをクリック
1-5. Varufy a NeW Domianをクリック
※***この段階で東京リージョン以外のリージョンを選択しておいたほうが良いです***

![SES-Management-Console (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632795/ad309c22-f5dc-8693-cba2-e7364c3ec390.png)
1-6. Domainに接続したいドメイン名を入れる
1-7. Generate DKIM Settingsにチェック入れる
1-8. Varufy This Domianをクリック

![SES-Management-Console (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632795/4cdfb22a-eff8-85c4-8a64-1e91c6bad5c0.png)
1-9. User Route53をクリック
Route53を登録している場合上記表示になる。
登録している場合レコードの設定までを自動でやってくれるぽい


![SES-Management-Console (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632795/b1aba36f-3dab-5cf2-a224-11b656549bc2.png)
1-10. Create Record Setsをクリック
AWS SWSのsettingは一旦こちらで終了です！

![SES-Management-Console (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632795/2b3daddb-910f-cbd6-092c-55770ee689bf.png)
しばらくすると各項目がverifiedに代わると思います。

## 2. AWSのCSに制限解除のメールを送る
AWS SESをsettingをしただけではメールは送信されません。
設定初期ProductionAcsessがSandboxになっており、これを解除する必要があります。

![SES-Management-Console (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632795/4e1966fc-c047-5ecf-ab98-ef45a98619e2.png)
2-1. Email Sending > Sending Statistics　をクリック　　
2-2. ProductionAcsessがSandboxになっていることを確認する。

![SES-Management-Console (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632795/1391ec11-5c8c-7bf0-48ef-e4a82734b200.png)
2-3. 右上のサポートをクリック
2-4. サポートセンターをクリック

![AWS-サポートダッシュボード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632795/dfce60f8-e1b3-3dd7-97f0-54503d820ae4.png)
2-5. 中央にあるCreate Caseをクリック

以降メールの送信手順に関しては下記記事でご丁寧にまとめられておりましたので
メールを送るまでは参考にしてみてください。
[2-6.メール送信の手順](https://laraweb.net/knowledge/7083/)
※２．解除申請を送るフォームに入力から行ってみてください。

![S__635158530.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632795/0cfec1a0-d8aa-9f5e-7a9b-0fca9dce5565.jpeg)
メール送信して一日後、上記のような解除しましたとメールが来れば
下記がProductionAcsessがSandbox⇒Enabledに代わります。

![SES-Management-Console (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632795/8de4d0bb-b748-4447-913d-10f9503c81cd.png)

![SES-Management-Console (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632795/be0c7709-db5a-77a4-9fd5-eed4a7094a11.png)
2-7.IdentityManagement>Domain>SendaTestEmailをクリック
2-8.メールを送ってみる
最後にテストです。
メールを送り受信ボックスに届くか確認します。

## 3. IAMユーザーの設定
AWS SESのsettingと制限解除だけではrailsにつなぎこめません。
最後にIAMユーザーを新規登録しなくてはいけません。
※筆者はrootアカウントでキーとIDを参照する方法を探してみましたがありませんでした。
※本来rootアカウントでは接続管理は好ましくなく、各アクションごとにIAMユーザー（権限の範囲）を指定して接続したほうがいいと参考書に書いてありました。
のであるかはわかりませんがとりあえずIAMユーザーで作成しておけってことですね。

![AWS-マネジメントコンソール (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632795/45c1a1de-686b-3235-f1c0-23cf5400c3d4.png)
3-1. ヘッダーのサービスをクリック
3-2. IAMと検索してエンター

![IAM-Management-Console (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632795/df4a28e9-7e08-53e0-6fa8-5c50739c8ee6.png)
3-3. ユーザーをクリック
3-4. ユーザーを追加をクリック

![IAM-Management-Console (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632795/9b9b37c9-6759-75b3-0739-8554cf3b0bf8.png)
3-5. ユーザー名を入れる（※ここはわかりやすければなんでもOKです）
3-6. プログラムによるアクセスにチェック
3-7. 次のステップ：アクセス権限をクリック

![IAM-Management-Console (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632795/6008638a-13b3-9aa7-8769-ae38673b3a6e.png)
3-8. 既存ポリシーを直接アタッチをクリック
3-9. ポリシーのフィルタにSESと入れる
3-10. AmazonSESFullAccessにチェックを入れる
3-11. 次ぐのステップ：タグをクリック

![IAM-Management-Console (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632795/18d47d0d-914a-bae8-3fda-8686935d22f2.png)
3-12. 次ぐのステップ：確認をクリック
キーと値は何も入れなくてOKです。

![IAM-Management-Console (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632795/63ca43e2-a856-dd5b-883d-8aaa8b4dd5b3.png)
3-13. ユーザーの作成をクリック

![IAM-Management-Console (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632795/0266d69a-7e8e-5b1c-2905-dd15661d8a54.png)
こちらでIAMユーザーの作成が完了です。
***※アクセスキーIDとシークレットアクセスキーは必ず控えておきましょう。
※アクセスキーIDは後程確認できますが、シークレットアクセスキーはこのページでしか確認ができず消したらもう見れません。***
こちらでAWS上での設定は完了です。

## 4. railsに設定
お疲れ様です。
最後はrailsに設定して終わりです。
大体の作業は下記の流れです。
1. gemのインストール
2. ActionMailerの設定
3. 本番環境、開発環境の設定
4. deviseの設定変更
5. Mailerクラスのfromの設定
6. .envをアップロードする(本番環境用)

### 4-1. gemのインストール

```
gem 'aws-ses'
```
Gemfileにて上記を記載してbundle install

### 4-2. ActionMailerの設定

```
ActionMailer::Base.add_delivery_method :ses,
  AWS::SES::Base,
  access_key_id: ENV['AWS_ACCESS_KEY_ID'],
  secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
  server: 'email.リージョンID.amazonaws.com'
```
config/initializers/aws.rbを新規で作成
リージョンIDと記載されているところはSESを作成したリージョンIDを入れてください。
※分からない場合はAWSにログインをするとURLの末尾にリージョンIDが記載されてます。
>例
>東京：ap-northeast-1
>アイルランド：eu-west-1

IDとKEYはpushしてしまうとまずいので.envに新規で追加します。

```
AWS_ACCESS_KEY_ID = IDを入力
AWS_SECRET_ACCESS_KEY = KEYを入力
```

### 4-3 開発環境（のみ）の設定

```
config.action_mailer.default_url_options = { host: 'ドメイン名' }
config.action_mailer.delivery_method = :ses
```
config/environments/development.rbに上記を追加
***ドメイン名と書いてあるところは接続しようとしているドメイン名に変えてください。***


### 4-3 本番環境（のみ）の設定

```
config.action_mailer.default_url_options = { host: 'ドメイン名' }
config.action_mailer.delivery_method = :ses
```

config/environments/production.rbに上記を追加
***ドメイン名と書いてあるところは接続しようとしているドメイン名に変えてください。***

### 4-4. deviseの設定変更
```
# config.mailer_sender = 'please-change-me-at-config-initializers-devise@example.com'
config.mailer_sender = 'Testrooper <noreply@ドメイン名>'
```
config/initializers/devise.rbを変更します
***ドメイン名と書いてあるところは接続しようとしているドメイン名に変えてください。***

### 4-5. Mailerクラスのfromの設定

```
class ApplicationMailer < ActionMailer::Base
  default from: 'MyDomain <noreply@ドメイン名>'
  layout 'mailer'
end
```
Mailerクラスのfromの設定をします。
mailers/application_mailer.rbに上記を追加します。
***ドメイン名と書いてあるところは接続しようとしているドメイン名に変えてください。***
開発環境であればこちらで終了となります^^

### 4-6. .envをアップロードする(本番環境のみの設定)
開発環境では正常に動き、本番環境で動かなかった際、こちら完全に忘れておりました、、
.envはpushされないのでEC2上にアップロードします
でないと本番環境ではSESの参照ができません！
流れは下記のとおりです。
1.EC2にログイン
2.アプリケーションのディレクトリに移動
3.viで.envにアクセスキーIDとシークレットアクセスキーの上書き保存
4.PUMAの再起動

## 用語解説
後程追加いたします。