SES のログを S3 に出力してバウンスメールを確認してみる

Note
この記事では紹介してませんが、アップデートで追加された Virtual Deliverability Manager もオススメです。
https://blog.serverworks.co.jp/how-to-investigate-the-sender-and-recipient-of-bounced-emails-in-amazon-ses

# はじめに

一般的にメールサーバーを運用するのは大変です。世の中にはスパムメールを送る業者が存在しており、メール機能を提供するプロバイダー側で独自のフィルターを構築し、利用者がスパムメールを受信しないように運営されている場合もあります。

Amazon SES (Simple Email Service) を利用してメールを送る際も同様に、一般的なメールの運用が必要になります。一般的なメール関連の用語に次のものがあります。



- **バウンス (Bounce)**
  - 送信したメールが、何らかのエラーによって送信者に差し戻されること。バウンスメールには「ハード」と「ソフト」の2種類がある。
  - ハードバウンス (Hard Bounce)
        - 永続的なエラーによるバウンス。そのメールアドレスには基本的に届けることができない。メールアドレスが存在しない、受信拒否されている、など
    - ソフトバウンス (Soft Bounce)
        -  一時的なエラーによるバウンス。時間をおいて再送信すれば届くことが多い。メールボックスがいっぱい、サーバのダウン、など

- **苦情 (Complaint)**
    - メールの受信者が、メーラー上で「迷惑メール報告」や「迷惑メールフラグ」をつけること。



SES の Document には、バウンス率を5%以下に抑えることや、苦情率を 0.1 % 以下に抑えることがベストプラクティスとして記載されています。
https://docs.aws.amazon.com/ja_jp/ses/latest/dg/success-metrics.html

バウンスや苦情を抑えるために、現状のレートやログを確認することは重要です。確認することで、改善策の検討材料にできます。

ということで、今回は SES のバウンス・苦情レートの確認方法や、SES のログの確認方法をご紹介します。



# SES でバウンス率・苦情率を確認

AWS マネージメントコンソールで Reputation metrics を開くことで、最近のバウンス率・苦情率を確認できます。Warning 以下に抑えるように運用をしていくのがベストプラクティスと書かれています。

![image-20211225150147993.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/0888facb-bf32-b384-950b-f96fd1611d55.png)



# Kinesis Firehose を作成

上記の機能でバウンス率・苦情率はわかりますが、具体的に失敗した宛先や理由は確認ができません。詳細を確認するために、SES のアクセスログを Kinesis Firehose を経由して S3 に出力できます。



それでは、Kinesis Firehose を作成していきます。

Create

![image-20210918192000731.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/e68beae2-d7ce-378f-b5f0-2f6aebe04698.png)



S3 へ保存するパラメータを指定

![image-20210918192205803.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/8788fe93-862e-7819-bfa8-6e250e9673b3.png)



出力先の S3 Bucket を指定

![image-20210918192231599.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/95bc13b3-3e01-d4b4-9554-77385687be80.png)



Create

![image-20210918192238471.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/15ed161d-bc76-77bf-9d9c-942624117447.png)



Kinesis Firehose が作成されます。

![image-20210918192336303.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/41c6a658-c0f9-95b4-260f-578de70f410f.png)





# Configuration Sets を設定

次に、SES 側でログを出力するため Configuration Sets が必要です。Configuration sets のページを開き、Create set を選択します。

![image-20211225151536518.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/88da9346-0a97-f98a-ad79-bb3ca78658e6.png)



好きな名前を入れいます。それ以外はデフォルトのままです。

![image-20211225151701671.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/85d70199-3808-65dc-1a3e-b0f2d230e120.png)



Create Set を押します。

![image-20211225151726710.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/83ecbae4-b37c-e153-c407-8e9c853d97d1.png)



作成されたので、Event destinations を選択します。

![image-20211225151804104.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/c34ceedb-a6ed-7fc2-d41b-e54345850646.png)



Add destination を押します

![image-20211225151854391.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/cc9e5b9d-364b-6088-7164-6b885fbd1b05.png)



今回はすべてのログを取得対象にしてみます。実際には、必要なログに絞るとコストを最適化できます。

![image-20211225152045101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/8aeba71d-7c82-2dba-707a-8c0717e5abbf.png)



次のパラメータを入れて Next を押します。

- Destination の名前
- Kinesis Firehose の指定
- 利用する IAM Role

