![]() |
PHP:
|
|
| |
Es gibt die Möglichkeit, HTML-Formulare durch ein mailto: im action-Attribut per E-Mail zu versenden. Allerdings ist diese Methode nicht sonderlich zuverlässig, da sie vom Browser des Benutzers abhängig ist. Es ist besser, einen Formmailer zu verwenden. Bei einem Formmailer ist es die Aufgabe des Web-Servers, die Mail zu versenden. Der Browser des Benutzers hat darauf dann keinen Einfluss.
Stefan Münz beschreibt in seinem Beitrag
Einfacher Form-Mailer einen einfachen und zuverlässigen Formmailer in Perl. Oft ist es leider jedoch so, dass Webspace-Anbieter kein CGI/Perl erlauben, dafür aber PHP. Deshalb soll hier die PHP-Fassung dieses Formmailers vorgestellt werden. Zusätzlich wurden noch einige Sicherheitsprobleme behoben (ein Dankeschön geht an dieser Stelle an
Jörg Reinholz, besser bekannt als fastix®).
Beachten Sie bitte auch den Artikel
Fortgeschrittener Form-Mailer von Sven Rautenberg, in dem eine alternative und besser erweiterbare Methode des Mailversands vorgestellt wird.
<?php
/**
* Konfiguration
*
* Bitte passen Sie die folgenden Werte an, bevor Sie das Script benutzen!
*
* Das Skript bitte in UTF-8 abspeichern (ohne BOM).
*/
// An welche Adresse sollen die Mails gesendet werden?
$zieladresse = 'IhrName@EXAMPLE.com';
// Welche Adresse soll als Absender angegeben werden?
// (Manche Hoster lassen diese Angabe vor dem Versenden der Mail ueberschreiben)
$absenderadresse = 'ihrAndererName@EXAMPLE.com';
// Welcher Absendername soll verwendet werden?
$absendername = 'Formmailer';
// Welchen Betreff sollen die Mails erhalten?
$betreff = 'Feedback';
// Zu welcher Seite soll als "Danke-Seite" weitergeleitet werden?
// Wichtig: Sie muessen hier eine gueltige HTTP-Adresse angeben!
$urlDankeSeite = 'http://www.EXAMPLE.com/IhrName/IhreSeite.htm';
// Welche(s) Zeichen soll(en) zwischen dem Feldnamen und dem angegebenen Wert stehen?
$trenner = ":\t"; // Doppelpunkt + Tabulator
/**
* Ende Konfiguration
*/
if ($_SERVER['REQUEST_METHOD'] === "POST") {
$header = array();
$header[] = "From: ".mb_encode_mimeheader($absendername, "utf-8", "Q")." <".$absenderadresse.">";
$header[] = "MIME-Version: 1.0";
$header[] = "Content-type: text/plain; charset=utf-8";
$header[] = "Content-transfer-encoding: 8bit";
$mailtext = "";
foreach ($_POST as $name => $wert) {
if (is_array($wert)) {
foreach ($wert as $einzelwert) {
$mailtext .= $name.$trenner.$einzelwert."\n";
}
} else {
$mailtext .= $name.$trenner.$wert."\n";
}
}
mail(
$zieladresse,
mb_encode_mimeheader($betreff, "utf-8", "Q"),
$mailtext,
implode("\n", $header)
) or die("Die Mail konnte nicht versendet werden.");
header("Location: $urlDankeSeite");
exit;
}
header("Content-type: text/html; charset=utf-8");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">
<head>
<title>Einfacher PHP-Formmailer</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<h1>Beispielformular</h1>
<form action="" method="post">
<!-- Hier die eigentlichen Formularfelder eintragen. Die folgenden sind Beispielangaben. -->
<dl>
<dt>Ihr Name:</dt>
<dd><input type="text" name="Versender" /></dd>
<dt>Ihre E-Mail:</dt>
<dd><input type="text" name="E-Mail" /></dd>
<dt>Sie können:</dt>
<dd><input type="checkbox" name="kannwas[]" value="HTML" />HTML <input type="checkbox" name="kannwas[]" value="PHP" />PHP</dd>
<dt>Sie sind:</dt>
<dd><input type="radio" name="sexus" value="M" />Mann <input type="radio" name="sexus" value="Frau" />Frau</dd>
<dt>Sie mögen:</dt>
<dd><select name="Browser"><option value="Opera">Opera</option><option value="Mozilla">Mozilla</option></select></dd>
<dt>Bemerkungen:</dt>
<dd><textarea name="Bemerkungen" rows="3" cols="20">Bemerkungen</textarea></dd>
</dl>
<!-- Ende der Beispielangaben -->
<p>
<input type="submit" value="Senden" />
<input type="reset" value="Zurücksetzen" />
</p>
</form>
</body>
</html>
Zunächst werden im Script einige Einstellungen festgelegt. Was die einzelnen Optionen bewirken, können Sie den Kommentaren an den entsprechenden Stellen entnehmen.
Als nächstes wird geprüft, ob ein POST-Request vorliegt. Diese Prüfung soll verhindern, dass eine leere Mail abgeschickt wird, wenn das Script zum ersten Mal aufgerufen wird, denn dann soll der HTML-Teil angezeigt werden.
Anschließend legt das Script die Variable $mailtext leer an. In dieser sammeln wir den Mailtext.
Danach geht es mit foreach() sämtliche Elemente des $_POST-Arrays durch und schreibt den Namen des Elementes, das Trennzeichen (definiert in $trenner) und den Inhalt des Elementes in die Variable $mailtext. Sollte ein Element ein Array sein, was ja bei
Checkboxen und
Auswahllisten mit Mehrfachauswahl der Fall ist, geht das Script mit foreach() das Unterarray durch und verfährt mit den Elementen genauso, wie mit allen anderen Variablen auch.
Am Ende wird die Mail verschickt - (wenn es fehlschlägt, wird mit die() das Script beendet und eine Fehlermeldung ausgegeben). Zuletzt wird noch zur in $urlDankeSeite definierten Danke-Seite weitergeleitet und das Script mit exit() beendet.
Wenn das Formular nicht abgesendet wurde, sondern das Script direkt aufgerufen wurde, wird nur das Formular angezeigt. Dieses können Sie frei bearbeiten und weitere oder andere Formularelemente einbauen. Der Name der Script-Datei ist frei wählbar und wird automatisch in das action-Attribut des <form>-Tags eingefügt.
Wenn Sie in Ihrem Formular Checkboxen oder Auswahllisten mit Mehrfachauswahl einbauen wollen, muss der Name dieser Felder mit einem [] enden, damit PHP weiß, dass es die Daten als Array behandeln soll. Im Beispielformular wird dies anhand der Checkboxen demonstriert.
Vor dem Aufruf der Funktion header() darf das Script nichts ausgegeben haben (z.B. über print() und echo()), weil ansonsten ein Fehler erzeugt wird. Das bedeutet auch, dass vor dem PHP-Code, eingegrenzt durch <?php ... ?>, kein HTML-Code sowie keine Leerzeichen und Leerzeilen stehen dürfen. <?php muss also direkt am Dateianfang stehen.
Das Skript geht davon aus, dass PHP auf dem Server zeitgemäß ohne magic_quotes_gpc konfiguriert ist. Wenn dies nicht der Fall ist, werden eingegebene Anführungszeichen des Benutzers mit vorangestelltem Backslash in die Mail geschrieben. Sprechen Sie ggf. ihren Provider an, um dieses lästige Problem abschalten zu lassen.
Das Skript nutzt konsequent UTF-8 als Zeichencodierung. Denken Sie daran, diese Codierung nicht zu zerstören - andernfalls werden Umlaute im Text nicht korrekt dargestellt.
Die folgenden Stellen werden empfohlen, um das obige Beispiel besser zu verstehen, oder um weitere Möglichkeiten und Details zu erfahren.
Kristian Köhntopp: Wie kann man Checkboxen verarbeiten?
Kristian Köhntopp: Wie kann man ein <select multiple> verarbeiten?
Kristian Köhntopp: Wie erzeuge ich mit PHP einen Redirect auf eine andere Seite?
Stefan Münz: Einfacher Form-Mailer (in Perl programmiert)
Fortgeschrittener Form-Mailer