Photoshop
Cinema 4d
HTML / CSS
JavaScript
PHP
Flash
Fotografie
Terragen
Webserver
Informatik
Sonstige
eMail-Formular (Php Tutorial)
Tutorial erstellt von wal, letzte Änderung am 04.07.2007
Hiermit möchte ich auch mal einen kleinen Beitrag leisten für das www.der-webdesigner.net - Board.
Da ich noch nicht so fit mit Cinema 4D bin, halte ich mich noch etwas an den anderen Bereiche!! ;)
Hier schnell noch bevor es losgeht ein paar Begrifflichkeiten, damit wir immer von den gleichen Dingen in diesem Dokument sprechen:
HTML Seite codeschnipsel_email.htm
PHP Seite codeschnipsel_email.php
Funktion z.B. isset(...)
Bedingung if (...) {...}
Formular Inhalt der HTML-Seite – alle Felder (z.B.: Vorname, Name, etc.)
Formularfelder Einzelnes Feld in der HTML Seite (z.B. Durchwahl etc.)
Das ganz ist aus einem sehr viel größeren Projekt stammend. Ich habe vor einiger Zeit mal eine auf Basis PHP im Intranet angesiedelte Applikation stricken müssen, welche es ermöglicht Probleme oder auftretende Fehler von Benutzern im Unternehmen, der IT-Abteilung mitzuteilen.
Dies bedeutet, der Benutzer stellt einen Fehler fest , z.B. sein Word funktioniert nicht mehr. Daraufhin geht dieser Benutzer in das Intranet, ruft diese Seite auf (z.B. codeschnipsel_email.php) und füllt dann die Felder aus und schickt dieses Formular per klicken auf „Absenden“ dann weg. Der Empfänger wurde fest eingetragen und war die IT Abteilung. Soviel erstenmal zur entstehen und Benutzung dieses Formulares.
Vielleicht noch wichtig zu erwähnen, dass es sich hierbei um ein sehr großen Formular handelte und ich es sehr stark verkürzt habe, aber um die wichtigsten Inhalte beizubehalten.
Als erstes habe ich ein Formular (codeschnipsel_email.htm) erstellt, dies dient rein zur Eingabe der benötigten Daten. Schliesslich möchten wir ja keine leere Mail versenden, da hilft auch kein Ausdrucken und über die Lampe halten und hoffen, dass das leere Blatt dann eine Zauberschrift anzeigt *g*.

Als nächstes habe ich das Script (codeschnipsel_email.php) erstellt. Dies dient sozusagen als Steuerungsscript. Das bedeutet, es wird immer das php-script aufgerufen, dieses liest die htm-Seite ein und gibt sie aus. Nach einem Button-Klick werden die Werte an das php-script zurückgegeben und ausgewertet.
Wichtig dabei ist, das der Server so konfiguriert und eingestellt ist, das diese Mails versenden kann!
1. Aufrufen von http:// ... /codeschnipsel_mail.php
2. Es wird die HTM-Seite durchgereicht und angezeigt
3. Ausfüllen der Formularfelder
4. Absende-Button klicken und auf Mail warten! ;)
Was noch getätigt werden sollte, ist natürlich mindestens die Anpassung des Empfängers.
Viel Spass dabei ... wenn Fragen sind bitte in das entsprechende Forum posten!
Mainbereich
==================== Dieser Bereich ist der Main Bereich ======================
Die Variable $done wurde eingefügt, um die Anzeige der HTML Seite steuern zu können.
Sie wird zuerst auf false gesetzt, dann wird in den folgenden Zeilen überprüft, ob $done auch false beinhaltet, dies passiert mittels der if Abfrage – if(!$done). Beachte hierbei bitte das „!“, denn dies sorgt für die Abfrage die so gesprochen ausschaut: „Ist der Inhalt von $done false oder nicht?“. Wenn ich nun die php Seite aufrufe, wird der Wert false in die Variable $done geschrieben. Mit dieser Variable wird verhindert, das die unten stehende Bedingung (if(!$done)) nicht immer ausgeführt wird, da in den vohergehenden Bedingungen der Wert der Variable $done auf true gesetzt wird. Hintergrund dieser Aktion ist, sonst wurde jedes Mal bei Scriptdurchlauf die Funktion displayStart(); aufgerufen werden und das wollen wir ja nur zu beginn einmal.
Probiert es einfach mal aus, indem ihr die Variable $done=true überall auskommentiert.
Code:
Diese Bedingung sorgt dafür, das wenn der Button “Zurücksetzen” in der HTML Seite gedrückt wurde, diese neu angezeigt wird und die Felder wieder im leeren Zustand erscheinen. Könnte auch über reset direkt in der HTML Seite abgehandelt werden, aber ich möchte dies ja alles euch per PHP zeigen.
Aber da ich das nun mal angeschnitten habe anbei beide Versionen zum Vergleich.
HMTL-Version:
Code:
PHP-Version:
Code:
Die Funktion isset($POST[„delete“]) überprüft, ob der Button beim versenden des Formulares Zurücksetzen angeklickt wurde.
P.S.: Würde ich nun hierbei die Variable $done=true auskommentieren, dann würde die Funktion displayStart(); zweimal ausgeführt werden. (siehe hierzu in den folgenden Quellcodes
*a* und
*b*)
Code:
In dieser Bedingung wird abgefragt, ob der Absende Button in der HTML Seite gedrückt wurde. Wenn dieser gedrückt wurde, dann wird die Funktion sendMail() aufgerufen. Auch hier wird dann wieder die Variable $done auf true gesetzt, damit die danach kommende Bedingung (if(!done) {displayStart() ...}) nicht wieder ausgeführt wird.
Code:
Die letzte der drei Bedingungen sorgt dafür, das am Anfang beim Aufrufen des PHP Scripts die Funktion displayStart() aufgerufen wird, die dann auch die HTML Seite anzeigt. Auch hier setze wieder die Variable $done auf true, sollten weitere Bedingungen folgen, werden diese dann ebenfalls nicht mehr ausgeführt ist sozusagen bereits eine Vorkehrung ;)
Code:
==================== Ende Main Bereich ======================
Funktionsbereich
=================== Dieser Bereich ist der Funktionsbereich ===================
Funktion: displayStart
Wenn nun im Main Bereich die Funktion displayStart() aufgerufen wird, wird die unten stehende Funktion ausgeführt. Diese macht nicht anderes, als die HTML Seite einlesen und komplett wie sie ist wieder ausgeben. Doch schauen wir uns die gesamte Funktion mal etwas genauer an:
Code:
Die Funktion an sich wird in PHP immer so geschrieben, damit der PHP Interpreter dies auch versteht: function name(){ … was soll hier passieren ... }. Bitte unbedingt die geschweifte Klammer auch wieder schliessen!
Code:
Kommen wir nun zu den “Innereien” der Funktion.
Die Variable $fileName bekommt mittels dem „=“ den Inhalt der aufzurufenden Date zugeweisen, also codesnipsel_email.htm. Denn diese Seite möchten wir beim Starten der PHP Seite ja auch sehen.
Code:
In der nächsten Zeile erzeugen wir einen Dateizeiger $fp, der als Inhalt die zu öffnende Datei und auch den Modus erhält, wie die Datei geöffnet werden soll, hier zum Lesen „r“ und vom Anfang der Datei „b“. Die Funktion fopen($fileName,“rb“) öffnet nun die Datei codesnipsel_email.htm, dies steht ja in $fileName drinnen und zwar mit dem Modus lesen von Anfang an. Die Funktion fopen() benötigt nämlich zur Ausführung zwei Parameter, den Namen der zu öffnenden Datei (hier: Inhalt von $fileName) und wie die Datei geöffnet werden soll – lesen von Anfang an „rb“.
Code:
Die nächste Funktion lautet: fpassthru(). Sie bekommt den Dateizeiger $fp übergeben und weiss damit genau welche Datei angezeigt werden muss. Sie liest die gesamte Datei nun von Anfang an bis zum Ende (EOF – End Of File) und schreibt diese gelesenen Daten dann in den Ausgabepuffer – zeigt sie also an. Somit können wir festhalten, fopen bereitet die Datei zum Lesen vor, öffnet diese also, damit fpassthru diese Datei dann lesen und ausgeben kann.
Code:
In der nächsten Zeile steht nun eine weitere Funktion: fclose(). Jede geöffnete Datei muss auch wieder geschlossen werden, sonst besteht die Gefahr von Datenverlust oder der Webserver gerät am Ende durcheinander. Daher übergeben wir der Funktion wieder den Dateizeiger, damit die Funktion erkennen kann welche Datei wieder geschlossen werden muss. Bitte beachten, die fclose()-Funktion benötigt dazu den Dateizeiger und nicht den Dateinamen!! Das ist so in etwas wer A sagt, muss auch B sagen – also wer die Tür öffnet sollte sie auch wieder schliessen!
Code:
Funktion: sendMail
Wenden wir uns nun der Funktion sendMail zu. Dies ist ja die eigentliche Funktion, auf die ich hinausmöchte! :)
Wie bereits vorher besprochen steht hier die Funktion – bzw. der Anfang!
Code:
Hier mal etwas Kniffeliges! Nachdem die Anwendung doch immer komplexer wurde und es immer mehr Anwendungen gab, die zu Problemen geführt haben – so ca. 100 inklusive diverser Fehlermeldungen war ich an einem Punkt angelangt, an dem ich nicht jedes Feld einzeln abfragen und in die Mail setzen wollte – es sollte automatisch funktionieren. Daher bin ich auf die Idee mit einem Array gekommen. Dort werden alle Formularfelder eingetragen, die benötigt werden. Somit habe ich dann die Möglichkeiten über Schleifenaufrufe auf alle Felder zugreifen zu können ohne mich nochmals damit groß kümmern zu müssen. Dies bedeutet: Eine Schleife und alle Daten werden automatisch in den Textköper der Mail geschrieben und ich muss nicht für des Formularfeld einen Eintrag per Hand dann in den Köper der Mail „bucksieren“.
Eventuell ist es bei den paar Feldern hier übertrieben, doch bei mehreren macht es durchaus – in meinen Augen – sehr viel Sinn! Ausserdem war mein Ansporn bei dieser Datei/Funktion euch auch die Möglichkeiten bei größerem Umfang dieses aufzuzeigen.
Somit erstelle ich nun zu Beginn in dieser Funktion zwei Arrays. Das eine enthält die Daten zur Person $mailfields_Daten_Verfasser, das andere die Information oder Mitteilung $mailfields_Daten. Wie gesagt, es gibt bei mir hunderte diverser Informationen!
Anlegen eines Arrays:
Ein Array wird wie folgt angelegt Name = array (Inhalt).
Der Name gibt den Arraynamen an und der Inhalt sind die einzelnen Felder die darin gespeichert werden sollen.
Somit ergibt sich für unser Beispiel folgendes:
Name des Arrays = $mailfields_Daten_Verfasser
Inhalt = vorname, nachname, domain, durchwahl (ist euch bestimmt schon aufgefallen, aber ich sage es sicherheitshalber auch, es handelt sich exakt um die Namensgebung der Formularfelder in der HTML-Seite; dies ist ein MUSS!)
Code:
Was habe ich damit gewonnen?
Nun habe ich über mein Array die Möglichkeit mittels einer Schleife auf die Felder zuzugreifen und die Daten rauszulesen:
Bsp.:
Echo $_REQUEST[$mailfields_Daten_Verfasser[0]]; würde mir den Vornamen ausgeben
Echo $_REQUEST[$mailfields_Daten_Verfasser[1]]; würde mir den Nachnamen ausgeben
... etc.
Ich müsste also für jede Ausgabe eine Zeile schreiben, doch mit:
for ($i=0; $i<sizeof($mailfields_Daten_Verfasser); $i++) {
Echo $_REQUEST[$mailfields_Daten_Verfasser[$i]];
}
... könnte ich nun beliebig viele Zeilen ausgeben und habe nur 3 Zeilen Code geschrieben, egal ob nun 20, 40 oder 10000 ausgebeben werden müssten! Einzig man muss den exakten Namen der Formularfelder in das Array eintragen.
Nun setzen wir erst mal den Sender der Mail zusammen, dies ist die Person, die das Formular ausfüllt!
Mit $_POST["vorname"] holen wir uns den Inhalt aus dem Formularfeld der HTML Seite. Die Funktion trim(...), löscht alle versehentlich eingegeben Leerzeichen vor und nach dem eingetragenen Wort im Formularfeld. Mit „.“ bastel ich einen Punkt zwischen Vor- und Nachnamen und speichere alles in der Variablen $sender ab.
Code:
Beispiel: Wenn in dem Feld Vornamen nun Hinz stehen würde und im Feld Nachnamen Kunz, würde es wie folgt nun in $sender stehen:
Code:
Da dies ja noch keine Mailadresse ist, folgt nun auch der Domainnamen:
Code:
Da in Emailadressen keine Umlaute verwendet werden, müssen wir diese nun rausfiltern, dies passiert am einfachsten in dem alle Buchstaben in Kleinbuchstaben gewandelt werden:
Code:
Die Funktion strtolower(), liest nun die Variable $sender ein und setzt jedes Zeichen darin nun auf Kleinbuchstaben um: Ä ä, C c etc.
Nun erstelle ich zwei weitere Arrays:
Array("ü","ö","ä","ß","è","é","'") und Array("ue","oe","ae","ss","e","e",""). Das erste sucht die Umlaute und das zweite gibt an mit welchen es “Übersetzt“ werden soll. (Beispiel: ü wird zu ue, etc.)
Code:
Jetzt muss noch der Sender komplettiert werden um eine gültige Adresse zu erhalten (Beispiel: $sender=ruediger.muss@gehen.de):
Code:
Bitte beachtet den kleinen „.“ Zwischen dem $sender und dem „=“.
So, nun haben wir den Sender zusammengebaut, doch an wen soll die Mail gehen?
Lass uns nun den Empfänger erzeugen. Normalerweise solle eine Mail von einem Formular an eine bestimmt Adresse gehen, also kann die Andresse direkt in das Skript eingebaut werden:
Code:
Bsp.: $empfaenger=Ruediger.darf@bleiben.de;
Auch bringt das Versenden einer Mail ohne Inhalt recht wenig! ;)
Darum erstellen wir auch gleich einen Textkörper. Dieses Teiler wir dann der Übersichtlichkeit noch in zwei bereiche auf, einen für die persönlichen Daten des Senders und einen für den Textbereich:
Wir benutzen eine weitere Variable für den gesamten Mailinhalt $s_Message, auch hierbei bitte wieder immer den kleinen Punkt für dem „=“ beachten!
Zwei Leerzeilen in der Mail schaffen mittels .chr(10):
Code:
Für die optische Trennung (Persönliche Daten, Textbereich) des Textes in der Mail erstellen wir eine weitere Zeile:
Code:
Jetzt isses soweit, der Einsatz des am Anfang der Funktion angelegten Arrays kommt nun dran. Der 3-Zeiler, der uns alle persönlichen Daten aus den Formularfelder liefert:
Code:
Bemerkungen:
substr($mailfields_Daten_Verfasser[$i] liefert uns das im Array eingetragene Wort, z.B. vorname, oder nachname etc.
$_POST[$mailfields_Daten_Verfasser[$i]] liefert uns den Inhalt des Formularfeldes, z.B. vorname = Rüdiger, etc.
Erneut ein Leerzeichen, damit auch alles sehr übersichtlich bleibt ;)
Code:
Auch eine räumliche Trennung für das Auge sollte nicht fehlen:
Code:
Nun kommt … juchuuu … das zweite oben erstellte Array zum Tragen, $mailfields_Daten:
Code:
Das Auslesen der Daten ist exakt der gleiche Vorgang wie bei der Schleife zuvor.
Noch etwas am Betreff rumschrauben, damit der Empfänger auch gleich erkennen kann worum es geht:
Code:
Die Funktion date("d.m.Y") liefert dabei nur das aktuelle Datum, also 10.08.2005.
In die Variable $headers schreiben wir nun den Sender rein:
Code:
… und ab die POST! ;)
Code:
Wir haben gelernt, wie es möglich ist Emails per PHP zu versenden, wie man Daten aus einer HTML Seite in PHP einliest, wie Dateien mittels PHP angezeigt werden können, wie Funktionen aufgerufen werden und wie es möglich ist, Code von PHP getrennt von HTML-Code zu lagern. Ich hoffe es hat euch etwas gefallen und war nicht zu sehr auf Programmtechnischer Schiene erklärt – aber bei diesen Themen ist es oft nicht so einfach alles 100% für jeden zu erklären, aber ich hab’s ehrlich probiert!! ;)
Ich hoffe auch, der Einsatz von Arrays kam nicht zu kurz und dadurch ein Überblick, wie man innerhalb eines Strings Zeichen umwandeln kann.
Auch kann einiges bestimmt einfacher erstellt werden, aber wenn die Applikation dann doch wächst, ist etwas mehr Energie beim Erzeugen zu Beginn doch sehr nützlich und bietet später mehr Flexibilität für Erweiterungen. Auch kann es im privatem Bereich von Interesse sein, eventuell in die HTML Seite ein Formularfeld Emailadresse einzubauen, dann spart mach sich das zusammensetzen und würde es ist wie folgt bequem auszulesen: $sender=trim($_REQUEST[‚adresse’]);
Hier gibts nun beide Dateien, die htm und die php-Datei, zum Download http://www.der-webdesigner.net/tutorials/php_anwendungen/emailformular/quellcode_email.zip
>> Allgemeine Fragen oder Probleme mit dem Tutorial? Hier gehts zum Forum!
Da ich noch nicht so fit mit Cinema 4D bin, halte ich mich noch etwas an den anderen Bereiche!! ;)
1) Begrifflichkeiten
Hier schnell noch bevor es losgeht ein paar Begrifflichkeiten, damit wir immer von den gleichen Dingen in diesem Dokument sprechen:
HTML Seite codeschnipsel_email.htm
PHP Seite codeschnipsel_email.php
Funktion z.B. isset(...)
Bedingung if (...) {...}
Formular Inhalt der HTML-Seite – alle Felder (z.B.: Vorname, Name, etc.)
Formularfelder Einzelnes Feld in der HTML Seite (z.B. Durchwahl etc.)
2) So, nun zu meinem Codesnipsel
Das ganz ist aus einem sehr viel größeren Projekt stammend. Ich habe vor einiger Zeit mal eine auf Basis PHP im Intranet angesiedelte Applikation stricken müssen, welche es ermöglicht Probleme oder auftretende Fehler von Benutzern im Unternehmen, der IT-Abteilung mitzuteilen.
Dies bedeutet, der Benutzer stellt einen Fehler fest , z.B. sein Word funktioniert nicht mehr. Daraufhin geht dieser Benutzer in das Intranet, ruft diese Seite auf (z.B. codeschnipsel_email.php) und füllt dann die Felder aus und schickt dieses Formular per klicken auf „Absenden“ dann weg. Der Empfänger wurde fest eingetragen und war die IT Abteilung. Soviel erstenmal zur entstehen und Benutzung dieses Formulares.
Vielleicht noch wichtig zu erwähnen, dass es sich hierbei um ein sehr großen Formular handelte und ich es sehr stark verkürzt habe, aber um die wichtigsten Inhalte beizubehalten.
3) Aufbau
Als erstes habe ich ein Formular (codeschnipsel_email.htm) erstellt, dies dient rein zur Eingabe der benötigten Daten. Schliesslich möchten wir ja keine leere Mail versenden, da hilft auch kein Ausdrucken und über die Lampe halten und hoffen, dass das leere Blatt dann eine Zauberschrift anzeigt *g*.

Als nächstes habe ich das Script (codeschnipsel_email.php) erstellt. Dies dient sozusagen als Steuerungsscript. Das bedeutet, es wird immer das php-script aufgerufen, dieses liest die htm-Seite ein und gibt sie aus. Nach einem Button-Klick werden die Werte an das php-script zurückgegeben und ausgewertet.
Wichtig dabei ist, das der Server so konfiguriert und eingestellt ist, das diese Mails versenden kann!
4) Der Ablauf sind dann wie folgt aus:
1. Aufrufen von http:// ... /codeschnipsel_mail.php
2. Es wird die HTM-Seite durchgereicht und angezeigt
3. Ausfüllen der Formularfelder
4. Absende-Button klicken und auf Mail warten! ;)
Was noch getätigt werden sollte, ist natürlich mindestens die Anpassung des Empfängers.
Viel Spass dabei ... wenn Fragen sind bitte in das entsprechende Forum posten!
5) Aber nun noch mal zu den einzelnen Bereichen im PHP-Script:
Mainbereich
==================== Dieser Bereich ist der Main Bereich ======================
Die Variable $done wurde eingefügt, um die Anzeige der HTML Seite steuern zu können.
Sie wird zuerst auf false gesetzt, dann wird in den folgenden Zeilen überprüft, ob $done auch false beinhaltet, dies passiert mittels der if Abfrage – if(!$done). Beachte hierbei bitte das „!“, denn dies sorgt für die Abfrage die so gesprochen ausschaut: „Ist der Inhalt von $done false oder nicht?“. Wenn ich nun die php Seite aufrufe, wird der Wert false in die Variable $done geschrieben. Mit dieser Variable wird verhindert, das die unten stehende Bedingung (if(!$done)) nicht immer ausgeführt wird, da in den vohergehenden Bedingungen der Wert der Variable $done auf true gesetzt wird. Hintergrund dieser Aktion ist, sonst wurde jedes Mal bei Scriptdurchlauf die Funktion displayStart(); aufgerufen werden und das wollen wir ja nur zu beginn einmal.
Probiert es einfach mal aus, indem ihr die Variable $done=true überall auskommentiert.
Code:
$done=false;
Diese Bedingung sorgt dafür, das wenn der Button “Zurücksetzen” in der HTML Seite gedrückt wurde, diese neu angezeigt wird und die Felder wieder im leeren Zustand erscheinen. Könnte auch über reset direkt in der HTML Seite abgehandelt werden, aber ich möchte dies ja alles euch per PHP zeigen.
Aber da ich das nun mal angeschnitten habe anbei beide Versionen zum Vergleich.
HMTL-Version:
Code:
<input type="reset" value="Zurücksetzen" name="delete">
PHP-Version:
Code:
<input type="submit" value="Zurücksetzen" name="delete">
Die Funktion isset($POST[„delete“]) überprüft, ob der Button beim versenden des Formulares Zurücksetzen angeklickt wurde.
P.S.: Würde ich nun hierbei die Variable $done=true auskommentieren, dann würde die Funktion displayStart(); zweimal ausgeführt werden. (siehe hierzu in den folgenden Quellcodes
*a* und
*b*)Code:
if (isset($_POST["delete"])) {
displayStart(); *a*
$done=true;
}
displayStart(); *a*
$done=true;
}
In dieser Bedingung wird abgefragt, ob der Absende Button in der HTML Seite gedrückt wurde. Wenn dieser gedrückt wurde, dann wird die Funktion sendMail() aufgerufen. Auch hier wird dann wieder die Variable $done auf true gesetzt, damit die danach kommende Bedingung (if(!done) {displayStart() ...}) nicht wieder ausgeführt wird.
Code:
if (!$done) {
if (isset($_POST["senden"])) {
sendMail();
$done=true;
}
}
if (isset($_POST["senden"])) {
sendMail();
$done=true;
}
}
Die letzte der drei Bedingungen sorgt dafür, das am Anfang beim Aufrufen des PHP Scripts die Funktion displayStart() aufgerufen wird, die dann auch die HTML Seite anzeigt. Auch hier setze wieder die Variable $done auf true, sollten weitere Bedingungen folgen, werden diese dann ebenfalls nicht mehr ausgeführt ist sozusagen bereits eine Vorkehrung ;)
Code:
if (!$done) {
displayStart(); *b*
$done=true;
}
displayStart(); *b*
$done=true;
}
==================== Ende Main Bereich ======================
Funktionsbereich
=================== Dieser Bereich ist der Funktionsbereich ===================
Funktion: displayStart
Wenn nun im Main Bereich die Funktion displayStart() aufgerufen wird, wird die unten stehende Funktion ausgeführt. Diese macht nicht anderes, als die HTML Seite einlesen und komplett wie sie ist wieder ausgeben. Doch schauen wir uns die gesamte Funktion mal etwas genauer an:
Code:
function displayStart() {
$fileName="codesnipsel_email.htm";
$fp=fopen($fileName,"rb");
fpassthru($fp);
fclose($fp);
}
$fileName="codesnipsel_email.htm";
$fp=fopen($fileName,"rb");
fpassthru($fp);
fclose($fp);
}
Die Funktion an sich wird in PHP immer so geschrieben, damit der PHP Interpreter dies auch versteht: function name(){ … was soll hier passieren ... }. Bitte unbedingt die geschweifte Klammer auch wieder schliessen!
Code:
function displayStart() {
…
}
…
}
Kommen wir nun zu den “Innereien” der Funktion.
Die Variable $fileName bekommt mittels dem „=“ den Inhalt der aufzurufenden Date zugeweisen, also codesnipsel_email.htm. Denn diese Seite möchten wir beim Starten der PHP Seite ja auch sehen.
Code:
$fileName="codesnipsel_email.htm";
In der nächsten Zeile erzeugen wir einen Dateizeiger $fp, der als Inhalt die zu öffnende Datei und auch den Modus erhält, wie die Datei geöffnet werden soll, hier zum Lesen „r“ und vom Anfang der Datei „b“. Die Funktion fopen($fileName,“rb“) öffnet nun die Datei codesnipsel_email.htm, dies steht ja in $fileName drinnen und zwar mit dem Modus lesen von Anfang an. Die Funktion fopen() benötigt nämlich zur Ausführung zwei Parameter, den Namen der zu öffnenden Datei (hier: Inhalt von $fileName) und wie die Datei geöffnet werden soll – lesen von Anfang an „rb“.
Code:
$fp=fopen($fileName,"rb");
Die nächste Funktion lautet: fpassthru(). Sie bekommt den Dateizeiger $fp übergeben und weiss damit genau welche Datei angezeigt werden muss. Sie liest die gesamte Datei nun von Anfang an bis zum Ende (EOF – End Of File) und schreibt diese gelesenen Daten dann in den Ausgabepuffer – zeigt sie also an. Somit können wir festhalten, fopen bereitet die Datei zum Lesen vor, öffnet diese also, damit fpassthru diese Datei dann lesen und ausgeben kann.
Code:
fpassthru($fp);
In der nächsten Zeile steht nun eine weitere Funktion: fclose(). Jede geöffnete Datei muss auch wieder geschlossen werden, sonst besteht die Gefahr von Datenverlust oder der Webserver gerät am Ende durcheinander. Daher übergeben wir der Funktion wieder den Dateizeiger, damit die Funktion erkennen kann welche Datei wieder geschlossen werden muss. Bitte beachten, die fclose()-Funktion benötigt dazu den Dateizeiger und nicht den Dateinamen!! Das ist so in etwas wer A sagt, muss auch B sagen – also wer die Tür öffnet sollte sie auch wieder schliessen!
Code:
fclose($fp);
Funktion: sendMail
Wenden wir uns nun der Funktion sendMail zu. Dies ist ja die eigentliche Funktion, auf die ich hinausmöchte! :)
Wie bereits vorher besprochen steht hier die Funktion – bzw. der Anfang!
Code:
function sendMail(){ }
Hier mal etwas Kniffeliges! Nachdem die Anwendung doch immer komplexer wurde und es immer mehr Anwendungen gab, die zu Problemen geführt haben – so ca. 100 inklusive diverser Fehlermeldungen war ich an einem Punkt angelangt, an dem ich nicht jedes Feld einzeln abfragen und in die Mail setzen wollte – es sollte automatisch funktionieren. Daher bin ich auf die Idee mit einem Array gekommen. Dort werden alle Formularfelder eingetragen, die benötigt werden. Somit habe ich dann die Möglichkeiten über Schleifenaufrufe auf alle Felder zugreifen zu können ohne mich nochmals damit groß kümmern zu müssen. Dies bedeutet: Eine Schleife und alle Daten werden automatisch in den Textköper der Mail geschrieben und ich muss nicht für des Formularfeld einen Eintrag per Hand dann in den Köper der Mail „bucksieren“.
Eventuell ist es bei den paar Feldern hier übertrieben, doch bei mehreren macht es durchaus – in meinen Augen – sehr viel Sinn! Ausserdem war mein Ansporn bei dieser Datei/Funktion euch auch die Möglichkeiten bei größerem Umfang dieses aufzuzeigen.
Somit erstelle ich nun zu Beginn in dieser Funktion zwei Arrays. Das eine enthält die Daten zur Person $mailfields_Daten_Verfasser, das andere die Information oder Mitteilung $mailfields_Daten. Wie gesagt, es gibt bei mir hunderte diverser Informationen!
Anlegen eines Arrays:
Ein Array wird wie folgt angelegt Name = array (Inhalt).
Der Name gibt den Arraynamen an und der Inhalt sind die einzelnen Felder die darin gespeichert werden sollen.
Somit ergibt sich für unser Beispiel folgendes:
Name des Arrays = $mailfields_Daten_Verfasser
Inhalt = vorname, nachname, domain, durchwahl (ist euch bestimmt schon aufgefallen, aber ich sage es sicherheitshalber auch, es handelt sich exakt um die Namensgebung der Formularfelder in der HTML-Seite; dies ist ein MUSS!)
Code:
$mailfields_Daten_Verfasser=Array("vorname","nachname","domain","durchwahl");
$mailfields_Daten=Array("textfeld");
$mailfields_Daten=Array("textfeld");
Was habe ich damit gewonnen?
Nun habe ich über mein Array die Möglichkeit mittels einer Schleife auf die Felder zuzugreifen und die Daten rauszulesen:
Bsp.:
Echo $_REQUEST[$mailfields_Daten_Verfasser[0]]; würde mir den Vornamen ausgeben
Echo $_REQUEST[$mailfields_Daten_Verfasser[1]]; würde mir den Nachnamen ausgeben
... etc.
Ich müsste also für jede Ausgabe eine Zeile schreiben, doch mit:
for ($i=0; $i<sizeof($mailfields_Daten_Verfasser); $i++) {
Echo $_REQUEST[$mailfields_Daten_Verfasser[$i]];
}
... könnte ich nun beliebig viele Zeilen ausgeben und habe nur 3 Zeilen Code geschrieben, egal ob nun 20, 40 oder 10000 ausgebeben werden müssten! Einzig man muss den exakten Namen der Formularfelder in das Array eintragen.
Nun setzen wir erst mal den Sender der Mail zusammen, dies ist die Person, die das Formular ausfüllt!
Mit $_POST["vorname"] holen wir uns den Inhalt aus dem Formularfeld der HTML Seite. Die Funktion trim(...), löscht alle versehentlich eingegeben Leerzeichen vor und nach dem eingetragenen Wort im Formularfeld. Mit „.“ bastel ich einen Punkt zwischen Vor- und Nachnamen und speichere alles in der Variablen $sender ab.
Code:
$sender=trim($_POST["vorname"]).".".trim($_POST["nachname"]);
Beispiel: Wenn in dem Feld Vornamen nun Hinz stehen würde und im Feld Nachnamen Kunz, würde es wie folgt nun in $sender stehen:
Code:
$sender=Hinz.Kunz!
Da dies ja noch keine Mailadresse ist, folgt nun auch der Domainnamen:
Code:
$domain=trim($_POST["domain"]);
Da in Emailadressen keine Umlaute verwendet werden, müssen wir diese nun rausfiltern, dies passiert am einfachsten in dem alle Buchstaben in Kleinbuchstaben gewandelt werden:
Code:
$sender=strtolower($sender);
Die Funktion strtolower(), liest nun die Variable $sender ein und setzt jedes Zeichen darin nun auf Kleinbuchstaben um: Ä ä, C c etc.
Nun erstelle ich zwei weitere Arrays:
Array("ü","ö","ä","ß","è","é","'") und Array("ue","oe","ae","ss","e","e",""). Das erste sucht die Umlaute und das zweite gibt an mit welchen es “Übersetzt“ werden soll. (Beispiel: ü wird zu ue, etc.)
Code:
$sender=str_replace(Array("ü","ö","ä","ß","è","é","'"),Array("ue","oe","ae","ss","e","e",""),$sender);
Jetzt muss noch der Sender komplettiert werden um eine gültige Adresse zu erhalten (Beispiel: $sender=ruediger.muss@gehen.de):
Code:
$sender.="@".$domain;
Bitte beachtet den kleinen „.“ Zwischen dem $sender und dem „=“.
So, nun haben wir den Sender zusammengebaut, doch an wen soll die Mail gehen?
Lass uns nun den Empfänger erzeugen. Normalerweise solle eine Mail von einem Formular an eine bestimmt Adresse gehen, also kann die Andresse direkt in das Skript eingebaut werden:
Code:
$empfaenger="name@domain.de";
Bsp.: $empfaenger=Ruediger.darf@bleiben.de;
Auch bringt das Versenden einer Mail ohne Inhalt recht wenig! ;)
Darum erstellen wir auch gleich einen Textkörper. Dieses Teiler wir dann der Übersichtlichkeit noch in zwei bereiche auf, einen für die persönlichen Daten des Senders und einen für den Textbereich:
Wir benutzen eine weitere Variable für den gesamten Mailinhalt $s_Message, auch hierbei bitte wieder immer den kleinen Punkt für dem „=“ beachten!
Zwei Leerzeilen in der Mail schaffen mittels .chr(10):
Code:
$s_Message=" ".chr(10).chr(10);
Für die optische Trennung (Persönliche Daten, Textbereich) des Textes in der Mail erstellen wir eine weitere Zeile:
Code:
$s_Message.="********** Daten vom Verfasser **********".chr(10).chr(10);
Jetzt isses soweit, der Einsatz des am Anfang der Funktion angelegten Arrays kommt nun dran. Der 3-Zeiler, der uns alle persönlichen Daten aus den Formularfelder liefert:
Code:
for ($i=0; $i<sizeof($mailfields_Daten_Verfasser); $i++) {
if (isset($_REQUEST[$mailfields_Daten_Verfasser[$i]])){
$s_Message.=substr($mailfields_Daten_Verfasser[$i]." ",0,35).": ".$_POST[$mailfields_Daten_Verfasser[$i]].chr(10);
}
}
if (isset($_REQUEST[$mailfields_Daten_Verfasser[$i]])){
$s_Message.=substr($mailfields_Daten_Verfasser[$i]." ",0,35).": ".$_POST[$mailfields_Daten_Verfasser[$i]].chr(10);
}
}
Bemerkungen:
substr($mailfields_Daten_Verfasser[$i] liefert uns das im Array eingetragene Wort, z.B. vorname, oder nachname etc.
$_POST[$mailfields_Daten_Verfasser[$i]] liefert uns den Inhalt des Formularfeldes, z.B. vorname = Rüdiger, etc.
Erneut ein Leerzeichen, damit auch alles sehr übersichtlich bleibt ;)
Code:
$s_Message.=" ".chr(10);
Auch eine räumliche Trennung für das Auge sollte nicht fehlen:
Code:
$s_Message.="********** Textfeld **********".chr(10).chr(10);
Nun kommt … juchuuu … das zweite oben erstellte Array zum Tragen, $mailfields_Daten:
Code:
for ($i=0; $i<sizeof($mailfields_Daten); $i++) {
if (isset($_REQUEST[$mailfields_Daten[$i]])){
if (trim($_REQUEST[$mailfields_Daten[$i]]) != ""){
$s_Message.=substr($mailfields_Daten[$i]." ",0,35).": ".$_POST[$mailfields_Daten[$i]].chr(10);
}
}
}
if (isset($_REQUEST[$mailfields_Daten[$i]])){
if (trim($_REQUEST[$mailfields_Daten[$i]]) != ""){
$s_Message.=substr($mailfields_Daten[$i]." ",0,35).": ".$_POST[$mailfields_Daten[$i]].chr(10);
}
}
}
Das Auslesen der Daten ist exakt der gleiche Vorgang wie bei der Schleife zuvor.
Noch etwas am Betreff rumschrauben, damit der Empfänger auch gleich erkennen kann worum es geht:
Code:
$s_Betreff="Mailversand, vom ".date("d.m.Y");
Die Funktion date("d.m.Y") liefert dabei nur das aktuelle Datum, also 10.08.2005.
In die Variable $headers schreiben wir nun den Sender rein:
Code:
$headers= "From: ".$sender;
… und ab die POST! ;)
Code:
mail($empfaenger,$s_Betreff,$s_Message,$headers);
6) Fazit:
Wir haben gelernt, wie es möglich ist Emails per PHP zu versenden, wie man Daten aus einer HTML Seite in PHP einliest, wie Dateien mittels PHP angezeigt werden können, wie Funktionen aufgerufen werden und wie es möglich ist, Code von PHP getrennt von HTML-Code zu lagern. Ich hoffe es hat euch etwas gefallen und war nicht zu sehr auf Programmtechnischer Schiene erklärt – aber bei diesen Themen ist es oft nicht so einfach alles 100% für jeden zu erklären, aber ich hab’s ehrlich probiert!! ;)
Ich hoffe auch, der Einsatz von Arrays kam nicht zu kurz und dadurch ein Überblick, wie man innerhalb eines Strings Zeichen umwandeln kann.
Auch kann einiges bestimmt einfacher erstellt werden, aber wenn die Applikation dann doch wächst, ist etwas mehr Energie beim Erzeugen zu Beginn doch sehr nützlich und bietet später mehr Flexibilität für Erweiterungen. Auch kann es im privatem Bereich von Interesse sein, eventuell in die HTML Seite ein Formularfeld Emailadresse einzubauen, dann spart mach sich das zusammensetzen und würde es ist wie folgt bequem auszulesen: $sender=trim($_REQUEST[‚adresse’]);
Hier gibts nun beide Dateien, die htm und die php-Datei, zum Download http://www.der-webdesigner.net/tutorials/php_anwendungen/emailformular/quellcode_email.zip
>> Allgemeine Fragen oder Probleme mit dem Tutorial? Hier gehts zum Forum!