Amazon SESで検証用Eメールを送信して、受信メールをS3バケットに格納する方法
2024-08-08
azblob://2024/08/08/eyecatch/2024-08-08-aws-ses-verify-email-store-in-s3-000.png

こんにちは、株式会社FIXERの村上です。本ブログは個人ブログにもポストしています。

AWSが提供するEメール送受信サービス『Amazon SES』を使用してEメールを送信する手順を書いてみました。
※本ブログでは、2024年7月16日時点 での仕様やマネコンUIに基づき執筆しております。

本ブログで紹介する構成図はこちらになります。東京リージョンで構成していきます。

前提条件

  • 送信元アドレスのドメインを所有していること
  • Route 53などのDNSサービスを使用し、ホストゾーンにDNSレコードを登録できること

1. 送信機能を作ってみる

(1)Amazon SES IDの「ドメイン」を作成する

Amazon SESの「ID」とは、ドメイン(サブドメイン含む)とメールアドレスの総称になります。
ドメインは作成する必要がありますが、メールアドレスの作成は任意です。メールアドレスについては、Cognitoなどの他サービスと連携する場合や、特定の送信元アドレスに限定する場合に限り作成します。

Amazon SESコンソールから「ID」を選択し、「IDの作成」を押下します。

IDタイプで「ドメイン」を選択し、認証させたいドメイン名やDKIMの設定を入力して作成します。

(2)ドメイン認証とDKIM設定を実施する

ドメイン作成後、「ドメイン認証」が行われます。数分ほどでDNSの反映が行われるため、ブラウザを更新するなどして、検証の成功可否を確認します。

送信元の改ざん防止対策を証明するDKIM設定も同様に成功可否を確認します。失敗した場合、DNSゾーンに登録されたCNAMEレコードの設定値を確認しましょう。

(3)DMARC設定を実施する

最後に送信元のなりすまし防止や信頼性を向上させるため、DMARC設定を行います。

下記のTXTレコードを登録します。

レコードタイプ名前TTL
TXT_dmarc.<認証されたドメイン名>3600"v=DMARC1; p=none;"

送信機能の実装は以上になります。


2. 受信機能を作ってみる
 

(1)Eメール受信用のS3バケットを作成する

Amazon SESを作成した同じリージョンでS3バケットを作成します。

Amazon S3コンソールから「バケットの作成」を押下します。本ブログでは、「mailtechblog-archive」と名付けました。

(2)Amazon SESの書き込み操作を許可するS3ポリシーを構成する

Amazon SESのアーカイブ処理を許可するS3ポリシーを設定します。

本ブログでは下記の値を設定しました。

設定項目
S3バケット名mailtechblog-archive
リージョンIDap-northeast-1
受信ルールセット名OperationReceiptRuleSet
受信ルール名SaveToS3Rule
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowSESPuts",
            "Effect": "Allow",
            "Principal": {
                "Service": "ses.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::<S3バケット名>/*",
            "Condition": {
                "StringEquals": {
                    "AWS:SourceArn": "arn:aws:ses:<リージョンID>:<AWSアカウントID>:receipt-rule-set/<受信ルールセット名>:receipt-rule/<受信ルール名>",
                    "AWS:SourceAccount": "<AWSアカウントID>"
                }
            }
        }
    ]
}

(3)Amazon SESの受信設定を構成する

Amazon SESを受信サーバにする場合、MXレコードの登録が必要です。

DNSプロバイダーの管理コンソールにサインインします。本ブログでは、Route53を使用しています。

下記のTXTレコードを登録します。

レコードタイプ名前TTL
MX<認証されたドメイン名>30010 inbound-smtp.<リージョンID>.amazonaws.com

(4)Amazon SESの受信ルールを構成する

Amazon SESがEメールを受信したときにどのような処理を行うのかフローを定義していきます。

Amazon SESコンソールから「Eメール受信」を選択し、「ルールセットの作成」を押下します。受信ルールセット名を入力して作成します。
 

