From 3d8ded28daa04d53cb6bf09d1d4f4312a7fe5ec9 Mon Sep 17 00:00:00 2001 From: fs Date: Sun, 5 Jul 2026 00:27:19 +0200 Subject: [PATCH] Mailversand: Brevo durch All-Inkl-SMTP ersetzt + sendefreier Verbindungstest MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Versand läuft jetzt über das KAS-Postfach noreply@tsv08kulmbach.de (w01ca75d.kasserver.com:587, STARTTLS) — ein Drittanbieter weniger, SPF der Domain deckt den Server bereits ab. bin/smtp-test.php prüft Verbindung, TLS und Login ohne eine Mail zu versenden (Debug bewusst aus, damit keine Credentials im Terminal landen). Co-Authored-By: Claude Fable 5 --- CLAUDE.md | 6 +++-- bin/smtp-test.php | 52 +++++++++++++++++++++++++++++++++++++++ config/config.example.php | 13 +++++----- 3 files changed, 63 insertions(+), 8 deletions(-) create mode 100644 bin/smtp-test.php diff --git a/CLAUDE.md b/CLAUDE.md index c9005b7..51edb02 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -15,7 +15,7 @@ selbst gehosteter Stack ohne Abhängigkeiten von Drittanbietern. 1. **Keine externen Einbindungen.** Keine CDNs, keine externen Fonts/Scripts/iframes/Embeds, keine Tracking-/Analytics-Dienste, kein reCAPTCHA. Alles wird self-hosted. Einzige erlaubte ausgehende - Verbindungen: Brevo SMTP (Mailversand, serverseitig) und der Instagram-Scraper (CLI/Cron, nie im Request-Pfad). + Verbindungen: All-Inkl-SMTP (Mailversand, serverseitig) und der Instagram-Scraper (CLI/Cron, nie im Request-Pfad). Besucher-Browser kontaktieren ausschließlich unsere Domain. Die CSP (`default-src 'self'`) erzwingt das — nicht aufweichen. 2. **`.context/` und `.context_db/` sind reine Referenz** (alte, unsichere CMS-Seite). Von dort werden nur Assets (Bilder/Fonts/Videos), Texte und Styling-Werte extrahiert. **Niemals Code übernehmen, niemals @@ -94,7 +94,9 @@ Sichtbare FAQ + FAQPage-Schema aus derselben `data/*.json`-Quelle, damit Inhalt Fokus aufs erste ungültige Feld) — Konvention dafür ist die `#-error`-ID aus der Komponente. - A11y-Vorgaben: Feldränder mit `--clr-glass-border-strong` (≥3:1 Kontrast, WCAG 1.4.11), Checkbox min. 24px (WCAG 2.5.8), Status-Region nie per `display:none` verstecken (fliegt aus dem Accessibility-Tree). -- Versand via PHPMailer über Brevo SMTP (`smtp-relay.brevo.com:587`, STARTTLS), Config aus `config/config.php`. +- Versand via PHPMailer über All-Inkl-SMTP (`w01ca75d.kasserver.com:587`, STARTTLS, Postfach + `noreply@tsv08kulmbach.de`), Config aus `config/config.php`. Verbindung/Login ohne Mailversand + testen: `php bin/smtp-test.php`. - Spam-Schutz ohne externe Dienste — mehrschichtig in jeder `app/actions/*`-Action: (1) Honeypot-Feld `website`, (2) HMAC-signierter Timestamp / Time-Trap (`ft`-Token via `form_token()`/`form_token_valid()`, `app_secret`), (3) serverseitige Whitelist-Validierung, diff --git a/bin/smtp-test.php b/bin/smtp-test.php new file mode 100644 index 0000000..097801a --- /dev/null +++ b/bin/smtp-test.php @@ -0,0 +1,52 @@ +isSMTP(); +$mail->Host = $smtp['host']; +$mail->Port = (int) $smtp['port']; +$mail->SMTPAuth = true; +$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; +$mail->Username = $smtp['username']; +$mail->Password = $smtp['password']; +$mail->Timeout = 15; + +try { + if ($mail->smtpConnect()) { + $mail->smtpClose(); + echo "OK: Verbindung, STARTTLS und Login erfolgreich — keine Mail versendet.\n"; + exit(0); + } + fwrite(STDERR, 'Fehler: ' . ($mail->ErrorInfo !== '' ? $mail->ErrorInfo : 'Verbindung fehlgeschlagen.') . "\n"); + exit(1); +} catch (Throwable $e) { + fwrite(STDERR, 'Fehler: ' . $e->getMessage() . "\n"); + exit(1); +} diff --git a/config/config.example.php b/config/config.example.php index 40d332e..843c998 100644 --- a/config/config.example.php +++ b/config/config.example.php @@ -17,14 +17,15 @@ return [ // Generieren mit: php -r "echo bin2hex(random_bytes(32));" 'app_secret' => 'CHANGE_ME', - // Brevo SMTP (Login + SMTP-Schlüssel aus dem Brevo-Dashboard, nicht das Konto-Passwort). + // All-Inkl SMTP (Postfach im KAS anlegen; Host = .kasserver.com). + // Verbindung testen ohne Mailversand: php bin/smtp-test.php 'smtp' => [ - 'host' => 'smtp-relay.brevo.com', + 'host' => 'w01ca75d.kasserver.com', 'port' => 587, // STARTTLS - 'username' => 'BREVO_LOGIN', - 'password' => 'BREVO_SMTP_KEY', - // Absender muss in Brevo als Sender verifiziert sein. - 'from' => 'info@tsv08kulmbach.de', + 'username' => 'noreply@tsv08kulmbach.de', // volle Postfach-Adresse + 'password' => 'POSTFACH_PASSWORT', + // Absender: das authentifizierte Postfach (gleiche Domain, sonst lehnt All-Inkl ab). + 'from' => 'noreply@tsv08kulmbach.de', 'from_name' => 'TSV 08 Kulmbach', // Empfänger der Formular-Mails. 'to' => 'info@tsv08kulmbach.de',