Kontaktformular ohne Spam

Ich benutze dieses Technik seit 2017 auf einem Kontaktformular und bekomme täglich darüber E-Mails. Es war bisher nicht eine Spam-Mail dabei!

Die Idee

.. ist recht einfach. Ich hab ein Formular mit den folgenden Feldern:

  • Name
  • E-Mail
  • Nachricht
  • Datenschutz akzeptiert

Um dieses Formular spamfrei zu halten, füge ich ein weiteres Feld hinzu:

  • Vorname

Das Feld Vorname ist per CSS-Anweisung unsichtbar.

<input name='Vorname' type='text' value='". $vorname ."' style='display: none !important;' />

Die SpamBots ignorieren die CSS-Anweisung und sehen alle Felder, und füllen auch alle Felder aus. Kurz vor dem Versenden gibt es eine Weiche, die ein gefülltes Formular mit Vorname zwar als erfolgreich versendet meldet, aber nicht absendet. Nur wenn Vorname leer ist, geht die Post raus.

if($vorname !== '' && $vorname !== NULL)
    {   // Wir sind höflich, sprechen den Spambot mit Vornamen an, aber versenden die E-Mail nicht.
        echo "<p>Hallo " . $vorname . " Deine Nachricht wurde versandt.</p>";
    }
else
    {   // Mail wird versendet.
        mail($an, $betreff, $message, $mail_header, "-f $von" );
        echo "<p>Ihre Nachricht wurde versandt.</p>";
    }                                       
};

Finetuning

Bei meinen Formularen verwende ich die CSS-Anweisung nicht als style-Tag sondern als class-Tag. Die class steht dann im stylesheet.css. Ich bin nicht sicher, ob die SpamBots ein style-Tag direkt erkennen würden. Immerhin steht das display:none ja direkt vor ihrer Nase. Eine externe Datei stylesheet.css mit der class wird jedenfalls nicht geladen und analysiert.

<input name='Vorname' type='text' value='". $vorname ."' class='vorname' />

Und in der Datei stylesheet.css

.vorname {
    display: none !important;
}

Das Beispiel

Das komplette Kontaktformular sieht so aus, bitte $an und $von setzen.

<!DOCTYPE HTML>
<html lang="de">
    <head>
        <title>kontaktformular</title>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1" />
    </head>
    <body>

<?php
// setzen von Empfänger und Absender
$an = "mail @ domain.com";
$von = "info @ domain.com";

function formular($status = ''){
    $vorname = isset($_POST['Vorname']) ? $_POST['Vorname'] : '';
    $name = isset($_POST['Name']) ? $_POST['Name'] : '';
    $email = isset($_POST['E-Mail']) ? $_POST['E-Mail'] : '';
    $nachricht = isset($_POST['Nachricht']) ? $_POST['Nachricht'] : '';
    $datenschutz = isset($_POST['Datenschutz']) ? $_POST['Datenschutz'] : '';
    $form = "
    <form method='post' action='kontakt.php'>
        <div><input name='Vorname' type='text' value='". $vorname ."' style='display:none!important;' /></div>
        <div><input name='Name' type='text' required value='". $name ."' placeholder='Ihr Name' /></div>
        <div><input name='E-Mail' type='email' required value='". $email ."' placeholder='Ihre E-Mail' /></div>
        <div><textarea name='Nachricht' placeholder='Ihre Nachricht'>". $nachricht ."</textarea></div>
        <div><input type='checkbox' name='Datenschutz' value='akzeptiert' required /> Datenschutz gelesen</div>
        <div><input type='submit' name='submit' value='senden'></div>
    </form>
    ";
    return $form;
    };

    if($_SERVER["REQUEST_METHOD"] === "POST")
    {   // Sammeln der Formulardaten
        $vorname = $_POST['Vorname'];
        $name = $_POST['Name'];
        $email = $_POST['E-Mail'];
        $nachricht = $_POST['Nachricht'];
        $datenschutz = $_POST['Datenschutz'];

        function get_content($URL){
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_URL, $URL);
            $data = curl_exec($ch);
            curl_close($ch);
            return $data;
        };

        if (isset($_POST["submit"])) {
            $betreff = "Anfrage von " . $name . " (Webseite)";
            $mail_header = 'From: ' . $von . "\n";
            $mail_header .= 'Reply-To: ' . $email . "\n";
            $mail_header .= 'Return-Path: ' . $von . "\n";
            $mail_header .= 'Content-type: text/plain; charset=UTF-8' . "rn";
// Nachrichtenlayout erstellen
$message = "
Anfrage von $vorname
Name:       $name
Email:      $email
Nachricht:  $nachricht
---
Datenschutzerklärung $datenschutz";

// Verschicken der Mail
        if($vorname !== '' && $vorname !== NULL)
            {   // Wir sind höflich, sprechen den Spambot mit Vornamen an, aber versenden die E-Mail nicht.
                echo "<p>Hallo " . $vorname . " Deine Nachricht wurde versandt.</p>";
            }
        else
            {   // Mail wird versendet.
                mail($an, $betreff, $message, $mail_header, "-f $von" );
                echo "<p>Ihre Nachricht wurde versandt.</p>";
            }
        };
    } else {
        echo formular();
    };
?>
    </body>
</html>