Email mit Javamail versenden

TobGod

Erfahrenes Mitglied
Hi, ich habe jetzt stunden bei google geschaut und dieses Forum auch durchforstet. Leider wird immer noch keine E-Mail verschickt. Ich arbeite mit Java und dem GUI Jigloo. Hier mein Code:
Code:
public class SendJavaMail extends javax.swing.JFrame {
	  
	public static void postMail( String recipient,String subject,String message, String from ) throws MessagingException
	{
		Properties props = new Properties();
		props.put("mail.smtp.de Kann das so bleiben ?", "Was muss hierrein ?");
		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);
		
	}

Ich habe die Bibliotheken Javamail und Activation Framework in das Projekt mit eingebunden. Habe auch keine Fehler im Programm. Habe mir dann einfach einen Button gemacht, der Code davon sieht so aus:

Code:
try {
     postMail( "Emailadresse vom Empfänger", "TESTSUBJECT", "TESTTEXT", "FROMME");
} catch (MessagingException e) {
cmdFunktioniert.setText("Geht nicht !");
}

Tja, es kommt keine Email an mit den Angaben mit denen ich das versuche und es wird immer "Geht nicht!" auf einem Label ausgegeben..

Welchen SMTP Server muss ich denn angeben und z.B. wenn man den von web.de nimmt, muss ich mich da erst authentifizieren ?

Danke schonmal für alle Antworten, Gruß Tobi
 

zeja

Erfahrenes Mitglied
Die Properties die du übergeben kannst stehen im Javadoch direkt auf der Übersichtsseite ganz unten: Javamail API

Der Rest ist fast richtig :) Für web.de z.B. brauchst du tatsächlich Authentifizierung.

Habe dir nochmal ein Beispiel fertig gemacht mit dem ich eben eine Mail senden konnte:
Java:
package de.tutorials;

import java.util.Date;
import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/**
 * @author zeja
 */
public class SendMailExample {
	
	public void sendMail(String smtpHost,String username,String password,String senderAddress,String recipientsAddress,String subject,String text ){
		MailAuthenticator auth = new MailAuthenticator(username, password);

		Properties properties = new Properties();

		// Den Properties wird die ServerAdresse hinzugefügt
		properties.put("mail.smtp.host", smtpHost);

		// !!Wichtig!! Falls der SMTP-Server eine Authentifizierung
		// verlangt
		// muss an dieser Stelle die Property auf "true" gesetzt
		// werden
		properties.put("mail.smtp.auth", "true");

		// Hier wird mit den Properties und dem implements Contructor
		// erzeugten
		// MailAuthenticator eine Session erzeugt
		Session session = Session.getDefaultInstance(properties, auth);

		try {
			// Eine neue Message erzeugen
			Message msg = new MimeMessage(session);

			// Hier werden die Absender- und Empfängeradressen gesetzt
			msg.setFrom(new InternetAddress(senderAddress));
			msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(
					recipientsAddress, false));

			// Der Betreff und Body der Message werden gesetzt
			msg.setSubject(subject);
			msg.setText(text);

			// Hier lassen sich HEADER-Informationen hinzufügen
			msg.setHeader("Test", "Test");
			msg.setSentDate(new Date( ));

			// Zum Schluss wird die Mail natürlich noch verschickt
			Transport.send(msg);

		}
		catch (Exception e) {
			e.printStackTrace( );
		}
	}
	
	class MailAuthenticator extends Authenticator {

		/**
		 * Ein String, der den Usernamen nach der Erzeugung eines
		 * Objektes<br>
		 * dieser Klasse enthalten wird.
		 */
		private final String user;

		/**
		 * Ein String, der das Passwort nach der Erzeugung eines
		 * Objektes<br>
		 * dieser Klasse enthalten wird.
		 */
		private final String password;

		/**
		 * Der Konstruktor erzeugt ein MailAuthenticator Objekt<br>
		 * aus den beiden Parametern user und passwort.
		 * 
		 * @param user
		 *            String, der Username fuer den Mailaccount.
		 * @param password
		 *            String, das Passwort fuer den Mailaccount.
		 */
		public MailAuthenticator(String user, String password) {
			this.user = user;
			this.password = password;
		}

		/**
		 * Diese Methode gibt ein neues PasswortAuthentication
		 * Objekt zurueck.
		 * 
		 * @see javax.mail.Authenticator#getPasswordAuthentication()
		 */
		protected PasswordAuthentication getPasswordAuthentication() {
			return new PasswordAuthentication(this.user, this.password);
		}
	}
	
	public static void main(String[] args) {

		String username = "";
		String password = "";
		String senderAddress ="";//someone@web.de
		String recipientsAddress = ""; //somereceiver@web.de
		String subject = "Test";
		String text = "text";
		String smtpHost = "smtp.web.de";
		
		new SendMailExample().sendMail(smtpHost, username, password, senderAddress, recipientsAddress, subject, text);
	}
}

(Falls jemandem die Kommentare einiger Methoden bekannt vorkommen, das sind wohl nicht meine. Ist aber schon länger her dass ich das ganze so genutzt habe, daher weiss ich nicht mehr woher sie kommen :-/)
 

TobGod

Erfahrenes Mitglied
Es geht wirklich ! :) Ich dachte schon mein Java mag das nicht machen.. Danke für die schnelle und kompetente Antwort.

Gruß Tobi
 

BMo

Mitglied
Es gibt noch Helden!

Vielen Dank für den super Code!
Ich bin jetzt seit 2 Tagen non stop am Emailen, doch es ging und ging nicht!
Diese sch*** Authentification!
Vielen Dank!
 

lernen.2007

Erfahrenes Mitglied
Hallo,

den Code wollte ich auch einsetzen, aber irgendwie klappt es nicht. Es erkennt das nicht:

MailAuthenticator auth = new MailAuthenticator(username, password);

Es findet die Klasse MailAuthenticator nicht. Obwohl alle imports ja auch passen. Gibt es noch eine Einstellung, das ich übernehmen muss.


Danke
erkan
 

Kulabac

Erfahrenes Mitglied
Vielleicht liegt's an der Java-Version? Ich mein die Mail-Sachen sind beim JDK erst ab Version 6 standardmäßig dabei, vorher muss man die sich noch gesondert runterladen und in den Classpath setzen. Also die Klasse MailAuthenticator ist natürlich da (ist ja im Programmcode), aber vielleicht findet er halt die Authenticator-Klasse nicht, von der MailAuthenticator erbt (gibt manchmal die gleiche Fehlermeldung).

Ich benutz übrigens von Apache die commons-email-1.0.jar Da wird's dann noch einfacher, weil man einfach die setAuthentication-Methode des Mailobjekts aufrufen kann :)
 

lernen.2007

Erfahrenes Mitglied
Hallo,

jetzt habe ich mit Classpath hinbekommen, aber bekomme immer noch folgende Exceptions:

Code:
avax.mail.MessagingException: Could not connect to SMTP host: smtp.web.de, port: 25;
  nested exception is:
        java.net.ConnectException: Connection timed out: connect
        at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1282)
        at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:370)
        at javax.mail.Service.connect(Service.java:297)
        at javax.mail.Service.connect(Service.java:156)
        at javax.mail.Service.connect(Service.java:105)
        at javax.mail.Transport.send0(Transport.java:168)
        at javax.mail.Transport.send(Transport.java:98)


Muss ich etwas einstellen oder anders machen?

Gruß
erkan
 

Kulabac

Erfahrenes Mitglied
Ja, ist ein Einstellungsfehler. Web.de (und die meisten anderen, die Authentifizierung verlangen), will den Kontakt nicht zu Port 25, sondern zu Port 587.
 

Neue Beiträge