亚马逊AWS官方博客

Amazon SES 电商邮件运营:从零到一搭建发送平台

概述

在电商数字化时代,邮件营销仍然是 ROI 最高的营销渠道之一——每投入 $1 可带来平均 $42 的回报。无论是订单确认、发货通知,还是促销活动、用户召回,邮件都是触达用户的关键通道。

Amazon SES (Simple Email Service) 作为 AWS 的云邮件服务,为电商企业提供了可靠、可扩展且经济高效的邮件发送平台。本文将帮助你快速搭建 SES 邮件发送系统,并掌握电商场景下的关键决策点。

为什么电商企业选择 SES?

🚀 弹性扩展,应对促销高峰 – 从日常数千封到大促数百万封,无需提前采购硬件 – 自动扩展,无需担心双十一、黑五流量峰值

💰 按需付费,成本可控 – $0.10/千封邮件(前 62,000 封免费) – 无最低费用,无需长期合同 – 相比自建邮件服务器,节省 70%+ 成本

📈 高送达率,直达收件箱 – AWS 全球 IP 声誉管理 – 灵活的专用 IP 和共享 IP 策略 – 完整的身份验证支持(SPF/DKIM/DMARC)

🔗 AWS 生态集成 – 与 CloudWatch 监控无缝集成 – 通过 Lambda 实现自动化处理 – 使用 S3 存储邮件内容和附件

📚 官方资源: – Amazon SES 产品页面SES 定价详情SES 常见问题

使用场景

场景类型 典型用例 发送特点
事务型邮件 订单确认、发货通知、密码重置、账单 实时触发、高优先级、送达率要求高
营销型邮件 促销活动、新品推荐、用户召回、会员通讯 批量发送、可延迟、需要 A/B 测试

快速入门:使用 Setup Wizard 零遗漏配置

💡 前置条件:拥有 AWS 账号和一个已验证的域名

SES Setup Wizard – 新手友好的引导式配置

SES 提供了完整的 Setup Wizard(设置向导),特别适合第一次搭建邮件营销平台的用户。向导会引导你完成所有必要配置,确保不遗漏任何关键步骤。

SES Setup Wizard

Setup Wizard 覆盖的配置项

  1. ✅ 域名身份验证(Domain Identity)
  2. ✅ 身份认证配置(SPF/DKIM/DMARC)
  3. ✅ 生产访问申请(Moving out of sandbox)
  4. ✅ Configuration Set 创建
  5. ✅ VDM 启用和配置
  6. ✅ 发送测试邮件

使用 Setup Wizard 的优势: – 🎯 零遗漏:按步骤引导,不会错过关键配置 – 🚀 快速上手:15-20 分钟完成全部配置 – 📋 最佳实践:自动应用 AWS 推荐的配置 – 🔍 实时验证:每步配置后立即验证是否成功

创建身份

💡 建议:首次使用 SES 时,强烈推荐使用 Setup Wizard,可以避免 90% 的常见配置错误。

步骤 1:区域选择与配额申请

选择合适的 AWS 区域

电商企业选择区域的三个考虑因素:

  1. 用户地理位置:选择离目标用户最近的区域,降低延迟
  2. 合规要求:某些国家/地区有数据本地化要求
  3. 成本优化:不同区域价格略有差异
区域 适用场景 备注
us-east-1 (弗吉尼亚) 北美、全球业务 功能最全、价格最优
eu-west-1 (爱尔兰) 欧洲业务 GDPR 合规
ap-southeast-1 (新加坡) 东南亚业务 亚太区域中心

移出沙箱环境

新账号默认处于沙箱模式,限制: – 每日最多发送 200 封邮件 – 发送速率:1 封/秒 – 只能发送到已验证的邮箱地址

申请生产访问权限: 1. 进入 SES 控制台 2. 点击 “Request production access” 3. 填写申请表单(说明业务用途、预期发送量) 4. 通常 24 小时内获得批准

📚 参考文档Moving out of the Amazon SES sandbox

配额规划建议

根据电商业务规模规划配额:

