Recibir correos con JavaMail y Java

De ChuWiki
Saltar a: navegación, buscar

Recepción de correos con Java y JavaMail. Se usa una cuenta de gmail para obtener los correos del buzón INBOX.


Obtener Session

Lo primero es obtener una instancia de la clase Session. Para ello, se llama a Session.getDefaultInstance() pasando unas propiedades como parámetro, que son los parámetros de conexión con gmail.

Properties prop = new Properties();

// Deshabilitamos TLS
prop.setProperty("mail.pop3.starttls.enable", "false");

// Hay que usar SSL
prop.setProperty("mail.pop3.socketFactory.class","javax.net.ssl.SSLSocketFactory" );
prop.setProperty("mail.pop3.socketFactory.fallback", "false");

// Puerto 995 para conectarse.
prop.setProperty("mail.pop3.port","995");
prop.setProperty("mail.pop3.socketFactory.port", "995");

Session sesion = Session.getInstance(prop);

// Para obtener un log más extenso.
sesion.setDebug(true);


Obtención de los mensajes

Para obtener los mensajes, establecemos la conexión, pedimos el almacén de mensajes y dentro del almacén, la carpeta INBOX

Store store = sesion.getStore("pop3");
store.connect("pop.gmail.com","ejemplo@gmail.com","la password ");
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);

Una vez que tenemos la carpeta, obtener los mensajes es inmediato

Message [] mensajes = folder.getMessages();


Analizar el contenido de los mensajes

El from y subject de cada mensaje se extrae fácilmente

for (int i=0;i<mensajes.length;i++)
{
   System.out.println("From:"+mensajes[i].getFrom()[0].toString());
   System.out.println("Subject:"+mensajes[i].getSubject());
}

Para cada mensaje, debemos analizar su contenido para extraer la información. Lo primero es saber si es un mensaje compuesto de varias partes o es un mensaje simple.

La comprobación de si es un mensaje compuesto y la extracción de cada una de sus partes se puede hacer así

// Si es compuesto, su MIME type es multipart
if (mensajes[i].isMimeType("multipart/*"))
{
   // Obtenemos el contenido, que es de tipo MultiPart.
   Multipart multi;
   multi = (Multipart)mensajes[i].getContent();

   // Extraemos cada una de las partes.
   for (int j=0;j<multi.getCount();j++)
   {
      Part unaParte = multi.getBodyPart(j);

      // Volvemos a analizar cada parte de la MultiParte
      if (unaParte.isMimeType (....))
          ...
   }
}

Debemos realizar este paso hasta que obtengamos partres que no sean multipart. Una vez que obtenemos una parte que no sea multipart, debemos mirar qué es exactamente, para extraer su contenido.

Podemos comprobar si es de texto y extraer su contenido

if (unaParte.isMimeType("text/*")
   System.out.println(unaParte.getContent());

Si no es de texto, por ejemplo es una imagen, obtenemos el InputStream y lo tratamos como corresponda al tipo de dato. El siguiente trozo de código guardaría una imagen en un fichero.

if (unaParte.isMimeType("image/*"))
{
   FileOutputStream fichero = new FileOutputStream("d:/"+unaParte.getFileName());
   InputStream imagen = bodyPart.getInputStream();
   byte [] bytes = new byte[1000];
   int leidos=0;
   while ((leidos=imagen.read(bytes))>0)
   {
      fichero.write(bytes,0,leidos);
   }
}

y el siguiente, crearía un JFrame para mostrarlo

if (unaParte.isMimeType("image/*"))
{
   JFrame v = new JFrame();
   ImageIcon icono = new ImageIcon(ImageIO.read(unaParte.getInputStream()));
   JLabel l = new JLabel(icono);
   v.getContentPane().add(l);
   v.pack();
   v.setVisible(true);
}


Enlaces

Puedes ver esto más detallado en