Conectar GMAIL desde nuestro programa

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.