退信里的 4xx 和 5xx 到底差在哪?常见回复代码分别代表什么?
RFC 5321 第 4.2.1 节(Reply Code Severities and Theory)规定,回复码三位数字各有分工:第一位表明响应是好、坏还是未完成;第二位表明大致错误类别(如邮件系统错误、命令语法错误);第三位及附带信息用于最细粒度的区分。第一位共四个取值:2yz 为肯定完成;3yz 为肯定中间态(命令已接受但动作被搁置,等待进一步信息);4yz 为瞬态否定完成,命令未被接受、动作未发生,但错误条件是临时的,动作可以再次请求,客户端应当重试;5yz 为永久否定完成,客户端不应按相同顺序重复完全相同的请求。
同节给出了一条实用判据:如果一条命令在「命令形式不变、收发双方属性也不变」的前提下重复执行有可能成功,那么它就属于 4yz;否则属于 5yz。该节同时坦承,当收发两端要就「瞬态」达成一致时,这个词很难赋予确定含义,每个此类回复可能对应不同的时间尺度。这解释了为什么同一现象在不同系统上可能被判为 4xx 或 5xx——它是策略选择,不是纯粹的事实判断。
RFC 5321 第 4.2.3 节(Reply Codes in Numeric Order)给出权威表述:421 服务不可用,正在关闭传输信道(当服务确知必须停机时,可作为对任何命令的回复);450 请求的邮件动作未执行:邮箱不可用(例如邮箱忙或因策略临时封锁);451 请求的动作中止:处理中出现本地错误;452 请求的动作未执行:系统存储空间不足;455 服务器无法接受这些参数;500 语法错误、命令无法识别(可能包含命令行过长这类错误);501 参数或实参语法错误;503 命令顺序错误;550 请求的动作未执行:邮箱不可用(例如邮箱未找到、无访问权限,或命令因策略原因被拒);552 请求的邮件动作中止:超出存储配额;553 请求的动作未执行:邮箱名不被允许;554 事务失败(若出现在连接打开的响应位置,含义是「此处无 SMTP 服务」);555 MAIL FROM/RCPT TO 参数无法识别或未实现。
三位基本码信息量有限,RFC 3463 第 2 节(Status Code Structure)定义了增强状态码,形式为 class.subject.detail,其中 class 只取 2、4、5,语义与基本码一致:2 为成功;4 为「持续性瞬态失败」,即所发邮件本身有效,只是某种临时状况持续存在导致投递被延迟或放弃,未来重发可能成功;5 为永久失败,即在当前形态下重发不太可能解决,必须改变邮件或目的地。subject 子码取 X.0 至 X.7,依次为其他/未定义、地址状态、邮箱状态、邮件系统状态、网络与路由状态、投递协议状态、内容或媒体状态、安全或策略状态。
RFC 3463 第 3 节列举的常见项:X.1.1 目的邮箱地址错误——地址中指定的邮箱不存在,对互联网邮件而言即 @ 左侧无效,该码仅用于永久失败;X.1.2 目的系统地址错误——@ 右侧的系统不存在或无法接收邮件,同样仅用于永久失败;X.2.2 邮箱已满——用户超出了单邮箱管理配额或物理容量,语义上收件人可通过删除邮件腾出空间,该码应当作为持续性瞬态失败使用;X.2.3 邮件长度超出管理限制;X.3.1 邮件系统已满;X.4.4 无法路由——因目录服务无法提供必要路由信息而确定不了下一跳,可用于永久失败也可用于持续性瞬态失败;X.5.3 收件人过多;X.7.1 投递未获授权、邮件被拒——发件人未被授权向该目的地发信,可能来自按主机或按收件人的过滤,仅作为永久错误使用。
参考:https://www.rfc-editor.org/rfc/rfc5321.txt 与 https://www.rfc-editor.org/rfc/rfc3463.txt
