Startseite --> Hilfen & Technische Artikel --> Einfacher PHP-Formmailer

Einfacher PHP-Formmailer

Hinweis:
Dieser Artikel erschien ursprünglich im Jahr 2002 auf dem Web-Angebot von SELFHTML und wurde seitdem mehrfach überarbeitet. SELFHTML hat mittlerweile eine eigene Version dieses Artikels erstellt. Hier finden Sie meine Fassung aus dem Jahr 2004.
Wenn Sie Fragen haben, schauen Sie bitte zuerst in die FAQ. Wenn Ihre Frage dort nicht beantwortet wurde, dürfen Sie mich gerne kontaktieren. Es werden nur Fragen zu meiner Version des Artikels beantwortet.

 Hinweise zum Thema
 Beispiel mit Erläuterungen
 Weiterführende Links

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.

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®).

 Nach oben  Nach unten

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."\n";
   }
  }
  else
  {
   $strMailtext .= $strName.$strDelimiter.$value."\n";
  }
 }

 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">
            <!-- 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&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, was ja bei Checkboxen und Auswahllisten mit Mehrfachauswahl 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.

 Nach oben  Nach unten

Weiterführende Links

Die folgenden Stellen werden empfohlen, um das obige Beispiel besser zu verstehen, oder um weitere Möglichkeiten und Details zu erfahren.

 FAQ zu diesem Formmailer

 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)

Startseite --> Hilfen & Technische Artikel --> Einfacher PHP-Formmailer