Amazon SESでメール送信するときは必ず設定セットを使う

設定セットとは

送信するメッセージに適用できるルールのグループのこと。
例えば

  • 成功したらログをCloudWatchに送信する
  • 配信(相手先に到達)したらSNSで通知する
  • テンプレートのレンダリングに失敗したらログをCloudWatchに送信する

というようなルールをあらかじめ定めておく。
定義した設定セットをメール送信時に利用すると、発生したイベントに該当するルールを実行してくれる。

使い方

説明のサンプルコードはAWS SDK for JavaScript v3SESv2Client.SendEmailCommandを使う。

docs.aws.amazon.com

先に答えを書くと、下記のようなコードになる。

const { SESv2Client, SendEmailCommand } = require("@aws-sdk/client-sesv2");
const client = new SESv2Client({ region: "us-east-1" });

const params = {
  ConfigurationSetName: "利用する設定セット名",
  Destination: {
    ToAddresses: ["宛先メールアドレス"],
  },
  Content: {
    Template: {
      TemplateName: "利用するテンプレート名",
      TemplateData: "テンプレートに設定するデータ文字列",
    }
  },
  FromEmailAddress: '検証済みメールアドレス',
};

const command = new SendEmailCommand(params);
const response = await client.send(command);

SendEmailCommandに設定するパラメーターの中にConfigurationSetNameを含めるだけでよい。

これでメールを送信した場合、設定セットに定義したルールに該当するイベントが発生すると、ルールを実行してくれるという寸法だ。

おすすめとしては失敗系をCloudWatchやSNSに配信するルールだ。メールはどこかに到達しない限りなにが起こっているのか把握しづらい。最低限、失敗に関する情報を通知すれば、問題解決しやすくなるだろう。

なぜいまさらこのような記事を書いたか

AWS SDK for JavaScript v3を使いテンプレートメールを送信するLambdaを作って使っていた。

あるとき、少しテンプレート周りの処理をいじったらメールが送信できなくなってしまった。原因がわからなかった。もしかしたらDMARCの影響?と思って、AWSコンソールからテストメールを送信するも、これは問題なく配信できた。

丸二日ほど原因不明で、SESに関するログもなく、いまだDMARCが原因なのかもしれないという思いから、もしかしたらSESv2Clientを利用することでDMARC関連の何かが解決するのかもしれないと思って処理を直した。解決しなかった・・・😭

改めてSESv2Client.SendEmailCommandのドキュメントを読んでみるとConfigurationSetNameを設定できることに気づく1。もともと設定セット自体は作ってあったのだが使い方がわからずに放置していた。そうか、ここで使うのかといまごろ気づいたのだった。

設定セットを使ってメールを送信してみたところ、メールでエラー内容が通知された。やっと原因がわかった瞬間だった。

原因はテンプレートに定義した変数に値が設定されていないことによるものだった。そういえば設定する値が取れなくなったから消してしまうかと考えて、テンプレートに渡すパラメーターから消していたのだった。

問題が解決し、この情報はぜひとも世の中に発信しなくては!という思いから記事を書いた。
いつか誰かメール送信で困っていたときに発見してもらえたら嬉しい。


  1. ちなみにSESClient.SendTemplatedEmailCommandにもConfigurationSetNameはあるのだった