![]() |
Einfacher Form-Mailer |
|
| |
| E-Mail: | |
|---|---|
| Homepage-URL: |
Bei Fragen zu diesem Beitrag bitte den Autor des Beitrags kontaktieren!
Das Problem ist bekannt: Formulare mit mailto als action-Attribut bereiten oft Schwierigkeiten. Beim einen Anwender ist dem Browser kein Mail-Programm bekannt, so dass die Formulardaten nicht versendet werden können. Beim nächsten Anwender klappt die Kommunikation zwischen Browser und Mail-Programm nicht richtig, und es geht ein leeres Mail-Fenster auf, statt dass die Formulardaten versendet werden.
Zuverlässiger ist die Methode, im action-Attribut des <form>-Tags ein CGI-Script anzugeben, das die Formulardaten einliest und den Mailversand auf dem Server anstößt. In diesem Artikel soll ein in Perl geschriebenes CGI-Script vorgestellt werden, das diese Standardaufgabe löst. Wenn Sie auf dem Server, auf dem Ihre Webseiten liegen, ein eigenes CGI-Verzeichnis haben und Perlscripts ausführen können, können Sie das hier vorgestellte Script selber installieren.
Wenn Sie mit PHP arbeiten statt mit Perl, lesen Sie den Beitrag
Einfacher PHP-Form-Mailer von Patrick Canterino.
Der folgende Perl-Quellcode enthält den gesamten Form-Mailer.
#!/usr/bin/perl
# -------> Individuelle Parameter des Skriptes - bitte anpassen!
# --> SMTP-Programm zum Versenden der Mail:
$Sendmail_Prog = "/usr/lib/sendmail";
# --> Ziel-Mailadresse, an die gesendet werden soll:
$mailto = 'mailadresse@example.org';
# -------> Modul für CGI-Scripts einbinden:
use CGI;
# -------> Modul für CGI-Scripts zum Einlesen der Formulardaten anwenden:
$query = new CGI;
@names = $query->param;
# -------> interne Daten aus den erwarteten hidden-Feldern auslesen:
$delimiter = $query->param('delimiter'); # ---> Begrenzerzeichen zwischen name und value
$returnhtml = $query->param('return'); # ---> URL für Dankeseite
$subject = $query->param('subject'); # ---> E-Mail-Subject
# -------> alle Whitespace-Zeichen (Leerzeichen, Tabulator, Newline) in Leerzeichen wandeln
# VERHINDERT sonst möglichen MISSBRAUCH des Skripts
$subject =~ s/\s/ /g;
# -------> Text der E-Mail aus den Formulardaten ermitteln:
$mailtext = "";
foreach(@names) {
$name = $_;
@values = "";
@values = $query->param($name);
if($name ne "return" && $name ne "subject" && $name ne "delimiter") {
foreach $value (@values) {
$mailtext = $mailtext.$name;
$mailtext = $mailtext.$delimiter;
$mailtext = $mailtext.$value."\n";
}
}
}
# -------> E-Mail versenden:
open(MAIL,"|$Sendmail_Prog -t") || print STDERR "Mailprogramm konnte nicht gestartet werden\n";
print MAIL "To: $mailto\n";
print MAIL "Subject: $subject\n\n";
print MAIL "$mailtext\n";
close(MAIL);
# -------> Dankeseite an Browser senden:
print "Location: $returnhtml\n\n";
Das Script definiert zunächst den Skalar $Sendmail_Prog. Darin wird der Pfad zu dem Programm auf dem Server gespeichert, das via SMTP-Protokoll E-Mails verschicken kann. Auf Unix-Rechnern ist dies normalerweise das Programm sendmail, das normalerweise im Verzeichnis /usr/lib liegt. Sollte das auf Ihrem Server anders sein (gegebenenfalls Provider fragen!), müssen Sie den Verzeichnispfad anpassen.
Mit dem Befehl use CGI bindet das Script ein Perl-Standard-Modul zur bequemen Verarbeitung ankommender Formulardaten ein. Auf diese Weise liest es die Formulardaten ein. Besonders wichtig sind für das Script vier erwartete Formularfelder mit den Namen delimiter, return und subject, alle vom Typ <input type="hidden">. Weiter unten auf dieser Seite wird noch erklärt, wie Sie diese Formularfelder in Ihr HTML-Formular einbauen.
Aus diesen und den übrigen Feldern des Formulars konstruiert das Script den Text der zu versendenden E-Mail. Anschließend wird das Programm sendmail geöffnet. In den Ein-Ausgabekanal zu diesem Programm schreibt das Script die E-Mail mit SMTP-Standard-Header und dem zuvor ermittelten Mailtext. Die Formulardaten sind damit versendet und gehen an die Mailadresse, die Sie im Script definiert haben.
Zuletzt wird eine gewünschte URL-Adresse an den aufrufenden Browser zurückgesendet. Auch diese URL geben Sie im HTML-Formular an.
Um das Script in Ihrem CGI-Verzeichnis zu installieren, kopieren Sie den obigen Code aus dem Browser über die Zwischenablage in einen Texteditor. Passen Sie einzelne Daten wenn erforderlich an. Speichern Sie die Datei unter einem für Perlscripts geeigneten Namen ab, zum Beispiel unter selfmail.pl
Laden Sie diese Datei auf den Server hoch, und zwar in das Verzeichnis, das als CGI-Verzeichnis definiert ist (meistens hat es den Namen cgi-bin). Achten Sie in Ihrem FTP-Programm, mit dem Sie die Datei hochladen, darauf, daß als Transfermodug "Text" eingestellt ist, nicht "Binär". Geben Sie der Datei auf dem Server (wenn es ein Unix-Rechner ist) mit dem chmod-Befehl die Rechte 755. Ein ordentliches FTP-Programm sollte Sie dabei unterstützen.
<form action="http://www.ihreadresse.de/cgi-bin/selfmail.pl" method="post"> <input type="hidden" name="return" value="http://www.ihreadresse.de/danke.html"> <input type="hidden" name="delimiter" value=": "> <input type="hidden" name="subject" value="Feedback-Formular"> <!-- hier beliebige eigene Felder --> <input type="submit"><input type="reset"> </form>
Beim action-Attribtut des <form>-Tags geben Sie die URL-Adresse des Form-Mailer-Scripts an. Im Feld return geben Sie hinter value die URL-Adresse der Seite an, die nach Absenden des Formulars im Browser erscheinen soll - typischerweise eine Dankeschön-Seite. Im zweiten hidden-Feld mit dem Namen delimiter geben Sie bei value eine Zeichenkette an, wie Formularfeldnamen und Formularfelddaten in der späteren E-Mail formatiert werden sollen. Wenn Sie hier beispielsweise value=": " eingeben und im Formular ein Feld mit Namen Vorname haben, dann sieht der Eintrag eines ausgefüllten Formulars in der E-Mails etwa so aus:
Vorname: Stefan
Im hidden-Feld subject schließlich müssen Sie bei value das gewünschte E-Mail-Subject angeben. Alle Mails, die Sie über das CGI-Script erhalten, haben dieses Subject. Geben Sie beispielsweise so etwas an wie Feedback von einem Anwender an.
Danach definieren Sie Ihre für den Anwender sichtbaren Formularfelder. Es kann sich um alle üblichen Feldtypen handeln, also um Eingabefelder, Auswahllisten, Textarea-Felder, Radiobuttons, Checkboxen usw. Der Submit-Button dient wie üblich dazu, das Formular abzuschicken.
Programmieren Sie unter keinen Umständen ein Script, bei dem Sie die Ziel-Mailadresse als hidden-Feld an das Script übergeben. Derartige Scripts können zum Versand von Spam missbraucht werden - den Ärger mit dem entstehenden Traffic, den Beschwerdemails, den tausenden unzustellbaren Rückläufern und Ihrem Provider, der Ihnen vielleicht sogar die Kündigung ausspricht, haben Sie.
Die folgenden Stellen werden empfohlen, um das obige Beispiel besser zu verstehen, oder um weitere Möglichkeiten und Details zu erfahren.
SELFHTML: Das CGI-Modul (Perl)
Patrick Canterino: Einfacher PHP-Form-Mailer