业务规模 日发送量 发送速率 建议配额
小型电商 < 1万 5-10 封/秒 默认配额即可
中型电商 1-10万 10-50 封/秒 申请提升至 10万/天
大型电商 > 10万 50-100 封/秒 根据大促峰值申请

步骤 2:域名验证与身份认证

验证发信域名

在 SES 控制台验证你的域名(如 example.com): 1. 创建域名身份 2. 添加 DNS 记录(SES 会提供具体记录) 3. 等待验证完成(通常几分钟)

配置 SPF、DKIM、DMARC

这三个协议是邮件送达收件箱的关键:

# SPF 记录 – 指定哪些服务器可以代表你的域名发送邮件
example.com. IN TXT “v=spf1 include:amazonses.com ~all”

# DKIM 记录 – SES 自动生成,添加到 DNS
# 格式:<selector>._domainkey.example.com

# DMARC 记录 – 定义邮件认证失败时的处理策略
_dmarc.example.com. IN TXT “v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com”

📚 参考文档: – Verifying domains in Amazon SESAuthenticating Email with DKIM

为什么这些很重要? – ✅ 提高送达率 15-20% – ✅ 避免被标记为垃圾邮件 – ✅ 保护品牌声誉,防止域名被冒用

步骤 3:选择发送方式

SES 提供两种发送方式,根据你的技术栈选择:

方式 1:SMTP 接口(推荐用于现有系统集成)

import smtplib
from email.mime.text import MIMEText

# SMTP 配置
smtp_host = "email-smtp.us-east-1.amazonaws.com"
smtp_port = 587
smtp_username = "YOUR_SMTP_USERNAME"
smtp_password = "YOUR_SMTP_PASSWORD"

# 发送邮件
msg = MIMEText("您的订单已发货!", "plain", "utf-8")
msg["Subject"] = "订单发货通知"
msg["From"] = "noreply@example.com"
msg["To"] = "customer@example.com"

with smtplib.SMTP(smtp_host, smtp_port) as server:
    server.starttls()
    server.login(smtp_username, smtp_password)
    server.send_message(msg)

方式 2:API/SDK(推荐用于新系统开发)

import boto3

ses_client = boto3.client('ses', region_name='us-east-1')

response = ses_client.send_email(
    Source='noreply@example.com',
    Destination={'ToAddresses': ['customer@example.com']},
    Message={
        'Subject': {'Data': '订单发货通知', 'Charset': 'UTF-8'},
        'Body': {
            'Text': {'Data': '您的订单已发货!', 'Charset': 'UTF-8'}
        }
    }
)

📚 参考文档Sending email with Amazon SES

步骤 4:IP 策略选择(关键决策)

这是电商企业最重要的决策之一,直接影响送达率和成本。SES 提供 3 种 IP 预热方式,适合不同场景。

IP 预热方式对比

预热方式 适用场景 预热时间 控制粒度 弹性扩容 成本
自管理预热 对 IP 信誉要求极高,不接受 Public IP 分流 4-6 周 完全自主 手动 $24.95/月/IP
标准自动预热 接受前期 Public IP 分流,或已有预热好的 DIP 扩容 4 周 精细化追踪 手动 $24.95/月/IP
托管 IP 池预热 接受前期 Public IP 分流,需要长期弹性扩容 自动 AWS 托管 自动 $24.95/月/IP

方式 1:自管理预热(Manual Warm-up)

适用场景: – ✅ 对 IP 信誉要求极高的企业(如金融、医疗) – ✅ 不希望使用 Public IP 池发送任何邮件 – ✅ 需要完全掌控预热进度

特点: – 完全手动控制每日发送量 – 不使用 AWS 的 Public IP 池分流 – 需要自己监控和调整预热进度

预热计划

Week 1: 500 → 2,000 封/天
Week 2: 5,000 → 20,000 封/天
Week 3: 50,000 → 100,000 封/天
Week 4: 200,000 → 目标量

方式 2:标准自动预热(Standard Auto Warm-up)

适用场景: – ✅ 接受前期利用 Public IP 池分流部分流量 – ✅ 已有预热好的 DIP,需要扩容新 IP – ✅ 需要精细化追踪预热进度

