Individuelles Kontaktformular mit Captcha in PHP

Kontaktformulare sind das Mittel der Wahl, um es dem Besucher besonders leicht zu machen, direkt mit dem Webmaster zu kommunizieren.

Doch wer sich nicht vertiefte PHP-Kenntnisse, mit Tutorials wie diesem, aneignen möchte, hat ein Problem: Wie soll nun ein Kontaktformular realisiert werden?

In diesem Beitrag biete ich dafür die Lösung. Hier kannst Du mein populäres Kontaktformular-Skript downloaden, welches Dir mehrere Möglichkeiten bietet. Du kannst selber Pflichtfelder festlegen und selbst entscheiden, welche Felder es überhaupt geben soll.

Außerdem gibt es auf dieser Seite sowohl ein Kontaktformular-Skript mit Captcha als auch eines ohne. Es kann also ausgewählt werden, ob Du mit dem Captcha zusätzliche Sicherheit vor Spam haben möchtest oder es Deinen Besuchern besonders leicht machen möchtest zu Dir Kontakt aufzunehmen – ohne Captcha.

Selbstverständlich können auch die angezeigten Text und das Layout an den Stil deiner Website angepasst werden. Also, worauf wartest Du? Lass uns dein neues Kontaktformular individuell gestalten.

Features der Lösung

Hier noch einmal der Überblick, was das Skript leisten kann:

  • eigene Felder (z.B. select, radio, text, textarea und file) festlegen und entscheiden, ob diese Pflichtfelder sein sollen
  • Integration in die eigene Website problemlos möglich
  • Spamschutz mit verstecktem Formular-Feld sowie optional PHP-Captcha von WWW Coding, welches auf Deinem Server eingerichtet wird
  • Bei falschen Angaben müssen nicht alle Daten erneut eingegeben werden
  • Verhindert mehrfaches Versenden
  • Festlegen individueller Texte, die je nach Fall angezeigt werden können und Layout leicht anpassbar mittels CSS
  • Einwilligungsfeld möglich (für Einwilligung nach DSGVO)
  • Email-Kopie an den Absender möglich
  • kostenlos und frei verwendbar

Technische Voraussetzungen

Im Regelfall wird der Versand von E-Mails über mail() auf eurem Server konfiguriert sein, das ist auch notwendig. Auch PHP Sessions sind notwendig, aber ebenfalls in der Regel bereits aktiviert.

Das Skript benötigt mindestens die PHP-Version 7.3.0. Unter älteren Versionen kann das Skript lauffähig gemacht werden, wenn die Funktion „is_countable()“ ersetzt wird.

Daneben benötigt ihr für das Captcha die Grafikbibliothek PHP GD.

Download des Kontaktformular-Skriptes

Wie schon zuvor angedeutet gibt es zwei Versionen dieses PHP-Skriptes.

Download Button
Download: Kontaktformular mit Captcha

Die erste Version beinhaltet sowohl die kontakt.php, das Kontaktformular, als auch den Ordner captcha, indem sich die für das Captcha notwendigen Dateien befinden. Entscheide dich für diese Lösung, wenn Du ein Kontaktformular inklusive Captcha möchtest. Hier, oder per Klick auf den Button links, kannst Du das Kontaktformular-Skript in dieser Version downloaden.

Download Button
Download: Kontaktformular ohne Captcha

Dich stört das Eingeben eines Captchas und Du willst Deine Besucher damit nicht belästigen? Das Kontaktformular verfügt bereits über einen recht einfachen Spamschutz, auch wenn dieser nicht so sicher ist, wie die Verwendung eines Captchas. Klicke hier, oder auf den Button links, um das Kontaktformular in der Ausführung ohne Captcha zu downloaden.

Sobald Du die Dateien gedownloadet hast, können wir mit der Einrichtung beginnen. Diese unterscheidet sich bei den beiden Versionen nicht wesentlich.

Einrichtung des Kontaktformulars

Nach Durchführung der folgenden Schritte ist dein Kontaktformular fertig eingerichtet. Bitte beachte bei der Captcha-Version, dass die so_gehts.php in diesem Fall ignoriert werden kann. Nur die folgenden Schritte sind maßgeblich:

  1. Dateien auf deinen Server laden
    Zuerst solltest Du die ZIP-Datei entpacken und alle enthaltenen Dateien auf den Server laden. Funktioniert es so, wenn Du die kontakt.php im Browser aufrufst? Okay, dann kann es weitergehen.
  2. Zeichensatz
    Verwendest Du UTF-8? Dann musst Du soweit keine Änderungen in der Datei vornehmen. Wenn Du dir nicht sicher bist, durchsuche einfach die anderen Dateien deiner Website nach Stichworten wie „utf8“ oder „utf-8“. Solltest Du kein UTF-8 verwenden, so musst Du diese Zeile entfernen:

    header('Content-Type: text/html; charset=utf-8'); /* WENN DU KEIN UTF-8 NUTZT, KANNST DU (NUR) DIESE ZEILE LÖSCHEN! */
  3. Inhalt vor das Kontaktformular einfügen
    In der kontakt.php findest Du folgenden HTML-Kommentar:<!-- Hier kann der Inhalt deiner Seite vor das Kontaktformular platziert werden -->Ersetze diese Zeile durch deinen HTML- und/oder PHP-Code der davor angezeigt werden soll. Das sollte neben DOCTYPE und head-Elementen zum Beispiel auch dein Header sein.
  4. Inhalt hinter das Kontaktformular einfügen
    Bei der Gelegenheit kannst Du auch gleich den zweiten Kommentar in der letzten Zeile der Datei durch den Code ersetzen, der hinter das Formular platziert werden soll.
  5. E-Mail-Adresse festlegen
    Damit Du die E-Mails auch erhältst, solltest Du in der Variable $adminMail deine korrekte E-Mail-Adresse speichern. An diese Adresse werden alle Anfragen geschickt.
  6. Texte anpassen
    Außerdem hast Du die Möglichkeit alle angezeigten Texte anzupassen. Ändere dafür einfach die Inhalte der Variablen für die Überschrift ($formTitle), den Informationstext ($msgInfo), den Fehler-Hinweis ($msgError) und die Erfolgsmeldung ($msgSent). Zudem solltest du den Link zu deiner Datenschutz-Erklärung in $datenschutzLink einfügen. In dieser solltest du auch auf die Verarbeitung der Daten aus dem Formular hinweisen. Der Text für die Einwilligung findet sich in $fields als unverbindlicher Vorschlag. Bitte passe diesen ggf. an und beachte, dass ich keine Gewähr für den Text im Hinblick auf Konformität mit der aktuellen Rechtslage übernehmen kann!
  7. Captcha einrichten
    Dieser Schritt richtet sich nur an die Nutzer, die die Version mit Captcha heruntergeladen haben. Diese müssen in $captchaPath den Pfad von der aktuellen Datei zu der captcha.php aus dem captcha-Ordner angeben. Wenn Du nichts verändert hast und die Dateien so in das Hauptverzeichnis Deines Servers geladen hast, kannst Du die Variable in der Regel so belassen („captcha/captcha.php“).
  8. Formularfelder anpassen
    In der Variable $fields sind alle Elemente enthalten, die im Formular angezeigt werden soll. Du kannst diese Elemente verändern, entfernen (z.B. durch Auskommentieren wie bei dem Eintrag „Website“), oder neue hinzufügen. Dabei gilt folgendes Schema:'Feldname' => array('TYP', Pflichtfeld?, 'placeholder', evtl. Ergänzungen)Der Typ kann entweder select, radio, text (inkl. Untertypen wie email, tel, url, date oder datetime-local) oder textarea, checkbox sein. Zudem gibt es die beiden Sondertypen _copy (Email-Kopie-Checkbox) und _consent (Einwilligungscheckbox). Ist der 2. Wert („Pflichtfeld?“) true, handelt es sich um ein Pflichtfeld (inkl. required für Überprüfung durch den Browser), bei false ist das Ausfüllen optional. Bei einem select– oder radio-Feld muss der 4. Eintrag des Arrays außerdem ein weiteres Array beinhalten mit allen Auswahlmöglichkeiten. Für eine Checkbox kann der daneben angezeigte Text ebenfalls über den 4. Eintrag des Arrays festgelegt werden.
    Beachte: Der Feldtyp „email“ darf nur/muss einmal vorkommen, um die Email-Kopie-Funktion zu ermöglichen. Zudem darf der Feldname dafür nicht bloß „Email“ oder „email“ lauten.
  9. CSS anpassen
    Die einzelnen Tabellenzellen sind bereits mit der CSS-Klasse contactSubjectTd bzw. contactInputTd und die Felder mit contactField sowie das eigentliche Nachrichten-Feld mit der CSS-Klasse contactTextarea gekennzeichnet. Die Fehlermeldung ist der Klasse contactError zugeordnet. Damit kannst du dein Kontaktformular mit CSS noch leichter anpassen, z.B. durch Einfügen des folgenden Codes in den <head>-Bereich deiner Website:

    <style type="text/css">
    .contactTextarea{
    /* Breite und Höhe werden angepasst */
    width:500px;
    height:200px;
    }
    </style>
  10. Fertig!
    Sobald Du die Änderungen übernommen hast und die Dateien erneut auf deinen Webspace hochgeladen hast, bist Du in der Regel fertig. Wenn du alles korrekt gemacht hast, kannst Du dein Kontaktformular jetzt im Browser per kontakt.php erreichen. Probiere es doch gleich mal aus.

Ich wünsche Dir viele interessante und hilfreiche Anfragen über Dein neues Kontaktformular. Das, wie Du ja siehst, ganz einfach mit PHP und mit oder ohne Captcha realisiert werden kann.

WICHTIGE Hinweise

Sicherheit:

Bitte beachtet insbesondere bei der Aktivierung von Dateiuploads, dass theoretisch beliebige Anhänge über das Formular versendet werden können. Die akzeptierten Dateitypen werden zwar serverseitig geprüft – dies kann aber dennoch umgangen werden.

Freie Verwendung:

Aufgrund von Nachfragen weise ich gerne darauf hin, dass das Skript kostenfrei auch für gewerbliche Zwecke verwendet werden darf. Ich bitte darum, die Kommentarzeilen und Autorenhinweise nicht zu entfernen.

