Obtener correo de GMail en la aplicación Java usando IMAP

Deseo acceder a los mensajes en GMail desde una aplicación Java utilizando JavaMail e IMAP. ¿Por qué recibo una SocketTimeoutException ?

Aquí está mi código:

Properties props = System.getProperties(); props.setProperty("mail.imap.host", "imap.gmail.com"); props.setProperty("mail.imap.port", "993"); props.setProperty("mail.imap.connectiontimeout", "5000"); props.setProperty("mail.imap.timeout", "5000"); try { Session session = Session.getDefaultInstance(props, new MyAuthenticator()); URLName urlName = new URLName("imap://MYUSERNAME@gmail.com:MYPASSWORD@imap.gmail.com"); Store store = session.getStore(urlName); if (!store.isConnected()) { store.connect(); } } catch (NoSuchProviderException e) { e.printStackTrace(); System.exit(1); } catch (MessagingException e) { e.printStackTrace(); System.exit(2); } 

Establecí los valores de tiempo de espera para que no demorara “para siempre”. Además, MyAuthenticator también tiene el nombre de usuario y la contraseña, que parecen redundantes con la URL. ¿Hay alguna otra forma de especificar el protocolo? (No lo vi en JavaDoc para IMAP.)

Usar imaps fue una gran sugerencia. Ninguna de las respuestas provistas me funcionó, así que busqué en Google un poco más y encontré algo que funcionó. Así es como se ve mi código ahora.

 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", "@gmail.com", ""); ... } catch (NoSuchProviderException e) { e.printStackTrace(); System.exit(1); } catch (MessagingException e) { e.printStackTrace(); System.exit(2); } 

Esto es bueno porque saca el Autenticador redundante de la imagen. Me alegro de que esto funcionó porque SSLNOTES.txt me hizo girar la cabeza.

En JavaMail, puede usar imaps como el esquema de URL para usar IMAP sobre SSL. (Consulte SSLNOTES.txt en su distribución JavaMail para obtener más detalles.) Por ejemplo, imaps://username%40gmail.com@imap.gmail.com/INBOX .

Del mismo modo, use smtps para enviar correos electrónicos a través de Gmail. por ejemplo, smtps://username%40gmail.com@smtp.gmail.com/ . Nuevamente, lea SSLNOTES.txt para más detalles. ¡Espero eso ayude!

Debe usar las siguientes propiedades para imaps:

 props.setProperty("mail.imaps.host", "imap.gmail.com"); props.setProperty("mail.imaps.port", "993"); props.setProperty("mail.imaps.connectiontimeout", "5000"); props.setProperty("mail.imaps.timeout", "5000"); 

Nota que es “imaps”, no “imap”, ya que el protocolo que está utilizando es imaps (IMAP + SSL)

Debe conectarse a GMail solo con SSL. Establecer las siguientes propiedades lo forzará por usted.

 props.setProperty ("mail.imap.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
 props.setProperty ("mail.imap.socketFactory.fallback", "falso");

Si desea obtener más código de muestra para usar JavaMail con Gmail (por ejemplo, convertir tags de Gmail a nombres de carpeta IMAP, o usar IMAP IDLE), consulte mi progtwig GmailAssistant en SourceForge .

Verifique http://g4j.sourceforge.net/ . Hay un cliente mínimo de Gmail creado con esta API.

Usé las siguientes propiedades para obtener la tienda y funciona bien.

"mail.imaps.host" : "imap.gmail.com"
"mail.store.protocol" : "imaps"
"mail.imaps.port" : "993"

Esto es lo que funcionó para mi equipo y para mí, me dieron una cuenta clásica nickname@gmail.com y una cuenta comercial employee@business.com:

  final Properties properties = new Properties(); properties.put("mail.imap.ssl.enable", "true"); imapSession = Session.getInstance(properties, null); imapSession.setDebug(false); imapStore = imapSession.getStore("imap"); imapStore.connect("imap.gmail.com", USERNAME, "password"); 

con USERNAME = “nickname” en el caso clásico, y USERNAME = “employee@business.com” en el caso de cuenta comercial.

En el caso clásico, y si usa una antigua dependencia de JavaMail, no olvide bajar la seguridad de la cuenta aquí: https://www.google.com/settings/security/lesssecureapps

En ambos casos, compruebe la configuración de GMail => Reenviar POP / IMAP si IMAP está habilitado para la cuenta.

¡Espero eso ayude!

Para llegar más lejos :

Necesita tener JSSE instalado para usar SSL con Java

 URLName server = new URLName("imaps://:@imap.gmail.com/INBOX");