尝试使用 SMTP 验证电子邮件地址时出现 Postfix 协议错误

mik*_*son 5 email email-server smtp postfix tcp

我有一些代码可以进行电子邮件地址验证。它的工作原理是尝试通过 SMTP 发送邮件,然后不发送任何内容就退出。它大部分时间都有效,但在某些边缘情况下则无效。我有其中一种情况,我想知道是否有人知道邮件服务器可能对我的请求不满意的地方?

这是端口 25 上到 smtp.hp.com 的 TCP 会话(我在这里替换了真实的电子邮件地址)

220-g1t6210.austin.hp.com ESMTP Postfix
HELO ednasmtp.beweb.co.nz
250 g1t6210.austin.hp.com
MAIL FROM: <a_real_email@beweb.co.nz>
250 2.1.0 Ok
RCPT TO: <a_real_hp_user_email@hp.com>
550 5.5.1 Protocol error
QUIT
550 5.5.1 Protocol error
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么 HP 的 postfix 服务器说“协议错误”?我的邮件投递无效吗?

kas*_*erd 7

smtp.hp.com解析为 4 个不同的 IP 地址。它们中的每一个都响应 SMTP,但它们的配置方式不同。如果不知道您连接到的 4 个中的哪一个,则很难确切说出它失败的原因。但是我可以一步一步地查看您的会话并解释客户端在此过程中出现的多个错误。

220-g1t6210.austin.hp.com ESMTP Postfix
Run Code Online (Sandbox Code Playgroud)

这是来自服务器的部分状态消息,由 指示-。状态的最后一行将在该位置有一个。4 个 SMTP 服务器中的 3 个以这种方式响应 2 行状态消息,并在两行之间存在延迟。其中之一以 1 行状态消息进行响应,排除该消息已处理您的会话。客户端将需要继续阅读状态消息,直到它全部看到为止。

HELO ednasmtp.beweb.co.nz
Run Code Online (Sandbox Code Playgroud)

此时客户端在收到完整状态之前通过发送命令违反了协议。

250 g1t6210.austin.hp.com
Run Code Online (Sandbox Code Playgroud)

在这里,服务器通过发送不同的状态代码来违反协议,符合标准的客户端会将其解释为220-上面状态行的延续。

MAIL FROM: <a_real_email@beweb.co.nz>
Run Code Online (Sandbox Code Playgroud)

在这里,客户端通过:和之间的无关空间违反了协议<。该位置永远不允许有空间,尽管存在会忽略该空间并允许事务继续的邮件服务器。

250 2.1.0 Ok
RCPT TO: <a_real_hp_user_email@hp.com>
Run Code Online (Sandbox Code Playgroud)

在这里,客户端以与MAIL命令中相同的方式再次违反协议。

550 5.5.1 Protocol error
Run Code Online (Sandbox Code Playgroud)

存在协议错误是正确的。很难说它抱怨的是上面提到的协议错误中的哪一个。该RCPT命令本身是错误的,但它没有错误,没有早些时候的交易被视为患有好。

QUIT
550 5.5.1 Protocol error
Run Code Online (Sandbox Code Playgroud)

此时很难猜测哪一方关闭了连接。鉴于双方都违反了协议,这可能不再重要。我们甚至无法确定哪些状态代码适用于哪些命令。

  • 是的!问题确实出在延续状态和破折号上。我现在正在循环阅读,直到进入非破折号状态并且一切正常。 (4认同)