SES のメール送信テンプレートを使用してみる

記事タイトルとURLをコピーする

こんにちは😸
カスタマーサクセス部の山本です。

SES のメール送信テンプレート

テンプレートがあると、なにかと便利な世の中ですよね。
SES のメール送信テンプレートは、以前からある機能です。私はまだ触ってみたことがなかったので、試してみました。

メール送信テンプレートは、
2017 年 10 月に発表された機能です。

2024 年 11 月 4 日に「インラインテンプレート」という機能が提供され、テンプレートを利用する際のプロセスが簡素化されています。

2024 年 11 月 4 日以前は、以下の流れだったようです。

  1. テンプレートを作成して SES サービスに登録する。
  2. テンプレートとテンプレートに入れる変数(「置換タグ」という)を指定してメールを送信する。

2024 年 11 月 4 日以降は、以下の流れになるようです。

  1. 手元で作成したテンプレートと、そのテンプレートに入れる「置換タグ」を指定してメールを送信する。

送信テンプレートを試してみる

準備

Route53 で取得したドメインを登録し、SPF , DKIM , DMARC の設定をしました。詳細は割愛します。
テストメールをマネジメントコンソールから自分の持っているメールアドレス宛てに送信し、受信できることを確認しました。

テストメール送信:

受信:

ここまではマネジメントコンソールから実施できます。

まずは以前からある「ストアドテンプレート」を試す

メール送信テンプレート機能は API のみ対応です。 インラインテンプレートではなく、以前からあるテンプレートを使用してみます。「ストアドテンプレート」と呼ぶようです。
「ストアドテンプレート」は、AWS の各リージョンごとに 20,000 個まで作成可能なようです 。各テンプレートのサイズ上限は 500 KB のようです。

{
    "TemplateName": "MyTemplate",
    "TemplateContent": {
        "Subject": "Greetings, {{name}}!",
        "Text": "Dear {{name}},\r\nYour favorite animal is {{favoriteanimal}}.",
        "Html": "<h1>Hello {{name}},</h1><p>Your favorite animal is {{favoriteanimal}}.</p>"
    }
}
  • TemplateName
    • テンプレート名です。メール送信時に指定します。
  • TemplateContent
    • SubjectPart
      • メールの件名です。{{name}} など「置換タグ」を書いておき、メール送信の際に指定するようにすることも可能です。
    • HtmlPart
      • HTML 本文です。件名同様に「置換タグ」を指定可能です。
    • TextPart
      • テキスト本文です。クライアント側の設定にもよりますが、HTML 本文が表示できない場合、テキスト本文が表示されます。こちらも「置換タグ」を指定可能です。

CloudShell を使用して、API を試してみます。
テンプレートの json を作成します。

テンプレート MyTemplate をサービス側に登録します。

  • aws sesv2 create-email-template --cli-input-json file://template-sample1.json

AWSマネジメントコンソールに名前のみ表示されます。

テンプレートを使用し、メールを送信するための設定ファイルを作成します。email.json

{
    "FromEmailAddress": "Tetsuya Yamamoto <tetsuya@karukozaka46.click>",
    "Destination": {
        "ToAddresses": [
            "yamamoto@karukozaka46.click"
        ]
    },
    "Content": {
        "Template": {
            "TemplateName": "MyTemplate",
            "TemplateData": "{ \"name\":\"yamamoto\", \"favoriteanimal\": \"Rock Ptarmigan\" }"
        }
    }
}
  • FromEmailAddress
    • 送信者のメールアドレス
  • ToAddresses
    • 受信者のメールアドレス
  • TemplateName
    • 先ほど登録したテンプレート MyTemplate
  • TemplateData
    • 「置換タグ」に入る値

メールを送信します。

  • aws sesv2 send-email --cli-input-json file://email.json

メールが来ました。
Gmail では HTML 本文が表示されました。
「置換タグ」もしっかり表示できています。

日本語

日本語を試してみます。 template-sample1.json を書き換えます。

{
    "TemplateName": "MyTemplate",
    "TemplateContent": {
        "Subject": "こんにちは, {{name}}!",
        "Text": "やあ {{name}},\r\n君の好きな動物はズバリ {{favoriteanimal}}.",
        "Html": "<h1>やあ {{name}},</h1><p>君の好きな動物はズバリ {{favoriteanimal}}.</p>"
    }
}

