Ein Kontaktformular mit PHP programmieren

Bildschirmfoto 2014-03-13 um 21.26.14Dank der zahlreichen Content-Management-Systeme ist das Erstellen eines Formulars nur eine Sache von Sekunden, geht einfach, schnell und ohne Programmierkenntnisse. Aber angenommen, man würde so etwas selber programmieren wollen, wie würde das funktionieren?

Man muss sich immer vor Augen halten, dass PHP eine Sprache ist, die im Gegensatz zu JavaScript erst vom Server verarbeitet wird. Solange also nichts gesendet wird, kann sich auch nichts tun.
Also brauchen wir als erstes einen Plan. Was gibt es zu tun?

  • Schreiben eines HTML-Formulars
  • nach dem Senden des Formulars müssen die Formularfelder ausgelesen werden
  • die zu verschickende Nachricht muss zusammengestellt werden
  • Versenden der Nachricht

Als erstes müssen wir ein Formular schreiben. Das lässt sich mit HTML ganz einfach zusammenschustern und sieht dann vielleicht so aus:

<form name="meinFormular" method="post" action="">
    <p>
        <label for="name">Name:</label>
        <input name="name" type="text" id="name" size="50"/>
    </p>
    <p>
        <label for="email">E-Mail:</label>
        <input name="email" type="text" id="email" size="50"/>
    </p>
    <p>
        <label for="subject">Betreff:</label>
        <input name="subject" type="text" id="subject" size="50"/>
    </p>
    <p>
        <label for="message">Ihre Nachricht:</label>
        <textarea name="message" cols="50" rows="5"/></textarea>
    </p>
    <p>
        <input type="submit" name="submit" value="Senden"/>
        <input type="hidden" name="gesendet" value="1"/>
    </p>
</form> 

Auf die einzelnen HTML-Elemente werde ich jetzt nicht weiter eingehen, sondern nur auf das, was für das Versenden des Formularinhalts relevant ist.
In der ersten Zeile <form name="meinFormular" method="post" action=""> sind schon die wichtigsten Dinge enthalten: Das Attribut method muss auf “post” gesetzt sein und das Attribut action muss noch ausgefüllt werden, sonst funktioniert es nicht. Das tun wir jetzt als nächstes

Wir werden ein Script schreiben, in dem bereits alles vorhanden ist, was wir tun wollen. Deshalb muss sich nach dem Absenden des Formulars das Script selbst neu laden, damit alle Funktionen ausgeführt werden können. Das funktioniert mit <?php $_SERVER['$SCRIPT_NAME'] ?>. Das fügen wir nun in das action-Attribut ein und erhalten folgende erste Zeile:

<form id="meinFormular" method="post" action="<?php $_SERVER['$SCRIPT_NAME'] ?>">

Jetzt kommen wir zu dem Teil, in dem die Daten aus dem Formular ausgelesen werden. Damit wir sie beim Zusammensetzen der Nachricht noch weiter verwenden können, werden sie zunächst an einzelne Variablen übergeben:

$absender_name = $_POST['name'];
$absender_mail = $_POST['email'];
$betreff = $_POST['subject'];
$nachricht = $_POST['message']; 

Die Formularfelder werden mit ihrem im Attribut name hinterlegten Namen angesprochen und ihr Inhalt in die entsprechende Variable übergeben.

Außerdem wird natürlich auch eine Variable benötigt, die die E-Mail-Adresse enthält, an die hinterher die Mail gesendet werden soll:

$empfaenger = 'name@domain.de';

Die Variablen nutzen wir nun, um die gesamte Nachricht in einer weiteren Variable zusammen zu setzen:

$message .= 'Liebe Susanne,' . "\n";
$message .= 'du hast folgende Nachricht von ' . $absender_name . ' erhalten:' . "\n\n";
$message .= $nachricht . "\n\n";
$message .= 'Diese Nachricht wurde über das Kontakt-Formular auf https://www.susanne-lueders.de verfasst.' . "\n";

Der Variablen $message werden nach und nach verschiedene Bausteine hinzugefügt.

