Java - 在没有JavaMail的情况下发送电子邮件 - EHLO客户端/服务器响应

时间:2016-10-27 07:29:42

标签: java sockets email smtp client-server

我一直在网上搜索并且连续6小时做了更好的测试,我无法让它工作。我想使用JavaMail,但是我的教授希望我们使用套接字...我只是想将一封带有java的电子邮件发送到Gmail帐户。

无论如何,我开始使用EHLO而不是HELO向服务器发送消息,因为它是"更新"从我所读到的。但是,我发现自己陷入困境。在我的代码的中间点,你会注意到在关闭套接字之前它都被注释掉了。这是我可以从服务器得到很好的回复。

让我在这里向您展示我的代码:

public class MailComponent{

final static String MAIL_SERVER = "smtp.gmail.com";
final static int SMTP_PORT = 25;
Socket socket = null;

public MailComponent(){
    // Making Constructor Later
}

public void sendMail() throws Exception{

    try{
        // Establish TCP Connection With Mail Server
        socket = new Socket(MAIL_SERVER, SMTP_PORT);

        // Create a Buffered Reader to read one line at a time
        InputStream inStream = socket.getInputStream();
        InputStreamReader inReader = new InputStreamReader(inStream);
        BufferedReader bReader = new BufferedReader(inReader);

        // Read Server's Greeting
        String serverResponse = bReader.readLine();
        if (!serverResponse.startsWith("220")){
            throw new Exception("220 Reply Not Received From Server!");
        }
        System.out.println(serverResponse);

        // Reference socket's output stream
        OutputStream oStream = socket.getOutputStream();

        // Send EHLO command
        String heloCommand = "EHLO smtp.gmail.com\r\n";
        oStream.write(heloCommand.getBytes("US-ASCII"));
        serverResponse = bReader.readLine();
        if (!serverResponse.startsWith("250"))
            throw new Exception("250 Reply Not Received From Server!");
        System.out.println(serverResponse);

        // Get Responses...
        serverResponse = bReader.readLine();
        System.out.println("Server Response: " + serverResponse);
        serverResponse = bReader.readLine();
        System.out.println("Server Response: " + serverResponse);
        serverResponse = bReader.readLine();
        System.out.println("Server Response: " + serverResponse);
        serverResponse = bReader.readLine();
        System.out.println("Server Response: " + serverResponse);
        serverResponse = bReader.readLine();
        System.out.println("Server Response: " + serverResponse);
        serverResponse = bReader.readLine();
        System.out.println("Server Response: " + serverResponse);
        serverResponse = bReader.readLine();
        System.out.println("Final Response: " + serverResponse);
        // END EHLO Responses

        // Send TLS command
        String tlsCommand = ("STARTTLS" + "\r\n");
        oStream.write(tlsCommand.getBytes("US-ASCII"));
        serverResponse = bReader.readLine();
        System.out.println("STARTTLS Response: " + serverResponse);



        /* Commented out

        //Send the MAIL FROM command
        String fromCommand = ("MAIL FROM: <example@gmail.com>\r\n");
        oStream.write(fromCommand.getBytes("US-ASCII"));
        serverResponse = bReader.readLine();
        System.out.println("Mail From Reponse: " + serverResponse);

        // Send RCPT TO command
        String toCommand = ("RCPT TO: <example@gmail.com>\r\n");
        oStream.write(toCommand.getBytes("US-ASCII"));
        //serverResponse = bReader.readLine();
        //System.out.println("RCPT To Response: " + serverResponse);

        // Send DATA command
        String dataCommand = ("DATA\r\n");
        oStream.write(dataCommand.getBytes("US-ASCII"));
        serverResponse = bReader.readLine();
        System.out.println("Data Response: "+ serverResponse);

        // Subject 
        String subCommand = ("SUBJECT: Email Test\r\n");
        oStream.write(subCommand.getBytes("US-ASCII"));
        //TimeUnit.SECONDS.sleep(1);
        String msg = ("Some random Message");
        oStream.write(msg.getBytes("US-ASCII"));
        //TimeUnit.SECONDS.sleep(1);

        // End Message data
        String endMsg = ("\r\n.\r\n");
        oStream.write(endMsg.getBytes("US-ASCII"));
        serverResponse = bReader.readLine();
        System.out.println("End Data Command: "+ serverResponse);

        // Send QUIT message
        String quitMsg = ("QUIT\r\n");
        oStream.write(quitMsg.getBytes("US-ASCII"));
        serverResponse = bReader.readLine();
        System.out.println("Quit Command: "+ serverResponse);


        End comment*/



        if (socket != null){
            socket.close();
            System.out.println("Closed Socket Connection!");
        }
    }
    catch(IOException ioe){System.err.println(ioe);}
}

}

注意&#34;最终答复&#34;在我的输出中250和SMTPUTF8之间没有连字符。在我不得不说些什么之前,我就知道它的最后一个回应。一旦我发送STARTTLS命令,我完全不知道该怎么做。

Output From Running Above Code

我真的很感激在STARTTLS命令(我所有评论之前的最后一个命令)之后我应该提供的帮助。提前谢谢!

0 个答案:

没有答案