Gerne gesehen (aber freiwillig) ist natürlich eine Empfehlung oder ein Link, wenn ihr mit dem Kontaktformular-Skript zufrieden seid 🙂

Kommentare:

Bitte habe Verständnis, dass ich aus Zeitgründen keine individuellen Anfragen per E-Mail oder Kommentar beantworten kann. Sofern du einen Fehler z.B. in einer neueren PHP Version feststellst oder einen Verbesserungsvorschlag von allgemeinem Interesse hast, freue ich mich jedoch über deinen Kommentar.

Changelog

  • 28.04.2014: Erste Version des Skripts wurde veröffentlicht
  • 30.06.2014: Nun ist auch das Einfügen von Checkboxen möglich
  • 21.10.2015: Bugfix, Checkboxen konnten bisher nur in der Version ohne Captcha eingefügt werden
  • 06.02.2016: Aktualisierte Version des Captchas übernommen
  • 17.05.2016: Neue Captcha Version eingebunden (mit Reload-Funktion und neuer Schriftart)
  • 03.03.2017: Betreff und E-Mail-Adresse werden nun als E-Mail-Betreff und Absender übernommen
  • 07.06.2018: Noch leichtere Anpassung per CSS
  • 17.04.2019: Umfangreiche Änderungen (Einwilligung, required, Feldtypen wie radio und email, Email-Kopie, kein mehrfach Absenden, placeholder)
  • 18.05.2019: „Bitte wählen“ beim select-Feld kann jetzt ersetzt werden (quasi wie placeholder)
  • 21.06.2019: Mime-Version ergänzt (Danke an Johannes)
  • 03.08.2019: Tippfehler behoben (Danke an Otto)
  • 30.08.2019: Bug behoben, durch den Pflicht-Checkboxen bereits gesetzt waren
  • 10.04.2020: Neue Typen date und datetime-local für Datumspicker hinzugefügt (Unterstützung browserabhängig) sowie checkbox mit mehreren Optionen ermöglicht
  • 08.07.2021: Dank Leserhinweis Skript geringfügig optimiert, um PHP-Hinweismeldungen zu reduzieren
  • 20.06.2022: Dateiupload wird nun unterstützt. Weitere, kleine Änderungen.
  • 31.08.2022: Behebung eines Fehlers im Zusammenhang mit Dateiuploads. Geringfügige Captcha-Anpassungen.

