Saltar al contenido
Portada » Cliente IMAP Java

Cliente IMAP Java

Vamos a construir varios ejemplos en este tutorial sencillo para un cliente IMAP escrito en Java.

El API de JavaMail ofrece un framework independiente de plataforma y de protocolo para construir aplicaciones para la gestión de correo electrónico en Java. Permite interactuar con servidores de correo usando los siguientes protocolos:

  • SMTP (Simple Mail Transfer Protocol)
  • IMAP (Internet Message Access Protocol)
  • POP (Post Office Protocol)

Dependencias

Las dependencias a incluir en el POM para trabajar con buzones de correo electrónico son las siguientes:

<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>

Puedes incluir la versión más reciente que se encuentre disponible.

Cómo se almacenan los correos

Para cada cuenta de usuario en el servidor de correo hay un almacenamiento propio para sus mensajes. El almacenamiento se divide en carpetas siendo la carpeta “inbox” la principal que contiene mensajes. Cada carpeta puede contener a su vez subcarpetas o mensajes directamente.

Clases básicas: Store, Folder y Message

Las clases fundamentales del API JavaMail son las siguientes:

  • Store: Se puede obtener un objeto Store de la sesión actual invocando el método getStore(String protocol) de la clase Session. Puedes conectar usando el método connect(String usuario, String contrasenya) y desconectar usando el método close().
  • Folder: Se puede obtener un objeto Folder del Store invocando el método getFolder(String nombreCarpeta). En general, la carpeta estándar para los buzones de correo es “inbox” (no es case-sensitive). Los métodos más importantes del objeto Folder:
    • open(int mode): Abre la carpeta en modo READ_ONLY o READ_WRITE.
    • getMessages(): Devuelve un array de objetos de tipo Message marcados como no-leidos en la carpeta. Un objeto Message puede ser una referencia ligera, y su contenido detallado puede ser obtenido a demanda.
    • close(boolean expunge): Cierra la carpeta y elimina permanentemente todos los mensajes marcados como borrados si “expunge” es verdadero.
  • Message: object represents an e-mail message. To get detailed attributes of a message, the following methods can be called on the Message object: El objeto representa un mensaje de correo electrónico (e-mail).
    • Address[] getFrom(): Devuelve una lista de emisores en el atributo From del mensaje.
    • Address[] getRecipients(Message.RecipientType type): Devuelve las direcciones de receptores del mensaje. El tipo puede ser TO o CC.
    • String getSubject(): Devuelve el asunto del mensaje.
    • Date getSentDate(): Devuelve la fecha y hora de cuando se envió el mensaje.
    • Object getContent(): Devuelve el contenido del mensaje.

Pasos para trabajar con servidor de correo

  1. Preparar un objeto Properties que maneja los datos como el host, el puerto, el protocolo, etc.
  2. Crear la sesión para empezar a trabajar con el servidor.
  3. Obtiene un “store” de la sesión por un protocolo específico (IMAP o POP3).
  4. Conectar a la “store” usando credenciales.
  5. Obtener la carpeta inbox de la “store”.
  6. Abrir la carpeta inbox.
  7. Devolver mensaje de la carpeta.
  8. Obtener detalles de cada mensaje.
  9. Cerrar la carpeta.
  10. Cerrar la “store”.

Ejemplo completo cliente IMAP Java

import java.util.Properties;
 
import javax.mail.Address;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Message.RecipientType;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.Session;
import javax.mail.Store;
 

public class ReceptorEmails{
 

    private Properties obtenerPropiedades(String protocolo, String host,
            String puerto) {
        Properties propiedades= new Properties();
 
        properties.put(String.format("mail.%s.host", protocol), host);
        properties.put(String.format("mail.%s.port", protocol), port);
 
        // SSL setting
        properties.setProperty(
                String.format("mail.%s.socketFactory.class", protocol),
                "javax.net.ssl.SSLSocketFactory");
        properties.setProperty(
                String.format("mail.%s.socketFactory.fallback", protocol),
                "false");
        properties.setProperty(
                String.format("mail.%s.socketFactory.port", protocol),
                String.valueOf(port));
 
        return propiedades;
    }
 

