Para poder leer correos de nuestro mail como cualquier servicio de web mail pero en hecho en java vamos a necesitar importar la dependencia de Java Mail, crear un conjunto de propiedades, crear la sesion, y ahora contamos con los objetos Store y Folder, ademas de la clase Message para cada email.
- Crear un conjunto de propiedades, a las cuales hay que setearle las propiedades:
Properties prop = new Properties();
- Deshabilitar el TLS (Transport Layer Security)
- prop.setProperty("mail.pop3.starttls.enable", "false");
- Avtivar en su lugar SSL (Secure Sockets Layer)
- prop.setProperty("mail.pop3.socketFactory.class","javax.net.ssl.SSLSocketFactory" );
prop.setProperty("mail.pop3.socketFactory.fallback", "false");
- Le indicamos el puerto de conexion (995)
- prop.setProperty("mail.pop3.port","995");
prop.setProperty("mail.pop3.socketFactory.port", "995");
- Deshabilitar el TLS (Transport Layer Security)
- Creamos una sesion, con las properties recién definidas:
- Session sesion = Session.getInstance(prop);
- Pasamos a crear los objetos, Store y Folder. Store vendria a ser como la cuenta de mail que guarda los diversos correos, Folder la carpeta donde se guardan estos(EJ: recibidos, enviados, spam, etc)
-
Store store;
Folder folder;
-
- Inicializamos estos objetos dentro de un try-catch, pidiéndole a la Session que obtenga el 'almacen' y lo conecte, pasando el host, usuario y contraseña.
Luego a este 'almacen' le pedimos que obtenga la carpeta y la abra con una propiedad de READ_ONLY para no marcar los correos como leido. Caso contrario usamos READ_WRITE:-
store= sesion.getStore("pop3");
store.connect("pop.gmail.com","nuestro_mail@gmail.com","nuestra_contraseña");
folder= store.getFolder("[Gmail]/Send");
folder.open(Folder.READ_ONLY);
-
- Creamos nnuestro objeto Message que representa el correo electronico en si mismo como un array de mensajes.
-
Message [] mensajes= folder.getMessages();
-
- Ya tendremos nuestro array de mensajes para mostrar, imprimiendo simplemente en pantalla, podemos utlizar un ciclo for para leer cada uno
-
for (int i = 0; i < mensajes.length; i++){ System.out.println("DE : " + mensajes[i].getFrom()[0].toString());
System.out.println("ASUNTO: " + mensajes[i].getSubject());
}
-
El resultado puede variar, dependiendo de los correos recibidos. Mi resultado fu este:
Mi método completo es el siguiente.
public void leerCorreo(){ 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); sesion.setDebug(false); Store store; Folder folder; try { store = sesion.getStore("pop3"); store.connect("pop.gmail.com","dar10comyr@gmail.com","blogspot2016"); folder = store.getFolder("INBOX"); folder.open(Folder.READ_ONLY); Message [] mensajes = folder.getMessages(); for (int i = 0 ; i < mensajes.length; i++){ System.out.println("DE : " + mensajes[i].getFrom()[0].toString()); System.out.println("ASUNTO: " + mensajes[i].getSubject()); } } catch (NoSuchProviderException e){ e.printStackTrace(); } catch (MessagingException e) { e.printStackTrace(); } }
OBTENER TODAS LAS CARPETAS
Para obtener mas carpetas ademas de la de 'INBOX', deberemos cambiar el protocolo de conexion de POP a IMAP
- Creamos nuestras propiedades.
- Le seteamos un única propiedad:
-
prop.setProperty("mail.store.protocol", "imaps");
-
- Creamos una sesion con las properties creadas.
- Obtenemos un Store pidiendoselo a la sesion pero esta vez con el protocolo IMAP
-
Store store= sesion.getStore("imaps");
-
- Le pedimos al Store que se conecte pasandole el host pero como protocolo POP, el usuario y la contraseña (igual que antes).
- Ahora, vamos a obtener un array de del Folders para luego recorrerlo y obtener de si mismo el nombre de la carpeta (o todos)
-
Folder[] folders= store.getDefaultFolder().list("*")
-
- Realizamos una pequeña comprobación con un if, ya que vamos a pedirle al Folder que nos obtenga el 'tipo', que es un número y solo nos interesa que sea el '3' (Ya que tambien existe un tipo '2' que no contiene 'folders' válidos).
-
if (folder.getType() == 3) { System.out.println(folder.getFullName() + ": " + folder.getMessageCount());
-
- Ahora obtenemos el folder, pidiendosele al Store pero esta vez le pasamos como parametro, el mismo 'folder' que obtiene su nombre.
-
folder = store.getFolder(folder.getFullName());
-
- Nuevamente le seteamos la opcion de 'READ ONLY' para que no los marque como leidos, si es que lo queremos asi:
-
folder.open(Folder.READ_ONLY);
-
- Volvemos a crear nuestro array de mensajes que luego iteraremos para leer cada mensaje de cada carpeta:
-
Message [] mensajes= folder.getMessages();
-
-
Por ultimo el mismo for para ver aunque sea por pantalla los resultados:
-
for (int i = 0; i < mensajes.length; i++){ System.out.println("DE : " + mensajes[i].getFrom()[0].toString());
System.out.println("ASUNTO: " + mensajes[i].getSubject());
}
-
Mi resultado fue mas o menos asi:
El codigo completo de esta clase es:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | public void LeerCorreos() { Properties props = System.getProperties(); props.setProperty("mail.store.protocol", "imaps"); try { Session session = Session.getDefaultInstance(props, null); Store store = session.getStore("imaps"); store.connect("imap.gmail.com", "dar10comyr@gmail.com", "blogspot2016"); Folder[] folders = store.getDefaultFolder().list("*"); for (Folder folder : folders) { if (folder.getType() == 3) { System.out.println(folder.getFullName() + ": " + folder.getMessageCount()); folder = store.getFolder(folder.getFullName()); folder.open(Folder.READ_ONLY); Message [] mensajes = folder.getMessages(); for (int i = 0 ; i < mensajes.length; i++){ System.out.println("DE : " + mensajes[i].getFrom()[0].toString()); System.out.println("ASUNTO: " + mensajes[i].getSubject()); } } } } catch (MessagingException e) { e.printStackTrace(); } } |
No hay comentarios:
Publicar un comentario