SMTP-сервер не может связаться с сервером Exchange - PullRequest
0 голосов
/ 22 апреля 2020

Я нахожусь в процессе написания 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 пример ... "); я даже пытался перехватить исключение SocketTimeoutException, написать дополнение \ r \ n и повторить приветствие, но безрезультатно .

Кто-нибудь знает, что может ожидать отправляющий сервер Exchange? Ожидает ли он сначала другую команду вместо приветствия, которое я посылаю?

Я думал о проблемах кодировки символов, но потом Я думаю, что я все еще буду читать символы, но неправильно интерпретировать их.

1 Ответ

0 голосов
/ 25 апреля 2020

После прочтения RFC0821 снова, где прямо говорится, что каждая команда заканчивается CRLF (\ r \ n), я больше не использовал PrintWriter # println (String), а вместо этого print (String) и затем добавление print ( "\ г \ п"). Однако из-за того, что я больше не выполняю println, я теряю возможность auto flu sh PrintWriter, которая вступает в силу только при println. Поэтому я добавил еще один PrintWriter # flu sh, и это сработало.

...