Amazon SESでテンプレートでパーソナライズしたメールが送信可能になりました

ウィスキー、シガー、パイプをこよなく愛する大栗です。

本日Amazon SESでテンプレートを利用してパーソナライズしたメールを送信できるようになりました。マーケティングメールで良くある本文の名前などを置き換えて送信する機能です。早速試してみました。

テンプレートを使用したパーソナライズ

ドキュメントを参照するとaws ses create-templateコマンドのヘルプを参照するとテンプレートのフォーマットは以下のようになっています。

{
  "TemplateName": "string",
  "SubjectPart": "string",
  "TextPart": "string",
  "HtmlPart": "string"
}

各項目の内容は以下のとおりです。

項目 内容
TemplateName テンプレートの名称。メール送信時にこの名前を参照します。
SubjectPart メールの件名。置換タグを含めることができます。タグには{{tagname}}形式を使用します。メール送信時に宛先ごとにタグの値を指定できます。
HtmlPart メールのHTML本文。置換タグを含めることができます。
TextPart メールのテキスト本文。HTMLメールを表示できないメールクライアントの場合に参照します。

件名と本文にタグを埋め込むことで宛先ごとにパーソナライズできます。

制限

  • Amazon SESアカウントごとに最大10,000のメールテンプレートを作成できます。
  • 各テンプレートは、テキスト部分とHTML部分の合計で最大500KBにすることができます。
  • 各テンプレートには、置換タグを無制限に含められます。
  • SendBulkTemplatedEmailの呼出しで50宛先までメールを送信できます。宛先にはCCとBCCが含まれます。APIへの一回の呼び出しで連絡できる接続先の数は、アカウントの最大送信レートによって制限される場合があります。詳細についてはManaging Your Amazon SES Sending Limitsを参照してください。

試してみる

以下の流れで試してみます。なお、SESはオレゴンリージョン(us-west-2)で実行します。

  1. メール送信設定
  2. テンプレートの作成
  3. プレビューの確認
  4. メール送信

現在テンプレート機能はコンソールから実行できない(テンプレートの一覧表示は可能)ためCLIで行います。AWS CLIを最新のバージョンにしておきましょう。

メール送信設定

事前準備として、オレゴンリージョンでメールを送信できるSESの環境を構築します。具体的な手順は、以下のエントリーをご覧ください。

テンプレートの作成

テンプレートの内容として以下のようにテンプレートのファイルを作成します。

{
    "Template": {
        "TemplateName": "TestTemplate01",
        "SubjectPart": "こんにちは {{name}}!",
        "HtmlPart": "<h1>こんにちは {{name}}さん</h1><p>あなたの好きなAWSサービスは{{favoriteservice}}ですね。</p>",
        "TextPart": "前略 {{name}}さん\r\nあなたの好きなAWSサービスは{{favoriteservice}}ですね。\r\n草々"
    }
}

テンプレートはaws ses create-templateコマンドで登録します。

aws ses create-template --cli-input-json file://TestMainTemplate.json --region us-west-2

コンソールでもテンプレートの名前と作成時刻が表示されます。

SES_Management_Console

プレビューの確認

タグを置換した結果の確認をしてみます。プレビューの表示にはaws ses test-render-templateコマンドを使用します。

