E-Mail versenden mit JavaMail

E-Mails verschicken mit Spring4

Die Java Mail API bietet dem Softwareentwickler die Möglichkeit, E-Mail Funktionalitäten in eine bestehende Anwendung zu integrieren. Hierzu bringt JavaMail bereits alle benötigten Klassen mit, unabhängig davon ob die E-Mail verschlüsselt, mit Anhang, in HTML oder als Plain Text versendet werden soll. Auch das empfangen und auslesen erhaltener E-Mails ist mit JavaMail kein Problem. Theoretisch gesehen könnte mit Hilfe der JavaMail API ein eigenständiges E-Mail Programm entwickelt werden.

[ad#co-3]

Download JavaMail

Als Basis für das Empfangen und Senden von E-Mails ist die JavaMail library von Oracle. Diese steht in der Version 1.4.3 (letzte Aktualisierung: November 2009) auf der Oracle Downloadseite zu Verfügung.

Installation von JavaMail

Nach erfolgreichem Download muss die zip-Datei (javamail-1.4.3.zip) entpackt und die darin befindliche mail.jar dem Java Build Path des Projektes hinzugefügt werden.

E-Mail versenden

Als Grundlage dient ein neues Projekt mit einem neuem Package.

  • neues Projekt de.michel.network.mail erstellen
  • neues Package mail erstellen

Alle folgende Klassen befinden sich in dem Package mail. Damit der Aufbau Übersichtlich bleibt, wurde die Logik in vier Klassen aufgeteilt. Neue E-Mail Accounts können leicht als ENUM über die Klasse MailAccounts.java erweitert werden. Details sind in der entsprechenden Klasse jeweils enthalten.

MailAuthenticator.java

In der Regel werden E-Mail Accounts durch eine Authentifizierung (Benutzername, Passwort) geschützt. Diese Klasse muss um die Java-KlasseAuthenticator erweitert werden und die Methode getPasswordAuthentication() beinhalten, welche die Zugangsdaten liefert.

package mail;

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

/**
 * Liefert eine Authentifizierungsobjekt 
 * (muss die Klasse um "Authenticator" erweitern)
 */
public class MailAuthenticator extends Authenticator
{
	private String user;
	private String password;
	
	public MailAuthenticator(String user, String password)
	{
		this.user = user;
		this.password = password;
	}
	
	/**
	 * getPasswordAuthentication() wird automatisch aufgerufen
	 * sobald der Benutzernamen + Passwort verlangt wird
	 */
	public PasswordAuthentication getPasswordAuthentication()
	{
		return new PasswordAuthentication(user, password);
	}
}

MailAccounts.java

In dieser Klasse können alle verwendeten E-Mail Accounts abgespeichert werden. Als Dummy-Daten sollen einige bekannte E-Mail Provider dienen. Der Loginname und das Passwort müssen entsprechend gefüllt werden. Alle nicht verwendeten E-Mail Provider können aus der Liste entfernt werden.

package mail;

public enum MailAccounts
{
	// Hier bitte die ensprechenden Attribute jeweils anpassen
	GMX("mail.gmx.net", 25, "login", "passwort", "absender"),
	GOOGLEMAIL("smtp.googlemail.com", 25, "login", "passwort", "absender"),
	ARCOR("mail.arcor.de", 25, "login", "passwort", "absender"),
	WEB("smtp.web.de", 25, "login", "passwort", "absender"),
	YAHOO("smtp.mail.yahoo.de", 25, "login", "passwort", "absender"),
	// Hier können weitere E-Mail Accounts als ENUM angelegt werden
	;
	
	private String smtpHost;
	private int port;
	private String username;
	private String password;
	private String email;
	
	/**
	 * Setzt die notwendigen Attribute des MailAccounts
	 * @param smtpHost - SMTP Host
	 * @param port - Port
	 * @param username - Benutzername
	 * @param password - Passwort
	 * @param email - Absender E-Mail
	 */
	private MailAccounts(String smtpHost, int port, String username, String password, String email)
	{
		this.smtpHost = smtpHost;
		this.port = port;
		this.username = username;
		this.password = password;
		this.email = email;
	}
	
	public int getPort()
	{
		return port;
	}
	
	public String getSmtpHost()
	{
		return smtpHost;
	}
	
	public MailAuthenticator getPasswordAuthentication()
	{
		return new MailAuthenticator(username, password);
	}
	
	public String getEmail()
	{
		return email;
	}
}

Mail.java

Diese Klasse beinhaltet den wesentlichen Aufbau für das versenden einer E-Mail.

package mail;

import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class Mail
{
	public static void send(MailAccounts acc, String recipient, String subject,
			String text) throws AddressException, MessagingException
	{
		// Properties über die Systemeigenschaften anlegen
		Properties properties = System.getProperties();

		// Server-Adresse hinzugefügen
		properties.setProperty("mail.smtp.host", acc.getSmtpHost());
		
		// In diesem Fall nicht notwendig (da der Standardport 25 ist), aber
		// dennoch wissenswert ist das Setzen des Serverports
		// (für den Fall das beispielsweise die E-Mail verschlüsselt versendet werden soll)
		properties.setProperty("mail.smtp.port", String.valueOf(acc.getPort()));

		// In der Regel wird nach Authentifizierungsdaten gefragt, weshalb
		// dies in den Properties expliziert angegeben werden muss
		properties.setProperty("mail.smtp.auth", "true");
		
		// Eine (Standard)Session wird erstellt.
		// wird keine Authentifizierung benötigt, wird "null" als Attribut übertragen
		Session session = Session.getDefaultInstance(properties, acc.getPasswordAuthentication());

		// Eine neue Nachricht wird erzeugt
		MimeMessage msg = new MimeMessage(session);

		// Von wem kommt die E-Mail?
		msg.setFrom(new InternetAddress(acc.getEmail()));

		// Wohin soll die Reise gehen?
		// CC geht beispielsweise an Message.RecipientType.CC
		msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipient, false));

		// Betreff
		msg.setSubject(subject);
		
		// Nachricht
		msg.setText(text);
		
		// E-Mail versenden
		Transport.send(msg);
	}
}

MailTest.java

Zu guter Letzt soll natürlich noch eine E-Mail versendet werden. Notwendig sind hierfür der Empfänger, der Titel und natürlich der Inhalt.
In diesem Beispiel wirder der GMX Account genutzt. Wurden in der MailAccount.java Datei andere E-Mail Provider gesetzt, müssen diese entsprechend angegeben werden.

package mail;

import javax.mail.MessagingException;
import javax.mail.internet.AddressException;

public class MailTest
{
	public static void main(String[] args) throws AddressException, MessagingException
	{
		String recipient = "info@itblogging.de";
		String subject = "Hallo zusammen ...";
		String text = "... ich bin eine E-Mail : - )";

		Mail.send(MailAccounts.GMX, recipient, subject, text);		
	}
}

Wenn alles gut verlaufen ist, sollte nun eine neue E-Mail im Postfach liegen. Viel Spaß beim austesten.