#!/bin/bash
set -e
AWS_ACCESS_KEY=""
AWS_SECRET_KEY=""
REGION="us-east-1"
SERVICE="ses"
SOURCE_EMAIL=""
uri_encode() {
local string="$1"
local length=${#string}
for (( i = 0; i < length; i++ )); do
local c="${string:$i:1}"
case $c in
[a-zA-Z0-9_.~-]) printf "$c" ;;
*) printf '%%%02X' "'$c" ;;
esac
done
}
hmac_sha256() {
local key="$1"
local data="$2"
echo -n "$data" | openssl dgst -sha256 -hmac "$key" -binary
}
RECIPIENT="$1"
SUBJECT="$2"
BODY="$3"
TIMESTAMP=$(date -u +"%Y%m%dT%H%M%SZ")
DATE=$(echo "$TIMESTAMP" | cut -c 1-8)
REQUEST_PARAMS=$(cat <<EOF
Action=SendEmail
&Version=2010-12-01
&Source=$(uri_encode "$SOURCE_EMAIL")
&Destination.ToAddresses.member.1=$(uri_encode "$RECIPIENT")
&Message.Body.Text.Data=$(uri_encode "$BODY")
&Message.Body.Text.Charset=UTF-8
&Message.Subject.Data=$(uri_encode "$SUBJECT")
&Message.Subject.Charset=UTF-8
EOF
)
HOST="email.${REGION}.amazonaws.com"
CANONICAL_HEADERS="content-type:application/x-www-form-urlencoded; charset=utf-8\nhost:${HOST}\nx-amz-date:${TIMESTAMP}"
SIGNED_HEADERS="content-type;host;x-amz-date"
HASHED_PAYLOAD=$(echo -n "$REQUEST_PARAMS" | openssl dgst -sha256 -hex | cut -d' ' -f2)
CANONICAL_REQUEST="POST\n/\n\n${CANONICAL_HEADERS}\n\n${SIGNED_HEADERS}\n${HASHED_PAYLOAD}"
HASHED_CANONICAL_REQUEST=$(echo -en "$CANONICAL_REQUEST" | openssl dgst -sha256 -hex | cut -d' ' -f2)
ALGORITHM="AWS4-HMAC-SHA256"
CREDENTIAL_SCOPE="${DATE}/${REGION}/${SERVICE}/aws4_request"
STRING_TO_SIGN="${ALGORITHM}\n${TIMESTAMP}\n${CREDENTIAL_SCOPE}\n${HASHED_CANONICAL_REQUEST}"
DATE_KEY=$(hmac_sha256 "AWS4${AWS_SECRET_KEY}" "$DATE")
DATE_REGION_KEY=$(hmac_sha256 "$DATE_KEY" "$REGION")
DATE_REGION_SERVICE_KEY=$(hmac_sha256 "$DATE_REGION_KEY" "$SERVICE")
SIGNING_KEY=$(hmac_sha256 "$DATE_REGION_SERVICE_KEY" "aws4_request")
SIGNATURE=$(echo -en "$STRING_TO_SIGN" | openssl dgst -sha256 -hmac "$SIGNING_KEY" -binary | xxd -p -c 256)
AUTHORIZATION_HEADER="${ALGORITHM} Credential=${AWS_ACCESS_KEY}/${CREDENTIAL_SCOPE}, SignedHeaders=${SIGNED_HEADERS}, Signature=${SIGNATURE}"
echo "$CANONICAL_REQUEST"
echo "$STRING_TO_SIGN"
echo "================="
RESPONSE=$(curl -s -w "\n%{http_code}" -X POST "https://${HOST}/"
-H "Content-Type: application/x-www-form-urlencoded; charset=utf-8"
-H "Host: ${HOST}"
-H "X-Amz-Date: ${TIMESTAMP}"
-H "Authorization: ${AUTHORIZATION_HEADER}"
-d "$REQUEST_PARAMS")
BODY=$(echo "$RESPONSE" | sed '$d')
STATUS=$(echo "$RESPONSE" | tail -n1)
echo "$STATUS"
echo "$BODY"