Nachdem die Nachricht nun erfolgreich zusammengebaut worden ist, muss sie eigentlich nur noch versendet werden. Dazu benutzen wir die mail()-Funktion von PHP.
Diese Funktion besteht aus folgenden Parametern: mail(Empfänger, Betreff, Nachricht, optionale Header).
Im Header können einige wichtige Angaben gemacht werden, zum Beispiel zum Absender und zur Codierung. Da wir im Deutschen mit unseren Umlauten ein paar brenzlige Zeichen verwenden, ist vor allem letzteres wichtig. Daher stricken wir uns schnell auch noch einen Header zusammen.

$header .= 'From:' . $absender_mail . "\n";
$header .= 'Reply-To:' . $absender_mail . "\n"; 
$header .= "Content-type: text/plain; charset=UTF-8 \r\n";

Hier werden wieder die bekannten Variablen verwendet. Am Ende wird der Inhaltstyp auf normalen Text gesetzt. An dieser Stelle ließe sich auch eine HTML-Mail generieren, aber eine simple Text-Mail sollte erst mal ausreichen. Wichtig ist noch, dass die Codierung auf UTF-8 gesetzt wird, damit die Umlaute entsprechend umgesetzt werden. Es gilt allerdings zu beachten, dass die PHP-Datei selber auch in UTF-8 ohne BOM codiert ist.

Da nun alle Bausteine beisammen sind, muss die Mail wirklich nur noch abgeschickt werden. Dazu reicht nun eine einzelne Zeile:

mail($empfaenger, $betreff, $nachricht, $header);

Das ganze muss jetzt nur noch sinnvoll in einer Datei miteinander verknüpft werden und könnte beispielsweise so aussehen:

<?php
    if (!$_POST['gesendet'] && !$_POST['name']) {
?>

<form id="meinFormular" method="post" action="<?php $_SERVER['$SCRIPT_NAME'] ?>">
    <p>
        <label for="name">Name:</label>
        <input name="name" type="text" id="name" size="50"/>
    </p>
    <p>
        <label for="email">E-Mail:</label>
        <input name="email" type="text" id="email" size="50"/>
    </p>
    <p>
        <label for="subject">Betreff:</label>
        <input name="subject" type="text" id="subject" size="50"/>
    </p>
    <p>
        <label for="message">Ihre Nachricht:</label>
        <textarea name="message" cols="50" rows="5"/></textarea>
    </p>
    <p>
        <input type="submit" name="submit" value="Senden"/>
        <input type="hidden" name="gesendet" value="1"/>
    </p>
</form>

<?php
        }

    else {
        /* Übergibt den Inhalt der Formularfelder an Variablen */
        $absender_name = $_POST['name'];
        $absender_mail = $_POST['email'];
        $betreff = $_POST['subject'];
        $nachricht = $_POST['message'];
        /* Legt den Emfänger fest */
        $empfaenger = 'name@domain.de';
        /* Baut die Mail zusammen*/
        $message .= 'Liebe Susanne,' . "\n";
        $message .= 'du hast folgende Nachricht von ' . $absender_name . ' erhalten:' . "\n\n";
        $message .= $nachricht . "\n\n";
        $message .= 'Diese Nachricht wurde über das Kontakt-Formular auf https://www.susanne-lueders.de verfasst.' . "\n";
        /* Baut Header der Mail zusammen */
        $header .= 'From:' . $absender_mail . "\n";
        $header .= 'Reply-To:' . $absender_mail . "\n"; 
        $header .= "Content-type: text/plain; charset=UTF-8 \r\n";
        /* Verschicken der Mail */
        mail($empfaenger, $betreff, $message, $header);

        echo "Ihre Nachricht wurde &uuml;bermittelt. Vielen Dank!";
    }

?>

Das Formular ist in eine if-Schleife eingebettet, die das Formular nach erfolgreichem Absenden ausblendet und dafür eine Dankes-Nachricht ausgibt.

Als letzter Punkt sei darauf hingewiesen, dass es Sinn macht, die Eingaben aus dem Formular validieren zu lassen, um Spam-Mails zu verhindern. Dazu kann man prima jQuery verwenden. Es gibt da ein offizielles Plugin, das einem das Schreiben von Validierungsfunktionen direkt abnimmt. Weitere Informationen dazu gibt es hier: http://jqueryvalidation.org/