mail example java imap javamail exchange-server

example - Java Mail to Exchange Server "no hay métodos de inicio de sesión compatibles"



javamail download (2)

Esta parte, * CAPABILITY IMAP4 IMAP4rev1 LOGINDISABLED sugiere que no puede iniciar sesión, en este hilo el OP lo resolvió actualizando su Javamail a 1.4.4 (aunque su salida de depuración sugiere que ya lo tiene). Trate de usar 1.4.5.

En realidad, intente agregar esta línea antes de crear la sesión; su servidor de correo electrónico lo admite y está deshabilitado de forma predeterminada: props.put("mail.imap.starttls.enable", "true");

Esta respuesta resolvió el problema.

Estoy tratando de implementar un servlet de Java Mail, el primer paso es conectar al servidor IMAP.

Soy capaz de hacer telnet al servidor en el puerto 143 (puerto IMAP predeterminado), telnet dice: OK The Microsoft Exchange IMAP4 service is ready.

Ahora estoy tratando de conectarme al servidor utilizando la API de Java Mail de esta manera:

Properties props = new Properties(); session = Session.getDefaultInstance(props, null); store = session.getStore("imap"); store.connect("host","user","password");

Y puedo conectarme a este mismo servidor utilizando una aplicación web de Outlook existente con las mismas credenciales que estoy tratando de pasarle a Java.

Pero ejecutando esto con session.setDebug(true) produce el siguiente resultado:

DEBUG: setDebug: JavaMail version 1.4.5 DEBUG: getProvider() returning javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc] DEBUG: mail.imap.fetchsize: 16384 DEBUG: mail.imap.statuscachetimeout: 1000 DEBUG: mail.imap.appendbuffersize: -1 DEBUG: mail.imap.minidletime: 10 DEBUG: trying to connect to host "myHost", port 143, isSSL false * OK The Microsoft Exchange IMAP4 service is ready. A0 CAPABILITY * CAPABILITY IMAP4 IMAP4rev1 LOGINDISABLED STARTTLS UIDPLUS CHILDREN IDLE NAMESPACE LITERAL+ A0 OK CAPABILITY completed. DEBUG: protocolConnect login, host=myHost, user=myUser, password=<non-null> javax.mail.MessagingException: No login methods supported!;

EDITAR:

prop.setProperty("mail.imap.starttls.enable", "true") como se sugirió.

Sin embargo, comencé a obtener este resultado de depuración:

DEBUG: setDebug: JavaMail version 1.4.5 DEBUG: getProvider() returning javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc] DEBUG: mail.imap.fetchsize: 16384 DEBUG: mail.imap.statuscachetimeout: 1000 DEBUG: mail.imap.appendbuffersize: -1 DEBUG: mail.imap.minidletime: 10 DEBUG: enable STARTTLS DEBUG: trying to connect to host "myHost", port 143, isSSL false * OK The Microsoft Exchange IMAP4 service is ready. A0 CAPABILITY * CAPABILITY IMAP4 IMAP4rev1 LOGINDISABLED STARTTLS UIDPLUS CHILDREN IDLE NAMESPACE LITERAL+ A0 OK CAPABILITY completed. DEBUG: protocolConnect login, host=myHost, user=myUser, password=<non-null> A1 STARTTLS A1 OK Begin TLS negotiation now. DEBUG IMAP: STARTTLS Exception: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Suponiendo que se trataba de un problema de certificado, seguí estas instrucciones y agregué un servidor de correo a mi archivo de cacerts. El programa de prueba incluido no funcionó muy bien y pude conectarme utilizando una URL de SSL, pero aún así obtuve la misma excepción al ejecutar la clase de correo Java.

También intenté cambiar a "imaps" con: session.getStore("imaps") (en lugar de "imap") y ni siquiera pude obtener el mensaje "Microsoft Exchange Server está listo". Creo que porque está intentando conectarse en el puerto 993 siempre que se especificó "imaps". Pero el uso de telnet para el puerto 993 no muestra ninguna conexión con el servidor de correo electrónico.

Así que luego intenté forzar al programa a usar SSL en el puerto 143 de esta manera:

// Use SSL prop.setProperty("mail.imap.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); prop.setProperty("mail.imap.socketFactory.fallback", "false"); // Use port 143 prop.setProperty("mail.imap.port", "143"); prop.setProperty("mail.imap.socketFactory.port", "143");

Solo para recibir esta excepción, así que no creo que tenga nada que ver con SSL:

DEBUG: mail.imap.fetchsize: 16384 DEBUG: mail.imap.statuscachetimeout: 1000 DEBUG: mail.imap.appendbuffersize: -1 DEBUG: mail.imap.minidletime: 10 DEBUG: trying to connect to host "myHost", port 143, isSSL false Not able to process the mail reading. javax.mail.MessagingException: Unrecognized SSL message, plaintext connection?;

¿Podría esa excepción TLS anterior ( DEBUG IMAP: STARTTLS Exception: javax.net.ssl.SSLHandshakeException: provenir de que TLS no esté habilitado en el servidor de Exchange?

No tengo acceso al servidor de correo electrónico, pero probablemente podría conseguir que alguien me deje entrar.

SOLUCIÓN:

El comentario de HulkingUnicorn debajo de su respuesta señaló esta respuesta, que era exactamente el manejo necesario. Al parecer MS Exchange Server tiene este problema. Junto con agregar la clase que figura en esa respuesta a mi paquete, simplemente implementé mis conexiones de correo de esta manera y todo estuvo bien:

Properties prop = new Properties(); prop.setProperty("mail.imap.starttls.enable", "true"); prop.setProperty("ssl.SocketFactory.provider", "my.package.name.ExchangeSSLSocketFactory"); prop.setProperty("mail.imap.socketFactory.class", "my.package.name.ExchangeSSLSocketFactory"); session = Session.getDefaultInstance(prop, null); session.setDebug(true); store = session.getStore("imap"); store.connect("myHost","myUser","myPassword");


Puede usar com.sun.mail.util.MailSSLSocketFactory que forma parte de la API javamail 1.4.5.

Ejemplo:

MailSSLSocketFactory sf = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); props.put("mail.imap.starttls.enable", "true"); props.put("mail.imap.ssl.socketFactory", sf);

No es necesario utilizar el SSLSocketFactory personalizado.