Mail über Exchange versenden

MopsdeBops

Mitglied
Hallo zusammen

Momentan schreibe ich ein kleines Programm, das lediglich eine E-Mail schreiben und eine empfangen soll. Die Probleme fingen schon früh an, da bei unserem Exchange POP3, SMTP und IMAP im internet Netz deaktiviert sind. Nach aussen natürlich nicht, aber das spielt keine Rolle. Im internet Netz geht das ganze über MAPI.
So habe ich also zuerst gegoolt was ich denn sonst verwenden könnte und bin auf EWS gestossen. Habe dann begonnen das ein wenig auszuprobieren und schon wieder kam der nächste Fehler. An diesem Sitze ich nun schon seit 3 Stunden. Hier mal mein Code

Java:
import java.net.URI;

import microsoft.exchange.webservices.data.*;
import microsoft.exchange.webservices.data.ExchangeService;


public class SI_Outlook {
	public static void main(String[] args) throws Exception {
		String email = "MLSOSVC-SysMon@bdo.intra";
		String password = "passwort";
		ExchangeService service = new ExchangeService();
		ExchangeCredentials credentials = new WebCredentials(email, password);
		service.setCredentials(credentials);
		service.setUrl(new URI("https://host/EWS/exchange.asmx"));
		Senden(service);
	}
	public static void Senden(ExchangeService service) throws Exception {
		EmailMessage msg= new EmailMessage(service);
		msg.setSubject("Hello world!"); 
		msg.setBody(MessageBody.getMessageBodyFromText("Sent using the EWS Managed API."));
		msg.getToRecipients().add("empfänger@mail");
		msg.send();
	}
}

Dann erhalte ich folgenden Error.

Java:
Exception in thread "main" microsoft.exchange.webservices.data.ServiceRequestException: The request failed. sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
	at microsoft.exchange.webservices.data.ServiceRequestBase.validateAndEmitRequest(Unknown Source)
	at microsoft.exchange.webservices.data.SimpleServiceRequestBase.internalExecute(Unknown Source)
	at microsoft.exchange.webservices.data.MultiResponseServiceRequest.execute(Unknown Source)
	at microsoft.exchange.webservices.data.ExchangeService.internalCreateItems(Unknown Source)
	at microsoft.exchange.webservices.data.ExchangeService.createItem(Unknown Source)
	at microsoft.exchange.webservices.data.Item.internalCreate(Unknown Source)
	at microsoft.exchange.webservices.data.EmailMessage.internalSend(Unknown Source)
	at microsoft.exchange.webservices.data.EmailMessage.send(Unknown Source)
	at SI_Outlook.Senden(SI_Outlook.java:32)
	at SI_Outlook.main(SI_Outlook.java:20)
Caused by: 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
	at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(Unknown Source)
	at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
	at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
	at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source)
	at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source)
	at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source)
	at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(Unknown Source)
	at com.sun.net.ssl.internal.ssl.AppOutputStream.write(Unknown Source)
	at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
	at java.io.BufferedOutputStream.flush(Unknown Source)
	at org.apache.commons.httpclient.methods.EntityEnclosingMethod.writeRequestBody(EntityEnclosingMethod.java:506)
	at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:2114)
	at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1096)
	at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398)
	at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
	at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
	at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)
	at microsoft.exchange.webservices.data.HttpClientWebRequest.executeRequest(Unknown Source)
	at microsoft.exchange.webservices.data.ServiceRequestBase.emit(Unknown Source)
	... 10 more
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
	at sun.security.validator.PKIXValidator.doBuild(Unknown Source)
	at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
	at sun.security.validator.Validator.validate(Unknown Source)
	at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(Unknown Source)
	at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
	at microsoft.exchange.webservices.data.EwsX509TrustManager.checkServerTrusted(Unknown Source)
	... 29 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
	at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
	at java.security.cert.CertPathBuilder.build(Unknown Source)
	... 35 more

Ich komme einfach nicht weiter. Falls mir jemand einen Tipp hat, wäre ichs sehr dankbar.

MFG Mops
 
Zuletzt bearbeitet:

FArt