aws ses test-render-template --template-name TestTemplate01 --template-data '{ "name": "大栗" , "favoriteservice": "SES" }' --region us-west-2
{
    "RenderedTemplate": "Date: 2017-10-12T01:59:37.325Z\r\nMessage-ID: <1234567890.123.1234567890123.JavaMail.ec2-user@ip-192-0-2-57.us-west-2.compute.internal>\r\nSubject: =?UTF-8?B?44GT44KT44Gr44Gh44GvIOWkp+aglyE=?=\r\nMIME-Version: 1.0\r\nContent-Type: multipart/alternative; \r\n\tboundary=\"----=_Part_123_1234567890.1234567890123\"\r\nContent-Transfer-Encoding: quoted-printable\r\n\r\n------=_Part_123_1234567890.1234567890123\r\nContent-Type: text/plain; charset=UTF-8\r\nContent-Transfer-Encoding: base64\r\n\r\n5YmN55WlIOWkp+agl+OBleOCkw0K44GC44Gq44Gf44Gu5aW944GN44GqQVdT44K144O844OT44K5\r\n44GvU0VT44Gn44GZ44Gt44CCDQrojYnjgIU=\r\n------=_Part_123_1234567890.1234567890123\r\nContent-Type: text/html; charset=UTF-8\r\nContent-Transfer-Encoding: base64\r\n\r\nPGgxPuOBk+OCk+OBq+OBoeOBryDlpKfmoJfjgZXjgpM8L2gxPjxwPuOBguOBquOBn+OBruWlveOB\r\njeOBqkFXU+OCteODvOODk+OCueOBr1NFU+OBp+OBmeOBreOAgjwvcD4=\r\n------=_Part_123_1234567890.1234567890123--\r\n"
}

分かりにくいので、データだけを取り出します。

aws ses test-render-template --template-name TestTemplate01 --template-data '{ "name": "大栗" , "favoriteservice": "SES" }' --region us-west-2  | jq '.RenderedTemplate' -r
{
    "RenderedTemplate": "Date: 2017-10-12T01:59:37.325Z\r\nMessage-ID: <1234567890.123.1234567890123.JavaMail.ec2-user@ip-192-0-2-57.us-west-2.compute.internal>\r\nSubject: =?UTF-8?B?44GT44KT44Gr44Gh44GvIOWkp+aglyE=?=\r\nMIME-Version: 1.0\r\nContent-Type: multipart/alternative; \r\n\tboundary=\"----=_Part_123_1234567890.1234567890123\"\r\nContent-Transfer-Encoding: quoted-printable\r\n\r\n------=_Part_123_1234567890.1234567890123\r\nContent-Type: text/plain; charset=UTF-8\r\nContent-Transfer-Encoding: base64\r\n\r\n5YmN55WlIOWkp+agl+OBleOCkw0K44GC44Gq44Gf44Gu5aW944GN44GqQVdT44K144O844OT44K5\r\n44GvU0VT44Gn44GZ44Gt44CCDQrojYnjgIU=\r\n------=_Part_123_1234567890.1234567890123\r\nContent-Type: text/html; charset=UTF-8\r\nContent-Transfer-Encoding: base64\r\n\r\nPGgxPuOBk+OCk+OBq+OBoeOBryDlpKfmoJfjgZXjgpM8L2gxPjxwPuOBguOBquOBn+OBruWlveOB\r\njeOBqkFXU+OCteODvOODk+OCueOBr1NFU+OBp+OBmeOBreOAgjwvcD4=\r\n------=_Part_123_1234567890.1234567890123--\r\n"
}
Date: 2017-10-12T01:59:37.325Z
Message-ID: <1234567890.123.1234567890123.JavaMail.ec2-user@ip-192-0-2-57.us-west-2.compute.internal>
Subject: =?UTF-8?B?44GT44KT44Gr44Gh44GvIOWkp+aglyE=?=
MIME-Version: 1.0
Content-Type: multipart/alternative;
	boundary="----=_Part_123_1234567890.1234567890123"
Content-Transfer-Encoding: quoted-printable

------=_Part_123_1234567890.1234567890123
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: base64

5YmN55WlIOWkp+agl+OBleOCkw0K44GC44Gq44Gf44Gu5aW944GN44GqQVdT44K144O844OT44K5
44GvU0VT44Gn44GZ44Gt44CCDQrojYnjgIU=
------=_Part_123_1234567890.1234567890123
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: base64

