基本java邮件客户端中存在451 4.5.0 SMTP协议冲突
我有一个作业,要求我建立一个非常基本的邮件客户端,在学校的服务器上发送电子邮件。如果我在我的计算机上打开一个命令提示符,并使用这些确切的命令运行telnet,消息就会通过,但程序中的某些内容会导致它返回一条错误消息。确切的答复是: 451 4.5.0 SMTP协议冲突,请参阅RFC 2821 e127si46647995qkb.26-gsmtp 以下是我的代码中我认为问题所在的部分:基本java邮件客户端中存在451 4.5.0 SMTP协议冲突,java,email,email-client,Java,Email,Email Client,我有一个作业,要求我建立一个非常基本的邮件客户端,在学校的服务器上发送电子邮件。如果我在我的计算机上打开一个命令提示符,并使用这些确切的命令运行telnet,消息就会通过,但程序中的某些内容会导致它返回一条错误消息。确切的答复是: 451 4.5.0 SMTP协议冲突,请参阅RFC 2821 e127si46647995qkb.26-gsmtp 以下是我的代码中我认为问题所在的部分: private void sendMessage(String from, String to, String
private void sendMessage(String from, String to, String subject, String msg) {
Socket socket = null;
DataOutputStream os = null;
DataInputStream is = null;
try {
socket = new Socket("ALT3.ASPMX.L.GOOGLE.COM", 25);
os = new DataOutputStream(socket.getOutputStream());
is = new DataInputStream(socket.getInputStream());
} catch (Exception e) {
System.out.println(e);
}
if (socket != null && os != null && is != null) {
try {
os.writeBytes("HELO\n");
os.writeBytes("MAIL From: <" + from + ">\n");
os.writeBytes("RCPT TO: <" + to + ">\n");
os.writeBytes("DATA\n");
os.writeBytes("From: <" + from + ">\n");
os.writeBytes(subject);
os.writeBytes(msg); // message body
os.writeBytes("\n.\n");
os.writeBytes("QUIT");
String responseLine;
while ((responseLine = is.readLine()) != null) {
System.out.println("Server: " + responseLine);
if (responseLine.indexOf("Ok") != -1) {
break;
}
}
private void sendMessage(String from、String to、String subject、String msg){
套接字=空;
DataOutputStream os=null;
DataInputStream为空;
试一试{
套接字=新套接字(“ALT3.ASPMX.L.GOOGLE.COM”,25);
os=新的DataOutputStream(socket.getOutputStream());
is=新的DataInputStream(socket.getInputStream());
}捕获(例外e){
系统输出打印ln(e);
}
if(socket!=null&&os!=null&&is!=null){
试一试{
os.writeBytes(“HELO\n”);
os.writeBytes(“邮件发件人:\n”);
os.writeBytes(“RCPT到:\n”);
os.writeBytes(“数据”);
os.writeBytes(“From:\n”);
操作系统写入字节(主题);
os.writeBytes(msg);//消息正文
os.writeBytes(“\n.\n”);
操作系统写入字节(“退出”);
弦响应线;
而((responseLine=is.readLine())!=null){
System.out.println(“服务器:“+responseLine”);
if(responseLine.indexOf(“Ok”)!=-1){
打破
}
}
SMTP和类似的基于线路的协议要求用CRLF终止线路。如果用“\r\n”而不是“\n”终止线路,问题是否仍然存在?from、to、subject和msg是什么?您需要在每个SMTP命令后检查服务器的回复,除非您使用管道扩展。telnet会话确实会自动获得回复,但您的代码只是将数据转储到其中。在最后退出后,您需要换行符。您应该检查SMTP回复代码,而不是查找“确定”在服务器回复中。服务器可能发送或不发送文本“ok”,甚至可能发送“this is not ok”,您的代码不会将其检测为错误。