假设我们的 DNS 记录中有多个邮件服务器。如果有人发送邮件,外发邮件服务器将检查 MX 并联系成本最低的第一个服务器。
如果该服务器没有请求的邮件地址,那么会发生什么?传出邮件服务器是否将邮件发送到 MX 记录中的第二个邮件服务器?或者这取决于第一个邮件服务器的错误消息?
如何处理发往“未知地址”的消息?由第一台服务器尝试将它们传递到适当的 MX 邮件服务器,还是 MX 邮件服务器尝试解决此问题?
答案1
处理邮件传递的 SMTP 和 ESMTP(底层协议)具有广泛的 RFC(最初是 RFC821,更现代的更新 RFC2821 以及 RFC5321 中的 Internet 标准跟踪协议)。
邮件服务器在传送过程中处理错误的方式因邮件服务器而异。更复杂的是,其中许多都是可配置的,并且很容易更改 RFC 中概述的默认行为。
考虑到上述注意事项,一般经验法则是:
选择最高优先级 MX 记录,如果存在多个具有相同优先级的记录,则随机选择一个 MX 记录(有时随机行为是一种循环算法)。如果所选主机“无法访问”(没有到主机的路由、连接被拒绝或类似情况),请尝试下一条相同或更低优先级的 MX 记录。正如 msw 所提到的,这些是一些违反直觉的东西 - 最高优先级是 0,并考虑更高数量的记录较少的优惠。
重复此操作,直到建立连接,或者所有主机都无法响应,在这种情况下,电子邮件将重新排队以供稍后尝试重新投递。大多数邮件服务器会尝试执行此操作一段时间(通常为 1 到 2 天),然后放弃并以未送达报告 (NDR) 的形式返回电子邮件。
如果连接是成功后,RFC 协议的各个步骤决定了连接 MTA 的一般行为。从远程邮件服务器发送的初始横幅,到向其发出的每个命令(从EHLO
/ HELO
、到MAIL FROM
和语句),一般经验法则是:RCPT TO
DATA
4xx 暂时错误,请稍后重试
使用此代码,电子邮件将由本地邮件服务器重新排队,并在稍后尝试发送(在该本地邮件服务器的设置中配置)
5xx 致命错误,邮件无法送达
使用此代码,电子邮件将被视为无法送达,并且本地发送邮件服务器将(并非总是如此,但在大多数服务器上)生成 NDR(未送达报告)。
就您的问题“如果此服务器没有请求的邮件地址”而言,在RCPT TO
阶段,大多数服务器都会用5xx
代码进行响应,并且您的本地邮件服务器将生成 NDR。
并非所有电子邮件服务器都是一样的
对此有一些注意事项。 MS Exchange 在最长的时间里会接受所有电子邮件,无论收件人不正确、无法路由的域等等,然后在事后生成 NDR。某些 ISP 由于垃圾邮件问题和称为后向散射,甚至不生成 NDR,您的邮件就会“默默地失败”(您永远不会收到任何投递失败的通知)。
您还必须考虑到 MTA(邮件传输代理或邮件服务器)并不总是传递的端点,MDA(邮件传递代理 - 例如 procmail)和 MUA(邮件用户代理)或“邮件客户端” ” 例如 Thunderbird/Outlook 等可以配置为“返回”这些电子邮件及其自己的类似 NDR 的响应。还有诸如.forward
文件之类的机制,可以让 MTA 在接受电子邮件后将电子邮件重定向到另一个地址。某些邮件服务器(我知道 Exim 就是这种情况)将尝试在SMTP 会话阶段.forward
扩展,如果扩展为不可路由的地址,则会回复上述一系列错误代码。RCPT TO
5xx
要获得更准确和更深入的解释,请阅读上面提到的 RFC 和您正在使用的 MTA 的文档(请记住,它的配置方式可能会影响其行为)。