如何将AWS SES发送/退回邮件副本存储到S3或CloudWatch日志?
解决方案:捕获并存储SES邮件副本及事件到S3/CloudWatch
以下是两种可行的实现途径,针对你需要存储已发送/退回邮件的需求:
1. 使用SES配置集(Configuration Sets)实现原生存储与事件捕获
这是AWS官方推荐的方案,无需修改太多业务代码,直接通过SES的配置集完成邮件副本存储和事件收集:
步骤1:创建SES配置集并添加操作
- 添加S3存储操作:
在配置集中创建「存储操作」,指定目标S3桶。此操作会将你通过SES发送的所有邮件(完整标头、正文)以原始格式存储到S3。需要确保:- S3桶的权限策略允许SES服务主体(
ses.amazonaws.com)执行PutObject操作 - 给SES关联的IAM角色授予S3写入权限
- S3桶的权限策略允许SES服务主体(
- 添加事件发布操作:
配置将SES事件(包括发送成功、退回、投诉等)发布到SNS主题。针对退回邮件,事件中会包含退回原因、收件人、原始邮件的MessageId等关键信息。
步骤2:调用SES API时指定配置集
在调用SendEmail或SendRawEmailAPI时,必须在请求参数中加入ConfigurationSetName,否则配置集的操作不会触发。示例代码片段(Python):
import boto3 ses_client = boto3.client('ses') response = ses_client.send_email( Source='sender@example.com', Destination={'ToAddresses': ['recipient@example.com']}, Message={...}, ConfigurationSetName='your-config-set-name' # 必须指定 )
步骤3:处理退回事件(可选)
如果需要将退回事件的详情和原始邮件关联存储:
- 给SNS主题订阅Lambda函数,Lambda读取SNS消息中的退回事件数据,结合S3中存储的原始邮件(通过
MessageId关联),将整合后的内容写入S3或CloudWatch日志。
2. 应用层结合Lambda主动存储
如果无法使用配置集(比如业务场景限制),可以在调用SES API前,先主动将邮件内容存储到S3:
- 在你的网站代码中,调用SES API前,将邮件的标头、正文序列化后写入S3桶
- 同时配置SES事件发布到SNS,Lambda订阅SNS后,将退回事件与S3中存储的对应邮件关联,补充存储到S3或写入CloudWatch日志
关键注意事项
- CloudTrail确实可以记录SES的
SendEmail/SendRawEmailAPI调用,但仅记录请求参数的元数据,不会包含完整的邮件正文,因此无法满足你的需求 - 配置集的S3存储仅保留已发送的邮件副本,退回事件的详情需要通过SNS+Lambda补充捕获和存储
- 确保S3桶开启版本控制(可选),避免邮件副本被意外覆盖
内容的提问来源于stack exchange,提问作者Budianto IP
相关产品推荐
相关产品推荐