特点: – AWS 自动管理预热进度 – 提供 预热百分比进度追踪(0% → 100%) – 前期流量自动分流到 Public IP 池 – 可以手动调整预热百分比

预热进度示例

# 查询预热进度
aws sesv2 get-dedicated-ip --ip 192.0.2.1

# 输出示例
{
  "DedicatedIp": {
    "Ip": "192.0.2.1",
    "WarmupStatus": "IN_PROGRESS",
    "WarmupPercentage": 45,  # 当前预热进度 45%
    "PoolName": "my-pool"
  }
}

# 手动调整预热进度(高级用户)
aws sesv2 put-dedicated-ip-warmup-attributes \
  --ip 192.0.2.1 \
  --warmup-percentage 50

优势: – 📊 精细化控制:可以根据预热百分比做精细化的流量控制 – 🎯 进度可视化:清楚知道预热到什么阶段 – 🔧 灵活调整:可以加速或减速预热进度

方式 3:托管 IP 池预热(Managed IP Pool)

适用场景: – ✅ 接受前期利用 Public IP 池分流部分流量 – ✅ 需要长期弹性扩容 DIP 数量 – ✅ 希望最简单的 DIP 使用方式

特点: – AWS 完全托管 IP 的申请、预热、扩容、释放 – 根据发送量自动增减 IP 数量 – 无需关心预热进度,AWS 自动处理 – 最省心的 DIP 使用方式

自动扩容示例

初始状态:1 个 DIP,日发送 10 万封

发送量增长到 50 万封

AWS 自动申请并预热第 2 个 DIP

发送量增长到 100 万封

AWS 自动申请并预热第 3 个 DIP

发送量降回 30 万封

AWS 自动释放多余的 DIP

配置示例

# 创建托管 IP 池
aws sesv2 create-dedicated-ip-pool \
  --pool-name managed-pool \
  --scaling-mode MANAGED

# AWS 会自动:
# 1. 根据发送量决定需要几个 IP
# 2. 自动申请和预热新 IP
# 3. 自动释放不需要的 IP

三种方式的选择建议

决策树

你是否接受前期使用 Public IP 分流?
├─ 否 → 自管理预热
│   └─ 完全掌控,但需要人工监控

└─ 是 → 继续判断

├─ 需要精细化控制预热进度?
│   ├─ 是 → 标准自动预热
│   │   └─ 可追踪百分比,灵活调整
│   │
│   └─ 否 → 托管 IP 池预热
│       └─ 最省心,自动扩容

电商实战建议

业务阶段 推荐方式 原因
初创期 共享 IP 发送量小,无需 DIP
成长期 标准自动预热 需要 DIP,但发送量相对稳定
成熟期 托管 IP 池 发送量波动大,需要弹性扩容
大促期 标准自动预热 提前规划,精细控制

💡 重要提示: – 标准自动预热和托管 IP 池都会在前期使用 Public IP 分流,这是正常的 – 如果已有预热好的 DIP,使用标准自动预热扩容新 IP 最合适 – 托管 IP 池是长期来看最简单的方式,适合发送量波动大的业务

步骤 5:配置监控与测试

设置 Configuration Set

Configuration Set 用于捕获邮件发送事件(送达、打开、点击、退信、投诉):

# 创建 Configuration Set
aws sesv2 create-configuration-set \
  --configuration-set-name ecommerce-emails

# 添加事件目标(发送到 CloudWatch)
aws sesv2 create-configuration-set-event-destination \
  --configuration-set-name ecommerce-emails \
  --event-destination-name cloudwatch-destination \
  --event-destination '{
    "CloudWatchDestination": {
      "DimensionConfigurations": [{
        "DimensionName": "campaign",
        "DimensionValueSource": "MESSAGE_TAG",
        "DefaultDimensionValue": "default"
      }]
    }
  }'

使用 SES 模拟器测试

在发送真实邮件前,使用模拟器测试各种场景:

# 测试成功送达
test_addresses = {
    'success': 'success@simulator.amazonses.com',
    'bounce': 'bounce@simulator.amazonses.com',
    'complaint': 'complaint@simulator.amazonses.com',
    'suppressed': 'suppressed@simulator.amazonses.com'
}