以下のコマンドで作成済みのテンプレート MyTemplate を更新します。

  • aws sesv2 update-email-template --cli-input-json file://template-sample1.json

email.json も更新します。

メールを送信すると日本語も表示できていました。

作業実施時の注意点

CloudShell の vim で 拡張子 .json のファイルに json 形式のテキストをペーストして貼り付けると、インデントが増えてしまいました。

直すのが大変です。

最初に email.txt という名前で作成し、INSERTモードでペースト後にファイル名をリネームしました。

「置換タグ」に指定する内容を誤った際の通知(レンダリング失敗イベントの通知)

「置換タグ」に指定する内容を誤った際には、送信時にメッセージ ID が表示されるものの、メールは来ません。

「レンダリング失敗」というらしいです。 SES からイベントが発行されるので、Eメールで受け取ることができます。

SES のサービス画面で「設定セット」を作成します。

設定セットができました。

「イベント送信先」タブをクリックします。「送信先の追加」をします。

イベントタイプの選択で「レンダリングの失敗」を選択します。

SNS トピックを選択します。イベント発行は有効化のまま。

右下のボタンを押して SNS トピックを作成します。

「送信先を追加」を押して「イベント送信先」を作成します。

さて、SNS サービスを見てみましょう。作成した SNS トピックは SES サービスに Publish の許可を与える以下のようなポリシーがついています。

{
  "Version": "2008-10-17",
  "Statement": [
    {
      "Sid": "stmt1750335507443",
      "Effect": "Allow",
      "Principal": {
        "Service": "ses.amazonaws.com"
      },
      "Action": "SNS:Publish",
      "Resource": "arn:aws:sns:ap-northeast-1:123456789012:test",
      "Condition": {
        "StringEquals": {
          "AWS:SourceAccount": "123456789012"
        },
        "StringLike": {
          "AWS:SourceArn": "arn:aws:ses:*"
        }
      }
    }
  ]
}

SNS トピックに「Eメール」のサブスクリプションを追加します。

確認メールが来るので承認します。

確認

「置換タグ」に使用できない文字の情報についてはドキュメントに見つかりません。
そのため、2つのうち1つの置換タグを指定しないことにより、レンダリング失敗イベントが通知されるのか見てみます。

email.json を編集し、先ほど作成した設定セットの情報を追加します。
"ConfigurationSetName": "test" 部分です。 1 つ上の行末に , の付与もしています。

{
    "FromEmailAddress": "Tetsuya Yamamoto <tetsuya@karukozaka46.click>",
    "Destination": {
        "ToAddresses": [
            "yamamoto@karukozaka46.click"
        ]
    },
    "Content": {
        "Template": {
            "TemplateName": "MyTemplate",
            "TemplateData": "{ \"name\":\"yamamoto\", \"favoriteanimal\": \"Rock Ptarmigan\" }"
        }
    },
    "ConfigurationSetName": "test"
}

そのあとに、置換タグ favoriteanimal を削除します。 , \"favoriteanimal\": \"Rock Ptarmigan\" を削除しました。

{
    "FromEmailAddress": "Tetsuya Yamamoto <tetsuya@karukozaka46.click>",
    "Destination": {
        "ToAddresses": [
            "yamamoto@karukozaka46.click"
        ]
    },
    "Content": {
        "Template": {
            "TemplateName": "MyTemplate",
            "TemplateData": "{ \"name\":\"yamamoto\"}"
        }
    },
    "ConfigurationSetName": "test"
}

メールを送ってみます。

aws sesv2 send-email --cli-input-json file://email.json

メッセージIDは出たものの、メールは来ませんでした。
その代わり、SNS トピックでサブスクリプションに設定したメールアドレスに、イベントの通知が来ていました。
1つの置換タグがないことを示しています。想定通りです。

