Recibir correos con JavaMail y Java
Recepción de correos con Java y JavaMail. Se usa una cuenta de gmail para obtener los correos del buzón INBOX.
Obtener Session[editar]
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[editar]
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[editar]
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[editar]
Puedes ver esto más detallado en