Files
openclaw/memory/gitea-specs/issue-34.md
2026-05-20 21:35:47 +00:00

4.6 KiB
Raw Blame History

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: <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 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.