203 Gedanken zu „Individuelles Kontaktformular mit Captcha in PHP“

  1. Hi, erstmal vielen Dank für das tolle Mailformular. Klappt auch alles super – aber wie kann ich zwischen Nachrichtentext und Captcha noch zwei Checkboxen einfügen? Bin da leider etwas unbedarft…

    Und zweite Frage – wie kann ich die Größe des Nachrichtentextfelds bestimmen?

    Danke & Gruß
    Steven

    1. Hallo Steven,

      Das Einfügen einer Checkbox war bisher nicht möglich. Ich habe jetzt aber eine neue Version des Skripts veröffentlicht, die genau das genau kann. Lade dir am besten die Dateien erneut herunter und schau dir den „Newsletter“-Eintrag im Array als Beispiel an.

      Zu deiner zweiten Frage: Ich würde Dir empfehlen über einen CSS-Code wie diesen textarea{width:300px;height:200px;} alle Textareas auf der Seite anzupassen. Alternativ kannst Du im Code bei textarea zusätzlich style="width:300px;height:200px; einfügen. Die Höhen- und Breitenangaben kannst Du natürlich beliebig wählen.

      Schöne Grüße

      1. Hallo Tristan,
        Formular ist ja erstmal TOP.

        Allerdings habe ich drei Fragen:

        1) Wo muss den Code (style=“width:300px;height:200px;) einfügen damit das Textfeld meine Größe nimmt – sobald ich es einfüge funktioniert die Seite nicht mehr

        2) Wie bekomme ich das Formular zentriert ?

        3) Gerne hätte ich auch die Bestätigung für den Versand bzw. Fehlermeldung als Popup oder zumindest das die Seite auf dem Formular bleibt. Aktuell springt es an den Anfang meiner Seite. 🙁

        Kannst Du mir hier kurz helfen ?

        Aktuell liegt das Formular unter folgendem Link:

        musikkontakt.de/kontakt.php

        Danke.

        Gruß Jürgen

  2. Suuuuuuuuuuuuper!!!! Ganz herzlichen Dank für die superschnelle Reaktion – funktioniert einwandfrei. Das einzigste was noch etwas stört sind die nicht richtig dargestellten Umlaute in der versendeten Mail und wenn man zwei Checkboxen hat, werden die in der E-Mail nebeneinander geklatscht. Habe an verschiedenen Stellen versucht, einen Umbruch hinzubekommen, hat aber nicht geklappt…

    Super vielen Dank nochmal und viele Grüße
    Steve

    1. Gerne doch.
      Ich habe die beiden Skripte noch einmal aktualisiert, sodass damit beispielsweise die Umlaute richtig dargestellt werden. Auch die Checkbox-Eingaben sollten wie alle anderen Felder in der E-Mail getrennt werden. Funktioniert denn der Zeilenumbruch bei den anderen Feldern?

  3. Hi, erstmal vielen Dank für super Formular.
    Ich habe es angepasst und es funktioniert tadellos.
    Eine Frage hätte ich aber.
    In meinem Formular wird die E-Mail Adresse abgefragt und diese hätte ich gerne auch als Antwortadresse, so das ich diese nicht rauskopieren muss, sondern direkt auf Antworten im MailClient klicken kann. Ich habe schon selbst versucht den Wert bei E-Mail header zu ändern, aber das hat leider nicht funktioniert.

    Viele Grüße
    Felix

    1. Hallo Felix,

      Es freut mich, dass dir das Skript weiterhilft. Was du suchst, ist der sogenannte Reply-To Header. Füge am besten einfach unter // Inhalt (wenn nicht leer) in die E-Mail schreiben // eine weitere Code-Zeile ein:

      if ($name == 'NAME_DES_EMAILFELDES') { $mailHeader .= "Reply-To: ".$_POST[field2url($name)]."\r\n"; }

      NAME_DES_EMAILFELDES ist dann zum Beispiel „E-Mail-Adresse“, je nachdem, wie du es in $fields angegeben hast.

      Schöne Grüße
      Tristan

  4. Sehr cooles script allerdings würde ich gern den ausgange als html senden und nicht als plain text.. das mit die angekommende mail etwas schicker aus sieht den so sehe ich nur buschstaben in meiner mail ohne zeilenbruch da blickt man überhaupt nicht mehr durch

    1. Hallo Rene,

      Wenn du aus Content-type: text/plain; charset=utf-8 (Zeile 55) ein Content-type: text/html; charset=utf-8 machst, kannst du auch HTML Tags in deiner eMail verwenden. Für die korrekte Darstellung der Umbrüche kannst du dann auch noch ein nl2br hinzufügen:

      // Inhalt (wenn nicht leer) in die E-Mail schreiben //
      $mailText .= $name.": ".nl2br($_POST[field2url($name)])."\r\n";

      Viel Spaß mit der Lösung und
      Schöne Grüße
      Tristan

  5. hm jetzt bekomme ich immer Warning: session_start() [function.session-start]: Cannot send session cache limiter – headers already sent ich benutze zum bearbeiten der dateien den Rapid PHP 2014 Editor. Speichern tute ich es auch als utf8

  6. Hey Tristan,
    auch ich finde dein Formular echt super und möchte mich für deine tolle Arbeit bedanken!
    Ich hab leider das Problem, dass ich die Eingabefelder nicht breiter machen kann, ich kann einfach die Funktion nicht finden (bin im HTML zu Hause :-P).
    Hast du da einen Tip für mich? Google mag mir nicht helfen.
    Vielen Dank schonmal!
    Viele Grüße,
    Ben

    1. Hi Ben,

      Durchsuche die kontakt.php einfach nach „// Felder auslesen //“. In den nachfolgenden Zeilen findest du die jeweiligen HTML-Codes. Mit style/class-Attributen kannst du dort dann per CSS die Breite der Felder verändern.

      Schöne Grüße
      Tristan

      1. Hallo, Danke für das super Formular, einfach spitze.
        Feldlänge konnte ich leider nicht verändern, bin blutiger Anfänger in php. Würde gerne über css die Länge der Felder einheitlich verlängern und bitte um Hilfe.
        Danke im Voraus.
        Rainer

  7. Hallo!

    Kann man irgendwie die Schriftart/Schriftfarbe für „Anrede“, „Vorname“, „Nachname“ etc. ändern?

    Danke für das super Script!

    1. Hi Johannes,

      Ja, das kannst du. Im Script findest du nach „Felder auslesen“ Mehrmals die Angabe:

      ‹td›".$name.":

      Nun kannst entweder per class-Attribut oder per style-Attribut die Eigenschaften verändern. Ein Beispiel:

      ‹td style=\"font-family:Arial;color:blue;\"›".$name.":

      Viel Erfolg dabei wünscht
      Tristan

    1. Hallo Martin,

      Entweder wurde das Captcha nicht korrekt angegeben oder Du solltest Dir noch einmal alle Felder angucken, die als „Pflichtfeld“ gesetzt wurden. Bei mir funktioniert alles, wie es soll.

      Schöne Grüße

  8. Hi Tristan

    erstmal danke für das Script, doch leider funktioniert es nicht, wie es soll.
    Ganz von vorne angefangen habe ich folgendes gemacht:

    1. Ich habe die ersten Zeilen in meine html-Datei integriert und diese in .php umbenannt, damit sie auch ordentlich interpretiert wird, wenn das Framework es nicht ordentlich macht 😉 (ich benutzt Bootstrap)

    Dazu erstmal die Frage: Wenn ich im html-Code: habe, benötige ich dann noch header(‚Content-Type: text/html; charset=utf-8‘);
    Muss ich evtl eines davon entfernen, damit Google es nicht „doppelt“ ließt 😉 ?

    2. Da meine html (jetzt php) Datei schon recht groß ist (1Pager), habe ich den 2ten Teil in eine weitere php-Datei ausgelagert und binde sie mit:


    in meine Seite ein. Die Klasse hab ich gesetzt, damit ich das auch an meine Styles anpassen kann !

    Das Formular wird korrekt dargestellt, meine Styles übernimmt er ordentlich nur abschicken tut er nicht und eine Fehlermeldung bekomme ich auch nicht.

    Muss ich das Script evtl. in die html(php :)-Datei schreiben, damit es funktioniert oder geht das etwas anders. (habs probiert, das ist auch nicht der Fehler )

    3. Ich wollte eine Checkbox integrieren mit folgendem Code:
    ‚Wie haben Sie von mir erfahren‘ => array(‚checkbox‘, true, array(‚Suchmaschine‘, ‚Freunde / Bekannte‘, ‚Visitenkarte / Flyer‘, ‚Sonstiges‘)),
    dieser steht zwischen der ‚E-Mail-Adresse‘- und ‚Betreff‘-Zeile.

    Vielen Dank ;))
    Monti

    1. zu 2

      hat er beim ersten mal nicht richtig übernommen, ich geh davon aus, das tags ignoriert werden damit kein böser code hier unheil stiftet…
      s.o. so habe ich es eingebunden, natürlich ohne die vielen leerzeichen

    2. Hallo Monti,

      es freut mich, dass dir das Skript gefällt. Bitte schreibe mir bei solchen individuellen und umfangreichen Anfragen doch eben eine Email, dann ist der Code auch lesbar.

      Schöne Grüße
      Tristan

  9. Moin Tristan!

    Vielen Dank für Dein tolles Kontaktformular!!!

    Nachdem es mir nun gelungen ist, dieses in meine Website „einzubauen“ stoße ich noch auf kleinere Schwierigkeiten.
    Es ist mir z.B. gelungen die Textboxen und die Textarea in der Breite anzupassen: <textarea style=\"width:400px\" name=\""…usw. usw.

    Aber wie bekomme ich die Hintergründe dieser z.B. Voll-Weiß (#fff)?!? Egal, was ich da anstelle, ich komme zu keiner Lösung.

    —–

    Ich habe noch mehr Formatierungsschwierigkeiten. Das php-Script des Kontaktformulars habe ich in ein DIV gesetzt. In diesem DIV regelt eine CSS-Datei die Formatierungen für Schriftfarbe, -art und -größe. Änder ich hier etwas, wird diese Änderung für die Texte oberhalb der php-Zeile "$fields = array" voll übernommen. Nicht jedoch für die Texte/Wörter (Anrede, Name, Vorname usw.) unterhalb dieser Zeile??? Hier wird NUR(!) die Schriftart übernommen – Farben, Größe, Stil usw. NICHT!

    Woran liegt das?

    Danke Dir ganz herzlich!

    LG
    Lenni

    1. Moin Lenni,

      Den Hintergrund legst du auch ganz einfach per CSS fest, in deinem Fall mit style="width:400px;background:#fff;". Das Textfeld wird in der Regel jedoch bereits einen weißen Hintergrund haben, solltest du den Rahmen setzen, dann nutze das Attribut border.

      Versuche es doch mal, in dem du !important benutzt, damit gibst du vor, dass dieser CSS-Code alles andere überschreiben soll, zB .divKlasse{color:#666 !important;}.

      Für weitere Fragen zu CSS, kannst du dir zum Beispiel dieses Tutorial anschauen.

      Schöne Grüße
      Tristan

  10. Hallo! Super script gefällt mir 🙂 Gibt es die Möglichkeit die Beschriftung des Buttons zu ändern? Ich kann im Code nichts zum Button finden..
    VG
    Phil

    1. Meine Frage hat sich soeben erübrigt, ich hatte die Stelle im Code übersehen.. Kann mir jemand erklären ob und wenn ja, wie es möglich ist, den Button durch einen „eigenen“ Button (Div Container mit Bild) zu ersetzen?
      Vielen Dank!
      VG
      Philipp

  11. Hallo,

    prima Script. Danke!

    Kann man auch eine automatische Weiterleitung nach einigen Sekunden einfügen?

    Wie kann man die eingegebene Mail-Adresse auf richtige Syntax prüfen?

    Vielen Dank vorab

    1. Hallo Karsten,

      das freut mich! Informationen zu Weiterleitungen findest Du hier. PHP-Weiterleitungen können allerdings nicht zeitverzögert erfolgen, das kannst du nur über HTML oder JavaScript realisieren.

      Wenn du dein Skript um eine Email-Syntax-Prüfung erweitern willst, kannst du einfach mal googeln und ein kleines PHP-Skript einbauen.

  12. Zwei Sachen sind mir noch aufgefallen:

    Wie kann man eine Kopie der Mail an den Verfasser senden?

    Wie verhindert man das mehrfache Absenden des Formulars?

    Danke!

    1. Eine (Blind-)Kopie kannst du über den sog. BCC-Header senden. Ergänze dazu einfach den Inhalt der Variable $mailHeader um ."Bcc: email@adresse.de;"."\r\n".

      An einem Codeschnipsel gegen mehrfaches Absenden kannst du dich entweder selbst probieren – mit einem versteckten Feld und zufällig generierten Code, der in der Session gespeichert wird und nur einmal angenommen wird – oder du nutzt die Captcha-Variante, die zumindest einen etwas besseren Schutz dagegen bietet.

  13. Hi erstmal vielen Dank für das Skript es ist eine Wucht.
    Ich bin 67 und erst vor 10 Jahren zum Computer gekommen und damit fast keine Ahnung vom Programmieren und von englisch erst recht nicht.
    Ich habe es bis jetzt fertig gebracht die Schriftfarbe zu ändern den Hintergrund Transparent zumachen und die Textfelder alle zu verlängern.
    Jetzt möchte ich noch wegen der Optik die Schaltfläche „ Formular abschicken „ genau unter die Schaltfläche vom captcha_code verschieben.
    Ich bin komplett ratlos, vielleicht kann mir hier jemand weiter helfen.
    Hier mal mein Code:

    <?php
    (dann kommt das Skript )

    Vielen Dank erstmal an alle

      1. Für alle, die es auch interessiert:

        Einfach die Zeile „“

        in

        „“

        abändern. Die Pixelangabe ist natürlich individuell anzupassen.

  14. Hallo Tristan,

    zunächst mal vielen Dank, macht einen sehr guten Eindruck.
    Ich konnte alles problemlos einbinden, es werden keine Fehler im Code angezeigt, das Captcha scheint zu funktionieren, aber ich bekomme IMMER die Fehlermeldung „Es ist ein Fehler aufgetreten: Es wurden nicht alle Felder korrekt ausgefüllt“. Auch wenn ich alle Felder als Nicht-Pflichtfelder (False) markiere.

    Hab schon verschiedenes ausprobiert, alles „true“, alles „false“, Felder weggelassen, nochmal das Captcha überprüft, aber ich komme nicht dahinter wo der Fehler herkommt. Wahrscheinlich ist es simpel, aber ich sehe es nicht. Für etwas Hilfe wäre ich dankbar.

    Gruß,
    Daniel

    1. Hallo Daniel,

      Dieser Fehler wird dir angezeigt, wenn der Spam-Schutz eingreift, das Captcha falsch übergeben wurde oder ein Pflichtfeld nicht ausgefüllt wurde.

      Du kannst temporär einmal in Zeile 62 (unter „// Pflichtfeld nicht ausgefüllt…“) ein echo "Pflichtfeld"; einfügen. Und ihn Zeile 73 ein echo "Captcha";. Je nachdem, was nun bei deinem Test ausgegeben wird, kannst du sehen, woran es liegt. Eventuell solltest du es auch einmal mit einem anderen Browser testen.

      Viel Erfolg & Beste Grüße!

  15. Herzlichen Dank! KLASSE!
    Funktioniert auf Anhieb, nachdem mein altes Formular nach einem PHP-Update ausgestiegen ist.

    Nun hängen die Felder aber sehr weit links auf der Seite. Wie kann ich dasFormular zentrieren oder einrücken?
    (Bitte für Total-DAU’s)
    Ein text-align: center hat mir nix gebracht.
    Ausserdem ist das Kommentarfeld sehr klein. Kann ich das vergrössern?
    Und wie kann ich bei falschem Capture einen Hinweis: „Capture falsch!“ erzeugen?

    Dann wäre es perfekt!

    LG und nochmal ein grosses DANKE

    Olaf

    1. Hallo Olaf,

      1. Du kannst das Formular als ganzes, d.h. den

      Tag zB zentrieren: <form style="text-align:center;">. Alternativ ist zB auch ein padding-left:20px; oder margin-left:20px; denkbar.

      2. Über die entsprechende Zeile im Code kannst du auch das Textfeld (textarea) anpassen, zB <textarea style="width:200px;height:150px;">.

      3. Um einen spezifischen Captcha-Fehler anzuzeigen, kannst du folgende Zeile nach 73 („$sent = false;“) einfügen:
      $msgError = "Das Captcha wurde nicht korrekt ausgefüllt.";

      Viel Erfolg mit dem Captcha!

      1. Diese Meldung kommt dann aber auch, wenn man zusätzlich eines der Pflichtfelder nicht ausgefüllt hat oder das Formular einfach leer abschickt.
        Also es erscheint in diesem Fall „Captcha nicht richtig ausgefüllt!“.
        Wie kann man die Meldung „Pflichtfelder nicht ausgefüllt“ priorisieren und die Meldung „Captcha nicht richtig ausgefüllt“ erst in einer zweiten Prüfung berücksichtigen?

  16. Hallo

    gibt es das Script auch mit SMTP Auth Funktion
    Da mein Provider meinte es müsse die Standartversion abschalten. Für Hilfe wäre ich dankbar

    Gruß

  17. Vielen Dank für die Mühe!

    Das Kontaktformular funktioniert gut. Allerdings gibt’s bei mir zwei PHP Fehlermeldungen:
    Warning: Cannot modify header information – headers already sent by … line 5.
    Warning: session_start(): Cannot send session cache limiter – headers already sent … line 6.
    Wie muss ich den Doctype anpassen, damit das verschwindet? Im Moment steht bei mir

    Muss das Charset in den Metatags gelöscht werden, wenn es im PHP-Header definiert wird?

    Wenn ich die Seite aktualisiere (z.B. F5), wird mir jedesmal über das Formular eine neue Mail geschickt.

    Viele Grüße
    Arne

  18. Hallo Tristan,
    vielen Dank für das tolle Formular! Es funktioniert wunderbar.
    Nun möchte ich gerne, dass das Formularfeld „Betreff“ auch in die Betreffzeile der versendeten Mail geschrieben wird. Leider bin ich in php nicht allzu fit und bekomme es einfach nicht hin. Wie kann ich das bewerkstelligen?
    Viele Grüße,
    Manuel

    1. Hi Manuel,

      Du kannst nach der Zeile 60 ($mailText .= $name.“: „.$_POST[field2url($name)].“\r\n“;) folgenden Code einfügen:

      if ($name == "Betreff") { $mailSubject = $_POST[field2url($name)]; }

      Viel Erfolg mit dem Formular!

      Beste Grüße
      Tristan

  19. Hallo,

    Ich betreibe eine Katzenpension und würde gerne dieses script für meine Homepage nutzen, darf Ich das mit diesem Formular + capcha. Oder muss ich dafür eine Lizenz erwerben, Ich frage nur vorher, um böse überraschungen zu vermeiden.

    1. Hallo atze,

      Du darfst das Skript auch für gewerbliche Zwecke kostenfrei verwenden.

      Ich freue mich natürlich über einen Link oder eine Empfehlung, wobei das freiwillig ist 🙂

      Beste Grüße
      Tristan

  20. Hallo Tristan,

    ich habe Dein Script mit einiger Begeisterung ausprobiert und dann in eine Test-Website auf unserem Server eingearbeitet.
    Eigentlich sieht alles gut aus und funktioniert, abgesehen von ein paar Fehlermeldungen des xhtml-Validators. Jedoch bekomme ich die gesendeten Nachrichten einfach nicht zugestellt.
    Da ich in PHP/HTML nicht gerade der Spezi bin, sitze ich nun etwas hilflos vor der Tastatur …
    Woran könnte es hängen?

    Viele Grüße
    Thomas

    1. Hallo Thomas,

      Das liegt dann vermutlich an deinen Servereinstellungen. Die mail() Funktion basiert auf dem PHP-Mailer. Womöglich ist dieser nicht korrekt integriert oder deaktiviert. Da solltest du einmal deinen Serveradministrator kontaktieren.

      Beste Grüße
      Tristan

  21. Hallo,

    ist es irgendwie möglich, dass im Email-Eingang bei einer neuen Mail nicht „kontaktformular@e-mail adresse“ dort steht, sondern die E-Mail Adresse des Absenders.

    Vielen Dank für die Hilfe

    Gruß Max

    1. Hi Max,

      Nach Zeile 60 ($mailText .= …) kannst du folgenden Code einfügen:

      if ($name == „E-Mail-Adresse“ && filter_var($_POST[field2url($name)], FILTER_VALIDATE_EMAIL)) { $mailHeader = „From: „.$_POST[field2url($name)].“\r\n“.“Content-type: text/plain; charset=utf-8″.“\r\n“; }

      Beste Grüße
      Tristan

      1. Wenn ich den Code einfüge, wird das Formular leider nicht mehr angezeigt. Irgendwo ist ein Fehler drin..

        Vielleicht kannst du mir den richtigen Code ja hier mal reinkopieren.

        Danke

        1. Das liegt wohl daran, dass die Anführungszeichen hier anders angezeigt werden, die solltest du dann einfach durch normale Anführungszeichen ersetzen.

      2. Wenn ich diese Lösung verwende wird mir die Mail mit folgendem Absender geschickt „ftp262503-2720983@sh4-17.1blu.de“ statt der im Formular angegebenen Mailadresse.
        Scheinbar mein FTP Username bei meinem Webhoster.

        Gibt es eine andere Lösung?

          1. Danke, ich hab es inzwischen hinbekommen 🙂
            Ich hatte dem Feld „E-Mail-Adresse“ einen abgeänderten Namen gegeben. Deswegen hatte es nicht funktioniert.
            Nun wird aber die Adresse aus dem E-Mail Feld auch als Absenderadresse benutzt 🙂

  22. Hallo Tristan
    ich habe dein klasse script meinen Wünschen angepasst. Jetzt möchte ich aber, dass der User (E-Mail-Adresse) dieselbe Mail bekommt und der Admin quasi in die BCC geht.
    Kannst du mir da helfen?

    1. Hallo Nobby,

      du findet an 2 Stellen im Skript ein $mailHeader =. Dort musst du den Header so anpassen, dass du z.B. „BCC: email@adresse.de\r\n“ anfügst.

      Zusätzlich musst du noch bei dem mail() Befehl die Adresse des Nutzers angeben, etwa indem du sie in Zeile 66 (beim Kommentar „Email-Adresse als Absender setzen“) in einer neuen Variable speicherst.

      Viel Erfolg dabei.

      Schöne Grüße
      Tristan

  23. Hallo, den Danksagungen für das geniale Script möchte ich mich uneingeschränkt anschließen. Per style und css Klassen konnte ich es hervorragend auf meine Websiteanforderungen anpassen: shiatsutuina.de . Ich würde jetzt nur noch gerne eine Art Sprungmarke (Popup oder neue Seite) für die Fehlermeldung $msgError und $msgSent einbauen. Da ich leider kein php Profi bin, würde ich mich über Hinweise oder Codebeispiele sehr freuen!

    1. Es freut mich, dass dir das Kontaktformular geholfen hat. Die sog. Anker in HTML sollten in dem Fall das richtige Stichwort sein. So kannst du dem Formular eine ID zu teilen und in der URL „#id“ darauf verweisen. Viel Erfolg dabei!

  24. Hallo,

    funktioniert tadellos.
    Wie kann ich nach erfolgreichem versenden des Formulars auf eine Danke Seite weiterleiten?

    Hast Du einen Tipp für mich?

  25. Das Kontaktformular ist echt Top. Leider habe ich noch das Problem, wenn ich in einem Feld, das auch nicht Pflicht ist nur eine Zahl eingebe, bekomme ich eine Fehlermeldung. Gebe ich aber einen Buchstaben ein, wird die Mail versendet.

    1. Hallo Thomas,

      Du meinst, dass du in ein Nichtpflichtfeld etwas eingibst? Welche Fehlermeldung bekommst du denn? Eigentlich hat die Eingabe in Nichtpflichtfeldern keinen Einfluss auf das Senden.

      Beste Grüße
      Tristan

      1. Bekomme den Fehler „Es ist ein Fehler aufgetreten: Es wurden nicht alle Felder korrekt ausgefüllt.“
        Habe jetzt aber gemerkt, dass wenn ich keinen Captchacode eingebe, dann versendet er das Kontaktformular. Also lade ich das ohne Captcha runter und versuche es damit. Dan habe ich leide kein Spamschutz, aber es funktioniert dann hoffentlich. Danke für die schnelle Antwort.
        Frust Thomas

        1. Hallo Thomas,

          Prüfe einmal ob Sessions + Cookies bei dir richtig arbeiten. Womöglich wird deswegen ein leerer Captcha-Code als der richtige Code gespeichert.

          Beste Grüße
          Tristan

  26. Hallo,

    erstmal vielen Dank für die Bereitstellung dieser tollen Lösung.
    Bei mir funktioniert die Variante mit dem Captcha nicht.
    Es wird kein Captcha geladen., obwohl der Anleitung gefolgt bin.

    Beste Grüße
    Jan

  27. Hallo,

    ich hatte gerade bemerkt, dass die Captcha-Lösung nicht bei mir funktioniert. Ich habe die PHP Version von 5.5 auf 7.0 umgestellt und jetzt läuft es 🙂

    Der vorherige Kommentar ist damit überflüssig

  28. Hallo Tristan,
    erstmal vielen Dank für das tolle Kontaktformular. Ich habe leider ein paar Probleme damit: 🙁

    1. Ist es möglich, dass eine Kopie der Nachricht an den Absender geschickt wird? Wenn möglich anstelle der Newsletter-Checkbox.
    2. Ich würde gerne den Betrefftext festlegen der bei meinen Emails angezeigt wird damit ich sofort sehe, dass es sich um eine Nachricht handelt die über mein Kontaktformular versendet wurde. Ist das möglich?

    3. Der Captcha funktioniert nicht.

    Wäre super, wenn du mir weiterhelfen könntest.

    Vielste Grüße
    Daniel

    1. Hallo Daniel,

      1. Die Kopie kannst du über den BCC-Header realisieren (siehe meinen Kommentar vom 28. März 2016).

      2. Für den Betreff kannst du den Inhalt von $mailSubject anpassen. Allerdings hat dieser dann auch Einfluss auf den Betreff in der E-Mail-Kopie.

      3. Bitte prüfe, ob bei dir GD-Library funktionsfähig ist.

      Beste Grüße
      Tristan

      1. Ok, vielen Dank. Frage 2 und 3 habe ich nun gelöst. Zu der Email-Kopie habe ich allerdings noch eine Frage:
        In deinem Kommentar vom 28.3.16 muss doch beim bcc eine Email-Adresse angegeben werden. Ich würde das aber gerne so machen, dass die Nachricht an die eingetragene Email-Adresse gesendet wird, also die vom Verfasser. Ist das möglich?

        Viele Grüße
        Daniel

        1. Die E-Mail-Adresse kannst du im Skript unter „E-Mail-Adresse als Absender setzen“ in Zeile 71 ff. in einer Variable speichern und diese dann für den BCC-Header verwenden.

          Viel Erfolg mit deinem Kontaktformular!

  29. hallo Tristan,
    ich habe mir das kontaktformular istsalliert, das wircklich super auschaut.
    leider wird nach dem absenden, keine mail empfangen.
    alles scheint ok zu sein, keine fehlermeldung usw.
    habe natürlich im script meine mailadresse eingetragen.
    vielleicht hast du da eine lösung.
    kann es daran liegen das ich https nutze?

    1. Hallo Paul,

      an einer verschlüsselten Verbindung liegt das nicht. Du solltest sicherstellen, dass sendmail bei dir korrekt konfiguriert ist.

      1. Hallo Tristan,
        bei mail einstellungen bin ich blutiger anfänger,
        das einzigste das ich gefunden hab wo ich was an mail einstellungen machen kann ist:
        mail.force_extra_parameters :
        „Zusätzliche Parameter für die Funktion mail(), die für das Versenden von Mails verwendet wird. Wenn Sie z. B. Ihre eigene Sendmail-Konfiguration nutzen möchten: -C /dir/conf.cf“

        ich hätte auch hier keine ahnung was ich ändern muss.
        falls das hier zu viel wird könntest du mir auch gerne per mail schreiben.
        da ich keine Idee habe was ich ändern muss, wäre ichb um hilfe froh, da ich so ein Problem noch nie hatte.

        1. Ich kann dir aus Zeitgründen leider keinen individuellen Support anbieten und bitte um Verständnis. Ggf. kann dir dein Webhoster weiterhelfen. Das Programm sendmail muss installiert sein und in der PHP INI korrekt konfiguriert sein.

          1. hallo,
            ich danke dir Totzdem, werde mich weiter damit beschäftigen, da ich dein script verwenden möchte.
            werde weiteres berichten, kann allerdings bissel dauern 🙂

          2. was ich jetzt gesehen habe werden auf meinem server die mails nicht über php versenden hier wird nun smtp genutzt , was immer das auch bedeutet, denke deswegen funktioniert das nicht, gehe davon aus das sendmail daher garnicht installiert ist
            Gruss Paul

          3. Hallo Tristan,
            ich habe nun das Kontaktformular hinbekommen das es funktioniert.
            Ich bin kein Profi, aber versuche mal zu erklären an was es lag.
            Das Problem lag darin, dass ich einen eigenen Mailserver habe, der nicht direkt über php sondern smtp Mails versendet.
            Ich habe nun einfach nur für das Kontaktformular eine Mailadresse eingetragen wo das ganze mit direkt über php funktioniert.
            Auch Mailadressen von yahoo gehen nicht, auch das habe ich versucht.
            Ich denke das man das Skript erweitern kann , aber wie genau muss ich als leihe erstmal rausfinden, möglicherweise müssen erstmal die Inhalte erweitert werden.
            // SMTP aktivieren
            $oMailer->isSMTP();

            // SMTP-Server
            $oMailer->Host = ’smtp.domain.com‘;

            // SMTP Authentifizierung aktivieren
            $oMailer->SMTPAuth = true;

            // SMTP Benutzer
            $oMailer->Username = ‚user@domain.com‘;

            // SMTP Benutzer Passwort
            $oMailer->Password = ‚foobar‘;

            // Verbindungssicherheit setzen ( SSL und TLS möglich )
            $oMailer->SMTPSecure = ‚tls‘;

            // Verbindungsport festlegen
            $oMailer->Port = 587;
            Aber was, wie und wo das gemacht wird, muss ich erstmal austesten, wie gesagt bin leihe.

            Aber jetzt geht’s bei m mir, das Kontaktformular ist sehr gut und ansonsten einfach handzuhaben.
            Danke für dieses gute script
            Gruss Paul

  30. Vielen Dank für das supergeniale Script!
    Es ist einfach gehalten und ohne viel Schnickschnack und vor allem es funktioniert! :)))
    Es lässt sich leicht an die eigenen Bedürfnisse anpassen und wunderbar in eine bestehende Seite integrieren.

    Ist es irgendwie möglich die $msgError Meldung in roter Schriftfarbe auszugeben und eine Zeilenumbruch danach einzufügen?

    1. Es freut mich, dass dir das Skript hilft. Individuellen Support kann ich dir leider nicht anbieten. Du kannst mittels CSS/HTML selbstverständlich die Schriftfarbe (CSS „color“) formatieren und einen Zeilenumbruch (<br />) einfügen.

  31. Hallo,

    erst einmal danke für das gute Script, ich bin gerade am Basteln und möchte vielleicht auch gern das Script in meine kleine Homepage einbauen und hier und da den eigenen Bedürfnissen anpassen.

    Da ich nur html nutze und bei php immer nach dem Prinzip try and error Dinge ändere habe ich eine Frage :
    Kann man eine einfache Prüfroutine für die email-Adresse integrieren, die vielleicht drei Dinge abprüft:
    1.) Prüfung, dass „@“ enthalten ist,
    2.) dass vor dem „@“ mindestens 3 Zeichen stehen und
    3.) dass am Ende „.“ und nur Buchstaben stehen?

    Viele Grüße
    Ingolf

    1. Hallo Ingolf,

      das ist natürlich möglich. Ich empfehle dir, die filter_var() Funktion anzuschauen, die bereits an anderer Stelle zum Einsatz kommt und prüft, ob die E-Mail-Adresse gültig ist. Diese Funktion sollte bevorzugt gegenüber eigenen Ansätzen eingesetzt werden.

      Beste Grüße
      Tristan

  32. Hallo,
    von meinem Provider erhielt ich den Hinweis, auf php7 umzustellen.
    Funktioniert das Formular dann auch noch bzw. muss am Formular noch etwas geändert werden?

    VG
    Thomas

    1. Hallo Thomas,

      die Änderungen in PHP7 sollten keine Auswirkungen auf das Skript haben. Solltest du wider Erwarten Probleme feststellen, freue ich mich über dein Feedback.

      Beste Grüße

  33. Hallo Tristan,

    ist es möglich die Größe des Textfeldes für die Nachricht zu ändern? Also für das Textfeld „Mitteilung“?
    Ich finde es etwas zu klein und würde es gerne größer machen.

  34. Hallo Tristan,
    vielen herzlichen Dank für das fantastische Kontaktformular. Es funktioniert tadellos. Ich habe jedoch eine Frage zur Sicherheit. Das Formular verfügt über ein verstecktes Feld sowie (optional) ein Captcha als Spamschutz. Wie sieht es mit anderen Maßnahmen gegen Missbrauch aus, wie z.B. Schutz vor Mail Header Injection? Ist das Formular gegen einen solchen Angriff oder andere Attacken abgesichert?
    Ich wäre Dir sehr dankbar für eine Antwort.
    Beste Grüße Ernst

    1. Hallo Ernst,

      Als einziger individueller Mail-Header wird ggf. der From-Eintrag gesetzt. Dabei wird die PHP-interne Funktion verwendet, um die E-Mail-Adresse zu validieren, was eine Header Injection in der Form unwahrscheinlich macht.

      Da es sich um ein kostenloses Skript handelt, kann ich keine Verantwortung für die Sicherheit übernehmen.

      Beste Grüße
      Tristan

  35. Hallo Tristan!
    Geniales Skript! Hat mir nach ewig langer Suche genau das geliefert, was ich brauchte.
    Hier im Kommentarbereich wurde schon ein paar Mal nach Anpassung der Größe für die Mitteilungs-Box gefragt. Könntest du bitte kurz erörtern, wie man diese Box ein bisschen größer machen kann? Vielen Dank für deine Arbeit!

    1. Hallo Maik.

      du kannst beispielsweise durch Einfügen von style=“width:300px;“ beim Textarea die Größe verändern.

      Beste Grüße

      1. Danke für deine Antwort! Kannst du mir kurz sagen, an welche Stelle ich den Befehlt schreiben muss? Ich habe Angst, mir was zu zerschießen.

        1. Ich habe den Artikel aktualisiert (siehe „9. CSS anpassen“). Auf diesem Wege kannst du ebenfalls dein Formular anpassen.

  36. Hallo Tristan,
    erstmal danke für deine Arbeit.
    Es wurde hier zwar schon mal gefragt, aber die Antwort kann ich mir nicht ansehen.
    -Wie kann ich das ganze zentrieren?
    -Wie kann ich die Kästchen größer machen. Kannst du mir hier ganz genau sagen wo ich style… einfügen muss?

    Viele Grüße Marcel

    1. Hallo Marcel,

      Das musst du beim textarea (Zeile 125) einfügen oder per CSS. Bitte habe Verständnis, dass ich zu individuellen Anpassungen keinen Support mehr geben kann.

      Beste Grüße
      Tristan

  37. Hallo,
    vielen dank für das gute PHP Script zum E-Mailkontakt.
    Ich setzte es seit gestern für unseren Verein auf dessen Webseite ein.Diese ist HTML 5 mit „charset=UTF-8“
    erstellt.
    Nun werden alle Umlaute, die über das kontakt.php zugestellt werden nicht dargestellt. Im Formularscript steht schon „Charset=UTF-8“, auch für das Versenden.
    Was muss ich ändern oder eintragen?

    Vielen Dank für Ihre Antwort
    Mit freundlichen Grüßen
    Reinhold Grasbeunder

    1. Beachten Sie bitte vorallem, dass Ihre PHP-Datei auch tatsächlich in UTF-8 gespeichert wird (Editor-Einstellungen) und über den Server kein anderer Header gesendet wird.

      Mit besten Grüßen
      Tristan

  38. Hallo Tristan,

    vielen dank für dieses tolle Script und die Anleitung.
    Selbst als absolute Anfängerin hab ich das auf Anhieb hinbekommen.
    Nun möchte ich noch den Absenden-Button und die Fehlermeldung per CSS stylen. Wie spreche ich denn diese beiden Elemente an? Ist das überhaupt möglich? Bis jetzt habe all meine Vesuche nicht geklappt.
    Vielleicht kannst Du mir einen kleinen Tipp geben?
    Schöne Grüße, Anna

  39. Hi Tristan,
    hab es rausgefunden, wie ich den Button mittels CSS anspreche. Es funktioniert alles wunderbar. Was ich aber nicht verstehe: Wie kann ich der Fehlermeldung eine ID oder Klasse zuweisen? Möchte die Farbe ändern und den Abstand zum Formular vergrößern…
    VG, Anna

    1. Hallo Anna,
      vor dem Problem habe ich auch gestanden und habe es gelöst, indem ich im Script die Zeile, in der „$msgError“ steht so verändert habe:
      $msgError = ‚Fehler: Bitte alle Pflichtfelder (*) ausfüllen und Datenschutzhinweis bestätigen.‘;
      Hat bei mir funktioniert. Die Fehlermeldung ist jetzt rot und größer.Auf diese Weise könntest Du sicherlich auch eine Klasse zuweisen.
      Ansonsten tolles Script und Dank an Tristan.
      VG Rainer

  40. Hallo Tristan,
    sehr schön schlank gehalten, das Script. Danke dafür.
    Ich würde gerne an unterschiedlichen Stellen des Formulars radiobuttons zur Auwahl stellen.
    Das ist leider momentan nicht vorgesehen.
    Soll diese Erweiterung noch kommen, oder bin ich alleine mit der Frage.
    Beste Grüße
    Martin

    1. Hallo Martin,

      Danke dir für Dein Feedback! Das werde ich eventuell in einer kommenden Version berücksichtigen. Alternativ kannst du dafür ein select-Feld verwenden.

      Beste Grüße

  41. Hallo Tristan, vielen Dank für das super Formular.
    Funktioniert alles bestens.
    Außer:
    Wenn man die Seite aktualisiert (z.B. F5), wird jedesmal eine neue Mail (gleiche Mail) noch mal abgeschickt- trotz Captcha.
    Kannst Du mir da helfen?
    Vorab vielen Dank für Deine Antwort.
    Beste Grüße
    Manfred

    1. Hallo Manfred,

      ich kopiere einfach mal die Antwort an Karsten:
      An einem Codeschnipsel gegen mehrfaches Absenden kannst du dich entweder selbst probieren – mit einem versteckten Feld und zufällig generierten Code, der in der Session gespeichert wird und nur einmal angenommen wird – oder du nutzt die Captcha-Variante, die zumindest einen etwas besseren Schutz dagegen bietet.

      In einer zukünftigen Version werde ich das berücksichtigen und selbst einbauen.

  42. Hallo Tristan,
    dein Formular ist und funktioniert super!
    Was mir grad noch nicht ganz passt ist das Feld zur E-Mail-Adresse, welches sich mit allem außer leer zufrieden gibt. Ich habe einiges mit filter_var() und auch mit ($_POST[field2url($name)].indexOf (‚@‘,0) == -1 || ($_POST[field2url($name)].indexOf (‚.‘,0) == -1 durchprobiert… und weiß weder wo noch was ich probieren könnte… Hättest du einen Tipp für mich?
    Einen lieben Gruß,
    Ulrike

  43. Hallo und vielen Dank für das Formular.

    Dem „mit irgendwas zufrieden“ schließ ich mich an aus diversen Aspketen, da ich das auch nicht hinbekommen habe und mir heute ein Scherzkerks die Adresse als Absender eingegeben hat, an die auch das Formular gesendet wird. Eine Überprüfung inkl. Blacklist bzw. Möglichkeit zu sperren wäre da super 🙂

  44. Vielen Dank für das tolle Skript mit funktionierenden Captchas sogar, das ich als Laie auch einfach verwenden konnte.
    Nach ein paar Testmails kam aber plötzlich keine Mail mehr an und ich habe per ftp-Zugriff festgestellt, dass sich eine neue Datei im Verzeichnis eingefunden hat:
    .htPOSTdata.txt
    der Inhalt ist eine Array mit Daten einer Person in Polen …
    Irgendwie spookie..
    Meine Frage wäre jetzt :
    kann ich (muss ich) das Verzeichnis schützen um fremde Dateiablagen zu verhindern und doch ein funktionales Skript darin zu lassen? Wie müsste ich das machen? Hat eins mit dem anderen etwa gar nichts zu tun?
    Wie wohl zu merken, ich bin ganz Laie und freu mich über Rückmeldung.
    mit besten Grüßen
    Karin

    1. Hallo Karin,

      dies muss an anderen Scripten/Lösungen liegen, die du einsetzt. Von meinem Script sollte eine solche Datei nicht angelegt werden.

      Unabhängig davon sind Dateien, die mit „.ht“ beginnen, in der Regel nicht von außen abrufbar.

      Beste Grüße

  45. Danke für das Formular!

    Wie bekommt man die Beschreibung vor den einzelnen Feldern (Vorname, Nachname… usw.) weg und dafür placeholder in die Felder?

    Wäre sehr dankbar für eine Lösung

    Grüße

    1. Hallo Tobias,

      Heute ist die neue Version des Kontaktformular-Skripts erschienen. Damit sind auch placeholder möglich. Den Text vor den Feldern kannst du entfernen in dem du an den jeweiligen Stellen „.$name.“: entfernst.

  46. Die neue Version ist super! Danke für die schnelle Antwort!

    Eine Frage noch. Ist es möglich das nachdem man auf „Formular abschicken“ geklickt hat, nicht zum Anfang der Seite gesprungen wird sonder genau an die stelle wo das Formular ist, da wo dann die Info steht ob es gesendet wurde oder einen Fehler gab? Das wäre super

    1. Du kannst bei der action-Eigenschaft im form-Element auf einen Anker verweisen (z.B. kontakt.php#anker), dann wird zu dem Element mit der entsprechenden ID „anker“ gesprungen.

      1. ich kenne mich mit php nicht aus und ich weiß nicht wo genau ich was in deinem Code schreiben muss das dann nach dem senden an den Anker (kontakt.php#anker) gesprungen wird.

        Ich kenn mich leider nur etwas mit html aus.
        Wäre dir sehr dankbar wenn du mir helfen könntest!

        1. PHP ist dafür nicht erforderlich. Die action-Eigenschaft von form setzt du z.B. auf „kontakt.php#anker“ und dann kriegt ein Element, z.B. div-Element im Kontaktformular die id=“anker“. Darüber hinaus kann ich leider keinen individuellen Support anbieten.

          1. jetzt versteh ich es…

            OK und Danke!

            Wäre aber vielleicht auch sinnvoll es direkt in dein Code zu integrieren das immer nach senden an die Stelle gesprungen wird wo dann der Hinweis ausgegeben wird (ob gesendet wurde oder der Code falsch eingegeben wurde) denn wenn immer nur an den Anfang der Seite gesprungen wird könnte das verwirren weil man den Hinweis nicht sieht

  47. Lieber Tristan,
    entschuldige bitte meine letzte Nachricht.
    Die neue Version habe ich noch nicht gesehen.
    Gegenüber der alten Version sieht alles sehr eng aus.
    http://www.lang39122.de/kontakt.php
    http://www.lang39122.de/test5kontakt.php
    Auf der einen Seite gefallen mir die neuen Möglichkeiten,
    aber die Darstellung ist zu schmal. Dadurch werden die Bezeichnungen in zwei Zeilen geschrieben.
    Hierzu habe ich bisher keine Lösung gefunden.
    Herzliche Ostergrüße
    Gerhard Lang

  48. Hallo Tristan,
    jetzt bin ich wieder etwas weiter mit der neuen Version.
    Bei „Kopie an mich selbst“ gesetzt wird eine Absende-Adresse generiert: kontakt@www.lang39122.de.
    Diese existiert so nicht. Mein Vorschlag wäre:
    DoNotReply@DoesNotExist.de
    Damit sollte das Gebilde auch als Absende-Adresse im System durchgehen.
    Das Kontaktformular setze ich schließlich ein, um meine eigene mail-Adresse zu verbergen.
    Schöne Ostern
    Gerhard

  49. Ich hab in allen Feldern ausschließlich Placeholder so das alle Feldnamen nicht angezeigt werden müssen und ich hätte dies gern auch in den Selectboxen das alles gleich ausschaut. Wie bekommt man einen Placeholder für eine Selectbox? Da ich mehrere Selectboxen habe macht es keinen Sinn das in allen „Bitte wählen…“ drin steht. Oder kann der erste Eintrag in der selectbox nicht wählbar gemacht werden so das quasi der erste Eintrag wie ein Placeholder ist? Wenn ich den Code so lasse wie er ist und nur das „Bitte wählen…“ entferne wird dann der erste Eintrag der selectbox angezeigt aber somit ist das Pflichtfeld auch immer schon ausgewählt auch wenn man es nicht angeklickt hat und das ist auch nicht von Vorteil.

    Wäre für eine Lösung sehr Dankbar!

    1. Ich habe das Skript soeben aktualisiert. Damit kannst du nun das „Bitte wählen“ über das $fields-Array durch eine eigene Formulierung ersetzen.

  50. Guten Tag Tristan
    Super dein Captcha-Kontaktformular. Ich verwende die aktuellste Version vom Mai 2019. Alles klappt eigentlich gut, ausser dass ich keine Kopie der E-Mail erhalte, obwohl ich die Checkbox entsprechend gesetzt habe. Bei $adminMail habe ich juerg@url hinterlegt beim E-Mail-Pflichtfeld gebe ich silvia@url ein. Wie gesagt, die Kontaktformular-Anfrage erhalte ich perfekt, die Kopie der E-Mail erhalte ich nie. Für Testzwecke haben beide Mails die gleiche Domain. Liegt eventuell hier die Ursache für das Problem? Für einen Lösungsvorschlag wäre ich sehr dankbar. Vielen Dank und freundliche Grüsse aus der Schweiz

    1. Hallo Jürg,

      Das dürfte an sich zu keinen Problemen führen – außer ggf. beim Spamfilter.

      Ansonsten solltest du insbesondere prüfen, dass die Funktion filter_var() bei dir auf dem Server korrekt funktioniert. Ggf. kannst du dir Fehler mit ini_set(‚display_errors‘, 1); error_reporting(E_ALL); anzeigen lassen.

  51. Hallo Tristan,
    ich weiß nicht, an was es liegt und warum es nur bei mir passiert: wenn ich die Zeile:

    $mailHeader = „From: „.$_POST[$fname].“\r\n“.“Content-type: text/plain; charset=utf-8″.“\r\n“;

    so lasse, zerschießt es mir bei dem Mail die Umlaute (Empfang über Outlook 2007)

    Wenn ich die Mime-Version ergänze, ist der Fehler weg:
    $mailHeader = „From: „.$_POST[$fname].“\r\n“.“Mime-Version: 1.0\r\n“.“Content-type: text/plain; charset=utf-8″.“\r\n“;

    1. Vielen Dank für deine Anmerkungen! Die MIME-Version sollte tatsächlich angegeben werden, sodass ich diese gute Anregung bei dem nächsten Update berücksichtigen werde.

  52. Noch eine Kleinigkeit: im Script mit captcha muss es in Zeile 199 heißen:
    statt

    Das von gestern Abend mit der fehlenden Mime-Version ist übrigens in der gleichen Datei in Zeile 67 und 85 bei der Definition von $mailHeader.

    Sonst: ein Super Script!!

  53. Hallo Tristan,
    vielen Dank für dein PHP Skript. Ich hab gestern die Version ohne Captcha runter geladen.
    Leider bekomme ich beim Aufrufen der kontakt.php im Browser folgende Fehlermeldung (lokal mit Apache Server):
    „Notice: Undefined variable: setttings in E:\xampp\htdocs\salzer3d_W3.CSS\kontakt_test.php on line 197“
    … dreimal hinter einander, ohne das ich etwas an der Datei geändert habe. Der Rest sieht gut aus.
    Hättest du mir einen Tip, da PHP nicht meine Welt ist?

    Danke Otto

    1. Lieber Otto,

      vielen Dank für deine Anmerkung. Es handelte sich tatsächlich um einen Tippfehler. Diesen kannst du selbst beheben (das 3. t in der Zeile löschen) oder die aktualisierte Version herunterladen.

    1. Hallo Winfried,

      das werde ich gerne mal bei einem nächsten Update integrieren. Bis dahin würde ich empfehlen, ein select-Feld zu wählen.

  54. moin Tristan,
    Ganz herzliches Dankeschön für Dein Kontakt-Formular und die Scripte dazu! Dadurch konnte ich sogar als Laie das Formular in meine Homepage und andere Webseiten einbinden und nach Wunsch gestalten und auch das Captcha mit eigenen Hintergründen versehen.
    Auf der Homepage von einem Kinderfreizeithof dient es als Gästebuch-Formular. Die Beiträge übertrag ich selber in das Gästebuch und vermeide so hässlichen Spam.
    Nur fehlt leider die Möglichkeit, Smileys in das große Textfeld einzufügen. Hast Du damit schon mal experimentiert? Das wäre super.

    1. Hallo Oskar,

      Du kannst dir Lösungen wie https://mervick.github.io/emojionearea/ angucken oder selbst (HTML/JS-Kenntnisse vorausgesetzt) eine Lösung, z.B. wie folgt implementieren: Smiley-Bilder einbinden und per Klick dann z.B. „:-)“ in das Textarea einsetzen (oder sichtbare Smileys, in dem du mit einem editable DIV arbeitest).

  55. Hallo Tristan, wäre es möglich noch ein Datumsfeld (Datepicker) einzufügen? ich hatte im Mai schon mal danach gefragt und deine Antwort war „Eine solche Funktion ist derzeit nicht geplant. Vielleicht mal bei einem nächsten Update.“

    wäre es denn in naher Zukunft möglich noch ein Datumsfeld (Datepicker) einzufügen? Wäre dir sehr dankbar!

    Grüße

    1. Hallo Tobias, bei dem nächsten größeren Update ist das weiterhin eine Überlegung. Derzeit kann ich das aus Zeitgründen leider noch nicht absehen.

  56. Hallo Tristan,

    Dein Skript ist toll.
    Ich habe nur, das Problem, dass ich die ausgefüllten Daten nicht als E-Mail bekomme. Zu mir kommt nur die Kopie und nicht beide Versionen.
    Das Programm sendet also, aber die eigentliche Nachricht kommt bei mir nicht an.
    Ich habe unterschiedliche E-Mail-Adressen verwendet.
    Es bringt die Erfolgreich-Bestätigung.
    Ich habe captcha verwendet.
    Hast Du eine Idee woran es liegen könnte.
    Vielen Dank für Deine Hilfe.

    1. Hi Alexander,

      Das Problem gab es z.T. auch bei anderen Nutzern. Prüfe evtl. mal deine Mailserver-Einstellungen, z.B. ob 2 Emails direkt hintereinander ggf. nicht zugelassen sind.

      Beste Grüße
      Tristan

  57. Hallo Tristan,
    man oh man, Dein Script wird ja seit vielen Jahre genutzt. Ich selbst habe es jetzt auch auf meiner Seite im Test da ich sehr große Probleme mit Spam-Mails hatte. Die sind jetzt, dank Deines Scripts abgeschaltet. Nicht alle (heute kamen 2 durch) aber nicht mehr diese Massen. Danke danke danke.

    Ich würde gerne mal mit Dir über Email Kontakt aufnehmen, da ich php überhaupt nicht behersche, ist für mich Böhmisches Dorf. Wäre toll wenn ich von Dir lese.

    Gutes weiteres Verbreiten.

    LG Britta

  58. Hallo Tristan,

    vielen Dank für Deine Mühe mit dem Formular, und dass Du uns „NoobS“ 😉 das zur Verfügung stellst. Nun noch schnell zu meiner Frage…
    Ich habe ein Formular mit mehreren Checkboxen erstellt, klappt auch alles hervorragend, leider sendet er aber immer nur eine Checkbox, auch wenn ich mehrer aktiviere. Bestimmt ist es nur eine Kleinigkeit die ich nicht bedacht habe 😉
    Könntest Du mir freundlicherweise einen Hinweis geben?

    Danke und LG
    Olaf

    1. Lieber Olaf,

      solange die Feldnamen (z.B. „Einwilligung“) unterschiedlich sind, sollte es auch mit mehreren Checkboxen funktionieren.

      Beste Grüße
      Tristan

  59. hallo Trsitan danke fuer das script funktioniert als standalone-seite auch super.
    habe probiert das is einen andere seite einzubauen die wiederum von einem CMS aufgreufen wird.
    dann kommen die fehlermeldungen

    Warning: session_start(): Cannot send session cookie – headers already sent by (output started at …/singlepage.php:1) in …/kontakt.php on line 4

    Warning: session_start(): Cannot send session cache limiter – headers already sent (output started at …/singlepage.php:1) in…/kontakt.php on line 4

    kann ich das script auch nutzen ohne einen sesson zu starten? (bzw. wie muss ich das script anpassen, damit er nicht prueft ob schon einen session laeuft?

    danke holger

    1. Hallo Holger,

      Das liegt daran, dass vor dem Code eine Ausgabe (z.B. ein Leerzeichen außerhalb der PHP-Tags, ein echo- oder print-Befehl oder schlichter HTML-Code) erfolgt. Wenn du session_start() vor jeglicher Ausgabe (ggf. auch die Datei als UTF8 ohne BOM speichern) platzierst, sollte dieser Fehler nicht mehr auftreten.

      Beste Grüße
      Tristan

    1. Hi,

      der Einsatz des Formulars lässt sich DSGVO-konform realisieren.

      Dafür ist insbesondere Voraussetzung, dass du in deiner gut zugänglichen Datenschutz-Erklärung entsprechend den Anforderungen aus Art. 13 DSGVO über die Verwendung aufklärst.

      Das Formular ermöglicht zudem den Einsatz einer Einwilligungs-Checkbox. Dies ist mit Blick auf Art. 6 Abs. 1 lit. f DSGVO (berechtigte Interessen) nicht unbedingt notwendig, aber empfehlenswert.

      Die Rechtmäßigkeit im Einzelfall solltest du dir – sofern du eine verbindliche Antwort wünscht – durch einen Rechtsanwalt bestätigen lassen.

      Beste Grüße
      Tristan

  60. Hallo

    Versuche krampfhaft das Array für Checkboxen zum laufen zu bringen. Obwohl Pflichtfeld, reicht bereits eine Checkboxe.
    Bei den Radio-Buttons geht es , wenn ich es bei den Checkboxen gleich mache geht es nicht.

    ‚Ich bin in folgenden Branchen tätig‘ => array(‚checkbox‘, true, ‚branche‘, array(‚Landwirtschaft‘, ‚Lohnunternehmen‘, ‚Gartenbau‘, ‚Tiefbau‘, ‚Hochbau‘, ‚Werkstätte‘, ‚Lager/Magazin‘, ‚Produktionsbetrieb‘, ‚anderer Gewerbebetrieb‘, ‚Hauswartung / Unterhalt‘, ‚Haushaltshilfe‘)),

    case ‚checkbox‘:
    // checkbox-Felder //
    echo „“.$name.“:“.(($settings[1]) ? ‚ *‚ : “).““;

    // Optionen auslesen //
    $i2 = 0;

    foreach ($settings[3] AS $f) {
    echo „“.$f.““;

    $i2++;
    }

    // Ende der checkbox-Felder //
    echo „“;
    break;

    Auch zeigt es bei mir die $msgError nicht an, ich finde den Fehler aber nicht

  61. Formular funktioniert einwandfrei.
    Danke für Deine Arbeit!

    Falls man eine Weiterleitung auf eine „Danke-Seite“ machen möchte und mit „Cannot modify header information“ zu kämpfen hat, kann man es z.Bsp. so machen:

    echo““;

    VG
    Mateusz

  62. Hallo aus der Schweiz

    Auch von mir einmal ein herzliches Danke für dieses Kontaktformular. Meine Herausforderung ist folgende:

    Wenn ich den „Rohling“ des Formulars auf meinen Server stelle, funktioniert es einwandfrei. Sobald ich es jedoch auf meine Kontaktseite einbinde und abschicken will, erscheint die eingegebene Fehlermeldung. Vielleicht kannst du mir ja da helfen.

    Besten Dank

    CrazyOldBone

    1. Hallo CrazyOldBone,

      du kannst dir bei den $sent = false; Einträgen jeweils eine Meldung mittels Einfügen von „echo „Fehler 1/2/3/4″;“ ausgeben lassen, um zu prüfen, woran genau es liegt.

      Beste Grüße
      Tristan

  63. Auch aus München ein dickes Danke.
    Nach 8 verschiedenen PHP und CGI Vorlagen ist das die gleichzeitig einfachste UND durchdachteste die auch noch funktioniert.

  64. Wie muss die Zeile aussehen, wenn ich den TYP Radio verwenden möchte? Konkret möchte ich 3 Punkte auswählen lassen: Entweder MIDI oder MP3 oder WAV.
    ‚Musikdateiformat‘ => array(‚radio‘, true, array(‚Midi‘, ‚MP3‘, ‚WAV‘)), funktioniert leider nicht.

    1. Wie im Beispiel muss der 3. Parameter leer sein:

      ‚Musikdateiformat‘ => array(‚radio‘, true, “, array(‚Midi‘, ‚MP3‘, ‚WAV‘)),

      1. Das Formular wird in der Captcha-Version nicht abgesendet. Alle Felder sind ausgefüllt und Captcha richtig eingegeben. Ich bekomme immer die „$msgError“ ausgegeben.
        PHP Version 7.4.9 und GD-Version 2.2.5.

        1. Nach meinen Tests funktioniert das Skript. Du kannst dir die etwaige Fehler ausgeben lassen:

          ini_set(‚display_errors‘,1); error_reporting(E_ALL);

          Außerdem kannst du selbst mit echo-Ausgaben nachschauen, wo es mit dem Skript auf deinem Server konkret hakt.

  65. Hallo Tristan,

    super Lob und Dank für das tolle Kontaktformular.

    Eine wichtige Frage, die bisher noch merkwürdigerweise keiner gestellt hatte und die du Lösung gerne in die obige Anleitung einfügen könntest:
    Wie schaffe ich es, dass die Datenschutzseite, wenn man unterhalb des Texteingabefeldes auf den dortigen Link drückt, nicht die Seite auf der gleichen Seite erscheint (und dann sein eben geschriebener Text gelöscht wird), sondern es definitiv sich lieber eine neue Seite öffnen sollte.

    Habe bereits alles mit target=“_blank“ in der Link-Zeile probiert, aber es gelingt nicht.

    Danke Dir und schönes WE,
    Patrick

  66. Vielen dank für den Script.
    Funktioniert Alles problemlos.

    Auch die Gestaltung mit CSS.

    Ein Problem habe ich aber noch.
    Ich bekomme es nicht hin die Radiobuttons
    zu vergrößern. Wie kann ich die in CSS
    verändern ?

    Ich würde mich sehr über einen Tip freuen.

    Viele Grüße
    Robert

  67. Moin, danke für das Kontaktformular.
    Gibt es irgendwo die Möglichkeit noch angeben zu können,
    dass beim datepicker das deutsche Format ausgegeben wird?

    also d.m.y, anstatt y-m-d?

  68. Hallo Tristan,

    ich habe echt schon viele Kontaktformulare ausprobiert, bin über Generatoren en masse gestolpert – jedoch war bisher kein Formular so simpel und einfach anpassbar wie Deines – Daumen 3x hoch.

    Drei Dinge wären noch interessant:

    1. Einfügen einer zweiten oder dritten Empfänger-eMail-Adresse … oder geht das über die $adminMail-Variable?

    2. Einfügen von einem oder mehreren Dateianhängen, z.B. Bildern, PDF, RAR/ZIP-Archiven etc. bis zu einer angegebenen Dateigröße, z.B. max 5 MB oder so.

    3. Umwandeln der Formulareingaben in eine PDF-Datei und diese PDF-Datei als Dateianhang verschicken. Ich weiß, das klingt erstmal unlogisch … jedoch gibt es Fälle, in denen der Empfänger z.B. eine PDF-Datei als Beleg archivieren will …

    1. Hallo Tobias,

      vielen Dank für dein konstruktives Feedback!

      Gerne werde ich bei einem nächsten Update schauen, was ich davon berücksichtigen kann. Insbesondere Dateianhänge zu unterstützen (2.), könnte ich mir vorstellen. Mit den Funktionen 1./3. will ich das Skript vermutlich eher nicht überfrachten und gehe davon aus, dass diese Funktionen eher selten benötigt werden würden.

  69. Was soll mir diese Fehlermeldung sagen?

    Warning: Cannot modify header information – headers already sent by (output started at /homepages/41/d206069050/htdocs/buehnenvermietung/Anfrage-Buehne-Miete.php:1) in /homepages/41/d206069050/htdocs/buehnenvermietung/Anfrage-Buehne-Miete.php on line 3

    Warning: session_start(): Cannot start session when headers already sent in /homepages/41/d206069050/htdocs/buehnenvermietung/Anfrage-Buehne-Miete.php on line 4

    Die Seite startet mit:

    In der .htaccess steht:
    # AddType ‚text/html; charset=UTF-8‘ html
    # AddType ‚text/html; charset=UTF-8‘ php

    Mache ich die # raus geht das Script überhaupt nicht (allerdings kommt dann auch die o.g. Fehlermeldung nicht)

    Seltsam: Auf anderen Seiten mit gleichem Code funktioniert es ohne Fehlermeldung. PHP 7.4 ist beim Provider eingestellt. Sorry, aber ich habe null Ahnung von PHP. Ich suche jetzt schon seit Stunden nach dem Fehler und kann ihn nicht finden.

    1. Lieber André,

      achte am besten darauf, dass keinerlei Leerzeichen vor dem ersten PHP-Tag auftauchen und dass du das Dokument als UTF-8 ohne BOM speicherst.

      1. Vielen Dank für Deine schnelle, nette Hilfe.
        Der erste PHP-Tag, ganz am Anfang, Zeile 1 – Zeichen 1, startet ohne Leerzeichen. Auch die php-Datei ist als utf-8 gespeichert. Leider war es nicht das Problem. Es funktioniert leider immer noch nicht.
        Trotzdem vielen Dank.

  70. Hallo Tristan,
    vielen vielen Dank für dieses SUPER Kontaktformular !
    Leider schaffe ich es nicht auf meine eigene „DANKE Seite“ umzuleiten.
    Habe zwar statt echo „“.$formTitle.““ .
    „“.$msgSent.““;

    header(„Location: http://www.domainname.at/danke.html„);

    eingegeben, aber nach abschicken erscheint immer nur meine Kopfzeile mit dem Logo (header) aber nicht die dafür gedachte DANKE-Seite. Hast du einen Tipp was ich falsch mache.

  71. Hallo,

    mein Provider behauptet das
    er der Support für PHP 7.2
    nicht mehr bieten kann
    und empfiehlt mir PHP 7.4.

    Kann ich das ignorieren oder kann
    man die PHP-Datei updaten ?
    Kann aber auch sein ich habe das komplett falsch verstanden 😉

    Viel Grüße
    Robert

  72. Hallo Tristan,

    wie sieht das mit Dateianhängen aus … wäre das machbar?

    Ich würde das Formular gerne für ein neues Projekt einsetzen, nur dafür ist der optionale Versand eines Anhanges (Bild) gefordert ….

    Ansonsten setze ich das Formular in kleineren Projekten bereits sehr erfolgreich ein – und: der Formularspam hat aufgehört. Haben sich vorher zig Bots gemeldet, ist nun damit Ruhe … dank diesem Formular, super gut!

    Daher, wie sieht das hier mit Dateianhängen aus?

    Lieber Gruß, Tobias

    1. Lieber Tobias,

      vielen Dank für deinen Kommentar!

      Ein Dateiupload lässt sich theoretisch nachrüsten. Dies kann ich nicht zeitnah umsetzen, werde es aber sehr gerne bei der nächsten Version des Skripts berücksichtigen.

      Beste Grüße
      Tristan

  73. Hallo Tristan,

    vielen herzlichen Dank für das Kontaktformular und die tolle Anleitung dazu!

    Auf dem Server meines Hosting-Anbieters läuft PHP in Version 7.3 . Nach dem Absenden des Formulares wird angezeigt, dass die Email versendet wurde, aber es kommt nichts an… Weder beim Empfänger, noch beim Absender.

    Im PHP-Formular habe ich lediglich die EmpfängerEmailadresse eingetragen, ansonsten nichts geändert.

    Besten Dank im Voraus für eine Rückmeldung!

  74. Hallo,
    vielen vielen Dank, dass du so ein Formular zur Verfügung stellst, war sehr lange auf der Suche danach! Funktioniert einwandfrei, einfach Spitze, danke!

    LG Simon

  75. Moin,

    super Formular, aber wenn man teilweise @yahoo.de oder Firmenadresse einträgt bekomme ich keine Mails. Wo dran liegt das und kann man den Filter ändern?

    Danke,
    Sven

    1. Lieber Sven,

      das könnte auf den Spamfilter zurückzuführen sein. Du kannst stattdessen die E-Mails mit PHP über einen „echten“ E-Mail-Account versenden lassen.

  76. Hallo Tristan!
    Danke für das tolle Formular!

    Ich habe jedoch ein Problem und zwar kommt bei mir folgende Fehlermeldung:
    Warning: Undefined variable $mailAttachments in /home/.sites/338/site6727711/web/kontakt.php on line 600 Fatal error: Uncaught TypeError: count(): Argument #1 ($value) must be of type Countable|array, null given in /home/.sites/338/site6727711/web/kontakt.php:600 Stack trace: #0 {main} thrown in /home/.sites/338/site6727711/web/kontakt.php on line 600

    Habe aber nicht viel verändert in deiner Datei und die line 600 sieht folgendermaßen aus:
    if (count($mailAttachments) == 0) {

    Kannst du mir vielleicht weiter helfen?

    Vielen Dank,
    Theresa

  77. Hallo Tristen,
    klasse Script und vielen Dank dafür:-)!!

    Ich habe ein Bewerbungsformular gebaut, was leider recht lang ist. Nun möchte ich das wegen der Übersichtlichkeit etwas aufteilen, also z.B. nach der Zeile Nachname eine Zeile einbinden, die 2-spaltig ist und in der „Anlagen“ steht.

    ‚Nachname‘ => array
    Anlagen…
    ‚Lebenslauf:‘ => array

    Ist das möglich? Habe schon mit div etc. experimentiert, aber leider ohne Erfolg.

    Vielen Dank für ein kurzes Feedback.

  78. Hallo,

    ich habe deine Testdateien auf den Server geladen (läuft mit php 8). Wenn ich die Datei aufrufe und das Formular ausfülle und abschicke erhalte ich folgende Fehlermeldung:

    Fatal error: Uncaught TypeError: count(): Argument #1 ($value) must be of type Countable|array, null given in /homepages/27/d72121997/htdocs/kontakt-test.php:151 Stack trace: #0 {main} thrown in /homepages/27/d72121997/htdocs/kontakt-test.php on line 151

    Woran könnte das liegen?

  79. Hallo Tristan,

    bisher läuft das Formular sehr gut … spamfrei … bisher leider.

    Sowohl über zwei drei eigene Seiten wie auch fremde Seiten kommen seit einigen Tagen vermehrt Spamrückmeldungen herein, so wie es aussieht automatisiert … Heißt die Spamfraktion hat die Sicherheitsmechanismen automatisiert geknackt und umgeht diese und füllt das Formular trotz Captcha aus …

    Was kann man hier machen?

    Gruß Tobias

    1. Lieber Tobias,

      vielen Dank für den Hinweis. Das ist natürlich keine gute Nachricht.

      Du könntest hier die Captcha-Hintergrundbilder abwandeln oder durch eigene ersetzen und zudem auch die weiteren Einstellungen in der captcha.php anpassen. Letztlich kann dies aber auch zulasten der Zugänglichkeit des Formulars gehen.

      Alternativ bleibt nur die Möglichkeit auf einen spezialisierten Captcha-Anbieter umzusteigen, z.B.: https://www.hcaptcha.com.

      Viele Grüße