2016-04-20 2 views
1

Я пытаюсь отправить электронную почту HTML через AWS SES с помощью API sendEmail.Как отправить html-почту с помощью AWS SES sendEmail API

Он отлично работает, если я удаляю заголовок типа содержимого.

#!/bin/bash 

TO="[email protected]" 
FROM="[email protected]" 
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" 

Но с типом контента, установленным в текст/html Я получаю эту ошибку

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

Пожалуйста, помогите.

+0

Не ответ на ваш вопрос, но вы можете сделать жизнь проще для себя, если вы использовали CLS AWS :) См. Http://docs.aws.amazon.com/cli/latest/reference/ses/send-raw -email.html – mickzer

ответ

0

Он отлично работает, если я удаляю заголовок типа содержимого.

Да, потому что ваше использование заголовка Content-Type: text/html здесь неверно.

Заголовок HTTP-запроса Content-Type: не имеет ничего общего с телом почты - это тип содержимого запроса API. Правильное значение: application/x-www-form-urlencoded - обратите внимание, что именно так вы находитесь кодировкаPOST тело с --data-urlencode ... это правильно.

Таким образом, если вы не устанавливаете его вручную, либо завиток настраивает его для вас, либо API сокращает вам слабину и предполагает, что это ожидаемая кодировка, поскольку вы не указали иначе ... но укажите неправильная кодировка и API отвергают контент, поскольку он не имеет смысла для принимающей системы.

Путь сказать API SES, что вы отправляете 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, другие более примитивные почтовые программы будут отображать текст.

+0

Спасибо, Майкл, это сработало. – kanadenipun

Смежные вопросы