【问题标题】:How to send html mail using AWS SES sendEmail API如何使用 AWS SES sendEmail API 发送 html 邮件
【发布时间】:2026-02-17 22:15:02
【问题描述】:

我正在尝试使用 sendEmail API 通过 AWS SES 发送 HTML 电子邮件。

如果我删除内容类型标题,它会完美运行。

#!/bin/bash

TO="a@b.com"
FROM="b@a.com"
SUBJECT="test subject"
MESSAGE="<B>Test Message</B><br /> test message"

date="$(date -R)"
access_key="<aws key>"
priv_key="secret key>"
signature="$(echo -n "$date" | openssl dgst -sha256 -hmac "$priv_key" -binary | base64 -w 0)"
auth_header="X-Amzn-Authorization: AWS3-HTTPS AWSAccessKeyId=$access_key, Algorithm=HmacSHA256, Signature=$signature"
endpoint="https://email.us-west-2.amazonaws.com/"
content_type="Content-Type: text/html"
mime_version="MIME-Version: 1.0"
action="Action=SendEmail"
source="Source=$FROM"
to="Destination.ToAddresses.member.1=$TO"
subject="Message.Subject.Data=$SUBJECT"
message="Message.Body.Text.Data=$MESSAGE"

curl -v -X POST -H "$auth_header" -H "Date: $date" -H "$content_type" -H "$mime_version" -H "Content-Length: 50" --data-urlencode "$message" --data-urlencode "$to" --data-urlencode "$source" --data-urlencode "$action" --data-urlencode "$subject"  "$endpoint"

但内容类型设置为 text/html 时出现此错误

<AccessDeniedException>
<Message>Unable to determine service/operation name to be authorized</Message> 
</AccessDeniedException>

请帮忙。

【问题讨论】:

标签: bash amazon-web-services html-email


【解决方案1】:

如果我删除内容类型标题,它会完美运行。

是的,因为您在此处使用的 Content-Type: text/html 标头是错误的。

HTTP 请求的Content-Type: 标头与邮件正文无关——它是API 请求的内容类型。正确的值是 application/x-www-form-urlencoded -- 请注意,这就是您使用 --data-urlencode...编码POST 正文的方式...这是正确的。

因此,当您不手动设置它时,curl 会为您设置它,或者 API 会让您松懈并假设它是预期的编码,因为您没有另外指定...但是指定编码错误,API 拒绝内容,因为它对接收系统没有意义。

告诉 SES API 您正在发送 HTML 正文的方法是更改​​它...

message="Message.Body.Text.Data=$MESSAGE"

...到这个...

message="Message.Body.Html.Data=$MESSAGE"

http://docs.aws.amazon.com/ses/latest/APIReference/API_Body.html

您还可以同时发送两个正文,纯文本和 HTML,方法是同时包含两者。这样,支持 HTML 多部分/替代功能的邮件阅读器将呈现 HTML 正文,其他更原始的邮件阅读器将呈现文本正文。

【讨论】: