# Mail senden - Problem connect to SMTP host



## magic_halli (19. Mai 2008)

Hi,

ich habe eine Funktion, welche eine Mail verschickt. Die Empfängerandresse ('String sMail') und eine Nummer ('String anfrageNr') werden in diese Funkton übergeben und hier eingesetzt. Der Funktionsaufruf passiert in einer anderen Funktion in einem Iterator. Hierbei werden die Key/Value-Paare aus einer HashMap (Nummer/Empfängeradresse) ausgelesen und eingesetzt.
Hier erstmal die Funktion zum Mail senden:

```
private static void sendMailAnfragen(String anfrageNr, String sMail){
		
		try{
			String host = "10.0.0.1";
			String port = "25";
			String username = "geheim";
			String password = "geheim";
			
			System.out.println("BestätigungsMail an " + sMail + "   Nummer = " +anfrageNr);
			
			Date date = new Date();
			DateFormat dateformat;
			dateformat = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.MEDIUM); // bspw.: Dienstag, 25.September 2008 15:45:00
			
			String datum = new SimpleDateFormat("dd.MM.yyyy").format( new java.util.Date() );	//bspw.: 25.09.2008
			
			String subject = "Eingang Ihrer Anfrage vom " + datum;
			String message = "Ihre Anfrage ist bei uns am " + dateformat.format(date) + " eingegangen und wird unter der Anfragenummer " + anfrageNr + " bearbeitet. \n";
			
			// Get system properties
			//Properties props = System.getProperties();
			Properties props = new Properties();
			//Mail-Server properties: Session verlangt die Informationen über Host, User, Passwd etc.
			props.put("mail.smtp.host", host);
			props.put("mail.smtp.port", port);
			props.put("mail.smtp.auth", "true");
		    
			// Initialisierung der Auth-Klasse zur Mail-Account-Authentisierung; in Session benutzt
			myAuthenticator auth = new myAuthenticator(username, password);
			
			// Session: steht für die Verbindung mit dem Mail-Server		
			Session session = Session.getDefaultInstance(props, auth);
			//Gibt in der Console Debug-Meldungen zum Verlauf aus
			session.setDebug( false );
			
			// neue Message initialisieren
			Message msg = new MimeMessage( session );
			
			// Absender der Bestätigungsmail
			InternetAddress addressFrom = new InternetAddress("test@test.de");
			msg.setFrom( addressFrom );
			// Empfänger der Bestätigungsmail --> hier sMail einsetzen
			InternetAddress addressTo = new InternetAddress( sMail );
			// Mailinhalte festlegen
			msg.setRecipient(Message.RecipientType.TO, addressTo);
			msg.setSubject( subject );
			msg.setContent( message, "text/plain" );
			// Mail senden
			Transport.send( msg );
			
			System.out.println( "Die Mail wurde am " + dateformat.format(date) + " an " + sMail +  " versendet." );
			

		}catch(Exception err){
			err.printStackTrace();
		}
	}
```
Und hier der Aufruf der Funktion an anderer Stelle:

```
Set set = map.entrySet(); 
				Iterator it = set.iterator(); 
				while( it.hasNext() ) 
				{ 
				    Entry entry = (Entry) it.next(); 
				    sendMailAnfragen( entry.getKey().toString(), entry.getValue().toString() );
				    System.out.println( "Nummer: " + entry.getKey().toString() + ", Mail: " + entry.getValue().toString() ); 
				}
```

Wenn ich diese Funktion ganz für sich ausführe, natürlich die Eingabestrings entsprechend definiert, funktioniert das einwandfrei. Doch wenn ich diese Funktion aus der aufrufenden Funktion ausführen will, bekomme ich folgende Fehlermeldung:
"javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 25"!!!

Das ist mir völlig unverständlich, warum dieser Fehler auftritt, zumal die Funktion alleine ohne Probleme Mails versendet.  :?:   ???:L 
Ich habe schon drangedacht, dass der Iterator vielleicht schneller durchlaufen könnte, als die Connection mit dem Mailserver zustande kommt, aber ein Testszenario mit einem Test-Iterator und meiner Mailfunktion hat problemlos geklappt!

Was könnte das für Ursachen haben? Wieso will/kann auf einmal nicht mit dem SMTP verbunden werden?

Danke und Gruß


----------



## cburghardt (19. Mai 2008)

Tipp 1: verwende die Session wieder
Poste bitte den Stacktrace


----------



## magic_halli (19. Mai 2008)

cburghardt hat gesagt.:
			
		

> Tipp 1: verwende die Session wieder
> Poste bitte den Stacktrace


Wie ist das gemeint, die Session wiederverwenden bzw. wie geht das?

Hier der Stacktrace:

```
javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 25;
  nested exception is:
	java.net.ConnectException: Connection refused: connect
	at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1391)
	at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:412)
	at javax.mail.Service.connect(Service.java:288)
	at javax.mail.Service.connect(Service.java:169)
	at javax.mail.Service.connect(Service.java:118)
	at javax.mail.Transport.send0(Transport.java:188)
	at javax.mail.Transport.send(Transport.java:118)
	at pFetchImap.sendMailAnfragen(pFetchImap.java:2264)
	at pFetchImap.createAnfrage(pFetchImap.java:678)
	at pFetchImap.main(pFetchImap.java:162)
Caused by: java.net.ConnectException: Connection refused: connect
	at java.net.PlainSocketImpl.socketConnect(Native Method)
	at java.net.PlainSocketImpl.doConnect(Unknown Source)
	at java.net.PlainSocketImpl.connectToAddress(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:233)
	at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:189)
	at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1359)
	... 9 more
```

EDIT: Jetzt fällt mir hier noch auf, dass er versucht mit 'host: localhost' verbinden möchte. Das ist aber nicht korrekt - hier sollte '10.0.0.1' stehen!  ???:L


----------



## cburghardt (19. Mai 2008)

Naja, du erzeugst doch deine Session jedes Mal neu:
Session session = Session.getDefaultInstance(props, auth);
Mach das eben vorher und verwende die Session dann als member Variable oder (besser) übergebe sie der Methode. Sollte außerdem schneller sein.


----------



## magic_halli (19. Mai 2008)

Ich habe die Session aus meiner Methode ausgelagert und definiere diese nun in der aufrufenden Methode. Somit musste ich auch das Setzen der System-Properties mit auslagern... Und genau diese haben anscheinend den Fehler verursacht!!! Jetzt funktioniert´s nämlich plötzlich wie gewünscht!  :applaus: 

Keine Ahnung, warum und wie die System-Properties das Verbinden mit dem SMTP beeinflusst haben... hat jemand ne Erklärung?

Danke und Gruß


----------



## myGrades (11. Jul 2011)

ich stehe vor dem selben Problem und bekomme den gleichen fehler... wie hast du die session ausgelagert?  die übergibt der session ja das "props" mit aber dieses wird ja erst in der Methode erzeugt...
Hoffe du kannst mir da weiter helfen!


----------

