You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用纯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:运行脚本

  1. 将脚本保存为send-ses-email.sh,替换所有占位符为你的实际信息。
  2. 赋予执行权限:chmod +x send-ses-email.sh。
  3. 运行脚本:./send-ses-email.sh。

常见问题排查

  • 请求失败时,先检查IAM用户权限是否包含ses:SendEmail,发件人/收件人邮箱是否完成SES验证。
  • 沙盒模式下,SES仅允许发送到已验证的邮箱地址,如需发送到任意地址需申请移出沙盒。
  • 确保系统已安装openssl工具(脚本依赖其计算哈希值)。

内容的提问来源于stack exchange,提问作者Umut Çağdaş Coşkun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 05:25:21