Crear un Gestor o Agente de Correo (Java)
Hace algún tiempo os hablé de como crear una clase en Java para mandar mails. Bien,
hoy os voy a comentar como crear un simple gestor de correo que se descargue todos los correos de una carpeta de una cuenta IMAP.
Para ello vamos a usar el JavaMail API.
Crearemos una clase llamada GestorMail, e importaremos las siguientes clases:
import javax.mail.*; import javax.mail.internet.*; import javax.mail.Flags.*; import javax.mail.search.*; import java.util.Date; import java.util.Properties; import java.util.TimerTask; import java.text.SimpleDateFormat; |
El método principal del programa, inicializará la conexión con el servidor IMAP,
abrirá la carpeta donde se encuentran los archivos y los recuperará para posteriormente realizar con ellos alguna tarea.
Configuramos el acceso IMAP y conectamos con el servidor>
username = "cuentade@correo.es"; password = "lapassword"; host = "192.168.0.19"; Properties props = System.getProperties(); props.put("mail.smtp.host", host); props.put("mail.smtp.timeout","10000"); Session sesionMail = Session.getDefaultInstance(props, null); Store store = sesionMail.getStore("imap"); store.connect(host, username, password); |
Abrimos una carpeta IMAP, y recuperamos los mensajes
/*Abrimos una carpeta IMAP, En este caso la bandeja de entrada*/ folder = store.getFolder("INBOX"); folder.open(Folder.READ_WRITE); //modo lectura-escritura /*Recuperamos todos los mensajes de la carpeta*/ Message messages[] = folder.getMessages(); /*¿Cuantos mensajes hemos leido?*/ int totalMensajes = folder.getMessageCount(); |
Tratamos los mensajes
//Procesamos cada uno de los mensajes for(int i=0;i<messages.length;i++ ) { MimeMessage unMensaje = (MimeMessage)messages[i]; if (es_mensaje_texto(unMensaje) ){ /*Recuperamos el cuerpo del mensaje*/ cuerpo = (String)unMensaje.getContent( ); sFechaEnvio = getFechaEnvio(unMensaje); de = getDe(unMensaje); para = getPara(unMensaje); asunto = getAsunto(unMensaje); int longitud = cuerpo.length(); System.out.println("Longitud del mensaje:" + longitud + " caracteres"); System.out.println("ASUNTO:"+ asunto); System.out.println("DE:"+ de); System.out.println("PARA:"+ para); /*Hacemos algo con el mensaje*/ } } // for messages |
Cerramos la carpeta y la conexión IMAP
folder.close( true ); store.close(); |
Algunos métodos que uso durante el programa principal los muestro a continuación:
Conocer si un mensaje es simplemente un mensaje de texto, o contiene adjuntos
public boolean es_mensaje_texto(MimeMessage message){ try{ if (message.getContentType()!=null && message.getContentType().indexOf("text")>=0 && message.getContentType().indexOf("multipart")<0 ) { if( message.getContentType().indexOf("text/plain")>=0 || message.getContentType().indexOf("text/html")>=0 ) { return true; } return false; } return false; }catch(Exception ex){ ex.printStackTrace(); return false; } } |
Obtener la fecha de envio del mensaje
public String getFechaEnvio(MimeMessage message){ try {fechaEnvio = message.getSentDate( ); } catch( Exception e ) { fechaEnvio = null; } try {sFechaEnvio = "'"+sdfsql.format( fechaEnvio )+"'"; } catch( Exception e ) { sFechaEnvio = "null"; } return sFechaEnvio; } |
Obtener el campo DE
public String getDe (MimeMessage message){ String de = ""; Address direcciones[]; Address direccion; try { direcciones = message.getFrom( ); } catch( Exception e ) { direcciones = null; } if( direcciones != null && direcciones.length>0 ) { for(int j=0, n=direcciones.length;j<n;j++) { direccion = direcciones[j]; if( direccion!=null ) de += direccion.toString( ); } } return de; } |
Obtener todos los TO del mensaje
public String getPara(MimeMessage message){ String para = ""; Address direcciones[]; Address direccion; try {direcciones = message.getAllRecipients( ); } catch( Exception e ) { direcciones = null; } if( direcciones != null && direcciones.length>0 ) { for(int j=0, n=direcciones.length;j<n;j++) { direccion = direcciones[j]; if( direccion!=null )para += direccion.toString( )+" "; } } return para; } |
Obtener el asunto del mensaje
public String getAsunto(MimeMessage message){ String asunto = ""; try { asunto = message.getSubject( ); }catch(Exception ex){ ex.printStackTrace(); asunto = ""; } return asunto; } |
Podéis descargaros el código fuente desde aquí.
lan