Tenemos que utilizar un Socket SSL, llamado SSLSocketFactory.
Para podernos conectar a Gmail, en opciones de seguridad de la cuenta google, teniendo la autenticación en 2 pasos activada, abajo de todo tenemos una sección llamada contraseñas de aplicaciones, aquí se crean contraseñas específicamente para aplicaciones, utilizaremos la contraseña que se genere ahí para loguear desde nuestro cliente.
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; public class GmailImapExample { public static void main(String[] args) { final String username = "USUARIO@gmail.com"; // Reemplaza con tu dirección de Gmail final String password = "Contraseña"; // Reemplaza con tu contraseña de Gmail try (SSLSocket socket = (SSLSocket) SSLSocketFactory.getDefault().createSocket("imap.gmail.com", 993); BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter writer = new PrintWriter(socket.getOutputStream(), true)) { // Imprime información del socket para verificar la conexión SSL System.out.println("Socket connected: " + socket.isConnected()); System.out.println("Socket cipher suite: " + socket.getSession().getCipherSuite()); // Lee la respuesta inicial del servidor String response = reader.readLine(); System.out.println(response); // Envía el comando de inicio de sesión writer.println("a001 LOGIN " + username + " " + password); response = reader.readLine(); System.out.println(response); // Envía el comando para listar los mensajes en el INBOX writer.println("a002 SELECT INBOX"); response = reader.readLine(); System.out.println(response); // Cierra la conexión writer.println("a003 LOGOUT"); response = reader.readLine(); System.out.println(response); } catch (Exception e) { e.printStackTrace(); } } }
El Standard MIME multipath nos puede ser útil.