Skip to content

Instantly share code, notes, and snippets.

@hytdsh
Last active December 6, 2023 07:02
Show Gist options
  • Save hytdsh/47b14ef02f386576a2fd9746081864c2 to your computer and use it in GitHub Desktop.
Save hytdsh/47b14ef02f386576a2fd9746081864c2 to your computer and use it in GitHub Desktop.
AWS SESの使い方

SESでメールを送信する

1st step

「設定を始める」はいまいち使いづらいのでスキップする。

2nd step

「検証済みID」から始める。

2-1

「検証済みID」に、Fromに出現させたいドメインとして 57tyh68f.click を追加する。

Route 53 にゾーンがある場合は「Route 53 にCNAMEを追加する」みたいなボタンが出現するので、それを押して Route 53 のゾーン 57tyh68f.click に3つのCNAMEを追加する。

Route 53 に3つのCNAMEレコードが追加されてから10分~20分ほど経過するとSESのダッシュボードで検証済みになる。

2-2

「検証済みID」に、Toに使いたいメアドを追加する。(例: tadashi.oya@digitalhearts.com)

tadashi.oya@digitalhearts.com に実在検証のメールが着信するので、クリックしてSESのダッシュボードでの表示を検証済みとする。

3rd step

SESダッシュボードから「Fromに使いたいドメイン」として 57tyh68f.click にチェックを入れ「テストEメールの送信」を押下する。

Fromに適当なアドレスを入れる。(例: no-reply)(no-replyと選択したドメインから no-reply@57tyh68f.click がFromに出現する)

シナリオとして「カスタム」を選択する。

出現する「カスタム受信者」にSESダッシュボードで検証済みとしたメアド tadashi.oya@digitalhearts.com を入力する。

適当に「件名」と「本文」を書いて「テストEメールの送信」を押下する。(例: 件名を test 本文を This is a test などとする)

4th step

tadashi.oya@digitalhearts.com にSESからのメールが着信しているのを確認する。

SESでメールを受信する

1st step

Route 53にMXレコードを追加する。

https://docs.aws.amazon.com/ses/latest/dg/receiving-email-mx-record.html を参考にする。

「ルートドメインのレコードを作成するには、空白のままにします。」に従い空白のままとして、「57tyh68f.click」に対するMXレコードを作成する。(「mail.57tyh68f.click」みたいにはしない)

10 inbound-smtp.ap-northeast-1.amazonaws.com

2nd step

SESの「Eメール受信」でルールセットを作成する。

名前しか指定する項目が無い。(例: receive-mail という名前にする)

作成したら「有効」にしておく。

3rd step

ルールセットの中に受信ルールを作成する。受信ルールの作成がめんどうくさい。

3-1

  • ルール名: misc
  • ステータス: 有効化(デフォルトでチェックが入っている)
  • TLS: チェック無し(デフォルトでチェック無しなのでそのまま使う)
  • スパムとウィルススキャン: チェック有り(デフォルトでチェック有りなのでそのまま使う)

3-2

3-3

  • 新しいアクションの追加: S3バケットへの配信 <<<「SNSトピックへの発行」というのも選べるが今回は関係なかった

下記の選択肢が生えてくる。

  • S3バケット: 57tyh68f-ses-bucket (先回りして作っておく)
  • オブジェクトキープレフィクス: misc
  • メッセージの暗号化: チェック無し(デフォルト)
  • SNSトピック: 選択せず

ここでS3バケットを指定しないといけないのでS3バケットを先回りして作っておく。

「receipt-rule」の箇所に、まだ作っていない・これから作る、受信ルールの名前を書かないといけないので注意する。

S3バケットの作成

  • AWSリージョン: ap-northeast-1
  • バケットタイプ: 汎用
  • バケット名: 57tyh68f-ses-bucket
  • オブジェクト所有者: ACL無効
  • パブリックアクセスをすべてブロック: チェック入り(デフォルト)
  • バケットのバージョニング: 無効にする(デフォルト)
  • タグ: 無し
  • デフォルトの暗号化-暗号化タイプ: SSE-S3(デフォルト)
  • デフォルトの暗号化-バケットキー: 有効にする(デフォルト)
  • 詳細設定: 触らない

