# 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.php` existiert bereits auf `main` und 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 1. Kontaktformular verschickt E-Mails serverseitig via PHP. 2. Empfänger ist `mki@kies-media.de`. 3. Absender (`From`) ist die E-Mail-Adresse aus dem Formular. 4. Pflichtfeld-Validierung für Name, E-Mail und Nachricht. 5. Spam-Schutz via Honeypot und zusätzlicher Missbrauchsschutz. 6. Erfolgsmeldung nach erfolgreichem Versand. 7. 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.php` bekommt einen serverseitigen POST-Handler. - `session_start()` wird verwendet für: - Formular-Timestamp - einfaches Rate-Limit zwischen Submits - Hilfsfunktionen: - `normalizeContactValue()` für Trim/Sanitizing - `escapeContactValue()` für sichere Ausgabe ins HTML - `containsHeaderInjection()` für Header-Schutz - Versand über `mail()` mit Headern: - `From: ` - `Reply-To: ` - `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 `required` beibehalten. ### 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 1. `main`-Stand prüfen und Feature-Branch anlegen. 2. `index.php` serverseitig auf POST/Mailversand umbauen. 3. Formular um Honeypot, Hidden-Felder, Fehler-/Erfolgsausgabe ergänzen. 4. `js/haus-schleusingen.js` von `mailto:`-Submit befreien. 5. CSS für Meldungszustände ergänzen. 6. Linting / Formatierung / PHP-Syntaxcheck ausführen. 7. Self-Review dokumentieren. 8. QA inkl. Happy Path, Validierungsfehler und Spam-Schutz dokumentieren. 9. PR erstellen und Martin zur Freigabe vorlegen. ## Akzeptanzkriterien - [ ] Formular sendet serverseitig eine E-Mail an `mki@kies-media.de`. - [ ] `From` verwendet 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.