Top Contributor
Nur bezogen auf den Fehler: es wird versucht eine sichere Verbindung mit dem Server aufzubauen, aber du vertraust dem Zertifikat des Servers nicht.
Importiere das Zertifiakt in deinen cert-Store bzw. (wenn der Server ein echtes Zertifikat hat) sorge dafür, das das Zertifikat des Trustcenters in deinem cert-Store enthalten ist.

Wenn jetzt viele Fragezeichen bei dir auftauchen, dann schaue erst mal, ob du nicht unverschlüsselt auf den Server zugreifen kannst oder ob du nicht (Forensuche) versuchen möchtests, einach blind allen Zertifkation zu vertrauen.
 

MopsdeBops

Mitglied
Das Zertifikat habe ich bereits in den Keystore per Keytool importiert. Auch auf meinem Computer ist das Zertifikat installiert. Wenn du mit cert-Store etwas anderes als den Keystore meinst, müsstest du mir dies kurz erklären. Dies ist mein erster Kontakt mit dem Thema Sichere Verbindungen in Java. Daher auch keine Erfahrung ;)
 

FArt

Top Contributor
Wäre sinnvoll gewesen, das zu erwähnen ;-)

Und wird der keystore auch hergenommen? Hast du die Properties entsprechend gesetzt bzw. hast du (wenn das Property nicht gesetzt ist) das Zertifikat in den Default-Keystore der JRE gelegt?

Wenn ja: google mal nach java ssl debug... da gibt es noch ein paar Systemproperties, wenn man die setzt bekommt man eine Menge Logausgaben, die den ganzen SSL Verbindungsversuch beschreiben... inklusive Handshake usw.... da sieht man dann eine genauere Fehlermeldung.
 

MopsdeBops

Mitglied
Habe beide Varianten versucht, einmal ins Default-Keystorefile und einmal ein neues erstellt und mit
Java:
System.setProperty("javax.net.ssl.trustStore", "zert.keystore");
referenziert. Beides wirkungslos.

Werde nun einmal SSL-Debug versuchen. Vielen Dank schon mal für deine Hilfe ;)

//Edit

Als ich heute Morgen wieder an meinen Arbeitsplatz sitze, gab mir Java erstaunlicherweise eine komplett andere Fehlermeldung.

Java:
13.04.2011 09:09:27 org.apache.commons.httpclient.auth.AuthChallengeProcessor selectAuthScheme
INFO: NTLM authentication scheme selected
microsoft.exchange.webservices.data.ServiceVersionException: Exchange Server doesn't support the requested version.
	at microsoft.exchange.webservices.data.ServiceRequestBase.processWebException(Unknown Source)
	at microsoft.exchange.webservices.data.ServiceRequestBase.validateAndEmitRequest(Unknown Source)
	at microsoft.exchange.webservices.data.SimpleServiceRequestBase.internalExecute(Unknown Source)
	at microsoft.exchange.webservices.data.MultiResponseServiceRequest.execute(Unknown Source)
	at microsoft.exchange.webservices.data.ExchangeService.findItems(Unknown Source)
	at microsoft.exchange.webservices.data.ExchangeService.findItems(Unknown Source)
	at microsoft.exchange.webservices.data.ExchangeService.findItems(Unknown Source)
	at SI_Outlook.pageThroughEntireInbox(SI_Outlook.java:43)
	at SI_Outlook.main(SI_Outlook.java:20)
Exception in thread "main" java.lang.NullPointerException
	at SI_Outlook.pageThroughEntireInbox(SI_Outlook.java:49)
	at SI_Outlook.main(SI_Outlook.java:20)
 
Zuletzt bearbeitet:

FArt

Top Contributor
Ganz so erstaunlich nicht... vermutlich erwartet der Server eine Authentifizierung über NTLM, evtl. über LDAP (vermutlich bis du an einer Domäne angemeldet)... LDAP kriegt man mit Java hin... NTLM ist Windows-eigen... das könnte schwieriger werden.

Evtl. hilft dir eine API wie SPNEGO weiter... sonst kann ich dir nur noch Google und evtl. Microsoft-Foren empfehlen...
 

