|
Formulardaten einlesen
Eingelesene Formulardaten als Mail zum Formularanbieter senden
HTML-Code an Browser senden
if($ENV{'REQUEST_METHOD'} eq 'GET') { $Daten = $ENV{'QUERY_STRING'} } else { read(STDIN, $Daten, $ENV{'CONTENT_LENGTH'}); } @Formularfelder = split(/&/, $Daten); foreach $Feld (@Formularfelder) { ($name, $value) = split(/=/, $Feld); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s/<!--(.|\n)*-->//g; $Formular[$i] = $name; $i = $i + 1; $Formular[$i] = $value; $i = $i + 1; } |
Die Daten stehen zunächst in dem Skalar $Daten. Der Wert von $Daten hat in diesem Stadium das Aussehen des Formulardatenstroms bei der Übertragung von Formulardaten.
Mit der Anweisung @Formularfelder = split(/&/, $Daten); wird die Zeichenkette $Daten in eine Liste verwandelt. Als Trennzeichen, das aus dem Datenstrom Listenelemente macht, wird das kaufmännische Und (&) angegeben. Durch dieses Zeichen sind die im Formulardatenstrom die einzelnen Formularfelder voneinander getrennt.
Anschließend werden die einzelnen Felder der neuen Liste @Formularfelder in einer foreach-Schleife behandelt. Zuerst wird jedes Formularfeld in zwei Bestandteile zerlegt, wobei als Trennzeichen das Istgleichzeichen angegeben wird. Die beiden Teile werden in den Skalaren $name und $value abgelegt. In $name steht dann genau das, was in dem betreffenden HTML-Formularelement mit der Angabe name= definiert wurde. In $value steht das, was der Anwender als Wert für das betreffende Formularelement eingegeben oder ausgewählt hat. Angenommen, das HTML-Formular enthält ein einzeiliges Eingabefeld, das mit <input name="Spitzname" size=60 maxlength=60> definiert wurde. Weiter angenommen, der Anwender hat in diesem Feld "Hotzenplotz" eingegeben. Dann steht für dieses Formularfeld im Skalar $name der Wert Spitzname, und im Skalar $value steht der Wert Hotzenplotz.
Mit den Suche-Ersetze-Vorgängen in den weiteren Anweisungen der for-Schleife werden die störenden Steuerzeichen, die noch aus dem Formulardatenstrom übrig geblieben sind, entfernt.
$Mailprogramm = '/usr/lib/sendmail'; # siehe Erläuterung unten $MailSubject = "Formluar-Feedback"; # siehe Erläuterung unten $Empfaenger = 'IhrName@Provider.xxx'; # siehe Erläuterung unten $SenderName = $Formular[1]; # siehe Erläuterung unten $SenderMail = $Formular[3]; # siehe Erläuterung unten open(MAIL,"|$Mailprogramm -t") || die; print MAIL "To: $Empfaenger\n"; print MAIL "From: $SenderMail $SenderName\n"; print MAIL "Subject: $MailSubject\n\n"; $i = 0; $max = $#Formular; for($i=0;$i<=$max;$i=$i+2) { print MAIL "$Formular[$i]: $Formular[$i+1]\n"; } close(MAIL); |
Der obige Perl-Code öffnet im weiteren Verlauf die Programmdatei des Mail-Servers. Die Option -t bei der open-Funktion bezieht sich auf das angenommene Programm sendmail. Wenn Sie ein anderes Programm benutzen oder benutzen müssen, erkundigen Sie sich, wie man dieses Programm mit auszuliefernden Mail-Daten aufrufen kann!
Wenn das Programm nicht geöffnet werden kann, wird das obige Perl-Script mit die kommentarlos beendet. An dieser Stelle könnten Sie eine Fehlerbehandlung einbauen.
Mit den print-Befehlen schreibt das Script die ihm bekannten Daten in den Mailheader. Jede Internet-E-Mail hat ein einheitliches Format. Im Kopf der Mail stehen diverse Angaben. Einige davon werden erst im Verlauf der Reise zum Empfänger gesetzt.
Innerhalb der for-Schleife werden die einzelnen Formulardaten in die E-Mail geschrieben. Feldnamen und Feldinhalte des ausgefüllten Formulars werden durch Doppelpunkt voneinander getrennt.
print "Content-type: text/html\n\n"; print "<html>\n"; print "<head>\n"; print "<title>Danke!</title>\n"; print "</head>\n"; print "<body bgcolor=#FFFFFF text=#000000 link=#009900 vlink=006600 alink=#0000FF>\n"; print "<h1>Danke</h1>\n"; print "Wir freuen uns, daß Sie unser Formular ausgefüllt \n"; print "haben. Hier zur Kontrolle Ihre Angaben:<p>\n"; for($i=0;$i<=$max;$i=$i+2) { print "<b>$Formular[$i]:</b> $Formular[$i+1]<br>\n"; } print "<p><hr noshade size=1><p>"; print "<i>Ihr Name, <a href=\"mailto:IhrName\@Provider.xx\">IhrName\@Provider.xx</a></i>"; print "</body>\n"; print "</html>\n"; |
Wichtig ist dabei zunächst die erste Anweisung. Sie lautet stets print "Content-type: text/html\n\n";. Das ist noch kein HTML-Code. Der WWW-Browser, der den Code empfängt, erwartet zunächst einen HTTP-Header. Dieser Header muß zumindest Informationen darüber enthalten, welche Art von Daten folgen. Mit dieser Anweisung teilen Sie dem Browser mit, daß HTML-Code folgt. Unbedingt wichtig sind dabei auch die beiden \n\n am Ende!
Danach werden mit print die üblichen Befehle zum Aufbau einer HTML-Datei notiert. Besondere Beachtung verdient die for-Schleife in der Mitte des Beispiel-Codes. Dort werden die Inhalte der Liste @Formular (siehe weiter oben) HTML-formatiert ausgegeben. Diese Möglichkeit, Variableninhalte direkt in den auszugebenden HTML-Code einzubinden, ist der Grund, warum CGI häufig auch als "dynamisches HTML" bezeichnet wird.
Schließlich sollten Sie noch die HTML-Ausgabe des mailto-Befehls im unteren Teil des Beispiel-Codes beachten. Wenn Sie HTML-Tags mit Angaben ausgeben wollen, die in Anführungszeichen stehen müssen, so wie die href-Angabe, dann müssen Sie die Anführungszeichen mit einem umgekehrten Schrägstrich maskieren. Sonst würde der Perl-Interpreter einen Fehler melden. Ebenfalls maskieren müssen Sie auf die gleiche Weise das E-Mail-Zeichen @, da dieses Zeichen in einer print-Funktion von Perl andernfalls als Name einer auszugebenden Liste interpretiert würde.
Blättern: | |||
Mit Zahlen und Zeit arbeiten | WWW-gerechte Grafiken |
HTML-Dateien selbst erstellen | |||
Dokumentation: CGI/Perl | |||
CGI und Perl: Perl Sprachelemente |
© 1997 Stefan Münz, s.muenz@euromail.com