Java Mail pour Exchange Server “pas de méthodes d'authentification prises en charge”

Je suis en train de mettre en œuvre un servlet Java Mail, la première étape est de se connecter au serveur IMAP.

Je suis en mesure de telnet au serveur sur le port 143 (IMAP par défaut, le port), telnet dit: OK The Microsoft Exchange IMAP4 service is ready.

Maintenant, je suis en train d'essayer de se connecter au serveur en utilisant le Java Mail API comme ceci:

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

Et je suis en mesure de se connecter à ce même serveur à l'aide d'un existant Outlook Webapp avec les mêmes informations d'identification que je suis en train de passer en java.

Mais l'exécution de ce avec session.setDebug(true) produit la sortie suivante:

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:

J'ai ajouté prop.setProperty("mail.imap.starttls.enable", "true") comme le suggère.

Cependant, j'ai commencé à faire cette sortie de débogage:

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

En supposant que c'était un problème de certificat, j'ai suivi ces instructions et a ajouté serveur mail de mon fichier cacerts. Le programme de test inclus, couru tout à fait bien et j'ai pu connecter à l'aide d'une url SSL, mais j'ai toujours le même exception lors de l'exécution de la classe java mail.

J'ai aussi essayé de changer de "imap" avec: session.getStore("imaps") (au lieu de "imap") et n'était même pas en mesure d'obtenir le "Microsoft Exchange Server est maintenant prêt" message. Je le pense parce que c'est en essayant de se connecter sur le port 993 chaque fois "imap" a été spécifié. Mais à l'aide de telnet sur le port 993 ne montre pas de connexion au serveur de messagerie.

Prochain donc j'ai essayé de forcer le programme à utiliser SSL sur le port 143 comme ceci:

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

Seulement de recevoir cette exception, donc je ne pense pas qu'il veut rien avoir à faire avec 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?;

Pourrait que le protocole TLS exception ci-dessus (DEBUG IMAP: STARTTLS Exception: javax.net.ssl.SSLHandshakeException:) viennent de TLS n'est pas activée sur le Serveur Exchange?

Je n'ai pas accès au serveur e-mail, mais je pourrais probablement trouver quelqu'un pour me laisser entrer.

SOLUTION:

HulkingUnicorn de commentaire ci-dessous sa réponse a souligné cette réponse qui était exactement la manipulation nécessaire. Apparemment, MS Exchange Server a ce problème. Avec l'ajout de la classe figurant dans la réponse à mon colis, j'ai simplement mis en œuvre mon mail connexions de ce genre et tout allait 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");
InformationsquelleAutor Geronimo | 2012-05-04