如何基于SES搭建新邮件触发API推送的系统?
基于AWS SES的邮件接收转API推送系统实现方案
核心流程
SES 接收外部邮件 → 触发事件处理函数 → 提取邮件正文 → 向目标API发起POST请求
具体实现步骤
1. AWS SES 接收配置
- 完成域名/邮箱验证:在AWS SES控制台中验证用于接收邮件的域名或单个邮箱地址,确保SES有权处理该地址的邮件。
- 创建接收规则集:
- 新建规则集,添加规则并指定触发条件(默认所有邮件)。
- 选择目标处理方式:推荐优先将邮件存储至S3桶(用于备份),同时触发Lambda函数;若邮件体积较小(<10MB),可直接将Lambda设为规则目标,邮件内容会作为事件参数传入。
- 配置MX记录:在域名DNS服务商处添加MX记录,指向AWS SES的 inbound 服务器(格式如
10 inbound-smtp.${region}.amazonaws.com,替换为你的AWS区域)。
2. Lambda 函数实现(Python示例)
Lambda负责解析邮件、提取正文并推送至目标API,需配置以下权限:
- 若关联S3:拥有S3对象读取权限;
- 若直接接收SES事件:拥有SES读取权限;
- 网络权限:若目标API为私网地址,需将Lambda部署至对应VPC并配置NAT网关。
代码逻辑示例:
import boto3 import email import requests from io import BytesIO def lambda_handler(event, context): # 从S3读取邮件(若直接用SES事件触发,可从event['Records'][0]['ses']['mail']获取内容) s3 = boto3.client('s3') bucket = event['Records'][0]['s3']['bucket']['name'] key = event['Records'][0]['s3']['object']['key'] obj = s3.get_object(Bucket=bucket, Key=key) raw_email = obj['Body'].read() # 解析邮件,提取正文 msg = email.message_from_bytes(raw_email) email_body = "" if msg.is_multipart(): for part in msg.walk(): if part.get_content_type() == 'text/plain': email_body = part.get_payload(decode=True).decode() break elif part.get_content_type() == 'text/html': # 若需要HTML正文,可替换此处逻辑 pass else: email_body = msg.get_payload(decode=True).decode() # 推送至目标API target_api_url = "https://your-target-api.com/endpoint" payload = {"email_body": email_body, "subject": msg['Subject']} try: response = requests.post(target_api_url, json=payload, timeout=10) response.raise_for_status() print(f"API推送成功,状态码:{response.status_code}") except Exception as e: print(f"API推送失败:{str(e)}") # 可添加重试逻辑或触发告警 raise e
注意:Lambda默认环境无
requests库,需通过Lambda层部署该依赖,或改用urllib库实现HTTP请求。
3. 错误处理与监控
- 日志监控:将Lambda日志关联至CloudWatch,实时查看执行状态与报错信息;
- 告警配置:通过CloudWatch告警规则,在Lambda执行失败、API推送超时或返回错误码时触发SNS通知;
- 消息可靠性:若目标API存在限流或不稳定情况,可引入SQS作为中间队列,Lambda先将邮件正文写入SQS,再由另一个Lambda从SQS消费并推送至API,避免请求丢失。
4. 限制与优化
- SES接收配额:根据AWS账户等级调整接收邮件的频率与数量限制;
- 邮件体积:若处理大邮件(>10MB),必须通过S3存储后再由Lambda读取;
- 重试机制:在API推送失败时,可设置Lambda异步重试(最多2次),或结合SQS的消息重试特性。
内容的提问来源于stack exchange,提问作者Binh Ho
相关产品推荐
相关产品推荐

