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

如何从SES入站Lambda返回4xx/5xx错误响应至SMTP会话?

核心结论

SES的入站邮件处理是异步触发规则集的模式——不管用哪种Lambda触发方式(包括RequestResponse),发件人的SMTP服务器都会在SES接收邮件后立即收到250 OK响应,Lambda的执行结果根本没法同步反馈到SMTP会话里。也就是说,你完全没法通过Lambda在SMTP会话阶段直接返回4xx/5xx错误码。

关键细节说明
  • SES的设计逻辑就是先确认接收邮件(返回250),再异步执行规则集里的动作(比如存S3、调用Lambda)。这么做是为了保证邮件接收的可靠性,避免后端处理延迟或故障导致邮件丢失。
  • 你提到的RequestResponse只是Lambda的调用模式,它仅能让SES等待Lambda的执行结果(比如成功/失败),这个结果只会影响SES后续的规则执行(比如Lambda报错时SES可能重试),绝对不会反向传递给发件人的SMTP服务器。
退信处理方案

既然没法同步返回错误,只能靠发送退信邮件(NDR,Non-Delivery Report)通知发件人,以下是实现思路和参考:

  • 退信格式要求:必须符合RFC 5322和RFC 3464规范,核心要明确错误类型:
    • 收件人地址错误:直接说明收件人不存在或无效
    • 垃圾邮件:告知邮件被判定为垃圾邮件,无法投递
    • 临时故障:说明暂时无法投递,建议稍后重试
  • AWS内部参考示例:
    • 可以查看AWS SES官方文档「处理退信」章节里的代码片段,比如用Python/Node.js生成符合规范的退信邮件,再通过SES的API或SMTP接口发送。
    • Lambda环境中,直接调用SES的send_email或send_raw_email API即可,注意给Lambda角色配置对应的SES发送权限。
  • 简化Python示例:
import boto3

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

def send_ndr(sender, recipient, original_subject, error_reason):
    subject = "Undelivered Mail Returned to Sender"
    body_text = f"""
This is the mail system at example.com.

I'm sorry to inform you that your message could not be
delivered to one or more recipients. It's attached below.

For further assistance, please contact postmaster@example.com.

Error reason: {error_reason}
"""
    ses.send_email(
        Source='postmaster@example.com',
        Destination={'ToAddresses': [sender]},
        Message={
            'Subject': {'Data': subject},
            'Body': {'Text': {'Data': body_text}}
        }
    )

你可以根据实际错误类型(永久/临时)调整内容,比如永久错误对应5xx描述,临时错误对应4xx描述。

内容的提问来源于stack exchange,提问作者koehn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 05:12:19