java - 由于超时,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);
}
}
}
我找不到问题出在哪里。任何帮助表示赞赏,谢谢你,祝你有美好的一天:)
解决方案
SMTP 命令应该被终止,<CRLF>
但您只发送<LF>
. 一些 SMTP 服务器对此非常挑剔,但我不能确定你的。
因此,请尝试在您的消息中使用\r\n
而不是。\n
msgToSend.writeBytes("HELO\r\n");
如果这不能解决问题,另一个可能的问题是传出消息可能会累积在写缓冲区中。打电话flush()
可能会有所帮助。
msgToSend.flush();
推荐阅读
- python - how does python regular expression group work
- mysql - Mysql / MariaDB Limit Rows Queried (not limit rows returned)
- dictionary - LiteDB - case sensitivity when storing Dictionary()
- android - Turn from the other side -landscape
- linux - Other than the file extension and execution, how to determine if a file is a PowerShell script vs a Bash script?
- javascript - How to reduce build time for Angular 11.1.1?
- javascript - 如何在 reactjs-form-builder 字段中预先设置数据?
- c++ - C++ 中一系列模板参数的显式模板实例化
- javascript - 如何一次触发所有输入的onchange事件?
- regex - 正则表达式从特定表达式中捕获多行,直到 Perl 中的第一个空行