送达通知通常包含多个服务器名称、日期和地址。发送报告的系统不一定是拒绝消息的系统。在根据报告的主题行进行DNS或邮箱更改之前,解析其传递状态字段并关联原始尝试。
识别报告和远程系统
RFC 3464定义了传递状态主体格式。报告-MTA 标识生成通知的系统。远程 MTA(如果存在)可识别与报告的传送尝试关联的远程系统。诊断代码可以保留远程协议响应。人类可读的解释是有帮助的,但它的散文不应取代结构化字段。 RFC 3464第 2.2 和 2.3 节.
记录系统标识和报告时间。从应用程序接受邮件的中继稍后可能会收到来自收件人服务器的拒绝并自行构建 DSN。将中继名称视为拒绝目标可能会将调查发送给错误的管理员并掩盖原始SMTP响应。
独立读取每个接收者块
最终收件人标识应用传递状态块的收件人。原始接收者(当存在时)可以保留较早的接收者身份。操作描述了交付操作,例如失败或延迟。状态带有增强的状态代码。可选的 Diagnostic-Code、Last-Attempt-Date 和 Will-Retry-Until 可以提供有用的附加上下文,但并非每个报告都提供它们。
当诊断代码存在时, RFC 3464第 2.3.6 节将提供的远程 MTA 解释为其发行者;如果没有 Remote-MTA,诊断将归因于 Reporting-MTA。该字段规则并不能证明更早的远程尝试从未发生过。使用可信日志证实完整的历史记录。
DSN 可以包含多个具有不同操作和状态值的接收者块。不要对原始“收件人”或“抄送”标头中的每个人都应用一次失败。同样,缺少可选字段并不能证明相应的事件从未发生过。将缺勤保留为未知,并使用队列或跟踪证据来填补空白。
阅读假设到期通知
想象一下, relay.example接受一条消息,然后在尝试传递时从mx.example收到 452 4.2.2 Mailbox full。在其配置的传递生命周期到期后,中继会生成 DSN。教学摘录可以识别报告-MTA:dns; relay.example ,远程 MTA:dns; mx.example ,最终收件人:rfc822; recipient@example.test ,操作:失败,状态:5.4.7 和诊断代码:smtp; 452 4.2.2 邮箱已满。
这是发明的现场演练,而不是完整的MIME报告或执行的邮件交换。最终状态描述了交付时间到期,而保留的诊断描述了最后一次容量拒绝。这些字段回答不同的问题。这不是通用的首选映射: RFC 3463第 3.5 节表示在可能的情况下返回实际的交付问题代码而不是过期代码。保留最具体的支持原因。 RFC 3464还允许 Action: failed with a 4.xx Status after the reporting MTA 已放弃尝试;暂时原因并不意味着原始原因仍处于排队状态。
对于您自己的报告,请分别关联原始提交、尝试、到期决定和报告到达。请勿假设说明性名称、时间或字段与提供商匹配。保留缺失的可选字段而不用猜测值填充它们。
行动前关联
将通知与原始信封收件人、提交时间和可用队列标识符进行匹配。 Original-Envelope-Id 可以在存在时帮助关联;返回的 Message-ID 是另一个线索,而不是对通知本身的充分验证。报告可能是欺骗性的或由伪造造成的 返回路径 地址,因此意外退回邮件不得自动触发发件人配置更改。
使用受信任的发送日志来确定组织确实提交了消息。避免仅仅因为邮件类似于退回邮件而打开返回的附件或遵循凭据提示。如果不存在匹配的提交,请调查该报告是否可能是未经请求的或伪造的,而不是将其视为帐户泄露的证据。
将校正分配给右侧图层
寻址状态将发送至邮箱或联系人所有者。路线或连接问题需要传输证据。身份验证诊断需要实际的相关消息身份和接收评估。保留完整的诊断信息,以便专家可以区分类似的故障。
经批准的更正后,将任何新尝试与其自己的队列和消息标识符相关联。不要用后来的结果覆盖历史报告。将原始故障、维修和更换交付视为相关但不同的事件。当成功重新发送后延迟的报告到达时,这可以保留诚实的时间表。
准备特定于收件人的升级
- 关联:使用收件人、时间和队列证据将报告与合法提交的内容进行匹配。
- 颁发者:将报告 MTA 与远程 MTA 和诊断颁发者分开保留。
- 结果:保留操作、状态和原始诊断代码,而不强制它们匹配。
- 所有者:分配实际的失败层,而不仅仅是退回的发送者。
- 隐私:仅提供必要的报告字段;不转发无关的返回消息内容。