首页 > 解决方案 > 由于超时,Java FakeSMTP 无法接收我的消息

问题描述

我有一个任务是在不使用任何预先实现的外部库的情况下制作一个简单的 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);
        }
    }
}

我找不到问题出在哪里。任何帮助表示赞赏,谢谢你,祝你有美好的一天:)

标签: javasmtpclient

解决方案


SMTP 命令应该被终止,<CRLF>但您只发送<LF>. 一些 SMTP 服务器对此非常挑剔,但我不能确定你的。

因此,请尝试在您的消息中使用\r\n而不是。\n

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

如果这不能解决问题,另一个可能的问题是传出消息可能会累积在写缓冲区中。打电话flush()可能会有所帮助。

msgToSend.flush();

推荐阅读