zurückInhaltvorwärts Perl Einführung: Das Net::SMTP Modul

12.2 Das Net::SMTP Modul

Das Net::SMTP Modul ermöglicht auf eine einfache Art und Weise die Kommunikation mit einem SMTP (Simple Mail Transfer Protocol) Server um Emails skriptgesteuert zu verschicken. Die Anwendungsmöglichkeiten sind vielfach und reichen von Rundbriefen über anonyme Emails bis zu Spamprogrammen (was wir NICHT empfehlen, da man sich hiermit sehr unbeliebt machen kann). Der Umgang mit dem Modul setzt Grundkenntnisse des SMTP Protokolls voraus, die man sich allerdings leicht über die entsprechenden RFCs aneignen kann. Auch dieses Modul ist objektorientiert.

Das folgende Beispielskript stellt eine Verbindung zu einem SMTP Server her und verschickt eine Email an eine Adresse. Die eigentliche Nachricht ist in einer Datei abgelegt, die eingelesen wird bevor die Email verschickt wird. Natürlich lassen sich auch Emailadressen in einer Datei ablegen, so daß man automatisch eine Email an beliebig viele Personen verschicken kann (siehe Übung 1).

use Net::SMTP;                          # Einbinden des NET:SMTP Moduls

$mailServer  = "mail.server.com";       # Name des SMTP Servers. Angabe einer
                                        # IP Adresse ist auch möglich
$nachricht   = "nachricht.txt";         # Der Text der Nachricht
$absender    = "absender\@hier.com";    # Emailadresse des Absenders.
$betreff     = "Neue Nachricht";        # Betreffszeile der Email
$empfaenger  = "empfaenger\@dort.com";  # Emailadresse des Empfängers


print "Mailserver ist : $mailServer\n"; # Name des SMTP Servers wird auf dem
                                        # Bildschirm ausgegeben

$smtp = Net::SMTP->new($mailServer);    # Ein neues SMTP Objekt wird erzeugt.
                                        # Als Parameter wird der Name des SMTP
                                        # Servers verlangt.
		
$smtp->mail($absender);                 # Dem SMTP Server wird der Absender
                                        # mitgeteilt.
$smtp->to($empfaenger);                 # Dem SMTP Server wird der Empfänger
                                        # mitgeteilt.

$smtp->data();                          # Dem SMTP Server wird mitgeteilt, daß
                                        # nun der Nachrichtentext folgt.
$smtp->datasend("Subject: $betreff\n"); # Betreffszeile wird zum Server
                                        # geschickt.
$smtp->datasend("To: $empfaenger\n");	# Empfänger Emailadresse wird
                                        # geschickt.
$smtp->datasend("\n");                  # Leerzeile wird an Server geschickt


# Öffnen der Datei, die den eigentlichen Nachrichtentext enthält, 
# und Einlesen des Texts in das Array @nachricht.
open (MESSAGE, $nachricht) || die "kann Datei $nachricht nicht öffnen";
@nachricht=<MESSAGE>;
close MESSAGE;

# Nachricht wird zeilenweise and den Server geschickt
foreach $zeile (@nachricht) {
  $smtp->datasend("$zeile");
}

$smtp->dataend(); # Dem Server wird mitgeteilt, daß kein weiterer
                  # Nachrichtentext folgt.
$smtp->quit;      # Beenden der Verbindung mit dem Server

Bevor man das Net::SMTP Modul benutzen kann, muß man es zunächst mit use Net::SMTP eingebunden werden. Es folgen einige Variablendeklarationen, in denen der Name des SMTP-Servers, der Absender und Empfänger festgelegt werden. Diese Informationen kann man selbstverständlich auch aus einer Datei einlesen. Beachte, daß dem @ Zeichen in den Variablendeklarationen der Variabeln $absender und $empfaenger ein \ vorangestellt werden muß, damit @ auch wirklich als @ und nicht als Sonderzeichen mit spezieller Funktion von Perl interpretiert wird.
Zur Kontrolle wird dann nochmal die Adresse des Servers auf dem Bildschirm ausgegeben. Nun kann der eigentliche Vorgang des Versendens beginnen.

Zunächst wird ein neues SMTP-Objekt mit dem Befehl $smtp = Net::SMTP->new($mailServer); erstellt, also eine Verbindung mit dem SMTP-Server hergestellt. Als Parameter erwartet die new Methode die Adresse des Mailservers.

Um eine neue Nachricht zu beginnen, wird mit die Methode $smtp->mail($absender); aufgerufen, die als Parameter die Email Adresse des Absenders erwartet.

Nun muß durch Aufruf der $smtp->to($empfaenger); Methode der Empfänger der Nachricht angegeben werden. Ist dies erfolgt, kann man die eigentliche Nachricht senden. Dies wird dem SMTP-Server durch Aufrufen von $smtp->data(); mitgeteilt.
Das Senden der Nachricht erfolgt mittels der $smtp->datasend() Methode.

Hier wird neben dem Betreff (Subject) noch einmal der Empfänger angegeben, damit dieser auch in seinem e-mail Programm sehen kann, daß die Nachricht an ihn gerichtet ist. Diese sogenannten Header-Felder sind in den RFCs zum SMTP-Protokoll genauer beschrieben. Nach den Header-Feldern kann die eigentliche Nachricht getrennt durch eine Leerzeile gesendet werden.

Im Beispiel wird die Nachricht aus einer Datei eingelesen und per $smtp->datasend(); Zeilenweise an den Server geschickt. Das Ende des Nachrichtentextes wird dem Server durch Aufruf von $smtp->dataend(); mitgeteilt, die fertige Nachericht wird gesendet.

Da keine weiteren Nachrichten gesendet werden sollen, muß nun noch die Verbindung zum SMTP-Server beendet werden, dies geschieht durch Aufrufen von $smtp->quit.

Für eine Dokumentation des SMTP Moduls sollte man sich die während der Installation erzeugten HTML-Seiten ansehen. Im Perl Verzeichnis existiert unter html\lib für jedes Modul eine recht ausführliche Beschreibung. Die des SMTP-Moduls findet man unter html\lib\site\Net\SMTP.html

Übung 1:
Wandle das Skript so um, daß die Emailadressen der Empfänger aus einer Datei gelesen werden. Um Pfade braucht Du Dir keine Gedanken zu machen, wenn die Datei im selben Verzeichnis liegt wie das Skript.

Perl Einführung: Das Net::SMTP Modul zurückInhaltvorwärts