LambdaとSESによるドメインでのメール送信

# 流れ
1. ドメイン設定
1. SESでドメインメール設定
1. SES制限解除
1. Lambda作成


# ドメイン設定
簡単に説明します。
お名前.comでドメインを購入し、Route53のNSを4つコピーし、お名前.comのネームサーバー設定に貼り付けると設定完了です。

# SESでドメインメール設定
ドメインメール設定をします。

![スクリーンショット 2022-02-05 14.02.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/8aca2e73-2546-5544-ce3a-f3e4bde0aaec.png)

ドメインを入力し、他は、デフォルトのまま、作成します。
![スクリーンショット 2022-02-05 14.03.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/766f92e9-3493-44ff-fc82-a3f30ee2196f.png)

DKIM用に、Route53に3つのCNAMEレコードが作成されます。
`Identity status`と`DKIM configuration`が数分で`Verified`と`Successful`になります。
![スクリーンショット 2022-02-05 14.10.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/ba3c3130-8846-e751-43de-bbac9e0a7f78.png)
![スクリーンショット 2022-02-05 14.10.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/08dcbe4c-3026-18df-b9ba-7b28e5f3679d.png)

# SES制限解除
`Account dashboard`に遷移すると、sandoboxの制限と記載されております。
![スクリーンショット 2022-02-05 15.06.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/d387eba5-de7c-db7c-a348-7572beb23518.png)
今のままですと、SESに登録したメールアドレスにしか、メールが送れません。

SESの送信上限緩和およびSandbox制限の解除の申請を行います。

申請方法は、`Service Quotas`と`AWSサポート`2つあります。

## ①SESのコンソールとService Quotasから申請
### sandbox制限解除

`Account dashboard`に遷移し、`Request production access`をクリックします。
![スクリーンショット 2022-02-05 15.06.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/d387eba5-de7c-db7c-a348-7572beb23518.png)

下記のように記載し、`リクエストを送信`をクリックします。
![スクリーンショット 2022-05-10 13.28.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/c1fb9170-1836-160a-1246-668cf92ad2fd.png)

- Mail Type
  - Transactional トランザクションメールを送信する場合
  - Marketing  マーケティングメールを送信する場合
- Website URL
  - 対象のウェブサイトの URL
  - http または https から始まるURL形式のみ入力可能
  - ウェブサイトが存在しない場合、ダミーのURL(http:\//test.com等)を入力し、「Use case description」にダミーのURLである旨を記載してください
- Use case description
  - 使用理由を記載します。
  - `送信制限数の上限緩和も申請可能です。`同時に申請したい場合「Use case description」の欄に希望する制限値をご記入ください。
    - 入力例 `送信クォータ ：〇〇通/日`
    - 入力例 `送信レート：〇〇通/秒`
- Additional contacts
  - 連絡先アドレスを入力します。最大 4 つまでカンマ区切りで入力可能

日本語訳
![スクリーンショット 2022-05-10 13.29.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/aeb65caa-8bb3-0c7a-fa01-5e7f3af8b770.png)

### 送信制限緩和
サービス名`Service Quotas`に遷移し、左タブの`AWSサービス`クリックし、SESを検索しクリックします。
![スクリーンショット 2022-05-10 13.54.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/75d1d985-cc5e-c3c9-c3f2-2a8552db062d.png)
`Sending quota`をクリックします。
![スクリーンショット 2022-05-10 13.56.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/84f94c7a-776c-ec90-7354-d34fec3de4ab.png)

`Sending quota`に遷移しますので、`クォータの引き上げをリクエスト`をクリックします。
![スクリーンショット 2022-02-05 15.45.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/51e8ea9c-3c4d-9afc-0a0e-c575ba206ed6.png)


`クォータ値`を入力し、リクエストします。
翌日には、リクエスト完了され、SESの送信上限緩和およびSandbox制限の解除されます。
![スクリーンショット 2022-02-05 15.45.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/22634a1f-52c0-be25-8d77-1a01ecf33888.png)

## ②AWSサポートから申請

以下の記事通り行いましょう。
Sandbox制限と送信制限解除が同時にできます。

https://dev.classmethod.jp/articles/relaxing-send-limit-and-removing-sandbox-restriction-in-ses/#toc-5

Sandbox制限の解除のみの場合、こちらでもできます。

https://docs.aws.amazon.com/ja_jp/ses/latest/dg/request-production-access.html


制限解除できたところで、テストメールを送ってみます。

`Scenario`は`Custom`にして、自分のGmailのメールアドレス等に送ってみましょう。

成功し、メールを受信したことを確認しましょう。
![スクリーンショット 2022-02-05 15.56.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/5ad5c207-1d05-92eb-4b31-78911817b436.png)


# Lambda作成
ロールは、`基本的な Lambda アクセス権限で新しいロールを作成`を選択します。
作成されたポリシーに以下のSESのメール送信権限を付与しましょう。

```json
{
    "Effect": "Allow",
    "Action": [
         "ses:SendEmail",
         "ses:SendRawEmail"
     ],
     "Resource": "*"
}
```

```py:Lambda
import json
import os
import boto3

SENDER = os.environ["SENDER"]
REGION = os.environ["REGION"]
mail_1 = os.environ["mail_1"]
mail_2 = os.environ["mail_2"]

TITLE = "テストです。"
                
BODY = "テスト本文になります\n"\
    + "このようにすると、改行できます\n"\


def send_email(sender, to, subject, body):
    client = boto3.client('ses', region_name=REGION)

    response = client.send_email(
        Source=sender,
        Destination={
            'ToAddresses': [
                to,
            ]
        },
        Message={
            'Subject': {
                'Data': subject,
            },
            'Body': {
                'Text': {
                    'Data': body,
                },
            }
        }
    )
    return response

def lambda_handler(event, context):
    
    maliList = [mail_1, mail_2]
    
    # TO対象者別々にメール送信する
    for i in range(len(maliList)):
        send_email_to = send_email(SENDER, maliList[i], TITLE, BODY)
        print(maliList[i])
                
    print("Send ResponseMetadata:" + json.dumps(send_email_to, ensure_ascii=False))
    
    return {'send_email': 'success'}
```
2つのメールに送る場合、各メールアドレスをTOにして送信するように組みました。
受信者が他に誰に送ったか分かると、プライバシー上良くないためです。

CCやBCCを贈りたい場合、`To`の下に以下のように挿入します。

```py:Lambda

    Destination={
        'ToAddresses': [
            'string',
        ],
        'CcAddresses': [
            'string',
        ],
        'BccAddresses': [
            'string',
        ]
    },

```
詳しくはboto3のドキュメントを参考にしてください。

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ses.html

実行すると、メールが送れていると分かります。

# 参考

https://qiita.com/OMOIKANESAN/items/1b8941258fb7ebbdb057