RFC 3834: 电子邮件中的自动响应
ELI5: 当你设置"离开办公室"自动回复时,是什么阻止两个自动回复器互相回复呢?RFC 3834 定义了规则:如何标记自动消息、如何检测和抑制循环,以及何时适合发送自动回复。这就是为什么你的假期回复不会引发无限的电子邮件风暴。
为什么存在这个标准
自动电子邮件回复无处不在:休假/不在办公室消息、已读回执、质询-回应垃圾邮件过滤器、工单系统确认和通知摘要。没有规则,自动回复器会创建危险的反馈循环:
- Alice的自动回复器回复Bob的消息。
- Bob的自动回复器回复Alice的自动回复。
- Alice的自动回复器回复Bob的自动回复。
- 无限重复,淹没两个邮箱和网络。
RFC 3834通过定义Auto-Submitted头字段和一套规则来防止这种情况,每个自动回复器都必须遵守这些规则。
工作原理
Auto-Submitted头字段
每条自动生成的消息必须包含Auto-Submitted头。定义的值有:
| 值 | 含义 | 示例 |
|---|---|---|
no |
消息由人创建(如果头不存在则为默认值) | 由人撰写的普通电子邮件 |
auto-generated |
消息自动生成,不是对另一条消息的响应 | 计划报告、监控警报、系统通知 |
auto-replied |
消息是对另一条消息的自动响应 | 休假回复、不在办公室、已读回执 |
auto-notified |
消息是关于另一条消息的自动通知 | 投递状态通知、处置通知 |
; 休假自动回复 From: alice@example.com To: bob@example.com Subject: Re: Project update Auto-Submitted: auto-replied In-Reply-To: <msg-id-from-bob@example.com> 我将在1月15日前不在办公室。 有紧急事项,请联系charlie@example.com。
核心规则:永远不要自动回复自动回复
发送任何自动响应之前,回复器必须检查传入消息本身是否自动生成。如果是,则不发送自动响应。检查如下:
-
检查
Auto-Submitted头。如果存在且不等于no,则不响应。 -
检查空退信地址。如果信封发件人(MAIL FROM)是
<>,则不响应。退信和DSN使用空退信地址。 -
检查
Precedence头。如果值是bulk、junk或list,则不响应。(这是RFC 3834之前的传统约定,但仍广泛使用。)
; 传入消息有Auto-Submitted头 Auto-Submitted: auto-replied ; 决定:不自动响应 ; 这可以防止无限循环场景
速率限制
RFC 3834要求自动回复器限制对同一发件人的响应。标准做法:
- 每个发件人每个时间段最多发送一条自动响应(通常每天一条,或每个假期一条)。
- 跟踪哪些发件人已收到自动响应。
- 不要在同一假期为同一个人发送重复的自动响应。
信封和头要求
自动响应必须:
- 使用空信封发件人(
MAIL FROM:<>)或使用回复器的地址。永远不要使用原始发件人的地址作为自动回复的信封发件人。 - 设置
Auto-Submitted: auto-replied(或为非回复自动化设置auto-generated)。 - 包含
In-Reply-To和References头指向原始消息,以便自动响应正确链接。 - 将响应发送到
Return-Path或信封发件人,而不是From地址。这确保自动回复的退信不会发送到原始人类发件人。
关键技术细节
不应触发自动响应的消息
RFC 3834列出了必须禁止自动响应的特定情况:
Auto-Submitted设置为no以外的任何值的消息- 信封发件人为空的消息(
MAIL FROM:<>) - 发送到邮件列表的消息(检查
List-Id、List-Unsubscribe或Precedence: list) - 发件人看起来是守护进程或系统地址的消息(例如
MAILER-DAEMON、postmaster) - 本身是退信通知的消息(DSN)
Auto-Submitted对比Precedence
较旧的Precedence头早于RFC 3834,并非正式标准化,但仍广泛使用:
; 遗留方法(仍然常见) Precedence: bulk ; 符合标准的方法 Auto-Submitted: auto-generated ; 最佳实践:同时包含两个以获得最大兼容性 Precedence: bulk Auto-Submitted: auto-generated
自动回复器应同时检查两个头。一些较旧的系统仅设置Precedence;一些较新的系统仅设置Auto-Submitted。同时检查两者可以防止与任何一个的循环。
X-Auto-Response-Suppress头
Microsoft Exchange引入了一个非标准但广泛支持的头:
X-Auto-Response-Suppress: All
可能的值包括DR(投递报告)、NDR(未投递报告)、RN(已读通知)、NRN(未读通知)、OOF(不在办公室)和AutoReply。许多发送系统在事务性和营销电子邮件上设置All以禁止来自Exchange/Outlook的所有自动响应。
检测邮件列表消息
对邮件列表消息的自动响应特别有问题——它们会发送到整个列表。检查:
; 这些中的任何一个都表示列表消息 List-Id: <dev.lists.example.com> List-Unsubscribe: <mailto:unsub@lists.example.com> Precedence: list X-Mailing-List: dev@lists.example.com
示例
格式正确的休假回复
; 信封 MAIL FROM:<> RCPT TO:<bob@example.com> ; 头 From: alice@example.com To: bob@example.com Date: Mon, 10 Mar 2025 09:00:00 +0000 Subject: Re: Q1 Planning Auto-Submitted: auto-replied In-Reply-To: <orig-msg-id@example.com> References: <orig-msg-id@example.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 感谢您的电子邮件。我于3月8日至15日不在办公室, 电子邮件访问受限。 有紧急事项,请联系charlie@example.com。
系统通知
From: noreply@monitoring.example.com To: ops-team@example.com Subject: [ALERT] CPU usage above 90% on web-prod-03 Auto-Submitted: auto-generated Precedence: bulk X-Auto-Response-Suppress: All 服务器web-prod-03已超过CPU阈值。 当前使用率:94%。立即调查。
常见错误
-
没有在自动化消息上设置
Auto-Submitted。这是最重要的事情。没有它,每个收件人的休假回复器都会回复您的自动化消息,他们的回复可能会在您的这一端触发进一步的自动化。 -
对带有空退信地址的消息自动响应。退信使用
MAIL FROM:<>。回复它们会造成退信循环:您的回复退信,生成另一个退信,您的系统尝试再次回复。 - 对邮件列表自动响应。将不在办公室回复发送到邮件列表会向每个订户发送垃圾邮件。在自动响应前始终检查List-Id和Precedence头。
- 没有速率限制。没有速率限制,向您发送50条消息的用户会收到50条相同的休假回复。将每个发件人每个时间段的自动响应限制为一条。
- 使用From地址作为自动回复目标。自动响应应发送到Return-Path(信封发件人),而不是From地址。From地址可能是邮件列表、不回复地址或与实际发件人不同。
- 在自动回复中包含原始消息正文。一些自动回复器引用整个原始消息。这是隐私风险(自动回复可能被转发)并浪费带宽。
-
没有在事务性电子邮件上设置
X-Auto-Response-Suppress: All。如果您发送订单确认或密码重置,添加此头以防止Exchange/Outlook用户向您的自动化消息发送不在办公室回复。
可递送性影响
- 自动回复循环损害发件人声誉。如果您的系统创建循环,大量激增看起来像向接收服务器的垃圾邮件运行。您的发送IP可以在数小时内被列入黑名单。
-
正确标记的自动响应被收件人过滤。Gmail和其他提供商自动分类带有
Auto-Submitted头的消息,降低您的自动响应被标记为垃圾邮件的机会。 -
在所有自动化邮件上设置
Auto-Submitted和Precedence。这包括事务性电子邮件、警报、报告和任何非人工撰写的消息。它防止休假回复淹没您的入站队列。 -
空退信地址防止退信级联。为自动响应使用
MAIL FROM:<>可确保如果响应本身退信,退信不会被投递到任何地方——打破潜在的级联。 - 监控入站是否出现自动回复泛滥。传入休假回复或投递回执的激增通常表示您忘记在新消息模板上设置自动响应禁止头。