import java.io.IOException;
import java.net.URI;
import org.apache.commons.net.PrintCommandListener;
import org.apache.commons.net.imap.*;
import java.io.*;

class IMAPMail{
    public static void main(String[] args) {
        // Datos de GMAIL: imap.gmail.com, Requiere SSL: Sí, Puerto: 993
        String server="imap.gmail.com";
        String user="XXX";
        String password="YYY";
        
        try {
            // Conectando e identificandome
            IMAPClient imap = new IMAPSClient(true);
            imap.setDefaultTimeout(6000);
            imap.connect(server);
            imap.login(user, password);
            
            // A partir de aqui le MANDA un comando al servidor IMAP que hay que recuperar
            // Indicamos que las respuestas las muestre por pantalla y hacia un fichero texto
            imap.addProtocolCommandListener(new PrintCommandListener(System.out, true));
            imap.addProtocolCommandListener(new PrintCommandListener(new PrintWriter("imap.txt")));
            
            // Ahora mandamos comandos IMAP y recibimos las repuestas en pantalla y fichero
            System.out.println("============CARACTERISTICAS DEL SERVIDOR===================");
            imap.capability();
            
            System.out.println("============= CARPETA INBOX (RECIBIDOS) ===================");
            imap.select("inbox");
            imap.examine("inbox");
            
            // Pide el numero de mensajes
            imap.status("inbox", new String[]{"MESSAGES"});

            // Recuperamos el mensaje numero 2 con fetch, que lleva 2 parametros
            // 1- Secuencia de mensajes Ej 1:4,6,7,10;*
            // 2- Parte del mensaje a recuparar
            // BODY.PEEK[HEADER] , BODY.PEEK[HEADER.FIELDS (SUBJECT)] , ALL , ENVELOPE , (INTERNALDATE BODY.PEEK[]) , ...
            System.out.println("============= Mensaje numero 2 =========================");
            // Pido el subject
            imap.fetch("2", "body[header.fields (subject)]");
            // Pido el contenido
            imap.fetch("2", "rfc822.text");
            
            // Desconectando
            imap.logout();
            imap.disconnect();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}