![image-20211225152358244.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/8d9c5225-6554-4364-8b20-e6e1f815e155.png)



Add destination を押します。

![image-20211225152448331.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/7a6ffcd6-5708-89df-71ff-07caec584ee1.png)



追加されました

![image-20211225152522547.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/e84a0255-2a5e-aff2-1559-8c3049d92dac.png)



# バウンス用のテスト用アドレスに送付

AWS には、いくつかのテスト用メールアドレスが準備されています。その中の一つに、バウンス用のメールアドレスがこちらです。

```
bounce@simulator.amazonses.com
```



上記のメールアドレス宛に、テストメールを送付します。

![image-20211225152919211.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/bc57330b-b6c8-b386-b3f4-f1b4daf8963f.png)



![image-20211225153058388.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/5bdb56a5-8219-001b-33ab-8b919ac981a1.png)



送信されました。

![image-20211225153136283.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/04fda9bd-1ef4-7861-b4b3-a61d436780fc.png)



Firehose によって、S3 上にログが格納されている

![image-20210918195630820.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/f6e80c39-dc43-fed7-39ae-efa89cb62641.png)



このログの中身は次のような内容になっている。eventType が Bounce になっており、これでログのタイプを識別可能

JSON で整形

```
{
	"eventType": "Bounce",
	"bounce": {
		"feedbackId": "0106017df049212c-fbd27120-8194-4d83-8c67-d514aae44c81-000000",
		"bounceType": "Permanent",
		"bounceSubType": "General",
		"bouncedRecipients": [
			{
				"emailAddress": "bounce@simulator.amazonses.com",
				"action": "failed",
				"status": "5.1.1",
				"diagnosticCode": "smtp; 550 5.1.1 user unknown"
			}
		],
		"timestamp": "2021-12-25T06:31:04.378Z",
		"reportingMTA": "dns; e234-6.smtp-out.ap-northeast-1.amazonses.com"
	},
	"mail": {
		"timestamp": "2021-12-25T06:31:03.076Z",
		"source": "iamsender@sugiaws.tokyo",
		"sourceArn": "arn:aws:ses:ap-northeast-1:xxxxxxxxxxxx:identity/sugiaws.tokyo",
		"sendingAccountId": "xxxxxxxxxxxx",
		"messageId": "0106017df0491ca4-134afe35-9bc6-4035-aae7-632194ccaadc-000000",
		"destination": [
			"bounce@simulator.amazonses.com"
		],
		"headersTruncated": false,
		"headers": [
			{
				"name": "Return-Path",
				"value": "xxxxxxxxxxxx"
			},
			{
				"name": "From",
				"value": "iamsender@sugiaws.tokyo"
			},
			{
				"name": "To",
				"value": "bounce@simulator.amazonses.com"
			},
			{
				"name": "Subject",
				"value": "test"
			},
			{
				"name": "MIME-Version",
				"value": "1.0"
			},
			{
				"name": "Content-Type",
				"value": "multipart/alternative;  boundary=\"----=_Part_211408_1918512267.1640413863078\""
			}
		],
		"commonHeaders": {
			"returnPath": "xxxxxxxxxxxx",
			"from": [
				"iamsender@sugiaws.tokyo"
			],
			"to": [
				"bounce@simulator.amazonses.com"
			],
			"messageId": "0106017df0491ca4-134afe35-9bc6-4035-aae7-632194ccaadc-000000",
			"subject": "test"
		},
		"tags": {
			"ses:operation": [
				"SendEmail"
			],
			"ses:configuration-set": [
				"ses-bounce-log"
			],
			"ses:source-ip": [
				"xxxxxxxxxxxx"
			],
			"ses:from-domain": [
				"sugiaws.tokyo"
			],
			"ses:caller-identity": [
				"Admin"
			]
		}
	}
}
```



# まとめ

SES に Kinesis Firehose と S3 を組み合わせることで、アクセスログを出力できることがわかりました。今回の記事では出力するまででしたが、実際の運用では検索したくなると思います。その時には Athena を使って検索が可能です。Athena S3 みたいなキーワードで検索すると設定方法が出てくるので、ぜひ Athena も試してみると良いと思います。



# 参考URL

E メールを介したAmazon SES に関する通知の受信
https://docs.aws.amazon.com/ja_jp/ses/latest/dg/monitor-sending-activity-using-notifications-email.html