Estoy tratando de implementar un servlet Java Mail, el primer paso es conectarme al servidor IMAP.Java Mail to Exchange Server "no se admiten métodos de inicio de sesión"
Puedo telnet al servidor en el puerto 143 (puerto por defecto IMAP), telnet dice: OK The Microsoft Exchange IMAP4 service is ready.
Ahora estoy tratando de conectar con el servidor utilizando la API de Java Mail como esto:
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 usando una aplicación de Outlook Webapp con las mismas credenciales que estoy tratando de pasarle en Java.
Pero correr 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!;
EDIT:
añadí prop.setProperty("mail.imap.starttls.enable", "true")
como se sugiere.
Sin embargo, empecé a recibir esta salida 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í these instructions y añadió servidor de correo a mi archivo cacerts. El programa de prueba incluido allí funcionó totalmente bien y pude conectarme usando una url de SSL pero todavía tengo la misma excepción cuando ejecuto la clase de correo de Java.
También intenté cambiar a "imaps" con: session.getStore("imaps")
(en lugar de "imap") y ni siquiera pude obtener el mensaje "El servidor de Microsoft Exchange ya está listo". Creo que porque está intentando conectarse en el puerto 993 siempre que se especifique "imaps". Pero el uso de telnet en el puerto 993 no muestra ninguna conexión con el servidor de correo electrónico.
Así siguiente intenté forzar el programa a utilizar SSL en el puerto 143 como esto:
// 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");
sólo para recibir esta excepción, así que no creo que quiere tener 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 de TLS anterior (DEBUG IMAP: STARTTLS Exception: javax.net.ssl.SSLHandshakeException:
) proceder de TLS que no está habilitado en el servidor de Exchange?
que no tienen fácil acceso al servidor de correo electrónico, pero que probablemente podría conseguir a alguien que me dejó entrar
SOLUCIÓN:.
comentario de HulkingUnicorn por debajo de su respuesta señaló this answer que era el manejo exacto necesario. Aparentemente MS Exchange Server tiene este problema. Junto con la adición de la clase que figuran en la respuesta a mi paquete, simplemente implementado mis conexiones de correo así y todo estaba 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");
Intenté esto y algunas cosas más pero aún no tuve suerte. – Geronimo
Si usa "imaps", también debe agregar la "s" a todas las propiedades, como 'prop.setProperty (" mail.imaps.port "," 143 ");' No parece probable que el servidor utiliza imaps con ese número de puerto sin embargo. – HulkingUnicorn
@Geronimo ¿Has probado Javamail 1.4.5? – HulkingUnicorn