Startseite --> Hilfen & Technische Artikel --> Einfacher PHP-Formmailer --> FAQ
Einleitung
Darf ich das Script frei kopieren? Darf ich es in kommerziellen Anwendungen verwenden?
Wieso bekomme ich beim Absenden des Formulars die Meldung, dass $_SERVER['PHP_SELF'] (oder so etwas in der Art) nicht gefunden wurde?
Wie kann ich verhindern, dass ein leeres Formular abgesendet wird?
Wie kann ich das Formular an mehrere Empfänger senden?
Wie kann ich dem Absender des Formulars eine Bestätigungs-Mail schicken?
Wieso werden in den Mails Umlaute nicht richtig dargestellt?
Mein Artikel "Einfacher PHP-Formmailer" erfreut sich großer Beliebtheit und es kommen viele Rückmeldungen und auch Fragen. Viele dieser Fragen werden immer wieder gestellt, weshalb ich hier nun eine kleine Zusammenfassung anbieten möchte.
In dieser FAQ werden wie üblich die Fragen genannt und anschließend eine Antwort zu dieser Frage angegeben. Wenn die Lösung des Problems Änderungen am Quellcode erfordert, wird noch eine veränderte Version des Scripts angeboten.
Bedenken Sie bitte, dass der PHP-Formmailer nur als Grundgerüst zu verstehen ist, das erläutern soll, wie ein Formmailer überhaupt funktioniert. Die hier vorgestellten Ergänzungen sind auch nur als Erläuterungen zu verstehen, die eben das Prinzip vorstellen sollen, wie das angegebene Problem zu lösen ist. Das beste ist immer, wenn Sie versuchen, den Formmailer zu verstehen und anhand dessen einen eigenen zu entwickeln, der Ihren Anforderungen entspricht.
Ja, das Script darf frei kopiert, angepasst (es ist sogar gewünscht, dass es angepasst wird, da es sich bei der vorgestellten Variante nur um ein sehr einfaches Grundgerüst handelt) und für kommerzielle Internet-Seiten verwendet werden.
Es wäre mir recht, wenn man mich bei Verwendung des Scripts als Autor erwähnt, verpflichten will ich dazu jedoch niemanden. Was ich allerdings überhaupt nicht möchte, wäre, wenn jemand behauptet, dass er das Script komplett alleine entwickelt hat.
$_SERVER['PHP_SELF'] (oder so etwas in der Art) nicht gefunden wurde?Diese Meldung rührt daher, dass das Script die Zeile <form action="<?php print $_SERVER['PHP_SELF']; ?>" method="post"> enthält. Hier soll <?php print $_SERVER['PHP_SELF']; ?> eigentlich vom PHP-Interpreter durch den aktuellen Namen des Scripts ersetzt werden. Bei dem beschriebenen Fehler ist das nicht passiert, weil der PHP-Interpreter nicht ausgeführt wurde.
Es ist zunächst wichtig, dass Sie das Script in einer HTTP-Umgebung installieren. Das heißt, dass Sie das Script entweder auf Ihren Webserver kopieren oder sich selbst lokal einen HTTP-Server (z.B. Apache oder IIS) einrichten und dort dann auch einen PHP-Interpreter installieren.
Dann ist es wichtig, dass Sie der Datei die Endung .php und nicht .htm oder .html geben! Das heißt, dass Sie das Script beispielsweise formmail.php nennen. Nur Dateien mit der Endung .php werden vom Webserver auf PHP-Programmcode untersucht!
In ganz seltenen Fällen kann es übrigens sein, dass Ihr Provider eine andere Endung für PHP-Dateien vorgesehen hat - aber das sollte eher die Ausnahme sein.
Sollte das auch nicht helfen, unterstützt Ihr Webspace wohl kein PHP.
Der Formmailer prüft in der Standardversion nicht, ob Formularfelder ausgefüllt wurden. Er prüft lediglich, ob im Formular auf den Senden-Button geklickt wurde und versucht dann, eine Mail zu generieren. Das gelingt ihm dann auch, die Mail enthält jedoch dann keinen Text.
Wenn Sie verhindern möchten, dass eine leere Mail versendet wird, können Sie beispielsweise prüfen, ob bestimmte Felder ausgefüllt wurden. Das können Sie erreichen, indem Sie den Teil des Scripts, in dem die Mail generiert wird, nur ausführen lassen, wenn das $_POST-Array (dieses Array enthält die Formularfelder und die eingegebenen Werte) bestimmte Daten enthält.
Suchen Sie nach dieser Stelle im Script:
$strMailtext = "";
Wenn Sie nun prüfen möchten, dass die Felder feld1 und feld2 gesetzt sind, müssen Sie vor dieser Zeile so etwas wie das hier einfügen:
if($_POST['feld1'] && $_POST['feld2'])
{
Dadurch wird geprüft, ob feld1 und feld2 im $_POST-Array auftauchen.
Nun soll noch eine Fehlermeldung angezeigt werden, wenn nicht alle Felder ausgefüllt wurden. Suchen Sie dazu nach diesem Abschnitt:
else
{
$strMailtext .= $strName.$strDelimiter.$value."\n";
}
}
Fügen Sie nach der untersten geschweiften Klammer diese Zeilen ein (inkl. der zusätzlichen geschweiften Klammer):
}
else die('Es wurden nicht alle Formularfelder ausgefuellt');
Wenn nun eines der Pflichtfelder nicht ausgefüllt wurde, wird die Meldung Es wurden nicht alle Formularfelder ausgefuellt angezeigt. Wenn Sie möchten, können Sie diese Meldung nach Ihren Vorstellungen anpassen und gestalten.
Vollständiges Formmailer-Script mit Änderungen
Die einfachste Möglichkeit ist, die E-Mail-Adressen, die das Formular empfangen sollen, durch Komma getrennt anzugeben:
$strEmpfaenger = 'IhrName@provider.xy, AndererName@andererProvider.xyz';
PHP liest diese Daten aus und versendet die E-Mails an die angegebenen Empfänger.
Sollte diese Lösung nicht funktionieren (aus welchen Gründen auch immer), können Sie das ganze auch manuell machen. Die Grundlage ist, die E-Mail-Adressen in einem Array zu halten und an jede Adresse in diesem Array die Mail zu versenden.
Zunächst wird das Array mit den Empfängern definiert:
# An welche Adresse sollen die Mails gesendet werden?
$arrEmpfaenger = array('IhrName@provider.xy','AndererName@andererProvider.xyz');
$arrEmpfaenger enthält nun die Adressen, an die die E-Mail versendet werden soll. Nun muss dieses Array noch abgearbeitet werden. Suchen Sie dazu nach dieser Stelle im Script:
mail($strEmpfaenger, $strSubject, $strMailtext, "From: ".$strFrom)
or die("Die Mail konnte nicht versendet werden.");
und ersetzen Sie sie durch diese:
foreach($arrEmpfaenger as $strEmpfaenger)
{
mail($strEmpfaenger, $strSubject, $strMailtext, "From: ".$strFrom)
or die("Die Mail konnte nicht versendet werden.");
}
Das Array $arrEmpfaenger wird nun durchlaufen und es wird an jede dort angegebene Adresse die E-Mail verschickt.
Vollständiges Formmailer-Script mit Änderungen
Es ist natürlich möglich, dem Absender des Formulars eine Bestätigungs-Mail zu schicken. Jedoch werde ich diese Möglichkeit nicht erläutern, da diese es jedem gestattet, E-Mails an jede nur denkbare Adresse zu versenden. Wer kann garantieren, dass der Absender wirklich seine eigene E-Mail-Adresse angibt?
In Ihren Mails werden Umlaute nicht richtig dargestellt. Entweder sind sie gar nicht zu sehen oder es werden kryptische Zeichen dargestellt (z.B. ä statt ä oder ö statt ö).
Das Problem ist, dass hier die Codierung der Mails nicht stimmt. Das dargestellte Formular wird als UTF-8 ausgeliefert und dadurch eben auch UTF-8-Daten an den Formmailer gesendet. Da in der Mail jedoch keine Codierung vermerkt ist, weiß Ihr Mail-Programm nicht, dass es die Mail als UTF-8 darstellen soll und es erscheinen die oben erwähnten Zeichenfolgen.
Um das Problem zu beheben, müssen Sie das Script so ergänzen, dass die versendete Mail eine Anweisung enthält, dass sie als UTF-8 dargestellt werden muss. Suchen Sie dazu im Script nach dieser Zeile:
mail($strEmpfaenger, $strSubject, $strMailtext, "From: ".$strFrom)
Ändern Sie diese Zeile folgendermaßen ab:
mail($strEmpfaenger, $strSubject, $strMailtext, "Content-Type: text/plain; charset=UTF-8\nFrom: ".$strFrom)
Dadurch wird im Header der versendeten Mail die Zeile Content-Type: text/plain; charset=UTF-8 eingefügt, die das Mail-Programm anweist, die Mail als UTF-8 darzustellen.
Vollständiges Formmailer-Script mit Änderungen
Startseite --> Hilfen & Technische Artikel --> Einfacher PHP-Formmailer --> FAQ