"failure":{"errorMessage":"Attribute 'favoriteanimal' is not present in the rendering

2024 年 11 月 4 日に出た「インラインテンプレート」機能を試してみる

「ストアドテンプレート」とメール送信用の json を合体させたような設定ファイル inline-template.json を作ります。1つになるので簡素化されています。
テンプレートのサイズ上限は 1 MB のようです。2ファイルが合体しているので、「ストアドテンプレート」の 500 KB と同等のサイズ上限な気がします。
SES で送信を行うソースコードをリポジトリで管理している場合はこちらが便利そうです。

{
    "FromEmailAddress": "Tetsuya Yamamoto <yamamoto@karukozaka46.click>",
    "Destination": {
        "ToAddresses": [
            "yamamoto@example.com"
        ]
    },
    "Content": {
        "Template": {
            "TemplateContent": {
                "Subject": "こんにちは, {{name}}!",
                "Text": "親愛なる{{name}},\r\n君の好きな動物、それはまさに {{favoriteanimal}}.",
                "Html": "<h1>やあ {{name}},</h1><p>君の好きな動物、それはまさに {{favoriteanimal}}.</p>"
            },
            "TemplateData": "{ \"name\":\"山本\", \"favoriteanimal\": \"ライチョウ\" }"
        }
    },
    "ConfigurationSetName": "test"
}

送信します。

  • aws sesv2 send-email --cli-input-json file://inline-template.json

メールが来ました。

先ほどと同じ設定セットを使用しているので、レンダリング失敗の通知が来るか確認します。
置換タグを1つ削除します。

  • , \"favoriteanimal\": \"ライチョウ\" を削除
{
    "FromEmailAddress": "Tetsuya Yamamoto <yamamoto@karukozaka46.click>",
    "Destination": {
        "ToAddresses": [
            "yamamoto@example.com"
        ]
    },
    "Content": {
        "Template": {
            "TemplateContent": {
                "Subject": "こんにちは, {{name}}!",
                "Text": "親愛なる{{name}},\r\n君の好きな動物、それはまさに {{favoriteanimal}}.",
                "Html": "<h1>やあ {{name}},</h1><p>君の好きな動物、それはまさに {{favoriteanimal}}.</p>"
            },
            "TemplateData": "{ \"name\":\"山本\"}"
        }
    },
    "ConfigurationSetName": "test"
}

メールを送ります。

メッセージIDは出たものの、メールは来ませんでした。
その代わり、SNS トピックでサブスクリプションに設定したメールアドレスに、イベントの通知が来ていました。
1つの置換タグがないことを示しています。想定通りです。

"failure":{"errorMessage":"Attribute 'favoriteanimal' is not present in the rendering

AWS SESのメール送信テンプレート機能まとめ

概要

  • SESのメール送信テンプレートは2017年10月から提供されている機能
  • 2024年11月4日に「インラインテンプレート」機能が追加され、プロセスが簡素化

テンプレートの種類と特徴

1. ストアドテンプレート(従来の方式)

  • 制限:
    • リージョンごとに20,000個まで作成可能
    • テンプレートサイズ上限:500 KB
  • 使用手順:
    1. テンプレートをSESサービスに事前登録
    2. 登録したテンプレートを指定してメール送信

2. インラインテンプレート(新機能)

  • 制限:
    • テンプレートサイズ上限:1 MB
  • 特徴:
    • テンプレートの事前登録が不要
    • メール送信時に直接テンプレートを指定可能
    • ソースコードのリポジトリ管理を行っている場合に適している

テンプレートの主な構成要素

  1. Subject(件名)
  2. Text(プレーンテキスト本文)
  3. Html(HTML形式の本文)
  4. 各要素で置換タグ({{変数名}})が使用可能

エラー処理

  • 置換タグの指定ミスによるレンダリング失敗時:
    1. メッセージIDは発行されるがメールは送信されない
    2. 設定セットとSNSトピックを使用して失敗通知を受け取ることが可能
    3. エラーメッセージで具体的な問題(未指定の置換タグなど)を確認可能

余談

今更「響け!ユーフォニアム」のアニメを観ています。
基礎が大事なのは吹奏楽も IT 技術も同じだなと思いました。

暑いので以前に行った雪山の写真を添付します。

山本 哲也 (記事一覧)

カスタマーサクセス部のインフラエンジニア。

山を走るのが趣味です。