2012-05-04 13 views
22

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"); 

Respuesta

17

Esta parte, * CAPABILITY IMAP4 IMAP4rev1 LOGINDISABLED sugieren que no se puede iniciar sesión, en this thread el OP lo resolvió actualizando su Javamail a 1.4.4 (aunque su resultado de depuración sugiere que ya lo tiene).Intente utilizar 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 por defecto: props.put("mail.imap.starttls.enable", "true");

This answer ha resuelto el problema.

+0

Intenté esto y algunas cosas más pero aún no tuve suerte. – Geronimo

+1

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

+0

@Geronimo ¿Has probado Javamail 1.4.5? – HulkingUnicorn

5

Puede usar el 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 hay necesidad de utilizar el SSLSocketFactory personalizado.

+0

¡Hombre impresionante! Salvaste mi día –

Cuestiones relacionadas