FArt

Top Contributor
P.S.:
Die letzte Fehlermeldung könnte man auch so deuten, dass die Client-Library von der Version her nicht zu dem Server passt, die Authentifizierung aber schon erfolgreich vorgenommen wurde. Kann das sein?
 

MopsdeBops

Mitglied
Die Fehlermeldung könnte auch daher kommen, dass mein Java Programm auf einem Windows Server 2008 R2 läuft und unsere Exchange auf Windows Server 2008. Daher könnte es sein, dass die NTLM Authentifierierung auf dem R2 eine neure Version ist. Ich werde nun dem einmal nachgehen.

Danke für eure Tipps

//Edit

Bin wieder einen Schritt weiter gekommen. Habe nun folgendes gemacht:

Java:
ExchangeService service = new ExchangeService (ExchangeVersion.Exchange2007_SP1);

Somit erhalte ich "nur" noch diese Fehlermeldung.

Java:
org.apache.commons.httpclient.auth.AuthChallengeProcessor selectAuthScheme
INFO: NTLM authentication scheme selected

Doch hier komme ich wieder nicht weiter.
 
Zuletzt bearbeitet:

AlexSpritze

Bekanntes Mitglied
Java:
ExchangeService service = new ExchangeService (ExchangeVersion.Exchange2007_SP1);

Somit erhalte ich "nur" noch diese Fehlermeldung.

Java:
org.apache.commons.httpclient.auth.AuthChallengeProcessor selectAuthScheme
[B]INFO[/B]: NTLM authentication scheme selected

Woran machst du fest, dass diese INFO-Log-Ausgabe eine Fehlermeldung ist? Hast du noch mehr Ausgaben dazu?
 

MopsdeBops

Mitglied
Nein, diese zwei Zeilen sind meine einzige Ausgabe. Allerdings ist es meiner Meinung nach ein Fehler, da er ja sonst die Nachricht verschicken würde.