📚 参考文档: – Using configuration setsTesting email sending

核心概念:确保邮件进入收件箱

关键健康指标

ISP(互联网服务提供商)通过两个核心指标判断你的发件人声誉:

指标 健康阈值 警告阈值 危险阈值 说明
退信率 (Bounce Rate) < 5% 5-10% > 10% 邮箱地址无效或不存在
投诉率 (Complaint Rate) < 0.1% 0.1-0.5% > 0.5% 用户标记为垃圾邮件

电商场景常见问题: – ❌ 使用购买的邮件列表 → 高退信率 – ❌ 未提供退订链接 → 高投诉率 – ❌ 发送频率过高 → 用户疲劳,投诉增加

最佳实践: – ✅ 只向明确订阅的用户发送 – ✅ 定期清理无效邮箱(硬退信) – ✅ 提供明显的退订链接 – ✅ 控制发送频率(建议每周不超过 2-3 次)

邮件发送生命周期

发送前:列表健康管理

# 示例:清理退信邮箱
def clean_bounce_list(email_list, bounce_records):
    """移除硬退信邮箱"""
    hard_bounces = {r['email'] for r in bounce_records if r['type'] == 'Permanent'}
    return [email for email in email_list if email not in hard_bounces]

# 示例:用户分群
def segment_users(users):
    """根据活跃度分群"""
    return {
        'active': [u for u in users if u['last_open_days'] < 30],
        'inactive': [u for u in users if 30 <= u['last_open_days'] < 90],
        'dormant': [u for u in users if u['last_open_days'] >= 90]
    }

发送中:实时监控

关键监控指标: – 发送量趋势 – 实时退信率 – 实时投诉率 – API 错误率

发送后:数据分析

# 计算关键指标
def calculate_metrics(campaign_data):
    sent = campaign_data['sent']
    delivered = campaign_data['delivered']
    opened = campaign_data['opened']
    clicked = campaign_data['clicked']
    
    return {
        'delivery_rate': delivered / sent * 100,
        'open_rate': opened / delivered * 100,
        'click_rate': clicked / delivered * 100,
        'ctr': clicked / opened * 100 if opened > 0 else 0
    }

监控与优化

Virtual Deliverability Manager (VDM) – 符合邮件运营需求的监控方案

VDM 是 SES 内置的可视化监控平台,专为邮件业务运营设计,相比传统的 CloudWatch 指标,VDM 更符合电商运营的实际需求。

为什么 VDM 更适合邮件运营?

传统监控工具(如 CloudWatch)只能统计事件数(PV),但邮件运营更关注: – 📊 独立用户数(UV:同一用户多次打开只计 1 次 – 📈 真实参与度:过滤机器人和邮件客户端的自动打开 – 🎯 ISP 级别表现:不同邮件服务商的送达差异 – 📉 趋势对比:历史活动效果对比

VDM 核心优势

维度 CloudWatch VDM 运营价值
打开率统计 PV(事件数) UV(独立用户) 真实反映用户参与度
点击率统计 PV(事件数) UV(独立用户) 准确评估转化效果
ISP 分析 ❌ 不支持 ✅ 支持 定位送达问题
历史对比 需自建 ✅ 内置 90 天 优化活动策略
配置复杂度 需配置 Event Destination ✅ 开箱即用 降低技术门槛

VDM Dashboard 关键指标

VDM 送达率监控

指标 说明 电商运营价值
送达率 成功送达的邮件比例 评估邮件系统健康度
打开率 (UV) 独立用户打开比例 评估主题行吸引力,优化 A/B 测试
点击率 (UV) 独立用户点击比例 评估内容和 CTA 效果,计算真实转化
退信率 硬退信 + 软退信 列表质量指标,触发清洗动作
投诉率 用户标记为垃圾邮件 内容质量和频率指标,避免封号

实际运营场景示例

场景:双十一预热邮件 A/B 测试

传统方式(CloudWatch):
– 主题 A:打开 50,000 次(PV)
– 主题 B:打开 45,000 次(PV)
– 结论:主题 A 更好?❌ 错误!

VDM 方式:
– 主题 A:15,000 独立用户打开(UV),平均每人打开 3.3 次
– 主题 B:18,000 独立用户打开(UV),平均每人打开 2.5 次
– 结论:主题 B 覆盖更多用户,效果更好!✅ 正确!

快速启用

# 1. 启用 VDM(通过控制台或 CLI)
aws sesv2 put-account-vdm-attributes \
  --vdm-attributes '{
    "VdmEnabled": "ENABLED",
    "DashboardAttributes": {"EngagementMetrics": "ENABLED"},
    "GuardianAttributes": {"OptimizedSharedDelivery": "ENABLED"}
  }'

