web-dev-qa-db-fra.com

Java Mail to Exchange Server "aucune méthode de connexion prise en charge"

J'essaie d'implémenter un Java servlet de messagerie, la première étape consiste à se connecter au serveur IMAP.

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

Maintenant, j'essaye de me connecter au serveur en utilisant le Java API Mail comme ceci:

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

Et je peux me connecter à ce même serveur en utilisant une application Web Outlook existante avec les mêmes informations d'identification que j'essaie de lui transmettre en Java.

Mais l'exécuter 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!;

MODIFIER:

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

Cependant, j'ai commencé à obtenir 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 qu'il s'agissait d'un problème de certificat, j'ai suivi ces instructions et ajouté un serveur de messagerie à mon fichier cacerts. Le programme de test qui y était inclus fonctionnait parfaitement et je pouvais me connecter en utilisant une URL SSL mais j'ai quand même eu la même exception lors de l'exécution de la classe de messagerie Java.

J'ai également essayé de passer à "imaps" avec: session.getStore("imaps") (au lieu de "imap") et je n'ai même pas pu obtenir le message "Microsoft Exchange Server est maintenant prêt". Je pense parce qu'il essaie de se connecter sur le port 993 chaque fois que "imaps" a été spécifié. Mais l'utilisation de telnet sur le port 993 n'affiche aucune connexion au serveur de messagerie.

J'ai ensuite 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 pour recevoir cette exception, donc je ne pense pas qu'il veuille quelque chose à voir 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?;

Cette exception TLS ci-dessus (DEBUG IMAP: STARTTLS Exception: javax.net.ssl.SSLHandshakeException:) Peut-elle provenir du fait que TLS n'est pas activé sur le serveur Exchange?

Je n'ai pas facilement accès au serveur de messagerie, mais je pourrais probablement demander à quelqu'un de me laisser entrer.

SOLUTION:

Le commentaire de HulkingUnicorn sous sa réponse a souligné cette réponse qui était la manipulation exacte nécessaire. Apparemment, MS Exchange Server a ce problème. En plus d'ajouter la classe répertoriée dans cette réponse à mon package, j'ai simplement implémenté mes connexions de messagerie comme ceci 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");
24
vanderwyst

Cette partie, * CAPABILITY IMAP4 IMAP4rev1 LOGINDISABLED Suggère que vous ne pouvez pas vous connecter, ce fil l'OP l'a résolu en mettant à jour son Javamail en 1.4.4 (bien que votre sortie de débogage suggère que vous avez déjà cette). Essayez d'utiliser 1.4.5.

En fait, essayez d'ajouter cette ligne avant de créer la session; votre serveur de messagerie le prend en charge et il est désactivé par défaut: props.put("mail.imap.starttls.enable", "true");

Cette réponse a résolu le problème.

19
HulkingUnicorn

Vous pouvez utiliser le com.Sun.mail.util.MailSSLSocketFactory qui fait partie de l'API javamail 1.4.5.

Exemple:

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

Il n'est pas nécessaire d'utiliser SSLSocketFactory personnalisé.

5
paf.goncalves