gpt4 book ai didi

java - 如何确定 SMTP 和 POP 响应的结束?

转载 作者:行者123 更新时间:2023-12-02 01:36:42 25 4
gpt4 key购买 nike

我正在从连接到 SMTP 和 POP 服务器的套接字写入的 BufferedReader 中逐字符读取套接字响应。但是,我如何知道我是否已读取到响应结束,以避免 read() 因读取超出服务器响应内容而挂起?以下代码是我从 BufferedReader 读取数据的方式:

boolean endOfResponse = false;
while(!endOfResponse) {
c = in.read();
if ((c >= 32 && c < 127) || c == '\t' || c == '\r' || c == '\n') {
response.append((char)c);
//The following check has a problem: If the response has multiple lines, the other lines will not be read.
if(c == '\n') endOfResponse = true;
}
}

例如,在 POP 中,当我执行 LIST 时,响应以 . 结尾。但在 SMTP 中,当我执行 EHLO 时,它没有明确指示响应何时结束。

遗憾的是,使用 in.read() == -1 不起作用,因为它仍然会尝试读取超出响应的数据并导致套接字挂起。

那么,如何确定 SMTP 和 POP 响应的结束?更好的是,是否有可能事先知道我应该从缓冲区读取多少字节,以便我什至不必检查响应结束?

最佳答案

这两个协议(protocol)不同,但都发送以换行符结尾的消息。使用 SMTP,您一次读取 1 行(以\n 结尾),您读取的每一行应以 3 个数字开头,然后是空格或“-”,如果是空格,则这就是服务器响应的结尾,如果它是一个“-”(例如250-VRFY,如果您使用EHLO打开,就会得到这样的结果,提示服务器使用扩展ESMTP命令列表进行响应)那么您需要读取另一行。

对于 POP3,我相信这取决于您发出的命令。像 USER 或 PASS 这样的东西会给你一个“+”或“-”响应(后面跟着一个代码和一些文本)。像 LIST 这样的命令会给您一个“+”或“-”,如果是“+”,您将获得电子邮件列表,该列表将以一个“.”结尾。通过它自己。每个响应(以及电子邮件的每个索引)都将是一行。

您应该看看RFC 821 for SMTPRFC 1939 for POP3获取协议(protocol)的详细描述

关于java - 如何确定 SMTP 和 POP 响应的结束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7776369/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com