Mailversand: Brevo durch All-Inkl-SMTP ersetzt + sendefreier Verbindungstest
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 <noreply@anthropic.com>
This commit is contained in:
@@ -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
|
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
|
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.
|
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
|
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
|
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 `#<id>-error`-ID aus der Komponente.
|
Fokus aufs erste ungültige Feld) — Konvention dafür ist die `#<id>-error`-ID aus der Komponente.
|
||||||
- A11y-Vorgaben: Feldränder mit `--clr-glass-border-strong` (≥3:1 Kontrast, WCAG 1.4.11), Checkbox
|
- 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).
|
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:
|
- Spam-Schutz ohne externe Dienste — mehrschichtig in jeder `app/actions/*`-Action:
|
||||||
(1) Honeypot-Feld `website`, (2) HMAC-signierter Timestamp / Time-Trap (`ft`-Token via
|
(1) Honeypot-Feld `website`, (2) HMAC-signierter Timestamp / Time-Trap (`ft`-Token via
|
||||||
`form_token()`/`form_token_valid()`, `app_secret`), (3) serverseitige Whitelist-Validierung,
|
`form_token()`/`form_token_valid()`, `app_secret`), (3) serverseitige Whitelist-Validierung,
|
||||||
|
|||||||
52
bin/smtp-test.php
Normal file
52
bin/smtp-test.php
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SMTP-Verbindungstest — prüft Host, STARTTLS und Login aus config/config.php,
|
||||||
|
* OHNE eine E-Mail zu versenden (nur Verbindung + Auth, danach QUIT).
|
||||||
|
*
|
||||||
|
* NUR CLI — nie im Request-Pfad. Debug-Ausgabe bleibt aus, damit keine
|
||||||
|
* Zugangsdaten (Base64 im AUTH-Dialog) im Terminal oder in Logs landen.
|
||||||
|
*
|
||||||
|
* Aufruf: php bin/smtp-test.php
|
||||||
|
*/
|
||||||
|
if (PHP_SAPI !== 'cli') {
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
require dirname(__DIR__) . '/app/bootstrap.php';
|
||||||
|
|
||||||
|
use PHPMailer\PHPMailer\PHPMailer;
|
||||||
|
|
||||||
|
$smtp = config('smtp');
|
||||||
|
|
||||||
|
if (in_array($smtp['password'] ?? '', ['', 'POSTFACH_PASSWORT', 'BREVO_SMTP_KEY', 'CHANGE_ME'], true)) {
|
||||||
|
fwrite(STDERR, "Abbruch: In config/config.php steht noch kein echtes SMTP-Passwort.\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "Teste {$smtp['host']}:{$smtp['port']} (STARTTLS) als {$smtp['username']} …\n";
|
||||||
|
|
||||||
|
$mail = new PHPMailer(true);
|
||||||
|
$mail->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);
|
||||||
|
}
|
||||||
@@ -17,14 +17,15 @@ return [
|
|||||||
// Generieren mit: php -r "echo bin2hex(random_bytes(32));"
|
// Generieren mit: php -r "echo bin2hex(random_bytes(32));"
|
||||||
'app_secret' => 'CHANGE_ME',
|
'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 = <KAS-Login>.kasserver.com).
|
||||||
|
// Verbindung testen ohne Mailversand: php bin/smtp-test.php
|
||||||
'smtp' => [
|
'smtp' => [
|
||||||
'host' => 'smtp-relay.brevo.com',
|
'host' => 'w01ca75d.kasserver.com',
|
||||||
'port' => 587, // STARTTLS
|
'port' => 587, // STARTTLS
|
||||||
'username' => 'BREVO_LOGIN',
|
'username' => 'noreply@tsv08kulmbach.de', // volle Postfach-Adresse
|
||||||
'password' => 'BREVO_SMTP_KEY',
|
'password' => 'POSTFACH_PASSWORT',
|
||||||
// Absender muss in Brevo als Sender verifiziert sein.
|
// Absender: das authentifizierte Postfach (gleiche Domain, sonst lehnt All-Inkl ab).
|
||||||
'from' => 'info@tsv08kulmbach.de',
|
'from' => 'noreply@tsv08kulmbach.de',
|
||||||
'from_name' => 'TSV 08 Kulmbach',
|
'from_name' => 'TSV 08 Kulmbach',
|
||||||
// Empfänger der Formular-Mails.
|
// Empfänger der Formular-Mails.
|
||||||
'to' => 'info@tsv08kulmbach.de',
|
'to' => 'info@tsv08kulmbach.de',
|
||||||
|
|||||||
Reference in New Issue
Block a user