E-Mail-Versand implementieren: Wie Javamail funktioniert

(http://www.zdnet.de/magazin/39153636/e-mail-versand-implementieren-wie-javamail-funktioniert.htm)

von Peter V. Mikhalenko, 20. April 2007

Die Javamail-API ist ein Messaging-Framework zur Entwicklung plattformunabhängiger Anwendungen, die E-Mails versenden und empfangen. Dieser Artikel erklärt die Javamail-API und zeigt Anwendungsbeispiele sowie spezielle Optionen.

Die Javamail-API[1] ist in die J2EE-Plattform integriert und als optionales Paket in J2SE verfügbar. Der Hauptzweck der API besteht nicht in der Übermittlung, Zustellung und Weiterleitung von Nachrichten, sondern vielmehr in der Bereitstellung eines protokollunabhängigen Zugangs zu Mail-Infrastrukturen für den Versand und den Empfang von Nachrichten.

Überblick

Die Javamail-API ist in zwei Bereiche aufgeteilt:

Hinweis: Das Erstellen protokollspezifischer Provider wird in diesem Artikel nicht erläutert, aber Sun bietet kostenlos eine ausreichende Auswahl an Providern, zumindest SMTP, POP und IMAP, was zum Senden und Empfangen standardmäßiger E-Mail-Nachrichten über eine herkömmliche Internet-Infrastruktur mehr als ausreichend ist.

Alle Versionen der Javamail-API benötigen das Javabeans Activation Framework, das eine Unterstützung der Eingabe und Handhabung beliebiger Datenblöcke mitbringt. Javamail verwendet die Implementierung Multipurpose Internet Mail Extensions (MIME) aus diesem Framework. Die MIME-Implementierung definiert den in einer E-Mail übermittelten Inhalt: das Format von Nachrichten, Anhängen und so weiter. Um Javamail problemlos benutzen zu können, muss eine Anwendung classpathmail.jar und activation.jar enthalten. Wer mit der J2EE arbeitet, muss gar nichts tun, um die grundlegende Javamail-API nutzen zu können - sie ist in den J2EE-Klassen enthalten.

2006 wurde Javamail zu Open Source, weshalb der Quellcode für die Javamail-API-Referenzimplementation jetzt, im Rahmen des Glassfish-Projekts[2], unter der Open-Source-Lizenz erhältlich ist.

Klassen

Es folgt eine Übersicht der wichtigsten Klassen, die in Javamail-Anwendungen zum Einsatz kommen:

Listing A enthält einen Mustercode, der eine Test-Nachricht versendet. In diesem Beispiel sollten die als Platzhalter verwendeten E-Mail-Adressen durch echte Adressen ersetzt und die smtp.address.com gegen die Adresse eines echten SMTP-Servers ausgetauscht werden, den der jeweilige Internet-Provider beziehungsweise das Unternehmen benutzt.

Listing A

Es wird ein Sitzungsobjekt erstellt, das die laufende E-Mail-Sitzung darstellt. Der Konstruktor des Sitzungsobjekts benötigt ein java.util.Properties-Objekt, das die Schlüsseldaten der Sitzung darstellt. Für dieses Beispiel genügt es, die Eigenschaft "mail.smtp.host" auf einen geeigneten SMTP-Host zu setzen. Danach erstellt man das eigentliche MimeMessage-Objekt und passt es auf die E-Mail an. Es werden zwei InternetAddress-Objekte benötigt, die jeweils die Sender- beziehungsweise Empfänger-Adressen darstellen. Im hier verwendeten Code sollten diese Adressen tatsächlich gültige E-Mail-Adressen sein, auf die zugegriffen werden kann. Nach der Eingabe der Adressen für die E-Mail werden eine Betreffszeile und eine einfache Nachricht geschrieben.

Schließlich ist die Nachricht für den Versand bereit. In Javamail führt das Transport-Objekt den Versand der Nachrichten aus. Da es sich in diesem Fall um nur eine Nachricht handelt, wird die statische Versandmethode verwendet. Diese benutzt den als Adresse "mail.smtp.host" angegebenen Server. Die Javamail-API verfügt über zahlreiche erweiterte Funktionen. So ist es beispielsweise möglich, beliebige Mail-Header zu der Nachricht hinzuzufügen, mehrere Empfänger zu definieren, Blindkopien einer Nachricht zu erstellen (also die BCC-Zeile), den Nachrichtentext in verschiedene Zeichensatzkodierungen umzuwandeln und so weiter. In Listing B ist zu sehen, wie man mehrere Empfänger hinzufügt.

Listing B

Wird eine Nachricht mit Nicht-ASCII-Zeichen versendet (etwa bestimmte Zeichen mit Akzent), hat der Empfänger möglicherweise Schwierigkeiten beim Lesen des Textes. Um die Lesbarkeit zu verbessern, kann die folgenden Zeilen hinzugefügt werden, um einen Hinweis auf die Kodierung zu geben:

Listing B

Dies funktioniert zumindest für den Nachrichtentext, doch zur korrekten Darstellung akzentuierter Zeichen im Titel muss dieser mit Hilfe der Kodierungen "Quoted-Printable" oder "Base64" chiffriert werden. Die Methode encodeText() stellt sicher, dass die übergebenen Strings "mailsicher" sind. Listing C zeigt, wie eine E-Mail mit einem Anhang versendet wird.

Listing C

Fazit

Die umfangreichen Möglichkeiten, Javamail-API zu nutzen, würden den Rahmen dieses Artikels sprengen. Eine umfassende Beschreibung findet sich in JSR 919, der neusten Javamail-1.4-Spezifikation. Die Sun-Javamail-API ist die vollständige Referenzimplementation dieser Spezifikation. Sie kann einfach installiert und ihre vielfältigen Funktionen ausprobiert werden.

URLs in diesem Artikel:
[1] = http://java.sun.com/products/Javamail/
[2] = https://glassfish.dev.java.net/