AWS SESの利用方法

# はじめに
[AWS SES](https://aws.amazon.com/jp/ses/)を利用するにあたって、初期設定の方法をまとめたので共有する。

# AWS SESとは
メール送信や受信ができるAWSのサービス。メールの送信は[AWS SNS](https://aws.amazon.com/jp/sns/)でも可能だが、SESには、送信者の設定、複数の宛先設定、メール本文のカスタマイズなど豊富な機能がある。


# 方法
## 事前設定

### 設定IDの作成

AWS SESの左上のメニューから、ID - 「IDの作成」をクリックする。

![67ce410a9aac45005ff04763.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/6a3a52c7-665a-4550-a5c1-17cf51059289.png)

IDのタイプは、「ドメイン」と「Eメールアドレス」があり以下の違いがある。

* ドメイン
    * ドメインの前は自由にアドレスを設定できる。（例：**hoge**@example.com）
    * 設定項目が多い
        * DNS設定が必要
            * Route53で、ホストゾーンを利用している場合は、簡単に設定可能
    * 本番環境への移行が可能
* Eメールアドレス
    * 簡単に利用可能
    * 送信者が、このアドレスとなる
    * 制約
        * 本番環境への移行ができない
            * ドメイン認証さえと通れば、EメールアドレスIDでも、任意の送信先へ送付できる

以下に、ドメイン、Eメールアドレスでの初期設定方法をそれぞれ示す。

#### ドメイン

カスタムドメインを利用する。
Route53で設定済みのドメインを利用している場合は、設定が自動で行われるので便利。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/a05de1c7-0c68-481c-ab8c-2405a32da833.png)

![67ec7f589aac45005ff04866.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/ec415327-6933-4608-81fd-c661120ef4d5.png)

以下のように設定する
* IDタイプ
    * ドメイン
* ドメイン
    * 任意のドメイン（事前にドメインをお名前ドットコムなどで取得しておく）
        * [こちらの記事](https://qiita.com/kono-hiroki/items/154e3ff96f7f63dc62cf)を参照
    * カスタムMAIL FROMドメインの使用
        * ✓をいれる
* IDの検証
    * MAIL FROMドメイン
        * mail
            * mail.以降のドメインは、上記に入力したドメインが自動ではいる
* ドメインの検証
    * DKIMの詳細設定
        * IDタイプ：Easy DKIM
        * DKIM署名キーの長さ：　RSA_2048_BIT
    * DNSレコードのRoute53への発行
        * 有効化：　Route53へ自動登録される
    * DKIM署名
        * 有効化

「IDの作成」ボタン押して作成する。数分後、IDステータスが「検証済み」となれば成功。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/7d72fa4a-ad02-4f83-b1a2-11fd525b48ed.png)

なお、Route53へのレコードは自動で作成される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/b478a4cd-7ea6-40e8-bd46-0c4932572f02.png)

#### Eメールアドレスの場合

* 注意事項
    * Eメールアドレスでは、最初は登録済み送信アドレスにしか送信できない
        * **本番環境へは移行できないので注意**
            * ただし、ドメイン認証で本番アクセスを有効にすればEメールIDでも送信可能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/131cb613-9dc7-4f7a-9f03-aaecb5c5752f.png)


以下の項目を入力する。
* IDの詳細
    * IDタイプ
        * Eメールアドレス
    * Eメールアドレス
        * 送信元のEメールアドレス

「IDの作成」ボタンを押すと、設定したメールアドレスに、AWSからメールが来るので、承認処理を行う。

承認処理が完了すると、以下の画面が表示される。

![67ce42fd9aac45005ff04766.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/8af03475-80b5-40f1-8c02-f805dcacc4d0.png)

## 本番環境への移行

SESサービス開始後は、サンドボックスモードとなっている。サンドボックスモードは、テスト用の利用が制限されているモードで、任意のアドレスへ送信できないなどの制約がある。詳細は、[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/ses/latest/dg/request-production-access.html)を参照。

SES - 「アカウントダッシュボード」から、本番アクセスへのリクエストを行う。
* AWS SESのコンソールからの本番アクセス設定には、ドメイン検証済みのIDが必要となるので注意

![67ce6bdd9aac45005ff04770.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/c5fa2abe-aea1-4886-8ea8-8bb710552561.png)

