Amazon SES で独自ドメインのメール受信設定

#Amazon SES で独自ドメインのメールを受信する
試験環境で色々作っていくにあたり、独自ドメインを入手して、独自ドメインのメールアドレス当てのメールを受信したいというケースがあると思います（私は結構ありますが皆さんどうなんですかね？(´・ω・｀)）
そんなときに使い捨てのメール環境があれば便利だと思います。ということで今回はAmazon SESで独自ドメインのメールを受信できる環境を構築していきたいと思います。

##やりたいこと
Freenomなどで取得した無料独自ドメインのメールアドレス向けのメールを受信できるようにしたい。
例えば、"admin@xxxxx.com" というメールアドレスへメールを、Amazon SESを使って受信したいというケースを想定しています

##前提条件
1. 独自ドメインは取得済み
2. DNSはRoute53を利用する
3. メールソフトは利用せず、メールデータファイルの拡張子を変更してブラウザーでメール内容が表示できればOKとする
4. リージョンはus-east1(バージニア北部)とする<br>※東京リージョンだとメール受信に対応していないので

## 構築手順
1. 独自ドメインを取得する
2. SES/Route53でドメインの認証設定
3. S3バケット（メール受信ボックス的なもの）の作成
4. SES で受信先設定

##実際にやってみた
1.についてはFreenomなどで取得して頂いているものとして、手順は割愛します。
Qiitaで”Freenom”と検索して頂ければ取得方法は丁寧な解説記事がたくさん出てくると思います。

では手順2.から行っていきます。
取得したドメインをRoute53に登録して、SESで利用できるようにドメイン認証を行います。

Route53のコンソール画面から取得した独自ドメインのホストゾーンを作成します。
「ホストゾーン」の作成をクリック
![スライド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/995f816a-2f96-157e-5046-340b416347e3.png)
「ドメイン名」のところに取得した独自ドメインを入力し、「タイプ」はパブリックホストゾーンを選択します。
![スライド2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/4ceab59a-b739-6437-cb59-f57d0561bed6.jpeg)
ホストゾーンが作成されると、NSコードとSOAコードが作成されます。NSレコードはDNSサーバの登録に必要になりますのでメモしておいてください。
![スライド3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/5eee322d-7f69-55e9-095b-b98d3ffbafb4.jpeg)
次にDNSを取得したドメインプロバイダーのDNS設定を行います。今回はFreenomで取得した想定で手順を記載します。
取得ドメインの設定画面から「nameservers」を選択します。
![スライド4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/ab3dc0c9-8921-5f5e-8563-249130a811a0.jpeg)
DNSサーバをドメインプロバイダーのものからRoute53に変更するために、Route53のNSコードを登録していきます。「Use custom namaservers(enter below)」を選択し、各サーバ名を入力します。
![スライド5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/81fa8a29-18b7-f0d8-2db5-345ee9d704aa.jpeg)

続いて、SESの設定を行い、ドメインの認証をしていきます。リージョンをus-east1(バージニア)を指定して、AWSコンソール画面からSESへアクセスします。次に左側の「Domains」をクリックしてください。
![スライド6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/724c8317-37eb-24ef-8fb9-9437e96fe6d3.jpeg)
「Verify a New Domain」という画面が表示されますので、ドメイン名を入力していきます。
「Generate DKIM Settings」はチェックを入れなくても問題ないです。
![スライド7.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/cec0d3f8-d119-205d-ebfa-4b4ad74485b8.jpeg)
Route53で独自ドメインのホストゾーンの登録が上手くいっていると「Use Route53」が選択できますので、クリックしてください。Route53を利用しない場合は、DNSサーバに、この画面で表示されているTXTレコードとMXレコードを登録してもらえればOKです。
![スライド8.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/9ac3fdac-12bb-16b1-71da-20eb653cb82b.jpeg)
確認画面が表示されますので、「Create Record Sets」をクリックしてください。自動的にRoute53にレコードが追記されます。
![スライド9.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/2d0e5e46-0c38-ae85-4cef-246813853ace.jpeg)
レコード登録後のRoute53は以下のような内容になります。
![Qiita_SES.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/4c79e61e-aff6-d89c-a6e7-76c2bbd32430.png)