PGgxPuOBk+OCk+OBq+OBoeOBryDlpKfmoJfjgZXjgpM8L2gxPjxwPuOBguOBquOBn+OBruWlveOB
jeOBqkFXU+OCteODvOODk+OCueOBr1NFU+OBp+OBmeOBreOAgjwvcD4=
------=_Part_123_1234567890.1234567890123--

文面がBASE64エンコーディングされているので復号化してみてみます。ちゃんとレンダリングされていることが分かります。

$ echo '44GT44KT44Gr44Gh44GvIOWkp+aglyE=' | base64 -D
こんにちは 大栗!
echo '5YmN55WlIOWkp+agl+OBleOCkw0K44GC44Gq44Gf44Gu5aW944GN44GqQVdT44K144O844OT44K5
> 44GvU0VT44Gn44GZ44Gt44CCDQrojYnjgIU=' | base64 -D
前略 大栗さん
あなたの好きなAWSサービスはSESですね。
草々
echo 'PGgxPuOBk+OCk+OBq+OBoeOBryDlpKfmoJfjgZXjgpM8L2gxPjxwPuOBguOBquOBn+OBruWlveOB
> jeOBqkFXU+OCteODvOODk+OCueOBr1NFU+OBp+OBmeOBreOAgjwvcD4=' | base64 -D
<h1>こんにちは 大栗さん</h1><p>あなたの好きなAWSサービスはSESですね。</p>

メール送信

実際にメールを送信してみます。テンプレートを利用したメールの送信はaws ses send-templated-emailaws ses send-bulk-templated-emailのコマンドがあります。aws ses send-templated-emailは1通でaws ses send-bulk-templated-emailは複数メールをまとめて送信します。

今回はaws ses send-bulk-templated-emailは複数メールを送信してみます。

以下のようにコマンドの入力内容を以下のようにファイルで作成します。送信先は3箇所としています。注目すべきは3番目のmaroon1st@example.comの送信設定ではReplacementTemplateDataを空にしています。この場合はDefaultTemplateDataの内容でタグを置換します。なお、ConfigurationSetNameを指定できるので開封やクリックのトラッキングも可能と思われます。

{
  "Source":"maroon1st+from@example.com",
  "Template":"TestTemplate01",
  "Destinations":[
    {
      "Destination":{
        "ToAddresses":[
          "maroon1st+send1@example.com"
        ]
      },
      "ReplacementTemplateData":"{ \"name\":\"大栗\", \"favoriteservice\":\"SES\" }"
    },
    {
      "Destination":{ 
        "ToAddresses":[
          "maroon1st+send2@example.com"
        ]
      },
      "ReplacementTemplateData":"{ \"name\":\"宗\", \"favoriteservice\":\"RDS\" }"
    },
    {
      "Destination":{
        "ToAddresses":[
          "maroon1st@example.com"
        ]
      },
      "ReplacementTemplateData":"{}"
    }
  ],
  "DefaultTemplateData":"{ \"name\":\"Oguri\", \"favoriteservice\":\"EC2\" }"
}

作成した入力内容のファイルを使用して、以下のコマンドでメールを送信します。

$ aws ses send-bulk-templated-email --cli-input-json file://BulkMailData.json --region us-west-2
{
    "Status": [
        {
            "Status": "Success",
            "MessageId": "01234567a8b9c0d1-1234abcd-12ab-ab12-1234-1234abcd12ab-000000"
        },
        {
            "Status": "Success",
            "MessageId": "01234567a8b9c0d2-1234abcd-34ab-ab12-1234-1234abcd12ab-000000"
        },
        {
            "Status": "Success",
            "MessageId": "01234567a8b9c0d3-1234abcd-56ab-ab12-1234-1234abcd12ab-000000"
        }
    ]
}

受信したメールを確認します。Gmailで受信しているのでHTMLの内容が表示されます。

こんにちは_大栗_メール

こんにちは_宗_メール

こんにちは_Oguri_メール