# 2. 启用参与度追踪(打开和点击)
aws sesv2 put-account-vdm-attributes \
  --vdm-attributes '{
    "DashboardAttributes": {
      "EngagementMetrics": "ENABLED"
    }
  }'

VDM Dashboard 使用

  1. 账户概览:查看整体送达率、打开率、点击率趋势
  2. 消息搜索:根据 Message ID 查找具体邮件的送达状态
  3. ISP 数据:分析不同 ISP 的送达情况(Gmail 95%、Outlook 92% 等)
  4. 身份分析:对比不同发件人域名的表现
  5. 配置集分析:对比不同活动的效果

电商运营实战

VDM Dashboard 提供直观的可视化界面,无需编写代码即可查看关键指标:

  1. 访问 VDM Dashboard
  • 登录 SES 控制台
  • 选择 “Virtual Deliverability Manager” → “Dashboard”
  1. 查看关键指标
  • 账户概览:整体送达率、打开率、点击率趋势
  • Configuration Set 分析:对比不同活动的效果
  • ISP 数据:查看 Gmail、Outlook 等不同 ISP 的表现
  • 消息搜索:根据 Message ID 查找具体邮件状态
  1. 导出数据分析
 	# 通过 CLI 导出 VDM 数据
aws sesv2 create-export-job \
  --export-data-source '{
    "MetricsDataSource": {
      "Namespace": "VDM",
      "Metrics": [
        {"Name": "SEND"},
        {"Name": "DELIVERY"},
        {"Name": "OPEN"},
        {"Name": "CLICK"}
      ],
      "StartDate": "2024-12-01T00:00:00Z",
      "EndDate": "2024-12-07T23:59:59Z"
    }
  }' \
  --export-destination '{
    "DataFormat": "CSV",
    "S3Url": "s3://my-bucket/vdm-exports/"
  }'

   4.分析导出的数据

 	import pandas as pd

# 读取导出的 CSV 数据
df = pd.read_csv('vdm-export.csv')

# 计算关键指标
total_sent = df['SEND'].sum()
total_delivered = df['DELIVERY'].sum()
total_opens = df['OPEN'].sum()
total_clicks = df['CLICK'].sum()

print(f"送达率: {total_delivered/total_sent:.2%}")
print(f"打开率 (UV): {total_opens/total_delivered:.2%}")
print(f"点击率 (UV): {total_clicks/total_delivered:.2%}")

📚 参考文档: – Virtual Deliverability ManagerVDM Dashboard

补充:CloudWatch 告警(高级场景)

对于需要自动化响应的场景,可以配置 CloudWatch 告警:

# 创建退信率告警
aws cloudwatch put-metric-alarm \
  --alarm-name ses-high-bounce-rate \
  --alarm-description "SES bounce rate > 5%" \
  --metric-name Reputation.BounceRate \
  --namespace AWS/SES \
  --statistic Average \
  --period 300 \
  --threshold 0.05 \
  --comparison-operator GreaterThanThreshold \
  --evaluation-periods 1 \
  --alarm-actions arn:aws:sns:us-east-1:123456789012:ses-alerts

电商场景优化建议

1.发送时间优化

根据用户行为数据选择最佳发送时间:

邮件类型 最佳发送时间 原因
促销邮件 周二-周四 10:00-11:00 工作日上午打开率最高
订单确认 实时发送 用户期待立即收到
购物车召回 弃购后 1-3 小时 趁热打铁,转化率高
会员通讯 周末 9:00-10:00 用户有时间阅读

2.A/B 测试