バケット作成後に https://docs.aws.amazon.com/ja_jp/ses/latest/dg/receiving-email-permissions.html を参考にしてバケットの「アクセス許可」の「バケットポリシー」(最初は空欄)に以下のJSONを登録する。

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"AllowSESPuts",
      "Effect":"Allow",
      "Principal":{
        "Service":"ses.amazonaws.com"
      },
      "Action":"s3:PutObject",
      "Resource":"arn:aws:s3:::57tyh68f-ses-bucket/*",
      "Condition":{
        "StringEquals":{
          "AWS:SourceAccount":"062149130045",
          "AWS:SourceArn": "arn:aws:ses:ap-northeast-1:062149130045:receipt-rule-set/receive-mail:receipt-rule/misc"
        }
      }
    }
  ]
}

4th step

ここまでの設定で「misc@57tyh68f.click」へのメールがS3バケットの中に入るようになる。

メールを送信する(HTML)

  1. SESのダッシュボードで「検証済みID」を表示する。
  2. 57tyh68f.click にチェックを入れ「テストEメールの送信」を押下する。
  3. テストメールを作成する。

テストメールのメッセージ

MIME-Version: 1.0
From: no-reply <no-reply@57tyh68f.click>
Subject: HTML mail TEST
To: tadashi.oya@digitalhearts.com
Content-Type: multipart/alternative; boundary="000000000000762ee5060bac7aec"

--000000000000762ee5060bac7aec
Content-Type: text/plain; charset="UTF-8"

HTML mail TEST

https://www.google.com/

--000000000000762ee5060bac7aec
Content-Type: text/html; charset="UTF-8"

<div dir="ltr">HTML mail TEST<div><br></div><div><a href="https://www.google.com/">https://www.google.com/</a></div><div><br></div><div><br></div></div>

--000000000000762ee5060bac7aec--

リンクをクリックしたことの検知

設定セットの作成

SESのダッシュボードから「設定セット」を表示して「セットの作成」を開始する。

  • 設定セット名: 57tyh68f-click-detect
  • IPプールを送信する: default(デフォルトでdefaultになっている)
  • カスタムリダイレクトドメインの使用: チェック無し(デフォルト)
  • 高度な配信オプション: 触らず
  • 評判メトリクス: チェック無し(デフォルト)
  • アカウントレベル設定を上書きする: チェック無し(デフォルト)
  • タグ: 追加せず

イベント送信先の追加

作成した「設定セット」を選択して「イベント送信先」を表示して「送信先の追加」を実施する。

その前にSNSトピックを作成する必要があり、SNSトピックを作成する(作成してサブスクリプションでメール受信設定を使う)ためにはS3のバケットの許可を追加する必要がある。

S3バケットへの許可の追加

S3バケットの「アクセス許可」を以下のように変更する。

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"ReceiveMisc",  <<<一意になるように
      "Effect":"Allow",
      "Principal":{
        "Service":"ses.amazonaws.com"
      },
      "Action":"s3:PutObject",
      "Resource":"arn:aws:s3:::57tyh68f-ses-bucket/*",
      "Condition":{
        "StringEquals":{
          "AWS:SourceAccount":"062149130045",
          "AWS:SourceArn": "arn:aws:ses:ap-northeast-1:062149130045:receipt-rule-set/receive-mail:receipt-rule/misc"  <<<受信ルールmisc
        }
      }
    },
    {
      "Sid":"ReceiveDetect",   <<<一意になるように
      "Effect":"Allow",
      "Principal":{
        "Service":"ses.amazonaws.com"
      },
      "Action":"s3:PutObject",
      "Resource":"arn:aws:s3:::57tyh68f-ses-bucket/*",
      "Condition":{
        "StringEquals":{
          "AWS:SourceAccount":"062149130045",
          "AWS:SourceArn": "arn:aws:ses:ap-northeast-1:062149130045:receipt-rule-set/receive-mail:receipt-rule/detect" <<<受信ルールdetect
        }
      }
    }
  ]
}

メールを受信する設定の追加

SESの「Eメール受信」からルールセット receive-mail を選択して、受信ルールのリスト表示のところでルールの作成を押下する。

  • ルール名: detect

  • ステータス: 有効化(デフォルトでチェックが入っている)

  • TLS: チェック無し(デフォルトでチェック無しなのでそのまま使う)

  • スパムとウィルススキャン: チェック有り(デフォルトでチェック有りなのでそのまま使う)

  • 受信者の条件: detect@57tyh68f.click

  • 新しいアクションの追加: S3バケットへの配信 <<<「SNSトピックへの発行」というのも選べるが今回は関係なかった

下記の選択肢が生えてくる。

  • S3バケット: 57tyh68f-ses-bucket
  • オブジェクトキープレフィクス: detect
  • メッセージの暗号化: チェック無し(デフォルト)
  • SNSトピック: 選択せず