メールのソースを確認すると、以下のようになっています。プレビュー通りContent-Typeはmultipart/alternativeになっており、text/plaintext/htmlの本文が入っています。

Delivered-To: maroon1st+send1@example.com
Received: by 192.0.2.15 with SMTP id z151a2b3c4dff;
        Wed, 11 Oct 2017 19:43:10 -0700 (PDT)
X-Google-Smtp-Source: AOwi7QB/ADA90abcd2uK8aSLbWvolv4bmAn121a2b3c4dV5AMFF31244yELFabcdfQHl7orlhivx
X-Received: by 192.0.2.15 with SMTP id g167mr123470pgc.341.1507776190764;
        Wed, 11 Oct 2017 19:43:10 -0700 (PDT)
ARC-Seal: i=1; a=rsa-sha256; t=1507776190; cv=none;
        d=google.com; s=arc-20160816;
        b=Dhbm+wnsbWkeZ1jXJO6+ep1CbQQh/IeN+hVn8oIUyTykUQ87zVzE8VbRmnmem0YZL1
         VEbMPwnhA7mZwP248NZfwvE/mCdFD5eEpJSj2O1a2b3c4dTe1jnCvOggHIS8YuhdtOHp
         +67H+UZwYINSaDeCtE11a2b3c4dPM46YaZVwETpEPlbPGsHncpM59hlluZMdPnNRQuAp
         WKqtmLY7AfU94VIslP/K1GWdk1BiS4cRy1a2b3c4dFoaPNOCUti4yc7GBGJcRlcjKp5l
         H1QcLPyvYFmzZg1a2b3c4d3L1fhPsADiKzPYOvisJbTxT4Q7soEwE/TG5w3aRT02bHTt
         572w==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20161234;
        h=feedback-id:content-transfer-encoding:mime-version:subject
         :message-id:to:reply-to:from:date:dkim-signature
         :arc-authentication-results;
        bh=SJvVrS8QXgJOHXNu1HRsCUb62Vd6ALOQSFOy8zP3SkM=;
        b=I8XD3r6lTry1a2b3c4dZiC8eBSiEJrc2fOfJTQh7y1ajOx+P+LwqNJGNWrvNZNwr3D
         esH7mSQfqRYYMT8swaG01a2b3c4dpjqpE5VAEgLl7hyRIeADVv6oGi+8xRbIjN6umD9X
         1a2b3c4dbnzMTIFdUvd0JiJ85TCi1a2b3c4dUtXvwGlRWsr0HdmbszCZzwlG6+y9RxeN
         aGHa5+Fu1a2b3c4dZJxIoDbiqNZD4gSTjmkO1a2b3c4d7dbT4elspYmwpzT/0ag6fYBC
         lwxxP/Etj1sBlrC31a2b3c4d/Jb3kzZJV76AECdKiFDi1a2b3c4dvCAnh3m8lLFTTpln
         4W3g==
ARC-Authentication-Results: i=1; mx.google.com;
       dkim=pass header.i=@amazonses.com header.s=hsbnp1a2b3c4da2b31a2b3c4dodymuwv header.b=UPwbNlzv;
       spf=pass (google.com: domain of 01234567a8b9c0d1-1234abcd-12ab-ab12-1234-1234abcd12ab-000000@us-west-2.amazonses.com designates 203.0.113.52 as permitted sender) smtp.mailfrom=01234567a8b9c0d1-1234abcd-12ab-ab12-1234-1234abcd12ab-000000@us-west-2.amazonses.com
Return-Path: <01234567a8b9c0d1-1234abcd-12ab-ab12-1234-1234abcd12ab-000000@us-west-2.amazonses.com>
Received: from a27-52.smtp-out.us-west-2.amazonses.com (a27-52.smtp-out.us-west-2.amazonses.com. [203.0.113.52])
        by mx.google.com with ESMTPS id m2s1a2b3c4dplk.258.2017.10.11.19.43.10
        for <maroon1st+send1@example.com>
        (version=TLS1 cipher=ECDHE-RSA-AES128-SHA bits=128/128);
        Wed, 11 Oct 2017 19:43:10 -0700 (PDT)
