Java FakeSMTP не может получить мое сообщение из-за тайм-аута - PullRequest
0 голосов
/ 14 апреля 2020

Я получил задание сделать простого клиента отправителя SMTP-почты без использования какой-либо предварительно реализованной внешней библиотеки. Сервер, который должен получать мои сообщения - это FakeSMTP (http://nilhcem.com/FakeSMTP/), который работает на локальном хосте. Когда я пытаюсь отправить сообщение, я получаю следующую ошибку:

220 DESKTOP-T6LJE71 ESMTP SubEthaSMTP null
421 Timeout waiting for data from client.
Error while sending email
java.net.SocketException: An established connection was aborted by the software in your host machine

Мой код:

public class SMTP {
    public static void sendHeader(DataOutputStream msgToSend, BufferedReader responseFromServer) throws IOException {
        System.out.println(responseFromServer.readLine());
        msgToSend.writeBytes("HELO\n");
        System.out.println(responseFromServer.readLine());
        msgToSend.writeBytes("MAIL FROM:<something@gmail.com>\n");
        System.out.println(responseFromServer.readLine());
        msgToSend.writeBytes("RCPT TO:<anything@gmail.com>\n");
        System.out.println(responseFromServer.readLine());
        msgToSend.writeBytes("DATA\n");
        System.out.println(responseFromServer.readLine());
    }

    public static void sendContent(DataOutputStream msgToSend, BufferedReader responseFromServer) throws IOException {
        msgToSend.writeBytes("From:<something@gmail.com>\n");
        msgToSend.writeBytes("To:<anything@gmail.com>\n");
        msgToSend.writeBytes("Subject:Test\n");
        msgToSend.writeBytes("Hello world.\n");
        msgToSend.writeBytes("Hello world.\n");
        msgToSend.writeBytes("Hello world.\n");
        msgToSend.writeBytes(".\n");
        System.out.println(responseFromServer.readLine());
        msgToSend.writeBytes("QUIT\n");
        System.out.println(responseFromServer.readLine());
        System.out.println("Closing connection");
    }

    public static void main(String args[]) throws Exception{
        try{
            Socket serverSocket=new Socket("localhost",25);
            BufferedReader responseFromServer=new BufferedReader(new InputStreamReader(serverSocket.getInputStream()));
            DataOutputStream messageToServer = new DataOutputStream(serverSocket.getOutputStream());
            sendHeader(messageToServer,responseFromServer);
            sendContent(messageToServer, responseFromServer);
        }
        catch (Exception e){
            System.out.println("Error while sending email");
            System.out.println(e);
        }
    }
}

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

1 Ответ

1 голос
/ 14 апреля 2020

Команды SMTP должны завершаться <CRLF>, но вы отправляете только <LF>. Некоторые SMTP-серверы очень требовательны к этому, но я не могу быть уверен в вашем.

Поэтому попробуйте использовать \r\n вместо \n в своих сообщениях.

msgToSend.writeBytes("HELO\r\n");

Если это не помогает, другая возможная проблема заключается в том, что исходящие сообщения могут накапливаться в буфер записи. Вызов flush() может помочь.

msgToSend.flush();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...