Amazon SES Virtual Deliverability Managerを使ってメールの配信状況を分析してみる

この記事は、[エンジニアが知っておくべき メール送信・運用ノウハウ、メールの認証技術やセキュリティについて投稿しよう！](https://qiita.com/advent-calendar/2024/blastengine)の14日目の記事です。
[こちら](https://zenn.dev/finatext/articles/9d1ad1f9c0f9f8)に同内容の記事がございます。

# はじめに
Finatextでサーバーサイド・AWSエンジニアをしている [@takuma5884rbb](https://x.com/takuma5884rbb)です。

2022年11月にGAとなった[^ses-vdm]Amazon Simple Email Service（以降、Amazon SES） Virtual Deliverability Manager（以降、VDM）。メール送信にかかるドメイン認証の設定検証や、メール配信状況のモニタリングなどをしてくれる便利なサービスですが、あまり活用事例を見かけないので記事にしてみました。

# 閑話休題：背景

FinatextではいくつかのtoC金融サービスを展開しており、その運用フェーズではメール配信を用いたマーケット施策も行っています。自分の所属するチームでも担当しているプロダクトがあるわけなのですが、サービスディレクターたちと会話をする中で、メールの開封率といった効果測定を定期的に行いたいニーズがあることがわかり、Amazon SESの機能を調査していました。

# Virtual Deliverability Managerとは？

記事の趣旨とはズレるので、[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/ses/latest/dg/vdm.html)に任せて軽く触れるのみにします。

VDMの主な機能は以下です。

* メール送信に用いるドメインの設定を監視し、改善が必要ならアクションを提示する
* Amazon SESを用いて送信しているメールのレピュテーションを評価し、その情報を可視化する

これらの機能の重要性としては、以下が挙げられています。

> E メール戦略を成功させるには、配信性能、つまり E メールが迷惑メールフォルダやジャンクメールフォルダではなく受信者の受信トレイに確実に届くようにすることが重要な要素となります。
> 
>（中略）
> 
> E メールのコンバージョン (受信者が E メールを開封した後にアクションを起こすこと) に関しては、受信トレイへの配信性能が重要な要素となります。顧客は、メッセージを受け取らなければ、エンゲージメントどころかそのメッセージを見ることすらできません。
>
> 送信の評価は、カスタマーエクスペリエンスレベルでの受信トレイへの配信性能に最も大きな影響を及ぼします。これにより、不要なメッセージが受信者に届くか、必要なメッセージが受信者のメールボックスに届く前に、迷惑メールフォルダに振り分けられたり、ブロックされたりするかどうかが決まります。

マネジメントコンソールからはAmazon SESの画面から Virtual Deliverability Manager > Settings と遷移し、有効化できます
![](https://storage.googleapis.com/zenn-user-upload/87b9fcb5dbde-20241211.png)

有効化の設定はリージョンごとで、[料金](https://aws.amazon.com/jp/ses/pricing/)は以下です。

> Virtual Deliverability Manager は、メール送信料などの他の SES 料金とは別に、メール送信 1,000 通ごとに 0.07 USD かかります。AWS コンソール、CLI、または API を使用して Virtual Deliverability Manager の情報にアクセスすると、1,000 クエリごとに0.0005 USD かかります。毎月最初の 5,000 クエリは無料です。


# ダッシュボードの見方

VDMのダッシュボードでは、以下のようにメールの

* 配信数
* 開封率
* クリック率

をメトリクスで見ることができます。

![](https://storage.googleapis.com/zenn-user-upload/299022bf37f0-20241204.png)

以前だと開封率・クリック率はConfiguration Setを作ってCloudWatch Metricsで集計をする必要があったので、機能の有効化のみでパッと見れるようになったのは嬉しい変化ですね！

:::message
引き続きHTMLメールでないと計測ができなかったり、メールクライアントによってはメール開封時ではなく、メール受信時に開封判定になってしまう場合があったりする点には注意が必要です。
:::

# AWS APIを用いたメトリクスデータ取得方法

VDMで確認できるデータは過去60日間（≠2ヶ月）分となっており、それより過去のデータを参照したい場合は、自前で保管しておく必要があります。

メール送信にかかる集計データは、[BatchGetMetricDataQuery](https://docs.aws.amazon.com/ja_jp/ses/latest/APIReference-V2/API_BatchGetMetricDataQuery.html)APIを利用することで取得できます。

以下は、2024/04/13~2024/04/20の期間で、日次のメール送信件数を取得するコマンド例です。

```shell
aws sesv2 batch-get-metric-data --cli-input-json file://query.json | jq . > resp.json
```

```json: query.json
{
 "Queries": [
   {
     "Id": "Retrieve-Account-Sends",
     "Namespace": "VDM",
     "Metric": "SEND",
     "StartDate": "2024-04-13T00:00:00",
     "EndDate": "2024-04-20T00:00:00"
    }
 ]
}
```

```json: resp.json
{
  "Results": [
    {
      "Id": "Retrieve-Account-Sends",
      "Timestamps": [
        "2024-04-14T09:00:00+09:00",
        "2024-04-15T09:00:00+09:00",
        "2024-04-16T09:00:00+09:00",
        "2024-04-17T09:00:00+09:00",
        "2024-04-18T09:00:00+09:00",
        "2024-04-19T09:00:00+09:00"
      ],
      "Values": [
        1,
        7,
        17,
        8,
        6,
        9
      ]
    }
  ],
  "Errors": []
}
```

# メール内容の詳細分析

さて、メールマーケティングをしている方などは、ここからさらにA/Bテストや、施策ごとの効果測定をしたくなってきたのではないかと思います。VDMではAmazon SESから送信したメール1件ずつについて、配信状況や開封状況などを記録しており、それらの情報も活用することができます。

マネジメントコンソールからは以下のように確認できます。

![](https://storage.googleapis.com/zenn-user-upload/d57c8ede2df7-20241211.png)

件名・受信アドレス・開封状況などでの検索もできるのですが、コンソール上だと検索結果の表示条件が100件になっているので、それ以上の件数を取得したい場合はAWS APIを利用します。

:::message
APIであっても、[最大取得件数は10000件](https://docs.aws.amazon.com/ja_jp/ses/latest/APIReference-V2/API_MessageInsightsDataSource.html#SES-Type-MessageInsightsDataSource-MaxResults)である点には注意が必要です
:::

APIだと

1. データエクスポートのジョブを発行
2. データをS3に配置
3. S3から取得

という手順を踏む形になります。

以下はCLIを用いてメール配信状況データ取得を行うスクリプト例です。

```shell: command.sh
# ジョブを発行
aws sesv2 create-export-job --cli-input-json file://metric-export-input.json | jq . > export-job.json

# 実行を待つ
sleep 5

# ジョブの結果を取得
aws sesv2 get-export-job --cli-input-json file://export-job.json | jq -r '.ExportDestination.S3Url' > s3_url.txt

# 結果ファイルをダウンロード
wget -i s3_url.txt
```
（※sleepの部分は、もうちょっと真面目にやればちゃんとしたwaiterを実装できると思います🙏）

11月のメールについて、件名での検索をする例
```json: metric-export-input.json
{
    "ExportDataSource": {
        "MessageInsightsDataSource": {
            "Include": {
                "Subject": [
                    "*{件名}*" // 完全一致だとヒットしないケースがあるので、like検索を用いると安定するようです
                ]
            },
            "StartDate": "2024-11-01T00:00:00+09:00",
            "EndDate": "2024-11-30T00:00:00+09:00",
            "MaxResults": 10000
        }
    },
    "ExportDestination": {
        "DataFormat": "CSV"
    }
}
```

基本的には施策ごとにメールの件名は別物であると思うので、件名ごとに検索することでメールの開封率・クリック率を調べることができ、効果測定の一部としてデータを活用することができますね！

他にも送信アドレスでの絞り込みなども可能なので、施策ごとにアドレスのユーザー名を変えたり、ドメイン（サービス）単位での効果測定・分析も可能です！

# まとめ

Virtual Deliverability Managerを利用することで、簡単なオプトイン設定のみでメールの配信状況・開封率を取得・分析できることがわかりました🙌

これらのデータを最近流行りのDuckDBに突っ込んで、画面上で色々分析するのも捗りそうです🥳

# 参考文献

> * Amazon SES Virtual Deliverability Manager 公式ドキュメント https://docs.aws.amazon.com/ja_jp/ses/latest/dg/vdm.html
> * BatchGetMetricDataQuery APIリファレンス　https://docs.aws.amazon.com/ja_jp/ses/latest/APIReference-V2/API_BatchGetMetricDataQuery.html
> * CreateExportJob APIリファレンス https://docs.aws.amazon.com/ja_jp/ses/latest/APIReference-V2/API_CreateExportJob.html

[^ses-vdm]:https://aws.amazon.com/jp/about-aws/whats-new/2022/11/amazon-simple-email-service-virtual-deliverability-manager-delivery-rate/