Java - SSL - 使用gmail的SMTP服务器进行身份验证

时间:2016-10-28 03:21:26

标签: java sockets ssl smtp gmail

我可以通过端口465连接到smtp.gmail.com。使用AUTH LOGIN命令后,接收334 VXNlcm5hbWU6,解码时为"用户名:"

我似乎无法弄清楚如何通过服务器发送我的用户名。我正在编码用户名和发送,但没有得到答复。下一个回复应该是要求我的密码。

见下文:

public class MailComponent{
Socket socket = null;
final static String MAIL_SERVER = "smtp.gmail.com";
final static int SMTP_PORT = 465;
String uName = "example@gmail.com";
String encodedName = Base64.getEncoder().encodeToString(uName.getBytes(StandardCharsets.UTF_8));

public MailComponent(){ /*Create constructor later*/}

public void sendMail() throws Exception{

    try{
        // Establish TCP Connection With Mail Server
        socket = ((SSLSocketFactory) SSLSocketFactory.getDefault()).createSocket(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();
        System.out.println("Server Greeting: " + serverResponse);           
        if (!serverResponse.startsWith("220")){
            throw new Exception("220 Reply Not Received From Server!");
        }

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

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

        // Obtain Authorization
        String authCommand = "AUTH LOGIN\r\n";
        oStream.write(authCommand.getBytes("US-ASCII"));
        serverResponse = bReader.readLine();
        System.out.println("Auth Response: " + serverResponse);

        // Give Username
        oStream.write(encodedName.getBytes(StandardCharsets.UTF_8));    
        serverResponse = bReader.readLine();
        System.out.println("Username Response: " + serverResponse);

一切似乎都运行正常,但是一旦我发送用户名,我就不会收到任何回复。关于为什么会出现这种情况的任何想法?

2 个答案:

答案 0 :(得分:0)

连接到outlook.com或Office 365 SMTP服务器时,必须在端口587上使用TLS - 否则它们将不接受连接。

答案 1 :(得分:0)

一旦被要求提供用户名,您必须将其编码以及发送CR / LF作为Dmitry Streblechenko在其上一条评论中添加。但是,如果您发送用户名和CL / LF,服务器将认为它是用户名或密码的一部分,并继续等待客户端响应。我通过简单地在两个单独的消息中发送它来实现它。

注意:我没有必要使用STARTTLS命令,因为我正在使用SSL。