Java:
	public static void Senden(ExchangeService service) {
		EmailMessage msg;
		try { 
			msg = new EmailMessage(service);
			msg.setSubject("Hello world!"); 
			msg.setBody(MessageBody.getMessageBodyFromText("Sent using the EWS Managed API."));
			msg.getToRecipients().add("pascal.grotz@bdo.ch");
			msg.send();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

Der Fehler tritt bei Zeile 8 dieses Code-Stückes auf. Weiter kommt er dann auch nicht. Wenn ich z.B. testweise ein System.out.print nach dem msg.send einfüge, führt er dies nicht aus.
 

AlexSpritze

Bekanntes Mitglied
Bleibt er in Zeile 8 komplett hängen? Kommt dann nichts mehr? Also weder der Stacktrace in Zeile 11 noch ein System.out.println("xx"); zwischen Zeile 12 und 13?
 

MopsdeBops

Mitglied
Hm hab jetzt nach Zeile 7, 8, 11 und 12 ein System.out.print gemacht. Zeile 7, 8 und 12 macht er, 11 nicht. Er geht also nicht so wie ich vermutet habe in den catch Block. Das heisst er hängt sich eigentlich nicht auf, aber die Nachricht sendet er trotzdem nicht.

//Edit
Ich glaubs ja nicht. Es geht. Naja bringt wohl doch was wenn man seine Arbeit aufschiebt. Das letzte mal als ich es getestet habe, kam er nur bis msg.send. Ein print danach hat er nicht gemacht. Heute geht es und ich gehe in meine Mailbox und siehe da. die Mails kamen an. Jetzt müsste ich es eigentlich nur noch schaffen diese Fehler/Info auszuschalten, damit es nicht ersichtlich ist. Danke für deine/eure Hilfe ;)
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
T E-Mail über javax.mail.Message Netzwerkprogrammierung 2
H Mail über URLConnection Netzwerkprogrammierung 8
E Custom E Mail Adresse mithilfe Serversocket oder ähnliches Netzwerkprogrammierung 21
N Link aus einer E-Mail aufrufen Netzwerkprogrammierung 2
M Mit Java Mail Mails an Webmailer schicken Netzwerkprogrammierung 1
T E-Mail versenden. Netzwerkprogrammierung 8
Niggo_ Probleme mit Java Mail Netzwerkprogrammierung 14
K Probleme bei HTML-Mail-Abruf mit IMAP bei 1und1 Netzwerkprogrammierung 2
M E-Mail - Verbinden zu web.de Netzwerkprogrammierung 8
S mail versand Netzwerkprogrammierung 1
G Mail senden funktioniert nicht mit SSL Netzwerkprogrammierung 7
E Wie kann man einen einfachen E-Mail Server schreiben Netzwerkprogrammierung 2
D Java Desktop Mail, vorbereitete Mail Netzwerkprogrammierung 5
D JavaMail: HTML Code einer Mail Netzwerkprogrammierung 9
T Java Mail port ändern Netzwerkprogrammierung 4
V Java Mail Api - IMAP Problem Netzwerkprogrammierung 6
F TLS bei mail benutzen Netzwerkprogrammierung 2
R Versenden einer MIME-Datei per E-Mail [solved] Netzwerkprogrammierung 5
N E-mail versenden Netzwerkprogrammierung 4
A html - E-mail - Bilder Netzwerkprogrammierung 4
A attachment einer Mail speichern Netzwerkprogrammierung 5
G Validierung von Internetadressen - Kontroll Mail oder so. Netzwerkprogrammierung 4
B log4j e-mail appender Netzwerkprogrammierung 4
B Mail Server selber schreiben Netzwerkprogrammierung 26
S Mail anhang in InputStream packen Netzwerkprogrammierung 5
R Mail und Mime Type Netzwerkprogrammierung 4
F Java Mail . Exception java.lang.NoClassDefFoundError Netzwerkprogrammierung 2
B Url-Link aus einer E-Mail aufrufen Netzwerkprogrammierung 2
G Java Mail etwas unsicher? Netzwerkprogrammierung 4
G MAIL API Netzwerkprogrammierung 4
K Problem bei Mail-Versand mit Anhängen Netzwerkprogrammierung 2
L JavaMail: Mail in Posteingang aber nicht in Versendet Netzwerkprogrammierung 2
M SMTP-Mail Netzwerkprogrammierung 2
E smtp Zugriffsproblem mit Java Mail API Netzwerkprogrammierung 3
H E-Mail Programm Netzwerkprogrammierung 3
K Tabelle im Web über Listener aufrufen Netzwerkprogrammierung 1
F Verbindung zu einem LDAP Server über Java Netzwerkprogrammierung 4
S Socket Bilder über Socket Senden Netzwerkprogrammierung 0
B Zip Dateien über FTP laden Netzwerkprogrammierung 2
x46 byte[] über BufferedReader auslesen Netzwerkprogrammierung 18
E Socket Parameter über Sockets übergeben und auslesen ! Netzwerkprogrammierung 5
L Webbasierte Anwendung - Authentifizierung über LDAP/ActiveDirectory Netzwerkprogrammierung 5
J Probleme mit Multicast über IPv6, DatagramChannel Netzwerkprogrammierung 1
S Daten über TCP/IP senden Netzwerkprogrammierung 3
T Broadcast-message über spez. Netzwerk-Schnittstelle Netzwerkprogrammierung 1
T Mikrofonaudio über Java Server an Webbrowser streamen Netzwerkprogrammierung 13
M Erstelltes Programm über Internet Browser ausführen Netzwerkprogrammierung 26
T VPN-Verbindung über Java Netzwerkprogrammierung 4
V Einfachen Javaserver über das Internet erreichbar machen Netzwerkprogrammierung 2
J FTP Upload über Proxy funktioniert nicht Netzwerkprogrammierung 1
E Kurze Textnachrichten über einen Server von meinem Handy auf den Computer laden. Netzwerkprogrammierung 9
J FTP FTP Zugriff über Proxy Server Netzwerkprogrammierung 1
Thallius Java Application über ZScaler benutzer? Netzwerkprogrammierung 0
J Chat Server starten über GUI problem Netzwerkprogrammierung 4
V einfaches hin und her von Text über Server Netzwerkprogrammierung 2
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2
antonbracke Multiuser Software über XMPP Server Netzwerkprogrammierung 1
Z Verbindung zwischen 2 Rechnern über ServerSockets nicht möglich Netzwerkprogrammierung 3
cezary Socket ServerSocket starten über GUIIm unterstehenden Code versuche Netzwerkprogrammierung 6
I ASCII über serielle Schnittstelle Netzwerkprogrammierung 1
N RMI "RMI über Lan funktioniert nicht" & "RMI-Server im Lan scannen" Netzwerkprogrammierung 13
L Mit Java über PHP in MySQL anmelden (Login script) Netzwerkprogrammierung 3
M Socket String Arrays über Socket an Server schicken Netzwerkprogrammierung 2
T Socket Methoden über Internet aufrufen Netzwerkprogrammierung 1
S Socket Kommunikation über Internet Netzwerkprogrammierung 1
X Problem mit vielen Bytes über Socket Netzwerkprogrammierung 23
K ByteArray über Netzwerk senden klappt nicht Netzwerkprogrammierung 5
M allgemeine Frage über Server-Client-Kommunikation Netzwerkprogrammierung 5
P RMI Threads die über RMI auf Datenbank zugreifen Netzwerkprogrammierung 2
S Datei schreiben über Applet Netzwerkprogrammierung 8
G Klassen über Netzwerk kommunizieren lassen Netzwerkprogrammierung 6
J Erster Server-Client läuft auf lokalem Rechner problemlos. Zwei Rechner über das Internet nicht Netzwerkprogrammierung 8
Kjubert Synchronisieren von Objekten über Client/Server - bester Weg? Netzwerkprogrammierung 7
S ImageIcon über Socket schicken (Serialisierung) Netzwerkprogrammierung 6
H Socket Objekte über Socket? Allgemeine Verständnisprobleme in Sachen Socket Netzwerkprogrammierung 3
S Seltsames Verhalten beim Empfangen von Daten über DataInputStream Netzwerkprogrammierung 12
A TCP über UDP Verbindung? Netzwerkprogrammierung 10
C Datei über Socket schreiben und Ereignis lesen Netzwerkprogrammierung 9
D Socket Class über Netzwerk verschicken Netzwerkprogrammierung 2
D JNLP über Webstart funktioniert nicht... Netzwerkprogrammierung 2
J Socket Dateien über Socket auf Server speichern Netzwerkprogrammierung 3
D Socket Datei nur stückweise über Socket verschicken Netzwerkprogrammierung 6
G Bild über Socket schicken - Client/Server Netzwerkprogrammierung 10
A Computer über Internet verbinden Netzwerkprogrammierung 12
N über Java in eine Text-Datei auf einem Server schreiben Netzwerkprogrammierung 2
c_sidi90 ideale Lösung, Screen Capture über Netzwerk Netzwerkprogrammierung 3
S Socket Verschiedene Exceptions beim Übertragen von Bildern über Socket Netzwerkprogrammierung 20
T ArrayList über Netzwerk senden! Netzwerkprogrammierung 5
N Problem über http eine Datei zu senden Netzwerkprogrammierung 4
T Verbindungsversuche über TCP Sockets von mehreren Threads führt zu Serverabsturz Netzwerkprogrammierung 2
V Authentifikation über mehrere Server? Netzwerkprogrammierung 3
C Verbindung zu einem Hostrechner über das Internet herstellen Netzwerkprogrammierung 15
M Map über Webservice übertragen Netzwerkprogrammierung 3
D Mehrere Clients über Java-Sockets Netzwerkprogrammierung 13
P Socket Verbindung über das Internet Netzwerkprogrammierung 2
Z Socket Connection reset by peer nur per IP nicht über localhost Netzwerkprogrammierung 13
ruffio1978 Telnet über ein socket ansprechen Netzwerkprogrammierung 8
F Socket Verbindungen über mehrere Server Netzwerkprogrammierung 4
U Datei über das Netzwerk einlesen und speichern Netzwerkprogrammierung 8
G Klassen über JMX per URLClassloader laden? Netzwerkprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben