1 PHP: Einfacher PHP-Formmailer|Artikel|Projekt OsUp

PHP: Einfacher PHP-Formmailer

Hinweise zum Thema

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.

Beispiel mit Erläuterungen

Beispiel:

<?php

### Konfiguration ###

# Bitte passen Sie die folgenden Werte an, bevor Sie das Script benutzen!

# An welche Adresse sollen die Mails gesendet werden?
$strEmpfaenger = 'IhrName@provider.xy';

# Welche Adresse soll als Absender angegeben werden?
# (Manche Hoster lassen diese Angabe vor dem Versenden der Mail ueberschreiben)
$strFrom = '"Formmailer" <IhrAndererName@provider.xy>';

# Welchen Betreff sollen die Mails erhalten?
$strSubject = 'Feedback';

# Zu welcher Seite soll als "Danke-Seite" weitergeleitet werden?
# Wichtig: Sie muessen hier eine gueltige HTTP-Adresse angeben!
$strReturnhtml = 'http://www.provider.xy/IhrName/IhreSeite.htm';

# Welche(s) Zeichen soll(en) zwischen dem Feldnamen und dem angegebenen Wert stehen?
$strDelimiter = ":\t";

### Ende Konfiguration ###

if($_POST)
{
$strMailtext = "";

while(list($strName,$value) = each($_POST))
{
if(is_array($value))
{
foreach($value as $value_array)
{
$strMailtext .= $strName.$strDelimiter.$value_array." ";
}
}
else
{
$strMailtext .= $strName.$strDelimiter.$value." ";
}
}

if(get_magic_quotes_gpc())
{
$strMailtext = stripslashes($strMailtext);
}

mail($strEmpfaenger, $strSubject, $strMailtext, "From: ".$strFrom)
or die("Die Mail konnte nicht versendet werden.");
header("Location: $strReturnhtml");
exit;
}

?>
<!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=iso-8859-1" />
</head>
<body>
<h1>Beispielformular</h1>
<form action="<?php print $_SERVER['PHP_SELF']; ?>" method="post">
<!--folgendes 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&ouml;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&ouml;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>

Erläuterung:

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 das $_POST-Array vorhanden ist. Diese Prüfung soll verhindern, dass eine leere Mail abgeschickt wird, wenn das Script zum Beispiel einfach so im Browser durch Eingabe der URL aufgerufen wird. Sollte dies der Fall sein, wird der HTML-Teil angezeigt (s.u.).

Anschließend legt das Script die Variable $strMailtext an. Diese ist momentan noch leer und wird später den Text der Mail beinhalten.

Danach geht es mit while() und each() sämtliche Elemente des $_POST-Arrays durch und schreibt den Namen des Elementes, das Trennzeichen (definiert in $strDelimiter) und den Inhalt des Elementes in die Variable $strMailtext. Sollte ein Element ein Array sein,  und der Fall ist, geht das Script mit foreach() das neue Array durch und verfährt mit den Elementen genauso, wie mit allen anderen Variablen auch.

Anschließend werden noch bei Bedarf die Slashes vor den Anführungszeichen aus dem Mailtext entfernt und die Mail versendet (wenn es fehlschlägt, wird mit die() das Script beendet und eine Fehlermeldung ausgegeben). Zuletzt wird noch die in $strReturnhtml definierte Seite aufgerufen aufgerufen 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.

Beachten Sie:

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.