SNSトピックとサブスクリプションの作成

SNSトピックを作成してサブスクリプションを関連付ける。

SNSトピック

  • タイプ: スタンダード
  • 名前: 57tyh68f-click-detect
  • 表示名: 空欄(デフォルト)
  • 暗号化: 触らず
  • アクセスポリシー: 触らず
  • データ保護ポリシー: 触らず
  • 配信ポリシー(HTTP/S): 触らず
  • 配信ステータスのログ記録: 触らず
  • タグ: 触らず
  • アクティブトレース: 触らず

サブスクリプション

  • トピックARN: arn:aws:sns:ap-northeast-1:062149130045:57tyh68f-click-detect
  • プロトコル: JSON形式のメール
  • エンドポイント: detect@57tyh68f.click
  • サブスクリプションフィルターポリシー: 触らず
  • Redriveポリシー: 触らず

送信先の追加

事前にSNSトピックを作成する必要あり

「設定セット」として 57tyh68f-click-detect を選択して「イベント送信先」を表示して「送信先の追加」を実施する。

  • イベントタイプ
    • 開封数: チェックを入れる(デフォルトはチェック無し状態)
    • クリック数: チェックを入れる(デフォルトはチェック無し状態)
  • 送信先オプション
    • 送信先タイプ: Amazon SNS
    • 名前: 57tyh68f-click-detect
    • イベント発行: 有効化にチェックあり(デフォルト)
  • Amazon Simple Notification Service (SNS) トピック
    • SNSトピック: 57tyh68f-click-detect

テストメールの送信

  1. SESのダッシュボードで「検証済みID」を表示する。
  2. 57tyh68f.click にチェックを入れ「テストEメールの送信」を押下する。
  3. テストメールを作成する。
    • Eメール形式: RAW
    • FROMアドレス: no-reply@57tyh68f.click
    • シナリオ: カスタム
    • メッセージ: MIME形式の最低限のヘッダに X-SES-CONFIGURATION-SET ヘッダを追加する+本文(以下に記載)
    • 追加設定: なし

テストメールのメッセージ

MIME-Version: 1.0
X-SES-CONFIGURATION-SET: 57tyh68f-click-detect     <<<追加したヘッダ
From: no-reply <no-reply@57tyh68f.click>
Subject: HTML mail TEST
To: tadashi.oya@digitalhearts.com
Content-Type: multipart/alternative; boundary="000000000000762ee5060bac7aec"

--000000000000762ee5060bac7aec
Content-Type: text/plain; charset="UTF-8"

HTML mail TEST

https://www.yahoo.co.jp/

--000000000000762ee5060bac7aec
Content-Type: text/html; charset="UTF-8"

<div dir="ltr">HTML mail TEST<div><br></div><div><a href="https://www.yahoo.co.jp/">https://www.yahoo.co.jp/</a></div><div><br></div><div><br></div></div>

--000000000000762ee5060bac7aec--

テストメールの確認

tadashi.oya@digitalhearts.com にメールが着信する。

この時、https://www.yahoo.co.jp へのリンクの実体が awstrack.me へのリンクに置き換わっていることを確認する。

tadashi.oya@digitalhearts.com がリンクをクリックすると、SES側でリンククリックの検知がJSONメールとして detect@57tyh68f.click 宛てに飛び、S3バケットに格納される。

S3バケット側での検知メールの見え方

以下のようなメールが detect@57tyh68f.click のS3バケットに格納される。

Return-Path: <0101018c3dc60b96-6cebeed0-1f19-4ede-a9b3-baf4033ecfa5-000000@us-west-2.amazonses.com>
Received: from a27-165.smtp-out.us-west-2.amazonses.com (a27-165.smtp-out.us-west-2.amazonses.com [54.240.27.165])
 by inbound-smtp.ap-northeast-1.amazonaws.com with SMTP id dru53kh8eip9pahdc5qjej1v3jukrvviuckbj1o1
 for detect@57tyh68f.click;
 Wed, 06 Dec 2023 06:17:20 +0000 (UTC)
