对SMTP HELO的正确回应

时间:2016-10-15 12:28:20

标签: email smtp network-protocols

以下是显示的SMTP事务示例的开头 教科书计算机网络(第六届国际版)

S: 220 hamburger.edu
C: HELO crepes.fr
S: 250 Hello crepes.fr, pleased to meet you

S:前缀表示它是服务器C:发送的一行 客户发送的一行。维基百科页面SMTP有一个SMTP 与HELO具有类似响应的示例。

服务器对HELO规范的响应是否合规? RFC 5321 指定服务器对HELO / EHLO的响应:

ehlo-ok-rsp    = ( "250" SP Domain [ SP ehlo-greet ] CRLF )
                    / ( "250-" Domain [ SP ehlo-greet ] CRLF
                    *( "250-" ehlo-line CRLF )
                    "250" SP ehlo-line CRLF )

据我了解规范,上述示例中服务器的响应应为

250 hamburger.edu

也就是说,它应该以{{1​​}}回复,后跟自己的主机名,而不是 客户端的主机名,当然不是显示的任意问候消息 在示例中。

250的正确回应是什么? 计算机网络示例是否不正确?

2 个答案:

答案 0 :(得分:3)

简短回答

由于Hello之后的迷路250,该示例无效。但是......这可能并不重要。

长(呃)回答

首先让我们看看客户的语法" HELO":

  

" HELO" SP域CRLF

客户端发送HELO后跟一个空格,后跟他的域名,然后是CRLF。我怎么知道它是客户域名?良好:

  

argument参数包含完全限定的域名   SMTP客户端(如果可用)

现在回复:

  

ehlo-ok-rsp =(" 250" SP Domain [SP ehlo-greet] CRLF)                       /(" 250 - " Domain [SP ehlo-greet] CRLF                       *(" 250 - " ehlo-line CRLF)                       " 250" SP ehlo-line CRLF)

这里有两个选项:

  1. "250" SP Domain [ SP ehlo-greet ] CRLF
  2. ( "250-" Domain [ SP ehlo-greet ] ...
  3. 两者都不合适,因为预计会出现域名,而不是我们看到的Hello

    以下ehelo-greet部分很好。它在RFC的下一页解释:

      

    ehlo-greet = 1 *(%d0-9 /%d11-12 /%d14-127)                       ; CR或LF以外的任何字符的字符串

    因此,它可以是任何不包含\r\n的字符串。字符串, pleased to meet you显然属于该类别。

    为什么不重要

    说完所有这些后,请注意这个例子无效的事实,并不意味着它在实践中没有发生,或者发送这样一个例子的服务器不会好好工作。理论与实践之间存在差异。例如,如果我们在SMTPTransport.java中查看Java的官方JavaMail,请参阅第1662-1665行,我们会找到以下代码:

    if (first) {    // skip first line which is the greeting
        first = false;
        continue;
    }
    

    这是来自名为ehlo(String domain)的方法,它处理发送和接收HELO命令。 JavaMail会跳过整个问候语,我怀疑其他客户端也可以这样做。

答案 1 :(得分:2)

RFC 821实际上并未指定对HELO的响应,但所有示例都使用收件人的域作为消息正文。后来的RFC定义了扩展的hello(EHLO),它实际上具有定义的响应格式。但鉴于原始标准缺乏明确性,实际上250 和CR之间的任何内容都是犹太人,当客户如此粗心地发送HELO而不是EHLO时。