SMTP服务器无法与Exchange服务器通信

时间:2020-04-22 18:51:19

标签: java sockets email smtp exchange-server

我正在编写一个smtp服务器,并且在测试过程中,我发现来自Exchange服务器托管的电子邮件客户端帐户的通信无法处理SMTP协议。 我有一个ServerSocket可用于接受传入的连接请求:

ServerSocket sSocket = new ServerSocket(25);
Socket socket = sSocket.accept();
try (BufferedReader reader = new BufferedReader(new
     InputStreamReader(this.socket.getInputStream()));
    PrintWriter writer = new PrintWriter(this.socket.getOutputStream(), true)) {
    writer.println("220 example.mailserver.com ESMTP Postfix");
    String command = reader.readLine();
    handle(command);
}

SMTP协议很简单,建立连接后,服务器会用问候语启动对话,然后从输入流中读取。然后,尝试发送电子邮件的客户端服务器通常会发送HELO或EHLO命令。

对于交换服务器,读取只是超时。

我尝试使用InputStream代替BufferedReader并自己处理行尾。我也尝试过显式地写'\ r \ n“而不是使用println(” 220 example ...“); 我什至尝试捕获SocketTimeoutException并写一个附加\ r \ n并重复问候,但无济于事。

有人知道发送交换服务器可能正在等待什么吗? 是不是要先等待另一个命令,而不是我要发送的问候?

我曾考虑过字符编码问题,但我想我仍然会读字符,但用错误的方式解释它们。

1 个答案:

答案 0 :(得分:0)

再次阅读RFC0821后,它明确表示每个命令均以CRLF(\ r \ n)结尾,之后,我不再使用PrintWriter#println(String),而是使用print(String),然后使用附加打印(“ \ r \ n”)。 但是,由于我现在不再使用println,因此我失去了仅在println生效的PrintWriter的自动刷新功能。因此,我添加了另一个PrintWriter#flush并成功。