X-SES-Spam-Verdict: PASS
X-SES-Virus-Verdict: PASS
Received-SPF: pass (spfCheck: domain of us-west-2.amazonses.com designates 54.240.27.165 as permitted sender) client-ip=54.240.27.165; envelope-from=0101018c3dc60b96-6cebeed0-1f19-4ede-a9b3-baf4033ecfa5-000000@us-west-2.amazonses.com; helo=a27-165.smtp-out.us-west-2.amazonses.com;
Authentication-Results: amazonses.com;
 spf=pass (spfCheck: domain of us-west-2.amazonses.com designates 54.240.27.165 as permitted sender) client-ip=54.240.27.165; envelope-from=0101018c3dc60b96-6cebeed0-1f19-4ede-a9b3-baf4033ecfa5-000000@us-west-2.amazonses.com; helo=a27-165.smtp-out.us-west-2.amazonses.com;
 dkim=pass header.i=@amazonses.com;
 dkim=pass header.i=@sns.amazonaws.com;
 dmarc=pass header.from=sns.amazonaws.com;
X-SES-RECEIPT: AEFBQUFBQUFBQUFHRVR1OUFQcHlsKzVJWGN4dnZmdTdaTnRveUpJUTJ5REREclVZQ0pMaGpoMzRtR3BQTnE0eGlZQm42a3dyb0MveGtzRDl6ZmhteG13MlZpeCtRY01WSTZnWnVDN1J0WkdXdGtvVEl0Vk8wMzgwUDc4QjBFWXVtMTEwNnpaTnB6UFNSZERhZEFwZ0cvb0xMeHU1WTViVTcwS1YxYWpwbUQ5ZnlrdHlkeUJaaWRTYUdHSXFhOEY5K1RqcWpkcm5ReGJXNDBxMm1EUmNEdnpyaXp4MjgycEV6OWJaTGdMbVZmRGYzL1Z5WmhrWVJoc0tpMklSNVZJSzBpZUZjSWZ0M0psMUV2OXpJR21RU0ErdVZjbzRQSk5LcDFQV0VxT2VFSFBVaTRLVzBRTndxaHd0M1NzdTZWYytRVjBsZzQrRWliWFFzUFVhNDNlUzNUSEtYQ0pHT2JYYWJmdkxJVi9hSWpFNmpKWWhEd1hvQ2pjeFFNQy9WUmVjbmdhTXdVMjYzcm00PQ==
X-SES-DKIM-SIGNATURE: a=rsa-sha256; q=dns/txt; b=H5Kzr4kQtTYx9ykWPNCX5WFSE7OaAAZSPThxnbVDw8ORecY3qgmXamTxq4MozbNfjDa4Ue1Kyc5KplRpopd1eGR8y5igxwq52kGhL7bjBGz55tbRS8rxBqu+/6/YM0kA8Y3O05W18IRxFkAScxPXuLeeCGDe+22bYryDNgSFj8w=; c=relaxed/simple; s=zh4gjftm6etwoq6afzugpky45synznly; d=amazonses.com; t=1701843440; v=1; bh=BKV+4ZmztYbQeXc6tVeHZ0BT+QzrEPc2hCjwkZX3Vq0=; h=From:To:Cc:Bcc:Subject:Date:Message-ID:MIME-Version:Content-Type:X-SES-RECEIPT;
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple;
	s=bvzpohlt7pj3iqbjuzpvcn4i3spdvank; d=sns.amazonaws.com;
	t=1701843438;
	h=Date:From:To:Message-ID:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding;
	bh=BKV+4ZmztYbQeXc6tVeHZ0BT+QzrEPc2hCjwkZX3Vq0=;
	b=U0yF59SU4K4y3+odJV9mNb0uDb/eiWRRHrsTKK43goXIDMoI71yv+V3wC0aS67pF
	1cXecmv1z2l7TbEsYUFM3PG4tFp0h+ZnYf6VVpwySJ1r8QjUD+uJFglGBYseDOKzo09
	okWdGISnlznDOH7VGxQB85YltRkJhNRxFkP7ClT4=
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple;
	s=hsbnp7p3ensaochzwyq5wwmceodymuwv; d=amazonses.com; t=1701843438;
	h=Date:From:To:Message-ID:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Feedback-ID;
	bh=BKV+4ZmztYbQeXc6tVeHZ0BT+QzrEPc2hCjwkZX3Vq0=;
	b=h54tWTd4WbawATow5OH6/G5p8EGtJhaPS12BBWH0VokcRWgC2ET2fme0yhyp3/rx
	n33CyHpyR7LbvB+OFAAlvgEJ/8784Q8e0wyKYk5frBVuJsxUfbWOY+FAvtTHXV5ItaZ
	+wd6XoN/RN3crqRGTYrSeBeZSHPcFwDyrlgZdY1E=
