martes, 4 de junio de 2013

Java Mail (Parte4) Obtener mensajes no leídos de GMail y Yahoo Mail [IMAP]

El envío de mensajes a través de JavaMail es un proceso de baja complejidad comparado con la lectura de los mensajes de nuestra bandeja de entrada.
La complejidad es causada porque cuando nosotros enviamos en mensaje especificamos que elementos contiene el cuerpo del mensaje, cuando intentamos leer los mensajes esto es un problema. No sabemos con certeza si el mensaje solo contiene texto, si esta en formato HTML, si contiene uno o mas adjuntos y que tipo de archivos están adjuntados(imágenes, documentos, archivos comprimidos, audio,video,etc)

A continuación presento en código fuente de una clase Java que obtiene los mensajes sin leer de nuestra cuenta de GMail ó Yahoo. Sólo se muestra el texto de los mensajes, en caso de que el mensaje contenga adjuntos no mostrará nada.

Este código es una modificación del que se encuentra en aqui. Para que la aplicación funcione correctamente es necesario importar las librerías  disponibles en este post

Aclaro que este ejemplo solo muestra los mensajes de tipo texto, si contiene imágenes o archivos adjuntos no se mostrará.

import java.util.Properties;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.search.FlagTerm;

public class EmailReader {

    public static void main(String args[]) {
        Properties props = System.getProperties();
        props.setProperty("mail.store.protocol", "imaps");
        try {
                Session session = Session.getDefaultInstance(props, null);
                Store store = session.getStore("imaps");

                // servidor IMAP para gmail. 
                // remplazar <usuario> con su usuario de Gmail.
                // remplazar <password> con el password correspondiente al usuario especificado.

                store.connect("imap.gmail.com", "usuario@gmail.com", "password");

                // Servidor IMAP para yahoo.
                //store.connect("imap.mail.yahoo.com", "<username>", "<password>");

                System.out.println(store);

                Folder inbox = store.getFolder("Inbox");
                inbox.open(Folder.READ_ONLY);
                mostrarCorreosNoLeidos(inbox);//indicamos que lee los mails no leidos
                   
                
        } catch (NoSuchProviderException e) {
            System.out.println(e.toString());
            System.exit(1);
        } catch (MessagingException e) {
            System.out.println(e.toString());
            System.exit(2);
        }

    }
    
    static public void mostrarCorreosNoLeidos(Folder inbox){        
        try {
            FlagTerm ft = new FlagTerm(new Flags(Flags.Flag.SEEN), false);
            Message msg[] = inbox.search(ft);
            System.out.println("Correos sin leer: "+msg.length);
            for(Message message:msg) {
                try {
                    System.out.println("Fecha: "+message.getSentDate().toString());
                    System.out.println("De: "+message.getFrom()[0].toString());            
                    System.out.println("Asunto: "+message.getSubject().toString());
                    System.out.println("Contenido: "+message.getContent().toString());
                    System.out.println("******************************************");
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    System.out.println("Sin Información");
                }
            }
        } catch (MessagingException e) {
            System.out.println(e.toString());
        }
    }
}


------------------------------------------------------------------------------------------------------------
Por el momento sigo tratando de entender la estructura de los mensajes para poder leer mensajes complejos en formato HTML y con Archivos adjuntos, espero publicar una entrada en la que explique como realizar la lectura de mensajes complejos.

4 comentarios:

  1. Hola amigo, pudiste actualizar el programilla para que lea archivos adjuntos?

    ResponderEliminar
  2. hola disculpa pero no puedo hacer correr tu codigo ya que me sale un error en lo que se refiere al ssl del servidor me podrias ayudar porfavor
    javax.mail.MessagingException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target;
    nested exception is:
    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

    ResponderEliminar