# 简单的 A/B 测试实现
def ab_test_send(user_list, subject_a, subject_b, split_ratio=0.5):
    """对比两个主题行的效果"""
    import random
    
    group_a = random.sample(user_list, int(len(user_list) * split_ratio))
    group_b = [u for u in user_list if u not in group_a]
    
    # 发送 A 组
    send_campaign(group_a, subject=subject_a, campaign_id='test_a')
    
    # 发送 B 组
    send_campaign(group_b, subject=subject_b, campaign_id='test_b')
    
    return {'group_a': len(group_a), 'group_b': len(group_b)}

3.个性化内容

# 使用 SES 模板实现个性化
template = {
    "TemplateName": "order-confirmation",
    "SubjectPart": "{{customer_name}},您的订单 {{order_id}} 已确认",
    "HtmlPart": """
    <h1>感谢您的购买,{{customer_name}}!</h1>
    <p>订单号:{{order_id}}</p>
    <p>预计送达:{{delivery_date}}</p>
    """
}

# 发送个性化邮件
ses_client.send_templated_email(
    Source='noreply@example.com',
    Destination={'ToAddresses': ['customer@example.com']},
    Template='order-confirmation',
    TemplateData=json.dumps({
        'customer_name': '张三',
        'order_id': 'ORD-12345',
        'delivery_date': '2024-12-10'
    })
)

常见问题

Q1: 如何确保邮件不进垃圾箱?

A: 五个关键措施: 1. 完整配置 SPF、DKIM、DMARC 2. 只向订阅用户发送 3. 提供明显的退订链接 4. 避免垃圾邮件特征词汇(“免费”、“中奖”等) 5. 保持稳定的发送模式

Q2: 专用 IP 预热需要多久?

A: 通常需要 4 周,逐步增加发送量: – 第 1 周:每天 500-1000 封 – 第 2 周:每天 5000-10000 封 – 第 3 周:每天 50000 封 – 第 4 周:达到目标发送量

详细预热计划见下一篇《大规模营销活动和邮件高可用》。

Q3: 发送延迟是多少?

A: SES 处理时间通常 < 1 秒,最终送达时间取决于接收方 ISP。事务型邮件通常 1-5 秒内送达。

Q4: 如何处理退信和投诉?

A: 自动化处理流程:

# 使用 SNS + Lambda 自动处理
def lambda_handler(event, context):
    """处理 SES 通知"""
    message = json.loads(event['Records'][0]['Sns']['Message'])
    
    if message['notificationType'] == 'Bounce':
        if message['bounce']['bounceType'] == 'Permanent':
            # 从数据库移除硬退信邮箱
            remove_from_list(message['bounce']['bouncedRecipients'])
    
    elif message['notificationType'] == 'Complaint':
        # 立即停止向投诉用户发送
        add_to_suppression_list(message['complaint']['complainedRecipients'])

📚 参考文档Handling bounces and complaints

总结与下一步

通过本文,你已经掌握了: – ✅ SES 的核心优势和适用场景 – ✅ 5 步快速搭建发送平台 – ✅ IP 策略选择的决策方法 – ✅ 监控和优化的最佳实践

下一步行动

  1. 立即开始:在 SES 控制台验证你的域名
  2. 测试发送:使用模拟器测试各种场景
  3. 规划配额:根据业务规模申请合适的配额

系列文章

相关资源

📚 官方文档: – Amazon SES Developer GuideSES API ReferenceSES Best Practices

💡 最佳实践: – Email Sending Best PracticesImproving Email Deliverability

🎓 学习资源: – AWS SES Workshop

*前述特定亚马逊云科技生成式人工智能相关的服务目前在亚马逊云科技海外区域可用。亚马逊云科技中国区域相关云服务由西云数据和光环新网运营,具体信息以中国区域官网为准。

本篇作者

夏宁

亚马逊云科技解决方案架构师,曾就职惠普软件和声网,超过 10 年前端后端开发经验,主导过各类软件项目设计。熟悉移动互联网,音视频,云计算相关领域。

AWS 架构师中心: 云端创新的引领者

探索 AWS 架构师中心,获取经实战验证的最佳实践与架构指南,助您高效构建安全、可靠的云上应用