2012-05-04 8 views
22

Ich versuche, ein Java Mail-Servlet zu implementieren, der erste Schritt ist die Verbindung mit dem IMAP-Server.Java Mail zu Exchange Server "keine Login-Methoden unterstützt"

ich in der Lage bin zu dem Server auf Port 143 (Standard-IMAP-Port) telnet, telnet sagt: OK The Microsoft Exchange IMAP4 service is ready.

Jetzt habe ich auf dem Server zu verbinden versuche, die Java-Mail-API wie folgt aus:

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

Und ich bin in der Lage, eine Verbindung zu diesem Server mit einer vorhandenen Outlook-Webanwendung mit den gleichen Anmeldeinformationen, die ich versuche, es in Java zu übertragen.

Aber läuft das mit session.setDebug(true) erzeugt die folgende Ausgabe:

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:

I prop.setProperty("mail.imap.starttls.enable", "true") hinzugefügt, wie vorgeschlagen.

Allerdings begann ich diese Debug-Ausgabe bekommen:

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 

Unter der Annahme, dass dies ein Zertifikat Problem war, ich these instructions gefolgt und fügte hinzu, Mail-Server zu meiner cacerts-Datei. Das dort enthaltene Testprogramm lief absolut gut und ich konnte mich mit einer SSL-URL verbinden, aber ich bekam immer noch die gleiche Ausnahme, wenn ich die Java-Mail-Klasse ausführte.

Ich habe auch versucht, zu "imaps" mit: session.getStore("imaps") (anstelle von "imap") zu ändern und war nicht einmal in der Lage, die Nachricht "Microsoft Exchange Server ist jetzt bereit" zu bekommen. Ich denke, weil es versucht, an Port 993 zu verbinden, wenn "Imaps" angegeben wurde. Die Verwendung von Telnet an Port 993 zeigt jedoch keine Verbindung zum E-Mail-Server.

Also die nächsten habe ich versucht, das Programm zu zwingen, SSL auf 143 Port verwenden wie folgt aus:

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

Nur diese Ausnahme zu erhalten, so dass ich glaube nicht, dass irgendetwas will mit SSL zu tun:

Könnte die obige TLS-Ausnahme (DEBUG IMAP: STARTTLS Exception: javax.net.ssl.SSLHandshakeException:) von TLS stammen, das nicht auf dem Exchange Server aktiviert ist?

Ich habe nicht bereit Zugriff auf die E-Mail-Server, aber ich konnte wohl jemand mich in lassen, bekommen

. LÖSUNG:

HulkingUnicorn Kommentar unterhalb seiner Antwort darauf hingewiesen, this answer das war die genaue Handhabung benötigt. Anscheinend MS Exchange Server hat dieses Problem. Zusammen mit der Klasse das Hinzufügen in dieser Antwort aufgeführt mein Paket, habe ich einfach meine Mail-Verbindungen wie diese umgesetzt und alles war gut:

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

Antwort

17

Dieser Teil, * CAPABILITY IMAP4 IMAP4rev1 LOGINDISABLED schlage vor, Sie können sich nicht anmelden, in this thread der OP habe es gelöst, indem ich Javavail auf 1.4.4 aktualisiert habe (obwohl deine Debug-Ausgabe andeutet, dass du das schon hast).Versuchen Sie mit 1.4.5.

Eigentlich versuchen Sie, diese Zeile vor dem Erstellen der Sitzung hinzufügen; Ihr E-Mail-Server unterstützt es und es ist standardmäßig deaktiviert: props.put("mail.imap.starttls.enable", "true");

This answer löste das Problem.

+0

Ich habe dies und ein paar mehr Dinge versucht, aber noch kein Glück. – Geronimo

+1

Wenn Sie "imaps" verwenden, müssen Sie allen Eigenschaften auch 's' hinzufügen, wie 'prop.setProperty (" mail.imaps.port "," 143 ");' Es scheint nicht wahrscheinlich, dass die Server verwendet jedoch IMAPs mit dieser Portnummer. – HulkingUnicorn

+0

@Geronimo Haben Sie Javamail 1.4.5 versucht? – HulkingUnicorn

5

Sie können die com.sun.mail.util.MailSSLSocketFactory verwenden, die Teil der Javamail 1.4.5 API ist.

Beispiel:

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

Es gibt keine Notwendigkeit, die benutzerdefinierte SSLSocketFactory zu verwenden.

+0

Ehrfürchtiger Mann! du hast meinen Tag gerettet –