基本java邮件客户端中存在451 4.5.0 SMTP协议冲突

基本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

我有一个作业,要求我建立一个非常基本的邮件客户端,在学校的服务器上发送电子邮件。如果我在我的计算机上打开一个命令提示符,并使用这些确切的命令运行telnet,消息就会通过,但程序中的某些内容会导致它返回一条错误消息。确切的答复是:

451 4.5.0 SMTP协议冲突,请参阅RFC 2821 e127si46647995qkb.26-gsmtp

以下是我的代码中我认为问题所在的部分:

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”,您的代码不会将其检测为错误。