Send emails via Amazon SES with Bash and cURL
Simple shell script to send emails via Amazon SES.
To work properly, adjust Bash environment variables TO
, FROM
, SUBJECT
and MESSAGE
.
Also AWS_SECRET_KEY
and AWS_ACCESS_KEY
environment variables have to be properly set.
#!/bin/bash
TO="Email To <to@example.com>"
FROM="Email From <from@example.com>"
SUBJECT="<YOUR SUBJECT HERE>"
MESSAGE="<YOUR MESSAGE HERE>"
date="$(date -R)"
priv_key="$AWS_SECRET_KEY"
access_key="$AWS_ACCESS_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-east-1.amazonaws.com/"
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 "Date: $date" -H "$auth_header" --data-urlencode "$message" --data-urlencode "$to" --data-urlencode "$source" --data-urlencode "$action" --data-urlencode "$subject" "$endpoint"
Written by Bruno Coimbra
Related protips
9 Responses
Thanks. But I have error on Mac OS Lion,
date: illegal option -- R
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...
[-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
base64: invalid option -- w
It'd be nice, but, on an Amazon EC2 server, running Linux the output is:
500 Error: command not implemented
500 Error: command not implemented
500 Error: command not implemented
500 Error: command not implemented
500 Error: command not implemented
500 Error: command not implemented
500 Error: command not implemented
500 Error: command not implemented
500 Error: bad syntax
This script worked wonderfully for me (running it under Ubuntu). Thanks for developing it and sharing!
@nvphong, macos version of date hasn't this option, but GNU date has. This option produces a date in rfc-2822 format. Any tool that produce dates in this format can be used to replace date -R
.
Thanks Bruno for this. !! Works like a charm.
I was wondering how to send the html mail.
tried adding a "Content-Type: text/html" header, but I'm getting this error :
<AccessDeniedException>
<Message>Unable to determine service/operation name to be authorized</Message>
</AccessDeniedException>
@kanadenipun, for HTML E-mails, I believe that you just need to send additional parameter with:
--data-urlencode "Message.Body.Html.Data=<your_html_message>"
On Mac, change date -R
to date +"%a, %d %b %Y %H:%M:%S %Z"
and base64 -w 0
to base64 -b 0
Thanks for the code. It worked before but now it doesn't work. Below is the error that i see when we use this code. Please help with the error.
< HTTP/1.1 403 Forbidden
< x-amzn-RequestId: 47a43537-0409-11e7-b7f5-6bd59eed771b
< Content-Type: text/xml
< Content-Length: 430
< Date: Wed, 08 Mar 2017 14:12:35 GMT
<
<ErrorResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
<Error>
<Type>Sender</Type>
SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.</Message>
</Error>
<RequestId>47a43537-0409-11e7-b7f5-6bd59eed771b</RequestId>
</ErrorResponse>
* Connection #0 to host email.us-east-1.amazonaws.com left intact
How to upgrade this to aws signature version 4 ??