Date: Wed, 6 Dec 2023 06:17:18 +0000
From: AWS Notifications <no-reply@sns.amazonaws.com>
To: detect@57tyh68f.click
Message-ID: <0101018c3dc60b96-6cebeed0-1f19-4ede-a9b3-baf4033ecfa5-000000@us-west-2.amazonses.com>
Subject: Amazon SES Email Event Notification
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
x-amz-sns-message-id: e152f19a-4119-518c-96bb-ac705537c402
x-amz-sns-subscription-arn: arn:aws:sns:ap-northeast-1:062149130045:57tyh68f-click-detect:e30c4038-6324-4cda-97cc-acb512902166
Feedback-ID: 1.us-west-2.c55J8LO2Yl1R0Ht+ysI6VjzUH6Cvo3dHPF80AUVC/G8=:AmazonSES
X-SES-Outgoing: 2023.12.06-54.240.27.165

{
  "Type" : "Notification",
  "MessageId" : "e152f19a-4119-518c-96bb-ac705537c402",
  "TopicArn" : "arn:aws:sns:ap-northeast-1:062149130045:57tyh68f-click-detect",
  "Subject" : "Amazon SES Email Event Notification",
  "Message" : "{\"eventType\":\"Click\",\"mail\":{\"timestamp\":\"2023-12-06T06:16:31.428Z\",\"source\":\"no-reply@57tyh68f.click\",\"sendingAccountId\":\"062149130045\",\"messageId\":\"0106018c3dc553c4-36ba9cc7-16b6-458a-96d2-613e6758f340-000000\",\"destination\":[\"tadashi.oya@digitalhearts.com\"],\"headersTruncated\":false,\"headers\":[{\"name\":\"MIME-Version\",\"value\":\"1.0\"},{\"name\":\"X-SES-CONFIGURATION-SET\",\"value\":\"57tyh68f-click-detect\"},{\"name\":\"From\",\"value\":\"no-reply@57tyh68f.click\"},{\"name\":\"Subject\",\"value\":\"HTML mail TEST\"},{\"name\":\"To\",\"value\":\"tadashi.oya@digitalhearts.com\"},{\"name\":\"Content-Type\",\"value\":\"multipart/alternative; boundary=\\\"000000000000762ee5060bac7aec\\\"\"}],\"commonHeaders\":{\"from\":[\"no-reply@57tyh68f.click\"],\"to\":[\"tadashi.oya@digitalhearts.com\"],\"messageId\":\"0106018c3dc553c4-36ba9cc7-16b6-458a-96d2-613e6758f340-000000\",\"subject\":\"HTML mail TEST\"},\"tags\":{\"ses:source-tls-version\":[\"TLSv1.3\"],\"ses:operation\":[\"SendRawEmail\"],\"ses:configuration-set\":[\"57tyh68f-click-detect\"],\"ses:source-ip\":[\"138.64.69.204\"],\"ses:from-domain\":[\"57tyh68f.click\"],\"ses:caller-identity\":[\"hytdsh\"]}},\"click\":{\"timestamp\":\"2023-12-06T06:17:18.323Z\",\"ipAddress\":\"138.64.69.204\",\"userAgent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0\",\"link\":\"https://www.yahoo.co.jp/\",\"linkTags\":null}}\n",
  "Timestamp" : "2023-12-06T06:17:18.406Z",
  "SignatureVersion" : "1",
  "Signature" : "pTny8jlHFO+ed+K6VCIqJFgryOvWPMVZaUxD3EFfXA1tsQqqFggVYcJL0su7gNWKqVgGDyYCn+4IWVKFA+Vug/vKdLMCTqEOCMPEfO2jezKRU2Z8PTCPQUric+i437UJHuAPmsif8JB3Yp2GsTS9F/TTEEcm6vCXMDa5rAltbmHTQdl0UnL0lZ3A9eBRo7+bwKLoglphfG38JAM44HGxnPkbcaf6mPwgcGff0SFZk3xevg9B6tFrBumDNLc23vcXW8ayUn2gDSGM+7W7ySFayorErniMRzfyIpWKM/eKyj9qiNFKawIoLtXJjXFZqK4xghe4JnJQs5TZZ62F0b4cpA==",
  "SigningCertURL" : "https://sns.ap-northeast-1.amazonaws.com/SimpleNotificationService-01d088a6f77103d0fe307c0069e40ed6.pem",
  "UnsubscribeURL" : "https://sns.ap-northeast-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:ap-northeast-1:062149130045:57tyh68f-click-detect:e30c4038-6324-4cda-97cc-acb512902166"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment