Schaut man sich Commons E-Mail an, findet man zweierlei: zunächst akzeptieren die Methoden setTo, setCc und setBcc Sammlungen von InternetAddress, da ihre Parameter stärker mit aktuellen Java-Verfahren übereinstimmen. Zweitens gibt es addTo-, addCc- und addBcc-Methoden, mit denen es einfach ist, Empfängerlisten zu erzeugen (MailCommons3.java):
for(String s:MailSettings.ccAddresses) email.addCc(s);
was viel klarer ist.
Und wie verschickt man HTML-Mails mit eingebetteten Bildern? Hier kommt das JavaBeans Activation Framework mit Javamail ins Spiel, um es beim Kodieren des Bildes zu unterstützen. Mit dem Javamail-API erzeugt man eine MimeMultipart-Instanz und erzeugt dann MimeBodyParts und fügt sie in dieser MimeMultipart-Instanz zusammen. Um also ein einziges Bild, etwa zdnet-de.gif, einzubetten und es in einer HTML-Nachricht anzuzeigen, muss man folgendes ausführen (siehe HtmlJavaMail.java):
MimeMultipart multipart=new MimeMultipart(); BodyPart msgBodyPart=new MimeBodyPart(); msgBodyPart.setContent("H1Hallo! sagt HtmlJavaMail/H1 img src="cid:logo"","text/html"); BodyPart embedImage=new MimeBodyPart(); DataSource ds=new URLDataSource (new URL(MailSettings.inlineImage)); embedImage.setDataHandler(new DataHandler(ds)); embedImage.setHeader("Content-ID",""); multipart.addBodyPart(msgBodyPart); multipart.addBodyPart(embedImage); message.setContent(multipart);
Der erste BodyPart hat seinen Inhalt als String und Inhaltstyp auf „text/html“ gesetzt. Zu beachten ist hier, dass das IMG-Tag in dem HTML-Text, den man setzt, auf eine Content-ID verweist; dies ist der Name des Teils der MIME-Nachricht, die das Logo-GIF enthalten wird. Um das Bild tatsächlich einzubetten, erzeugt man einen weiteren BodyPart und eine JAF-Datenquelle dafür, so dass die JAF-Bibliothek herausfinden kann, wie sie den Inhalt verwalten muss. Dann muss man einen DataHandler hinzufügen, der diese DataSource zu dem BodyPart verwendet, so kann er jeden Inhalt lesen, auf den die URL zeigt. Und schließlich muss man die Content-ID im Header des BodyPart setzen, so dass auf ihn als ein eingebettetes Bild zugegriffen werden kann. Diese erzeugten BodyParts werden dann der MimeMultipart-Instanz hinzugefügt, und statt setText() für die Nachricht aufzurufen, ruft man setContent() damit auf. Der knifflige Teil ist, all diese Content-IDs zu verwalten. Jetzt wurde das für nur ein Bild gemacht, doch müssen ein BodyPart und eine Content-ID für jedes Bild in den HTML-Text eingebettet sein.
Und wie sieht das jetzt mit der Commons E-Mail-Version aus (siehe HtmlMailCommons.java)?
HtmlEmail email=new HtmlEmail(); String cid=email.embed(new URL(MailSettings.inlineImage), "ZDNet-Logo"); email.setHtmlMsg("H1Hallo" sagt MailJavaMail3/H1 img src="cid:"+cid+"""); email.setTextMsg("Ihr MailClient unterstützt leider keine HTML-Dateien.");
Das ist viel kürzer, und diese Version ist funktioneller, denn sie setzt auch den alternativen Text, wenn der E-Mail-Client nicht mit HTML-E-Mails umgehen kann. Hier wurde nicht eine SimpleEmail-Instanz, sondern eine HtmlEmail-Instanz erzeugt. Um ein Bild einzubetten, ruft man nur die Embed-Methode von HtmlEmail auf. Das gibt einen String aus, der eine generierte und gemanagte Content-ID für dieses eingebettete Bild sein wird, und man kann den benutzen, wenn man den HTML-Content generiert. Um das zu setzen, ruft man nur setHtmlMsg mit einem entsprechend formulierten String auf. setTextMsg setzt den Text für den Nicht-HTML-Client, und die Nachricht kann abgeschickt werden.
Jetzt fragt sich wahrscheinlich jeder, warum er Javamail direkt benutzen sollte. Die Antwort lautet, dass Commons E-Mail für die meisten Zwecke tut, was man braucht, und dies mit viel schlankerem Code, wenn man E-Mails verschickt. Was man dabei aber nicht erhält, ist feinkörnige Kontrolle über Mail-Sessions oder die Möglichkeit, Mails zu empfangen. Da aber viele Applikationen keine großen Mail-Verteiler oder Mail-Reader sind, dürfte dies nicht schlimm sein. Und wenn man diese Dinge tun muss, dann verwendet man bereits die Javamail-Bibliothek. Die einzige Warnung ist, dass Commons E-Mail zu dem Zeitpunkt, als dieser Artikel verfasst wurde, ein 1.0-Release ist: Es gibt Bugs und Löcher in dem API, aber es funktioniert. Jetzt gibt es keine Entschuldigung mehr dafür, dass man seine Applikationen keine Status-Mails schicken lässt, während sie arbeiten.
Anmerkung: Der gesamte Beispielcode steht als ZIP-Paket zum Download bereit.
Neueste Kommentare
Noch keine Kommentare zu E-Mails in Java verschicken: Es gibt mehr als eine Möglichkeit
Kommentar hinzufügenVielen Dank für Ihren Kommentar.
Ihr Kommentar wurde gespeichert und wartet auf Moderation.