Mailversand mit Java

Autor:

Ralf Rapude

Tutorial für die Nutzung der Java Mail Funktionen

Einleitung
Für das Tutorial wird ein Tool für den Versand eines Newsletters programmiert. Das Programm liest für den Versand die benötigten Adressen aus einer Datenbank in eine Hashtable aus und versendet dann an diese Adressen den Text, der ins Textfeld eingetragen wurde.

Installation
1. Das Tool nutzt für den Mailversand Klassen aus der Java Enterprise Edition. Deshalb ist es notwendig, diese zunächst zu installieren. Zu finden ist die J2EE hier.

2. Um das Tool zu testen, ist es günstig einen lokalen Mailserver zu nutzen. Ich habe dafür Hamster installiert, der hier einen externen SMTP Server simuliert und ausserdem das Testen durch die Ausgabe eines logs erleichtert. Hamster nutzt die voreingestellte IP 127.0.0.1 und kann hier heruntergeladen werden (aber es kann natürlich auch jeder andere Mailserver genutzt werden). Eine Installation von Hamster ist nicht notwendig. Einfach entpacken und "Hamster.exe" starten. Der Proxy ist dann bereit. 

3. Vor dem testen des Programms muss ein ODBC-Treiber zur Datenbank "Mailer.mdb" eingerichtet werden. Eine Datenbank zu Testzwecken liegt dem Projekt bei und die Verbindung muss den Namen "newsletter" tragen (ansonsten müssen die Sourcen vor dem kompilieren angepasst werden).

Dokumentation

Start
Das Programm besteht aus einem Fenster und einigen Meldungsfenstern für zusätzliche Informationenen, die aus der Klasse JOptionPane instanziiert wurden, sowie einer Anzahl von Textfeldern, die die benötigten Informationen für den Versand aufnehmen. Gesteuert wird das Programm mit einigen Buttons der Klasse JButton.

nach oben

nach oben

Die oberen Textfelder

Der obere Teil des Tools besteht aus drei Textfeldern. Da zum testen und entwickeln der Mailproxy Hamster genutzt wurde, der auf der IP 127.0.0.1, Port 25 Mails empfängt, ist diese IP auch voreingestellt.

In die Zeile Absender wird die Mailadresse des Mailversenders eingetragen. Diese Adresse taucht auch im Reply-to der E-Mails wieder auf. Wird das Feld Absender leer gelassen, wirft die Methode "sendMail()" der Klasse CSendMails eine IllegalAdressException und der User wird durch ein JOptionPane darauf hingewiesen, dass die Exception aufgetreten ist und die Mail Adresse überprüft werden muss. 

In die Betreff Zeile ist das Subject des Newsletters einzutragen. Dieses Feld wird ebenso wie das Feld "Absender" in den Newsletter übernommen.. 

nach oben

Versand eines Newsletters

Beim Klick auf den Button "Versand" erfolgt eine Validierung der Absender Adresse und der Versand des Newsletters wird gestartet, wenn eine Adresse eingegeben ist.
Der Inhalt des Textfeldes "Nachricht" wird dabei in die Mail übernommen und der Button "Abbrechen" wird so lange eingeblendet, wie der Mailversand läuft. Wird der Button angeklickt, erscheint eine Meldung im Debug Fenster, dass der Versand jetzt abgebrochen wird. Ausserdem wird auch der Button Speichern aktiviert, damit damit eine LogDatei erstellt werden kann, die den Verlauf des Versands dokumentiert. 
Die entsprechenden Buttons werden auch während des Programmgebrauches je nach Bedarf ein- und ausgeblendet.

nach oben

Programmierung
Das Programm besteht aus sieben Klassen. Bei der Erstellung habe ich darauf geachtet, dass MVC-Pattern (Model-View-Controler) zu nutzen, um so einen möglichst übersichtlichen Code zu schreiben, der eine bessere Wartbarkeit, bzw. Erweiterbarkeit und Anpassung ermöglicht. Desweiteren ist an diesem relativ überschaubaren Beispiel eine Demonstration des Patterns problemlos möglich.
Um die Effizienz des Programms zu optimieren, erfolgt der Zugriff auf die Empfänger des Newletters über einen Datenbankzugriff und der Mailversand selbst über einen Thread. Ausserdem wurden die starken Mailfunktionen der Java-EnterpriseEdition genutzt.

  1. CApp
  2. CController
  3. CGuiClient
  4. CLogSpeichern
  5. CMailData
  6. CSendMails
  7. CTextAreaWriter
CApp
Die Klasse "CApp" enthält nur die Main Funktion des Programms. Hier wird das Programm gestartet.

CController
Diese Klasse ist der Controller des Programms. Die möglichen Events werden hier abgefangen um so die entsprechenden Ereignisse wie Mailversand, Speichern der Logfile usw. zu ermöglichen. 

CGuiClient
Diese Klasse stellt alle für den Anwender sichtbaren Elemente des Programms zur Verfügung

CLogSpeichern
Hier wird beim Klick auf den Button "Speichern" der Inhalt des Log Fensters in einer Text Datei gespeichert.

CMailData
Hier wird der Connect zur Datenbank aufgebaut und eine Hashtable mit den aktuellen Daten der Empfänger gefüllt. 

CSendMails
In dieser Klasse erfolgt der eigentliche Versand des Newsletters

CTextAreaWriter
Die Ausgabe der Debug Meldungen für den Mailversand wird hier vorgenommen, in dem der Ausgabestrom an ein Objekt der Klasse CTextAreaWriter umgeleitet wird. Diese Klasse wiederum ist von PrintStream abgeleitet. 

nach oben

Programmablauf
Beim Start des Programms wird in der Main-Methode von "CApp" zunächst die Gui gezeichnet. Im Textfeld "Mailserver" ist die IP 127.0.0.1 dabei voreingestellt.
Hat der User die benötigten Angaben in den Textfeldern vorgenommen und klickt auf den Button "Versand", wird eine Instanz der Klasse "CSendMails" im Controller gebildet und der Thread gestartet, der den eigentlichen Mailversand vornimmt und damit eine weitere Nutzung des Programms ermöglicht, auch wenn gerade ein Versand stattfindet.

In der run Methode der Klasse CSendMails wird zunächst eine aktuelle Hashtable geladen, die die Adressaten des Newsletters enthält. Diese Hashtable wird in der Methode "fillData()" der Klasse CMailData mit den aktuellen Daten der Mailempfänger gefüllt. Dieser Vorgang erfolgt bei jedem Klick auf den "Versand" Button erneut, damit stets auch neu hinzugefügt Adressaten den Newsletter erhalten. 

Nachdem die Hashtable geladen wurde, werden Mail Funktionen der Klasse javax.mail der Enterprise Edition genutzt, um den eigentlichen Mailversand vorzunehmen. Mit Hilfe dieser Klassen wird ein Connect zum Mailserver aufgebaut und die Mails werden an die Emfpänger versandt. 

Klickt der User während des Versandt auf den Button "Abbrechen", werden über den Controller Funktionen aufgerufen, die boolean Variablen neu setzen, damit der Mailversand abgebrochen wird und entsprechende Meldungen als Hinweis für den User ausgegeben werden. 

Die Buttons "Speichern" und "Abbrechen" werden allerdings nur aktiviert, wenn es sinnvoll ist, auf deren Funktionen zuzugreifen. Diese Aktivierung, bzw. Deaktivierung erfolgt über "set" Methoden der Gui Klasse. 

nach oben