[アップデート] Amazon SES v2 API の SendEmail/SendBulkEmail で簡単にインライン添付ファイル送信ができるようになりました
いわさです。
メール送信時にファイルを添付することが出来ますが、その添付ファイルをメール本文内に直接埋め込む方法があります。
よく画像ファイルを添付して Content-ID を付与し、HTML 内で使用したりします。
AWS のメール送信サービスである Amazon SES でも従来から送信を行うことは出来たのですが、これまでは送信メールの RAW データを自分で構築する必要があり、ちょっと面倒でした。
これが先日のアップデートで送信 API の中でパラメータ指定するだけで簡単に添付ファイルのインライン埋め込みができるようになりました。
今回画像ファイルを添付して送信してみましたので検証内容を紹介します。
注意点として、Amazon SES には V1 と V2 の API が存在しておりそのどちらかもメール送信ができるのですが、今回の機能は V2 でのみ利用出来ます。
Attachments の ContentDisposition で INLINE を指定する
今回は PNG 画像ファイルを SendEmail を使ってインラインで表示してみます。
公式ドキュメントに注記されているように、V1 API や、あるいは SES API ではなく SMTP 送信している場合は従来どおり RAW データでの埋め込みを頑張る必要があります。[1]
SendEmail SES API v2 with Raw content type, SMTP interface, and SES API v1 continue to handle attachments through raw email MIME message construction.
RawContent
に添付データの Base64 エンコードデータを設定するのは従来どおりですが、ContentDisposition
にINLINE
を指定します。
そしてContentId
に任意の cid を設定します。この cid を本文内で参照する形となります。
また、公式ドキュメントに記載されていないのですが、ContentTransferEncoding
にBASE64
を指定する必要があります。
上記を組み込んだ API のパラメータで SendEmail を呼び出した様子が以下です。
% cat hoge.json
{
"FromEmailAddress": "hoge0405@mail1.tak1wa.com",
"Destination": {
"ToAddresses": [
"hoge@example.com"
]
},
"Content": {
"Simple": {
"Subject": {
"Data": "hoge subject"
},
"Body": {
"Html": {
"Data": "<html><body>hoge:<br><img src=\"cid:iwasa\"></body></html>"
}
},
"Attachments": [
{
"RawContent": "iVBORw0KGg ... gICAgICAgICA=",
"ContentDisposition": "INLINE",
"FileName": "iwasa.png",
"ContentId": "iwasa",
"ContentTransferEncoding": "BASE64"
}
]
}
}
}
% aws sesv2 send-email --cli-input-json file://param.json --profile hoge
{
"MessageId": "010601960cb2f241-8a5bca5a-0b48-4755-82a9-96291eb020e6-000000"
}
すぐに E メールを受信しました。
今回は Gmail で受信したのですが次のように本文内に画像を表示することが出来ました。
外部の HTML サーバーで画像を公開せずに埋め込めるのは非常に良いですね。
一方で添付ファイルによってメールサイズが大きくなりがちなので、そこは認識しておきましょう。
また、従来の Amazon SES の添付ファイルの制限(サイズが 40 MB まで、サポートされているファイルタイプであること)などは従来どおりです。
受信メールの RAW データを確認してみます。
Delivered-To: hoge@example.com
Received: by 2002:a05:7300:434d:b0:166:9f67:461b with SMTP id w13csp3920710dye;
Sun, 6 Apr 2025 14:08:26 -0700 (PDT)
:
To: hoge@example.com
Subject: hoge subject
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="----=_Part_1161337_1547749885.1743973704504"
Message-ID: <010601960ceee338-dbb7589f-84b0-43f0-a929-a0b810fbf13a-000000@ap-northeast-1.amazonses.com>
Date: Sun, 6 Apr 2025 21:08:24 +0000
Feedback-ID: ::1.ap-northeast-1.DyzgXV4ryrxHyJuJ28jpeei4aIo+MChMQzZfLJfMJ2s=:AmazonSES
X-SES-Outgoing: 2025.04.06-23.251.234.4
------=_Part_1161337_1547749885.1743973704504
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 7bit
<html><body>header<br><img src="cid:iwasa"><br>footer<img alt="" src="https://1fq2t9rs.r.ap-northeast-1.awstrack.me/I0/010601960ceee338-dbb7589f-84b0-43f0-a929-a0b810fbf13a-000000/NuL2Brpi81PotJaYbd8tM1fr5zA=205" style="display: none; width: 1px; height: 1px;">
</body></html>
------=_Part_1161337_1547749885.1743973704504
Content-Type: image/png; name=iwasa.png
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=iwasa.png
Content-ID: <iwasa>
iVBORw0KGg ... gICAgICAgICA=
------=_Part_1161337_1547749885.1743973704504--
従来このような感じで組み立てが必要だったのですが、うまいこと Amazon SES API がやってくれるようになりましたね。便利です。
さいごに
本日は Amazon SES v2 API の SendEmail/SendBulkEmail で簡単にインライン添付ファイル送信ができるようになったので使ってみました。
これまで SES API を使いたかったけどインライン表示のために RAW データで頑張っていた方、諦めて外部 HTML 参照にしていたという方は是非試してみてください。