增强状态代码是结构化线索,而不是完整的事件报告。 “5.7.1”可以将调查范围缩小到安全或策略,但它无法单独识别策略所有者、受影响的路由或正确的配置更改。在整个故障排除过程中,将完整的诊断信息保留在代码旁边。
阅读所有三个组成部分
RFC 3463定义了具有类别、主题和详细信息组件的增强状态代码。该类区分成功、持续短暂失败和永久失败。主题类别区分诸如寻址、邮箱状态、路由和安全或策略等领域。细节缩小了该主题内的条件。普通的三位数SMTP响应仍然是证据的一部分。 RFC 3463.
不要将最终数字视为全局错误标识符。其含义取决于完整的增强代码和适用的注册或提供商文档。接收系统也可以在没有增强代码的情况下返回有用的散文。如果基本类和增强类看起来不一致,请保留确切的字节并调查提供程序的行为,而不是默默地重写日志。
将SMTP回复与送达报告分开
对话期间会发生SMTP回复。递送状态通知可以稍后报告结果并且可以描述多个收件人。 RFC 3464定义的字段包括最终收件人、操作、状态、远程 MTA 和诊断代码。独立读取每个接收者的块;一次失败并不能证明每个接收者都失败了。 RFC 3464第 2 节.
行动和状态回答不同的问题。 Action:失败表示报告 MTA 已停止对该收件人的尝试。状态:4.2.2 重试次数耗尽后仍能描述短暂邮箱满的原因;失败加上 4.xx 状态在 DSN 中有效,而不是不一致的SMTP回复。例如,具有这些字段的过期项目不会仅仅因为容量恢复而自动恢复。在授权任何替换之前检查实际队列。看 RFC 3464第 2.3.3 节.
人类可读的退回主题对于分类很有用,但可以省略决定性字段。尽可能获取机器可读的报告或发送日志。将报告服务器与远程服务器分开,并将报告的时间戳与失败的SMTP命令的时间戳区分开来。
读取假设的收件人块
假设发送日志记录了missing@example.test的 RCPT TO,后跟 550 5.1.1。说明性 DSN 接收者块可以包含 Final-Recipient: rfc822; missing@example.test ,操作:失败,状态:5.1.1,远程 MTA:dns; mx.example .test 和诊断代码:smtp; 550 5.1.1 无该用户。这些是发明的字段值,而不是执行的事务或完整的MIME报告。
失败的操作对于该接收者来说是最终的,而诊断则指向寻址。它没有确定该地址为何不可用或其他收件人发生了什么。从他们自己的区块和可信日志中获取这些答案。最终收件人、操作和状态是每个收件人的必填字段;远程 MTA 和诊断代码是有条件的或可选的。它们的缺席并不意味着允许发明拒绝主机或错误文本。
对于不熟悉的注册详细信息,请查阅当前的 IANA增强状态注册表 和引用的规范,然后是提供商的当前解释。 RFC 3463提供了框架,而不是每个后续代码的详尽列表。
将代码变成可检验的假设
对于寻址代码,请确认预期地址和接收系统行为。对于路由代码,请检查失败的下一跳和路由配置。对于安全或策略代码,请标识指定的需求及其所有者。避免从首选DNS更改开始,然后将每个响应解释为对其的支持。
记录一个假设、它预测的证据以及最小的授权检验。更正后的消息应与相关路线和收件人类别上的原始消息进行比较。将矛盾的结果保留为有用的证据,而不是将其强加到原始解释中。升级数据包应包括时间戳、准确响应、受影响范围和已测试的更改,并尽量减少消息内容和个人数据。代码查找是诊断的开始,而不是诊断的结束。
构建有用的升级包
- 身份:保留消息和队列标识符、失败信封收件人和受影响的范围。
- 时间轴:分别记录提交、失败尝试和报告到达。
- 诊断:包括准确的SMTP回复、命令阶段和每个收件人的 DSN 字段。
- 所有权:区分举报制度和拒绝制度,并提供证据。
- 下一步:陈述一个可测试的原因、最小的授权检查和任何矛盾的证据。尽量减少个人数据。