# Email versenden mit Java funktioniert nicht, Fehlermeldungen: MessagingException & SocketException



## ltremix (8. Okt 2013)

Hallo zsm,

ich habe folgendes Problem.
Ich habe eine Java-Klasse mit der ich Emails versenden kann.


```
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;

public class SendJavaMail {
	 public static void postMail( String recipient, String subject, String message, String from ) 
			 throws MessagingException{
		 
		 Properties props = new Properties();
		 props.put("mail.smtp.host", "XXX.XXX.de");
		 Session session = Session.getDefaultInstance(props);
		 Message msg = new MimeMessage(session);
		 InternetAddress addressFrom = new InternetAddress(from);
		 msg.setFrom(addressFrom);
		 InternetAddress addressTo = new InternetAddress(recipient);
		 msg.setRecipient(Message.RecipientType.TO, addressTo);
		 msg.setSubject(subject);
		 msg.setContent(message, "text/plain");
		 Transport.send(msg);
	 }
	
	 public static void main(String[] args) throws Exception {
		 postMail("XXX@XXX.de", "Test Email", "!Test Betreff", "XXX@XXX.de");
	}
	
}
```

Die Bibliotheken activation.jar und mail.jar habe ich auch importiert.
Da kommt aber immer die folgende Fehlermeldung:

Exception in thread "main" javax.mail.MessagingException: Could not connect to SMTP host: domint1.stadtdo.de, port: 25;
  nested exception is:
	java.net.SocketException: Network is unreachable: connect
	at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1961)
	at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:654)
	at javax.mail.Service.connect(Service.java:295)
	at javax.mail.Service.connect(Service.java:176)
	at javax.mail.Service.connect(Service.java:125)
	at javax.mail.Transport.send0(Transport.java:194)
	at javax.mail.Transport.send(Transport.java:124)
	at SendJavaMail.postMail(SendJavaMail.java:19)
	at SendJavaMail.main(SendJavaMail.java:23)
Caused by: java.net.SocketException: Network is unreachable: connect
	at java.net.DualStackPlainSocketImpl.connect0(Native Method)
	at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
	at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
	at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
	at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
	at java.net.PlainSocketImpl.connect(Unknown Source)
	at java.net.SocksSocketImpl.connect(Unknown Source)
	at java.net.Socket.connect(Unknown Source)
	at java.net.Socket.connect(Unknown Source)
	at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:321)
	at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:237)
	at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1927)
	... 8 more

Wenn ich das Projekt als Liferay-Projekt erzeuge, wird die Mail versendet.
Wenn ich aber ein normales Java-Projekt erzeuge, kommt die obenstehende Fehlermeldung.
Wie kann ich das Problem lösen?
Ich möchte ein normales Java-Projekt erzeugen, weil ich später ein Batch-Skript bauen muss, mit dem ich die Java-Datei ausführen werde. Oder kann man denn die Java-Datei bzw. das Java-Projekt als exe exportieren?
Also, es gibt drei Probleme:
1. Wieso kommt die Fehlermeldung bei einem Java-Projekt und nicht bei einem Liferay-Projekt?
2. Wie kann ich diese Datei mit cmd ausführen?
3. Kann man das als exe exportieren?

Gruß

ltremix


----------



## ltremix (8. Okt 2013)

*C:\Users\XXX\Desktop\PingServer>java SendJavaMail
Exception in thread "main" java.lang.NoClassDefFoundError: javax/mail/Address
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
        at java.lang.Class.getMethod0(Unknown Source)
        at java.lang.Class.getMethod(Unknown Source)
        at sun.launcher.LauncherHelper.getMainMethod(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Caused by: java.lang.ClassNotFoundException: javax.mail.Address
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 6 more*


Dies kommt als Meldung, wenn ich die class-Datei mit cmd ausführe.


----------



## JavaGott (8. Okt 2013)

Naja, die Fehlermeldung aus einem ersten Post ist doch eindeutig...

*Could not connect to SMTP host: domint1.stadtdo.de, port: 25*

Entweder ist die URL domint1.stadtdo.de nicht bekannt oder es hört auf port 25 nichts oder eine Firewall blockt den Zugang..

Probier einfach mal ein *telnet domint1.stadtdo.de 25* auf der commandozeile auszuführen. Wenn das schon nicht gehen wird, dann wird das in deinem Code sowieso nicht funktionieren.


----------



## ltremix (9. Okt 2013)

JavaGott hat gesagt.:


> Naja, die Fehlermeldung aus einem ersten Post ist doch eindeutig...
> 
> *Could not connect to SMTP host: domint1.stadtdo.de, port: 25*
> 
> ...



Die URL ist schon richtig. Wenn ich den Code in die Klasse eines Liferay-Projektes einfüge, funktioniert es, aber wenn ich den Code in die Klasse eines Java-Projektes einfüge, kommt die Fehlermeldung.

Auf der Kommandozeile wird die Verbindung hergestellt.


----------



## JavaGott (9. Okt 2013)

Mach mal den Mail debug an und schau mal was genau versucht wird:

props.put("mail.debug", "true");


----------



## ltremix (9. Okt 2013)

DEBUG: JavaMail version 1.4.7
DEBUG: successfully loaded resource: /META-INF/javamail.default.providers
DEBUG: Tables of loaded providers
DEBUG: Providers Listed By Class Name: {com.sun.mail.smtp.SMTPSSLTransport=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Oracle], com.sun.mail.smtp.SMTPTransport=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle], com.sun.mail.imap.IMAPSSLStore=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle], com.sun.mail.pop3.POP3SSLStore=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Oracle], com.sun.mail.imap.IMAPStore=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Oracle], com.sun.mail.pop3.POP3Store=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Oracle]}
DEBUG: Providers Listed By Protocol: {imaps=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle], imap=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Oracle], smtps=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Oracle], pop3=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Oracle], pop3s=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Oracle], smtp=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]}
DEBUG: successfully loaded resource: /META-INF/javamail.default.address.map
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth false
DEBUG SMTP: trying to connect to host "domint1.stadtdo.de", port 25, isSSL false
Das ist das Ergebnis.


