如何使用纯HTTP请求(cURL)通过Amazon SES发送邮件?
使用cURL通过Amazon SES发送邮件(无需AWS SDK)
要直接用cURL调用Amazon SES的SendEmail API,核心是处理AWS的Signature Version 4(SigV4)签名——所有AWS API请求都需要这个签名验证身份。以下是完整实操步骤:
前提条件
- 拥有AWS账号,创建具备
ses:SendEmail权限的IAM用户,获取其Access Key ID和Secret Access Key。 - 已在SES中验证发件人邮箱/域名;若处于沙盒模式,收件人邮箱也需验证。
- 确定你的SES服务区域(比如
us-east-1、eu-west-1)。
步骤1:准备请求体
创建JSON格式的请求体文件(例如命名为email.json),内容示例:
{ "Source": "sender@example.com", "Destination": { "ToAddresses": ["recipient@example.com"] }, "Message": { "Subject": { "Data": "测试邮件", "Charset": "UTF-8" }, "Body": { "Text": { "Data": "这是通过cURL直接调用SES发送的测试邮件", "Charset": "UTF-8" } } } }
步骤2:自动生成SigV4签名并执行cURL
手动计算SigV4签名极易出错,推荐用bash脚本自动完成。以下是可直接复用的脚本,替换占位符即可:
#!/bin/bash # 替换为你的实际配置 AWS_ACCESS_KEY_ID="你的Access Key ID" AWS_SECRET_ACCESS_KEY="你的Secret Access Key" AWS_REGION="us-east-1" AWS_SERVICE="ses" API_ENDPOINT="https://email.${AWS_REGION}.amazonaws.com" REQUEST_METHOD="POST" REQUEST_URI="/" REQUEST_BODY_FILE="email.json" # 生成日期参数(UTC时间) DATE=$(date -u +"%Y%m%d") DATETIME=$(date -u +"%Y%m%dT%H%M%SZ") # 读取请求体内容 REQUEST_BODY=$(cat $REQUEST_BODY_FILE) # 1. 构建规范请求 CANONICAL_REQUEST=$(printf "%s\n%s\n%s\n%s\n%s\n%s" \ "$REQUEST_METHOD" \ "$REQUEST_URI" \ "" \ "content-type:application/x-amz-json-1.1"$'\n'"host:email.${AWS_REGION}.amazonaws.com"$'\n'"x-amz-date:$DATETIME"$'\n'"x-amz-target:SimpleEmailService_v20101201.SendEmail" \ "content-type;host;x-amz-date;x-amz-target" \ $(echo -n "$REQUEST_BODY" | openssl dgst -sha256 -hex | sed 's/^.* //')) # 2. 构建待签名字符串 STRING_TO_SIGN=$(printf "%s\n%s\n%s\n%s\n%s" \ "AWS4-HMAC-SHA256" \ "$DATETIME" \ "$DATE/$AWS_REGION/$AWS_SERVICE/aws4_request" \ $(echo -n "$CANONICAL_REQUEST" | openssl dgst -sha256 -hex | sed 's/^.* //')) # 3. 生成签名密钥 KEY="AWS4$AWS_SECRET_ACCESS_KEY" K_DATE=$(echo -n "$DATE" | openssl dgst -sha256 -hmac "$KEY" -binary) K_REGION=$(echo -n "$AWS_REGION" | openssl dgst -sha256 -hmac "$K_DATE" -binary) K_SERVICE=$(echo -n "$AWS_SERVICE" | openssl dgst -sha256 -hmac "$K_REGION" -binary) K_SIGNING=$(echo -n "aws4_request" | openssl dgst -sha256 -hmac "$K_SERVICE" -binary) # 4. 计算最终签名 SIGNATURE=$(echo -n "$STRING_TO_SIGN" | openssl dgst -sha256 -hmac "$K_SIGNING" -hex | sed 's/^.* //') # 5. 构建授权头 AUTH_HEADER=$(printf "AWS4-HMAC-SHA256 Credential=%s/%s/%s/%s/aws4_request, SignedHeaders=%s, Signature=%s" \ "$AWS_ACCESS_KEY_ID" \ "$DATE" \ "$AWS_REGION" \ "$AWS_SERVICE" \ "content-type;host;x-amz-date;x-amz-target" \ "$SIGNATURE") # 执行cURL请求 curl -X POST "$API_ENDPOINT" \ -H "Content-Type: application/x-amz-json-1.1" \ -H "X-Amz-Date: $DATETIME" \ -H "X-Amz-Target: SimpleEmailService_v20101201.SendEmail" \ -H "Authorization: $AUTH_HEADER" \ -d "$REQUEST_BODY"
步骤3:运行脚本
- 将脚本保存为
send-ses-email.sh,替换所有占位符为你的实际信息。 - 赋予执行权限:
chmod +x send-ses-email.sh。 - 运行脚本:
./send-ses-email.sh。
常见问题排查
- 请求失败时,先检查IAM用户权限是否包含
ses:SendEmail,发件人/收件人邮箱是否完成SES验证。 - 沙盒模式下,SES仅允许发送到已验证的邮箱地址,如需发送到任意地址需申请移出沙盒。
- 确保系统已安装
openssl工具(脚本依赖其计算哈希值)。
内容的提问来源于stack exchange,提问作者Umut Çağdaş Coşkun
相关产品推荐
相关产品推荐

