AMIGA-Magazin · Ausgabe 10/02 · Praxis: PHP-Scripte

Aktuelles Heft 10/02

PHP als Mailsender

Formulare im Internet eignen sich für viele verschiedene Dinge. Auch als Kontakt- oder Anforderungsformular werden sie verwendet. Eine ganz einfache Möglichkeit besteht im Versand der Formulardaten per E-Mail.

von Michael Christoph

Wer ein Formular mit dem »mailto:«-Kommado verschicken will, stößt schnell auf Probleme. Nicht alle Browser unterstützen das direkte Versenden von E-Mails ­ z.B. verschiedene Versionen des Internet Explorers von Microsoft. Außerdem können nicht alle Browser mit der Kodierungsanweisung umgehen. Das führt dazu, dass eine einzige, URL-kodierte Zeile in der Mail ankommt, was natürlich recht schwer zu lesen ist. Es gibt aber auch Fälle, in denen eine leere Mail den Empfänger bei Versenden per »mailto:«-Kommado erreichte. Mit PHP kann man das Problem aber lösen und das sehr flexibel.


Ein Formular muss her

Wir werden hier nicht näher auf PHP selber eingehen, dazu gab es im Amiga Magazin verschiedene Artikel. Wer PHP auf seinem eigenem Amiga testen möchte, muss zuerst Apache einrichten, damit dieser als Webserver fungiert. Dieser ist in der Regel auch bereits für das aktuelle PHP4 konfiguriert. Ein ausführlicher Bericht zur Einrichtung von Apache, PHP und der Datenbank »mySQL« finden im Amiga-Magazin 8/2001.

Erstes Formular:
Der PHP-Sourcecode für das Versenden einer Mail per PHP im Editor.

Da PHP HTML-Code flexibel erzeugen kann, wollen wir keine starre HTML-Seite erstellen, sondern die Seite auch dynamisch generieren. Das mag auf den ersten Blick keinen Vorteil bieten, später kann man das Skript aber flexibel einsetzen. Die eigentlichen Vorteile dieser Methode ergeben sich erst, wenn die Formulare, z.B. aus einer Datenbank, generiert werden. Ein Beispiel: verschiedene Anforderungsseiten für Produkte/Informationen. Die Anforderungsprozedur und Formularfelder sind immer die selben, lediglich das Produkt ändert sich und eventuell der Empfänger der Bestellung.

Zur Ausgabe von HTML-Code stellt PHP die Befehle echo und printf zur Verfügung. Während der erste nur den angebenen Text wiedergibt, kann der zweite (wie von C bekannt) Formatierungsangaben enthalten. Beide erzeugen keinen Zeilenvorschub. Wer später den erzeugten HTML-Code ansehen möchte (z.B., um Fehler zu finden), sollte jede HTML-Zeile mit einem Zeilenvorschub (Escape-Sequenz \n) versehen. Der Zeilenumbruch dient ausschließlich dazu, den Quelltext für den HTML-Browser mehrzeilig zu verfassen. Eine neue Zeile in der Browseranzeige wird nur bei einer <br> Anweisung begonnen. Im Fehlerfall zeigt der Browser lediglich einen kurzen Hinweistext mit Zeilennummer an. Anhand dieser Meldung kann man nach fehlerhafter Syntax suchen.
In Listing 1 sehen Sie, dass man auch HTML-Anweisungen und PHP-Code beliebig mischen kann. Wichtig ist nur, dass der PHP-Code durch <?php und ?> eingeschlossen wird. Wie gesagt, könnte bei unserem Beispiel auch alles direkt in HTML-Anweisungen, ohne eine einzige Zeile PHP-Code, geschrieben werden.

Der Formularmailer
Speichern Sie das Listing 1 unter dem Namen formmail1.php im Root-Verzeichnis für die Webdokumente ab. Im Browser rufen Sie die Seite mit http:// <URL>/form.php auf. Bei einem lokal installierten Webserver (z.B. Apache) geht das so:

http://localhost/form.php

Lesetipp

»Go to PHP 4« verspricht auf dem Cover, Arbeitsbuch und Refernz zu sein. Nach der Lektüre soll man in der Lage sein, Internet-Inhalte dynamisch in Szene setzen. Die ersten 113 Seiten »Basics« bilden den ersten Block und führen in die Sprache ein. Anhand kleiner Programmschnipsel wird der Umgang mit PHP im HTML-Code gezeigt. Weiter geht es mit der Vorstellung der Datentypen, Ausdrücke, Operatoren, Arrays, Bedingungen, Schleifen und mathematischen Funktionen. Die Kapitel werden mit einzelnen Übungen abgeschlossen, um den Wissensstand zu kontrollieren.

Im zweiten Block mit 362 Seiten, als »going professional« bezeichnet, wendet sich der Autor den Themen Cookies, Sessions, reguläre Ausdrücke, Datenbanken (mySQL), dynamische Grafiken, FTP, Mail-Clients und XML zu. Ohne viel Schnickschnack kommt der Autor sofort auf den Punkt und zeigt die einzelnen Funktionen (teilweise auch in kombinierten Beispielen) in ihrer Anwendung.
Der dritte Teil stellt mit seinen 49 Seiten eine wirklich kompakte »Referenz« für das schnelle Nachschlagen dar.
Das Buch beleuchtet ein breites Spektrum zum Thema PHP. Abgerundet wird das Ganze durch die beiliegende CD, auf der die Buchbeispiele zu finden sind. Die weiteren Dateien und Programme der 285 MByte umfassenden CD sind leider nur für Windows-Anwender interessant. Zu finden sind Apache, PHP und mySQL, deren Installation auch im Buch gezeigt wird. Allerdings fast ausschließlich auf Windows basierend und daher nur mit geringem Informationsgehalt für den Amiga-Anwender. Außer der an einigen Stellen zu einseitigen Windows-bezogenen Sicht, beschreibt der Autor die Themen sehr übersichtlich und leicht verständlich. Programmierneulinge könnten Probleme haben, die Materie zu verstehen, da das Buch hier ein wenig Vorwissen voraussetzt. Wer aber bereits Erfahrungen in der Programmierung hat, findet mit diesem Buch einen sehr schnellen Weg in die Benutzung von PHP.

Informationen: Go to PHP 4,
Dirk Ammelburger,
Addison-Wesley Verlag,
ISBN 3827317592,
Preis: 39,95 Euro,
http://www.addison-wesley.de

Beim Klick auf den Absenden-Button passiert etwas Unerwartetes: Das Namensfeld wird geleert, und trotzdem ist alles scheinbar korrekt. Wird der Absenden-Knopf gedrückt, wertet der Browser die FORM-Anweisung aus und findet dort unter ACTION eine Datei, die er aufruft und die Formulardaten mitgibt. Im Beispiel handelt sich um unsere eigene Datei (das Formular) ­ diese wird wieder aufgerufen. In der Praxis sollte aber eine HTML-Seite mit der Antwort gesendet werden, die der Browser anzeigt. Eine andere Variante: Die Formularseite wird erneut aufgerufen und zeigt die Anwort automatisch an. Was uns noch fehlt, ist also die Weiterverarbeitung der Formulardaten und die entsprechende Reaktion.

Über empty() wird festgestellt, ob die Variable gefüllt ist oder nicht. Wird die Datei nun vom Browser zum ersten Mal abgefragt, gibt es die Variable gar nicht. Erst wenn der Benutzer den Abschicken-Knopf verwendet, füllt PHP für uns automatisch die folgenden drei Variablen: $name, $email und $subject (entspricht dem Namen aus dem Formular). Während die ersten beiden auch leer sein können, wenn vom Benutzer nichts im Formular eingetippt wurde, ist die dritte Variable auf alle Fälle vorhanden. Sie dient uns daher als Unterscheidung, ob nur das Formular angezeigt werden soll oder ob die Formulareingaben durch das Skript verarbeitet werden müssen.

Mailen in PHP
Neu ist in Listing 2 auch die mail()-Funktion. Wie der Name schon vermuten lässt, lassen sich damit Mails versenden ­ eine korrekt installierte PHP-Umgebung vorausgesetzt. Erkundigen Sie sich bei Ihrem ISP und lassen Sie das Setup des Servers entprechend ändern. Die Syntax für mail() lautet:
mail($empfaenger,$titel,
Â$text);


Die Parameter für die mail()-Funktion haben folgende Bedeutung:
$empfaenger: E-Mail-Adresse des Empfängers, z.B. formular@localhost. $titel: Subject-Zeile der Mail (z.B. »Formularanforderung« oder »Anfrage«).
$text:
Inhalt der Mail. Beim unserem Formular sollte es nur Text sein. Eventuelle Attachments bei anderen Formularen müssen entsprechend kodiert und an den Text angehangen werden. Auf dieses Thema wollen wir aber an dieser Stelle nicht eingehen.

Was in unserem Fall noch nicht so wichtig ist, aber trotzdem nicht außer Acht gelassen werden sollte, ist, die Gültigkeit der Eingabewerte festzustellen. Wo immer die Daten von Hand eingegeben werden, können durch Unachtsamkeit oder auch Absicht fehlerhafte Eingaben erfolgen. Man kann zwar in vielen Fällen gar nicht feststellen, was gültige Eingaben sind, aber man kann etwa bei E-Mail-Adressen zumindest auf diekorrekte Syntax achten: Text, dann ein AT-Zeichen gefolgt von mindestens drei Zeichen Internetadesse und abschließend, mit Punkt getrennt, eine Domain-Kennung. Eine entsprechende Testroutine finden Sie im Amiga Magazin 10/2001 oder auf unserer Webseite. In diesem Beispiel wird die Richtigkeit der E-Mail-Adresse mit Hilfe von regular Expressions getestet.

In anderen Fällen kann man prüfen, ob das Feld einen Inhalt aufweist oder leer gelassen wurde. Diese Angaben können nun einerseits direkt im Browser per Java-Script überprüft werden. Da aber nicht jeder Browser den JavaScript Code ausführt (z.B. IBrowse auf dem Amiga), ist eine Überprüfung der Daten direkt im PHP Code vorzuziehen.

Der else-Zweig der Routine muss erweitert werden, wie in Listing 3 zu sehen.


Mehr Komfort durch Konfigurierbarkeit
Der Formularmailer funktioniert jetzt schon recht gut. Er hat allerdings einen kleinen Schönheitsfehler: Die Mails gehen bis jetzt immer an den Schreiber. Beabsichtigt ist aber ein Anforderungs-Mailer, der die eingegebenen Daten an einen speziellen Empfänger weitermailt. Je nach Anforderung kann die E-Mail evtl. an unterschiedliche Empfänger gesendet werden. Deshalb darf die E-Mail-Adresse nicht im PHP-Code festgelegt werden. Sie wird je nach Anforderung dynamisch verwendet.

Ergebnis:
Das entworfene E-Mail-Formular, wie es vom Webbrawser dargestellt wird.

Um die Sache noch zu verfeinern, wird das Formular für verschiedene Anforderungen durch das Skript angepasst. Das bedeutet auch: Das Forumlar muss nicht immer identisch aussehen und kann auch unterschiedliche Eingabefelder haben. An dieser Stelle kann man sehr flexible Skripte schreiben. Deswegen dürfen auch die Formulardaten selber nicht mehr direkt über die Variablen abgefragt werden. Dadurch kann auch das Formular nicht mehr automatisch generiert werden, sondern muss als ganz reguläre HTML-Datei auf dem Server vorliegen.

Für die frei wählbare Empfängeradresse gibt es eine ganz einfache Lösung: versteckte Formularfelder. Diese erden als Typ hidden definiert und erhalten per VALUE die gewünschte Belegung. Eine weitere Möglichkeit: Je nach Anforderung weist das Skript bei der Auswertung die passende Adresse der Empfänger-Variablen automatisch zu.

Aber auch für die variable Anzahl der Formularfelder gibt es eine Lösung. Je nach der Formular-Versandmethode (METHOD) werden alle Felder in $HTTP_POST-_VARS oder $HTTP_GET_-VARS gefüllt. Da wir die Methode METHOD=POST verwenden, stehen die Werte in der ersten Variablen. Die Post-Methode hat auch noch den Vorteil, dass in der URL-Zeile des Browsers die Argumente nicht auftauchen und somit auch nicht vom Benutzer manipuliert werden können (wie es bei GET der Fall wäre). Solange Sie testen, ist es empfehlenswert, die GET-Methode zu verwenden. Dann sehen Sie in der URL-Leiste des Webbrowsers die Werte für die übergebenen Variablen und können diese besser kontrollieren. Funktioniert der Skript, wechseln Sie einfach die Methode.

In der Variablen sind die Einträge im Syntax Feldbezeichner=Wert enthalten und durch ein kaufmänisches Und (&) voneinander getrennt. Natürlich bietet PHP auch Kommandos zur Aufsplittung dieses Strings in assoziative Arrays ­ ein Beispiel zur Aufsplittung sehen Sie in Listing 4.

Durch foreach wird jedes Wertepaar durchlaufen und auch gleich noch aufgesplittet. Dabei entstehen $key für den Feldbezeichner und $arg für die Benutzereingabe. Als Nächstes wird noch auf die beiden Hidden-Variablen geprüft, über die der Empfänger und auch der Titel (Subject) der Mail festgelegt werden kann. Alles andere (das Absenden-Feld) wird als fortlaufender Text aufbereitet. Dabei gibt es eine Ausnahme ­ die Variable ok. Sie zeigt, ob das Formular gesendet wurde.

Die Daten werden jetzt zusammengefasst, und per mail()-Funktion erfolgt wieder der Versand. Zum Abschluss gibt das Skript Rückmeldung für den Nutzer in HTML aus, dass die Anfrage korrekt verarbeitet wurde.

Damit hätten wir jetzt unser gestecktes Ziel erreicht: einen universell einsetzbaren Formularmailer. Das Beispiel soll auch zum Experimentieren einladen. Sie können neben verschiedenen Formularen und Empfängeradressen auch das Design für das Formular verändern. Das gilt auch für die Anwortseite. Hier gibt es viele Möglichkeiten, ein Webforumlar flexibel per PHP-Skript zu gestalten und die Routine immer wieder für andere Webprojekte einzusetzen.

lb


Hauptseite © 2002 All Rights Reserved. Alle Rechte vorbehalten Franzis' Verlag GmbH
Veröffentlichung und Vervielfältigung nur mit schriftlicher Genehmigung des Verlags

Kommentare, Fragen, Korrekturen und Kritik bitte an Webmaster AMIGA schicken.
Zuletzt aktualisiert am 1. 9. 2002.