4.6 KiB
4.6 KiB
Issue #34 – Kontaktformular: E-Mail-Versand via PHP
- Repo:
greggy/landingpage-haus-schleusingen - Issue: #34
- Titel: Kontaktformular: E-Mail-Versand via PHP
- Komplexität: M
- Stand: Analyse abgeschlossen
- Datum: 2026-05-14
Kurzbewertung
Das Issue ist Medium (M): Es ist kein großer Architekturumbau, aber es ist mehr als ein kleiner Bugfix, weil serverseitige PHP-Logik, Spam-Schutz, Validierung, sichere Header-Behandlung und UI-Feedback zusammen umgesetzt werden müssen.
Abhängigkeiten
- Keine blockierenden offenen Issues gefunden.
index.phpexistiert bereits aufmainund ist die richtige Basis für die PHP-Umsetzung.- Hinweis: Das bestehende Docker/Nginx-Setup dient weiter als statisches Preview, verarbeitet aber kein PHP-Mail-Handling. Für den echten Versand ist eine PHP-fähige Laufzeit nötig (Testumgebung: Apache/PHP).
Anforderungen aus dem Issue
- Kontaktformular verschickt E-Mails serverseitig via PHP.
- Empfänger ist
mki@kies-media.de. - Absender (
From) ist die E-Mail-Adresse aus dem Formular. - Pflichtfeld-Validierung für Name, E-Mail und Nachricht.
- Spam-Schutz via Honeypot und zusätzlicher Missbrauchsschutz.
- Erfolgsmeldung nach erfolgreichem Versand.
- Verständliche Fehlermeldungen bei ungültigen oder fehlenden Eingaben.
Implizite Anforderungen / Edge Cases
- Header-Injection über Name/E-Mail darf nicht möglich sein.
- Ungültige E-Mail-Adressen müssen serverseitig abgelehnt werden.
- Leere oder nur aus Leerzeichen bestehende Nachrichten müssen abgelehnt werden.
- Bots sollen am Honeypot scheitern.
- Sehr schnelle Direkt-Submits sollen als verdächtig behandelt werden.
- Mehrfach-Submits in kurzer Zeit sollen begrenzt werden.
- Bei Mail-Fehlern darf kein falscher Erfolg angezeigt werden.
- Formulardaten sollen bei Validierungsfehlern im Formular erhalten bleiben.
Technischer Plan
Backend / PHP
index.phpbekommt einen serverseitigen POST-Handler.session_start()wird verwendet für:- Formular-Timestamp
- einfaches Rate-Limit zwischen Submits
- Hilfsfunktionen:
normalizeContactValue()für Trim/SanitizingescapeContactValue()für sichere Ausgabe ins HTMLcontainsHeaderInjection()für Header-Schutz
- Versand über
mail()mit Headern:From: <Formular-E-Mail>Reply-To: <Formular-E-Mail>Content-Type: text/plain; charset=UTF-8
- Bei Erfolg: Formular leeren und Erfolgsmeldung rendern.
- Bei Fehlern: Fehlerliste oberhalb des Formulars rendern.
Frontend / HTML
- Formular auf
method="post"umstellen. - Honeypot-Feld ergänzen (visuell versteckt, für Screenreader ebenfalls ausgeschlossen).
- Hidden-Feld für Formular-Token/Timestamp ergänzen.
- Bestehende Erfolgsmeldung auf serverseitig gesteuerten Zustand umbauen.
- Pflichtfelder klar markieren und
requiredbeibehalten.
Frontend / JS
- Bestehende
mailto:-Logik entfernen. - Sonstige Interaktionen (Lightbox, Navigation, Scroll) unverändert lassen.
Styling
- Styles für:
- Fehlermeldungsbox
- serverseitige Erfolgsmeldung
- Honeypot-Hilfsklasse
Sicherheitsbetrachtung
- Pflicht: serverseitige Validierung, nicht nur HTML5.
- Pflicht: Schutz vor Header-Injection in Mail-Headern.
- Pflicht: Honeypot leer + Mindestzeit bis Submit + Session-Rate-Limit.
- Keine sensiblen Daten in Logs oder im Frontend ausgeben.
Teilaufgaben
main-Stand prüfen und Feature-Branch anlegen.index.phpserverseitig auf POST/Mailversand umbauen.- Formular um Honeypot, Hidden-Felder, Fehler-/Erfolgsausgabe ergänzen.
js/haus-schleusingen.jsvonmailto:-Submit befreien.- CSS für Meldungszustände ergänzen.
- Linting / Formatierung / PHP-Syntaxcheck ausführen.
- Self-Review dokumentieren.
- QA inkl. Happy Path, Validierungsfehler und Spam-Schutz dokumentieren.
- PR erstellen und Martin zur Freigabe vorlegen.
Akzeptanzkriterien
- Formular sendet serverseitig eine E-Mail an
mki@kies-media.de. Fromverwendet die eingegebene Formular-E-Mail.- E-Mail enthält Name, E-Mail, optional Telefon, Anliegen und Nachricht.
- Honeypot + zusätzlicher Missbrauchsschutz aktiv.
- Erfolgsmeldung nach erfolgreichem Versand sichtbar.
- Fehlermeldungen bei fehlenden/ungültigen Pflichtfeldern sichtbar.
Architekturentscheidung
Es wird bewusst kein SMTP-Layer oder externer Mailer eingebaut, weil das Issue explizit mail() erlaubt und für dieses Projekt eine schlanke, servernahe Lösung genügt. Falls Zustellbarkeit oder Hosting-Limits später Probleme machen, wäre ein Folge-Issue für SMTP/PHPMailer sinnvoll.