Received-SPF: pass (google.com: domain of 01234567a8b9c0d1-1234abcd-12ab-ab12-1234-1234abcd12ab-000000@us-west-2.amazonses.com designates 203.0.113.52 as permitted sender) client-ip=203.0.113.52;
Authentication-Results: mx.google.com;
       dkim=pass header.i=@amazonses.com header.s=hsb1a2b3c4daochz1a2b3c4deodymuwv header.b=UPwbNlzv;
       spf=pass (google.com: domain of 01234567a8b9c0d1-1234abcd-12ab-ab12-1234-1234abcd12ab-000000@us-west-2.amazonses.com designates 203.0.113.52 as permitted sender) smtp.mailfrom=01234567a8b9c0d1-1234abcd-12ab-ab12-1234-1234abcd12ab-000000@us-west-2.amazonses.com
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple;
	s=hsbnp7p3en1a2b3c4dq5w1a2b3c4duwv; d=amazonses.com; t=1507776190;
	h=Date:From:Reply-To:To:Message-ID:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Feedback-ID;
	bh=SJvVrS1a2b3c4dNu1HRsCUb61a2b3c4dSFOy8zP3SkM=;
	b=UPwbNl1a2b3c4dADNGisPb1a2b3c4d9ngNUHgzG1a2b3c4dptR9qnjg6eKvMwfjI
	++Ygve/E0y1a2b3c4dfRXp9ed1a2b3c4dMg9V1omb1a2b3c4d7gdh91a2b3c4d7AJRY
	04aaO6W1a2b3c4d122ZyO011a2b3c4dgC5mLTH5o=
Date: Thu, 12 Oct 2017 02:43:09 +0000
From: maroon1st+from@example.com
Reply-To: maroon1st+from@example.com
To: maroon1st+send1@example.com
Message-ID: <01234567a8b9c0d1-1234abcd-12ab-ab12-1234-1234abcd12ab-000000@us-west-2.amazonses.com>
Subject: =?UTF-8?B?44GT44KT44Gr44Gh44GvIOWkp+aglyE=?=
MIME-Version: 1.0
Content-Type: multipart/alternative; 
	boundary="----=_Part_123_1234567890.1234567890123"
Content-Transfer-Encoding: quoted-printable
X-SES-Outgoing: 2017.10.12-203.0.113.52
Feedback-ID: 1.us-west-2.ACmPL/Uy2r0OLSDgS4Fh2pzm81xWJ5SVOMhWloCoM3g=:AmazonSES

------=_Part_123_1234567890.1234567890123
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: base64

5YmN55WlIOWkp+agl+OBleOCkw0K44GC44Gq44Gf44Gu5aW944GN44GqQVdT44K144O844OT44K5
44GvU0VT44Gn44GZ44Gt44CCDQrojYnjgIU=
------=_Part_123_1234567890.1234567890123
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: base64

PGgxPuOBk+OCk+OBq+OBoeOBryDlpKfmoJfjgZXjgpM8L2gxPjxwPuOBguOBquOBn+OBruWlveOB
jeOBqkFXU+OCteODvOODk+OCueOBr1NFU+OBp+OBmeOBreOAgjwvcD4=
------=_Part_123_1234567890.1234567890123--

さいごに

最近SESのアップデートが活発です。Eメールはレガシーなサービスと思われていますが、現役で様々な場面で使用されているものです。テンプレートによるパーソナライズはメールサービスの専門ベンダーではサポートされているような機能ですが、SESでも可能となりました。今まで外部のメールサービスを使用していてAWSとの連携に苦労している場合などAmazon SESを積極的に活用したようが良い場面が増えてきたと思います。