Java Fake SMTP 由于超时而无法接收我的消息

标签 java smtpclient

我接到一项任务,要制作一个简单的 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);
        }
    }
}

我找不到问题出在哪里。感谢您的帮助,谢谢,祝您有美好的一天:)

最佳答案

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

所以尝试使用\r\n而不是\n在您的消息中。

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

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

msgToSend.flush();

关于Java Fake SMTP 由于超时而无法接收我的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61207596/

相关文章:

java - 使用 Jackson json 跳过一层抽象

c# - Web 服务器正在发送重复的电子邮件

c# - GMail API/OAUTH2 - 如何使用已弃用的传统 C# SMTP 方法发送电子邮件?

asp.net - 在 ASP .NET (SMTP) 中发送邮件

c# - 异步模块或处理程序已完成,而异步操作仍未决

c# - 如何从 Windows Phone 8 应用程序发送电子邮件?

java - ActionListener 阻止程序运行?

java - 如何使用java替换字符串之间存在的ascii字符

java - println 输出中添加

java - Tomcat 显示 404