正常に登録が完了して、10分程度するとDomainの認証が完了し、各Statusが「Verified」になります。
![スライド11.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/abd58bdf-3134-1254-2396-a154c259d0f1.jpeg)
次にメール受信Box的なものとしてS3バケットを利用するため、S3バケットを作成していきます。S3バケットの作成手順は各所丁寧な記事がありますので割愛します。とりあえず、作成したバケットに以下のバケットポリシーを適用して、SESがS3バケットにアクセスできるようになればOKです。
![スライド12.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/41a198be-01f2-f6cb-00f8-0a37372b273f.jpeg)

    {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowSESPuts",
            "Effect": "Allow",
            "Principal": {
                "Service": "ses.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::BUCKET-NAME/*",
            "Condition": {
                "StringEquals": {
                    "aws:Referer": "AWSACCOUNTID"
                }
            }
        }
    ]
    }


「BUCKET-NAME/*」と「AWSACCOUNTID」のところはご自身の環境の値に合わせてください。
次にSESでメール受信設定を行っていきます。左側の「Rule Sets」を選択し、「View Active Rule Set」をクリックします。
![スライド13.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/c78dc03d-1eb6-8edc-d0ca-4f07d8f0d838.jpeg)
![スライド14.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/1bcd1d37-0e58-d376-36f6-9c2b68fe45db.jpeg)
「Recipient」に受信するメールアドレスをFQDN形式で記載します。
　例）admin@xxxx.com 
![スライド15.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/f613ff67-1edf-43a3-6396-8cf1f97b53bc.jpeg)
ドメイン認証が完了しているドメインの場合は右側のStatusが「Verified」になります。
![スライド16.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/8ca65efd-a764-08d1-0add-0cd08d1a2df6.jpeg)
「Add Action」で「S3」を選択します。
![スライド17.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/234e3293-2d27-4167-ca1f-01e067f42a98.jpeg)
「Object key prefix」にメールデータを格納したいフォルダを指定します。今回は存在しないフォルダを指定したため、新規にフォルダが作成されます。
![スライド18.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/78d1e86f-e1cd-ad8d-5a9b-adb514e495ae.jpeg)
「Rule Name」を設定します。その他の項目はデフォルトのままでOKです。
![スライド19.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/b922b96a-3399-bb3d-e3b1-ec0f3285a207.jpeg)
設定が完了すると以下のように画面のように表示されます。
![スライド20.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/349766ac-dcdc-b922-5902-2cacd2e52a50.jpeg)
S3側を見てみると、「Object key prefix」で指定した名前のフォルダが作成されていることが分かります
![スライド21.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/b0fae18b-379e-94b3-85c3-2bbf0a3bc6e9.jpeg)
<br>
<br>
これで準備は整いましたので、「Recipient」に登録したメールアドレスにテストメールを送信してみましょう。
メール送信後にS3バケット内に実メールデータが格納されています。
![スライド22.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/611c2211-69aa-768b-fdf2-9d93cb6ac883.jpeg)

S3のコンソール画面で実メールデータをDLしてみると、拡張子がメール形式でないため、開けないと思います。そこで、DLしたファイルの拡張子を「.mht」にして開いてみましょう。
![スライド23.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/17aaf1b2-bd28-00d9-c362-19338608b991.jpeg)
ブラウザー形式ですがメール内容が確認できました！
<br>
メール内容の確認ができましたので、これで完了です！
##さいごに
メール受信をトリガーにLamdbaと組み合わせて、色々遊べそうです。サーバ動作の試験環境は簡単ですが、メールを受けれる環境まで作るのは結構手間なので、便利ですね。Lamdbaコードもそろそろ勉強しないと...
コード書ける人羨ましいです。
## 参考にしたWebページ
[Amazon SES+Lambdaでメール受信をトリガーにしてあれこれする(前編)](https://qiita.com/keys/items/b1623766d362b8bf430b)
[SESでメールの受信設定](https://www.ginzaitlab.com/posts/7768414/)