c++ - 解析以扩展 SMTP (ESMTP) 结尾的响应

标签 c++ smtp ssl email-client

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

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 65 2E 63 6F 6D 20 61 74 20 79 6F 75 72 20 73 65 72 76 69 63 65 2C 20 5B 39 32 2E 34 23 32 35 35 75 72 20 34 32 5D 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 0A 32 35 30 2D 45 45 4E 48 41 4E 43 43 45 44 53 54 41 54 41 54 54 55 55 53 43 43 43 44 F 44 44 44 45 53 0A 32 32 35 35 35 30 20 20 50 20 50 50 49 50 49 50 49 49 49 49 49 4E 4 e 49 4 e 4 e 4 e 4 e 4 e 4 e 4 e 4 e 47 47 47 0d 47 47 0d 47 47 0d 47 47 0d 47 47 0d 0A

由于 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 隧道,但我可以使用我自己的代码创建端口并将其传递给库,如果有某种方法可以获得“响应结束”。

最佳答案

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

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

来自 RFC 2821 的第 4.2.1 节:

The format for multiline replies requires that every line, except the last, begin with the reply code, followed immediately by a hyphen, "-" (also known as minus), followed by text. The last line will begin with the reply code, followed immediately by < SP >, optionally some text, and < CRLF >.

关于c++ - 解析以扩展 SMTP (ESMTP) 结尾的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1766976/

相关文章:

python - 如何在 Win 7 64 位上安装 python-Levenshtein 或其他 C/C++ 包

c++ - 内联函数是否作为参数传递,真正在 C/C++ 中内联执行?

Spring Boot - 无法连接到 SMTP 主机 : smtp. gmail.com,端口 : 25, 响应:421

c# - 在 asp.net 中发送具有特定名称而不是发件人电子邮件的电子邮件

c# - 回复时如何维护/保留自定义电子邮件 header (X-header)

html - 通过一些弹出窗口登录(通过 https),同时浏览网站并在同一页面上(通过 http)

html - 在我的浏览器中删除 "NON SECURE"消息的任何技巧?

c++ - scoped_ptr 中的对象分配速度非常快?

django - Gunicorn 无法运行服务器

c++ - 模板类型推导中的隐式转换