    public void descargarEmails(String protocolo, String host, String puerto,
            String usuario, String contrasenya) {
        Properties propiedades= getServerProperties(protocolo, host, puerto);
        Session session = Session.getDefaultInstance(properties);
 
        try {
            Store store = session.getStore(protocolo);
            store.connect(usuario, contrasenya);
 
            Folder carpeta = store.getFolder("INBOX");
            carpeta.open(Folder.READ_ONLY);
 
            Message[] mensajes= carpeta.getMessages();
 
            for (int i = 0; i < mensajes.length; i++) {
                Message mensaje = messages[i];
                Address[] direccionDesde= mensaje.getFrom();
                String desde = direccionDesde[0].toString();
                String asunto = mensaje.getSubject();
                String listaPara= parseAddresses(mensaje                                                                                                                                                                                 .getRecipients(RecipientType.TO));
                String listaCC = parseAddresses(mensaje
                        .getRecipients(RecipientType.CC));
                String fechaEnvio= mensaje.getSentDate().toString();
 
                String tipoContenido = mensaje.getContentType();
                String contenidoMensaje = "";
 
                if (tipoContenido.contains("text/plain")
                        || tipoContenido.contains("text/html")) {
                    try {
                        Object contenido= mensaje.getContent();
                        if (contenido != null) {
                            contenidoMensaje = contenido.toString();
                        }
                    } catch (Exception e) {
                        contenidoMensaje = "Error descargando contenido";
                        e.printStackTrace();
                    }
                }
 
            }
 
  
            carpeta.close(false);
            store.close();

        } catch (NoSuchProviderException ex) {
            System.out.println("No hay proveedor para el protocolo: " + protocolo);
            ex.printStackTrace();
        } catch (MessagingException ex) {
            System.out.println("No pudo conectarse al store");
            ex.printStackTrace();
        }
    }
 

    private String parsearDirecciones(Address[] direcciones) {
        String listaDirecciones= "";
 
        if (direcciones != null) {
            for (int i = 0; i < direcciones.length; i++) {
                listaDirecciones+= direcciones[i].toString() + ", ";
            }
        }
        if (listaDirecciones.length() > 1) {
            listaDirecciones= listaDirecciones.substring(0, listaDirecciones.length() - 2);
        }
 
        return listaDirecciones;
    }
 

    public static void main(String[] args) {
        // for POP3
        //String protocolo = "pop3";
        //String host = "pop.gmail.com";
        //String puerto = "995";
 
        // for IMAP
        String protocolo = "imap";
        String host = "imap.gmail.com";
        String puerto = "993";
 
 
        String usuario= "tu_direccion_de_email";
        String contrasenya = "tu_contrasenya";
 
        ReceptorEmails receptor= new ReceptorEmails();
        receptor.descargarEmails(protocolo, host, puerto, usuario, contrasenya);
    }
}

Más algoritmos de redes

TemaDescripción
SocketsAprende lo básico sobre sockets en Java, construye tus protocolos.
WebsocketsConstruye un endpoint en Java al que conectar mediante Websockets.
FTPCódigo para implementar en Java un cliente FTP
IMAPCliente IMAP escrito en Java.
SMB/jCIFSUso de jCIFS para el acceso a recursos de red compartidos mediante SAMBA
Send Mail JavaEnvío de correos electrónicos a través de JavaMail API

Recursos básicos Java

AsuntoDescripción
Tutorial básico y sintaxisTutorial básico Java y sintaxis. Aprende los fundamentos del lenguaje.
Hilos (Threads)Aprende a manejar hilos y las cuestiones básicas de la concurrencia
Funciones LambdaAquí te enseñamos las nociones más importantes para arrancas con funciones lambda
PalíndromosPrograma de ejemplo para el uso de palíndromos en Java.
Máquina Virtual de JavaTe explicamos el funcionamiento de la máquina virtual de java (Java Virtual Machine – JVM)
JDK, JRE y JVMDiferencias entre el JDK, JRE y JVM.
Mejores libros Java en EspañolHazte con los mejores libros Java para aprender paso a paso y profundizar en las mejores prácticas
TensorFlowManejo del API de TensorFlow para la construcción de grafos de operaciones y su ejecución
Tutorial Log4jTutorial para el manejo de Log4j, herramienta ágil y flexible para la gestión de Logs en Java
Java SecurityEntiende y aplica las posibilidades que da Java para mantener la seguridad
Tutorial JConsoleAprende los conceptos básicos de monitorización de procesos Java con JConsole
JavaFXTutorial de JavaFX, librería gráfica moderna para construcción de GUIs en móvil, escritorio y web.
Estructuras de datos en JavaExplicación y ejemplos de las estructuras de datos más importantes: listas, pila, cola, arbol.
JavaapiConjunto de clases, interfaces, métodos y paquetes que forman parte de la plataforma Java estándar
Algoritmo HuffmanMétodo eficiente para codificar datos, asignando códigos más cortos a los caracteres más frecuentes