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

Car*_*ven 2 java sockets pop3 smtp

我正在读取从我连接到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;
    }
}
Run Code Online (Sandbox Code Playgroud)

例如,在POP中,当我执行a时LIST,响应以a结尾..但是在SMTP中,当我这样做时EHLO,它并没有清楚地表明响应何时结束.

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

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

Jon*_*Lin 9

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

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

您应该查看RFC 821 for SMTPRFC 1939 for POP3以获取协议的详细说明