本番アクセスをリクエスト」をクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/da5891ec-636a-4acc-af35-5849613dd487.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/1d93a585-fce7-4ca7-a8a6-9a7c8549ee36.png)


上記画面で、以下の項目を設定する。
* メールタイプ
    * マーケティング
    * トランザクション
* ウェブサイトURL
    * 下記記事ではRoute 53のドメインでも承認されたらしい
        * 参考
            * https://dev.classmethod.jp/articles/amazon-ses-production-access-request/
    * 今回は、CloudFrontで配信しているWebアプリのURLを設定した
* 連絡する際の希望言語
    * Japanese


リクエストが送信されると、以下のような画面となり、承認待ちとなる。

![67ce9ae19aac45005ff04786.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/6c42522c-1edd-42fd-8557-807fb7d2e5cf.png)

数分後に承認される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/8e83aaa4-0974-4001-922b-b9ca39bf76cd.png)


## 送信テスト
### AWSコンソールの場合

左側のメニューから、「設定」-「ID」から送信元のIDを選択して、「テストEメールの送信」ボタンを押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/e32d0866-98a9-4fc7-b842-138760ef549e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/605c3fb5-ff91-477a-a032-1ef6e488b0a4.png)

上記画面で、以下の項目を設定して、「テストEメールの送信」ボタンを押す。

* From-address
    * 送信元アドレス
        * IDのタイプによって設定内容が異なる
            * ドメインの場合
                * ドメインの前、つまり```@```より前を任意に設定する
                    * ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/039fe15b-ef73-4558-8414-6b71de624b6c.png)

            * Eメールの場合
                * 登録したEメールアドレスとなり変更できない
* シナリオ
    * 「カスタム」を選択：送信先アドレスを指定可能になる
* カスタム受信者
    * 送信先アドレスを入力
        * ※ただし、サンドボックスモードの場合は、認証済みの送信元アドレスしか送信できない
* 件名
    * 任意の件名を入力
* 本文
    * 任意の本文を入力

## APIからメール送信

* TEXTまたはHTML形式で記述可能
    * Teamsなどに転送する場合は、HTMLを推奨
        * テキストだとリンクなどが正しく表示されない

### Lambda（Python）

PythonのLambda関数の例を示す。


```python:lambda_function.py
import boto3
from botocore.exceptions import ClientError
from datetime import datetime
import json

def lambda_handler(event, context):
    # IDを設定する（Eメール、またはドメインの場合は、@より前は任意に設定する
    sender = '<sender_id>' 
    ses = boto3.client('ses')

    email_address_list = [] # 送信先アドレスを設定する
    email_address_list.append('hoge@example.com')
    email_address_list.append('fuga@example.com')
    try:
        charset = "UTF-8"
        response = ses.send_email(
            Source=f'{sender}',
            Destination={
                'ToAddresses': email_address_list
            },
            Message={
                'Subject': {
                    'Charset': charset,
                    'Data': subject
                },
                'Body': {
                    'Html': {
                        'Charset': charset,
                        'Data': html_body,
                    }
                    # テキスト形式の場合は以下
                    #'Text': {
                    #    'Charset': charset,
                    #    'Data': text_body
                    #}
                }                
            }
        )

    except ClientError as e:
        print(e.response['Error']['Message'])
        return {
            'statusCode': 500,
            'body': 'Error sending email via SES'
        }
```
* sender
    * メールIDもしくは、ドメイン
        * ドメインの場合は、任意の送信アドレス@ドメイン名 となる


# トラブルシューティング
## テストメールを送信できない

```
無効なコンテンツが含まれているため、メッセージを送信できません。
Email address is not verified. The following identities failed the check in region AP-NORTHEAST-1: 885775f3.groups.jp.ricoh.com@apac.teams.ms
```

サンドボックスモードが解除されているかを確認する。SESは、開始後はサンドボックスモードとなっており、登録済みのメールにしか送信できない。

## Teamsチャットに転送するとURLがリンクにならない

テキストメールで送ると、TeamsチャットではURLがリンクにならない。HTML形式で送る必要がある。

# 参考

https://dev.classmethod.jp/articles/ses-guided-onboarding/

https://zenn.dev/carenet/articles/6c2ffbc773276b

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

https://qiita.com/ryo_one/items/c0135e43ca809e9f64f2

https://qiita.com/kono-hiroki/items/154e3ff96f7f63dc62cf

https://qiita.com/hengineer/items/1f32f66a18db19b9129f