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