----------



## JavaGott (9. Okt 2013)

Versuch mal "-Djava.net.preferIPv4Stack=true" als Startparameter noch mit zu übergeben.

Wenn das auch nicht hilft: Welche Java Version nutzt du? Ist das zufällig 1.7? Wenn ja, probier das ganze mal mit 1.6

1.7 müsste als default versuchen mit IPv6 eine Verbindung aufzubauen, das könnte natürlich bei dir zu diesem Problem führen, da ich mal davon ausgehe, dass deine eigentliche Netzwerkverbindung IPv4 sein wird....


----------



## ltremix (11. Okt 2013)

```
System.setProperty("java.net.preferIPv4Stack" , "true");
```

Das war die Lösung. Dir kann man auch alles fragen. =)

Ich habe jetzt nur noch ein Problem.
Mein Programm ist fertig. Es besteht aus JFrame. Durch das Betätigen eines Buttons soll es einpaar Server von uns anpingen und wenn ein Server nicht erreicht wird, soll das Programm eine Fehlermeldung anzeigen und die Fehlermeldung uns als Emal versenden. 
Das Programm habe ich als Jar exportiert mit den Bibliotheken zusammen und habe es in einen Server eingefügt.
Mit einer Batch-Datei auf dem Desktop soll ich die Jar-Datei auf dem Server ausführen.
Das Programm wird geöffnet und es funktionier einwandfrei.
Die Batch-Datei soll ich Kollegen verteilen, damit sie auch die Server überwachen können.
Das Problem ist, wenn sie die Batch-Datei ausführen, das JFRame-Fenster wird nicht geöffnet.
Bei mir funktioniert es aber. Was könnte das Problem sein?

Das ist der Code in der Batch-Datei:

S: 
cd \"Team"\Allgemein\Serverueberwachung\Serverueberwachung
start /MIN java -jar Serverueberwachung.jar


----------



## JavaGott (11. Okt 2013)

Ohne Fehlermeldung, welche innerhalb des cmd angezeigt wird, kommen wir hier glaub nicht weiter.

Eine mögliche Ursache könnte aber eine falsche Java Version sein. Wenn dein Projekt zb mit 1.7 deployed wurde und die nur 1.6 haben, dann wird das ziemlich sicher in die Hose gehen.

Oder die Pfade passen nicht, die du in der Batch angegeben hast.

Bedeutet: Der output der Batch wäre hilfreich 

---
Mal was anderes:

Wieso baust du für eine Server Überwachung, die mehrere User gleichzeitig nutzen sollen, ein dezentrales Client Tool?! 

Werf das JFrame weg, bau dir eine schöne JSP Seite welche den Output hat wie das JFrame und hoste das ganze auf einem WebSpace.

Vorteile:
1. Zentral
2. Du sparst dir das ständige Verteilen wenn sich mal was ändert
3. Du kannst ein Berechtigungskonzept dahinter klemmen
4. Und vielews mehr :lol:

So braucht keiner ein client Tool von euch und ihr habt eine zentrale Überwachungsseite, erreichbar über den Browser.


----------



## ltremix (11. Okt 2013)

Das wäre für mich einfacher gewesen, dann bräuchte ich die S*****e mit JFrame garnicht zu lernen.
So soll es aber sein. 
Der Pfad in der Batch stimmt, weil ich es von meinem Rechner aus ausführen kann. 
Die Fehlermeldung kann ich erst am Montag reinstellen, da die Kollegen jetzt weg sind und von meinem Rechner aus alles glatt läuft.
Ich muss ja nicht immer wieder verteilen, wenn sich was verändert hat. Die Jar-Datei liegt ja auf dem Server. Die Kollegen bekommen einmal die Batch, die auf den Server zugreift und die Jar-Datei ausführt.
Ich brauche da nur die Jar-Datei zu verändern, wenn ich das Programm verändern soll.


----------



## ltremix (16. Okt 2013)

Ich habe diesmal die Java Version 1.6 verwendet und es läuft alles glatt.:lol::lol:


----------

