1

要在发送“EHLO”时使用来自谷歌的示例响应:

250-mx.google.com at your service, [66.501.941.15]
250-SIZE 35651584
250-8BITMIME
250-AUTH LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250 PIPELINING

十六进制:

32 35 30 2D 6D 78 2E 67 6F 6F 67 6C 6C 65 2E 63 6F 6D 6D 20 61 74 20 79 6F 75 72 20 73 65 65 72 76 69 69 69 65 2C 20 5B 39 5B 39 39 32 2E 34 32 2E 34 32 32 32 32 31 2E 35 35 35 34 32 34 32 32 32 32 32 5DDD 0D 0A 32 35 30 2D 53 49 5A 45 20 33 35 36 35 31 35 38 34 0D 0A 32 35 30 2D 38 42 49 54 4D 49 4D 45 0D 0A 32 35 30 2D 41 55 54 48 20 4C 4F 47 49 4E 20 50 4C 41 49 4E 0D 0A 32 35 30 2D 45 4E 48 41 4E 43 45 44 53 54 41 54 55 53 43 4F 44 45 53 0D 0A 32 35 30 20 50 49 4E 45 4E 479A

由于 SMTP 规范规定一行必须以 CR LF (0D 0A) 结尾,我们可以解析这两个字节来查找行,但是我们如何确定响应的结尾呢?

在卫星上,响应可以被分解成碎片,两者之间有很大的延迟。这意味着响应可能在 CR LF 之后结束并且不完整,即:

250-mx.google.com at your service, [66.501.941.15]
250-SIZE 35651584
250-8BITMIME

任何寻找尾随 CR LF 的逻辑都会假设响应是完整的。在这种情况下,我使用 CryptLib 来执行 SLL 隧道,但如果有某种方法可以获得“响应结束”,我可以使用自己的代码创建端口并将其传递给库。

4

2 回答 2

8

响应在 250 和名称之间没有连字符的那一行结束。

因此,如果该行的第 4 个字符是空格,那将是响应的最后一行。

RFC 2821的第 4.2.1 节:

多行回复的格式要求除最后一行外,每一行都以回复代码开头,紧跟连字符“-”(也称为减号),然后是文本。最后一行将从回复代码开始,紧随其后的是 < SP >、可选的一些文本和 < CRLF >。

于 2009-11-19T22:27:12.850 回答
3

这是 SMTP 协议中的多行回复(在RFC 821附录 E 中描述)

您会注意到第一行的格式为

CODE-FirstLine
CODE-SecondLine

但是最后一行的格式如下:

CODE LastLine

就像您解释的那样,每一行都由 CRLF 分隔,但是当代码和文本未由 - (减号)分隔时,您知道您在多行回复的最后一行

于 2009-11-19T22:28:02.790 回答