次に受信ルール名を入力します。Amazon SESの標準テストメールは暗号化されていない通信になるため、暗号化確認オプションは無効化します。
 

そして、受信ルールの対象を定義します。定義しない場合は、すべてのIDが適用されるため適宜 設定しましょう。
 

最後に処理フローを定義します。今回は「Amazon S3 バケットに配信」をアクションタイプにします。
S3プレフィックスも指定できるため、運用要件に合わせて指定しましょう。

(5)Amazon SESの受信ルールを有効化する

デフォルトでは無効化された状態で受信ルールセットが作成されます。
 

有効化しましょう。
 

受信機能の実装は以上になります。

検証用メールを送信してみた

「テストEメールの送信」を押下します。

検証用の送信元、送信先の情報を入力し、テストメールを送信してみます。
 

送信後、Amazon S3コンソールに移動すると受信された時刻に送信されたEメール内容のオブジェクトデータが格納されます。
 

ダウンロードして、Eメールの詳細情報を確認してみます。
Google Admin Toolbox

SPF、DKIM、DMARCの解析結果もPASS(合格)していますね! いいね👍

[補足]S3バケットに受信メールが格納されない

Amazon SESを初めて利用するAWSアカウントまたはリージョンであれば、サンドボックス状態でSESアカウントが作成されます。この初期状態では、「検証用メールを送信してみた」で紹介した特定のメールアドレスに対して、メール送信することができない制約があります。

解決するためには、Amazon SES のEメールアドレスを作成する必要があります。以下のドキュメントのとおりに設定してください。

(1)Eメールアドレス ID の作成
(2)Eメールアドレス ID の検証

Eメールアドレスを作成後、S3バケットに下記のようなメッセージが記載されたデータが格納されます。notepadなどで表示してください。
 

Dear Amazon Web Services Customer,

We have received a request to authorize this email address for use with Amazon SES and Amazon Pinpoint in region Asia Pacific (Tokyo). If you requested this verification, please go to the following URL to confirm that you are authorized to use this email address:

https://email-verification.ap-northeast-1.amazonaws.com/?Context=XXXXXX

Your request will not be processed unless you confirm the address using this URL. This link expires 24 hours after your original verification request.

If you did NOT request to verify this email address, do not click on the link. Please note that many times, the situation isn't a phishing attempt, but either a misunderstanding of how to use our service, or someone setting up email-sending capabilities on your behalf as part of a legitimate service, but without having fully communicated the procedure first.

To learn more about sending email from Amazon Web Services, please refer to the Amazon SES Developer Guide at http://docs.aws.amazon.com/ses/latest/DeveloperGuide/Welcome.html and Amazon Pinpoint Developer Guide at http://docs.aws.amazon.com/pinpoint/latest/userguide/welcome.html.

Sincerely, 

The Amazon Web Services Team.

本文から
https://email-verification.ap-northeast-1.amazonaws.com/?Context=XXXXXX
から始まるURIをブラウザで実行してください。リージョンIDのコードはAmazon SES作成したものになります。

ブラウザ画面で「検証に成功しました」と表示されたら、送信機能を利用できます。

[任意]サプレッションリストから削除する

上記の詳細情報を見ればわかるのですが、送信先やメール本文の情報が記載されていません。

これはAmazon SESが自動でサプレッションリスト(抑制リスト)に受信側のメールアドレスを登録しているためです。今回は検証用途であるため深追いはしませんが、これらの問題を解決したい場合にはAmazon SESコンソールのサプレッションリストから対象のメールアドレスを明示的に削除してください。

その後、再送信すると無事送信できたことを確認できます。

最後に

最後まで読んでいただき大変ありがとうございます。

Amazon SESを検証するための環境構築に向けてブログを書きました。受信できるメールアドレスを求められることが多いサービスなのですが、受信メールをS3バケットにアーカイブすることにより簡単に実現できます。

もし検証環境をサクッと用意したい場合は紹介した手順を試してみてくださいませ!