feat: SMTP mail stack and separate server.env deploy

Add mail.php with STARTTLS sending, test scripts, server.env split from
local .env, admin@ postbox docs, DKIM DNS support-ticket notes, and todo 11
for boka relay.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Frank Schwenk
2026-06-11 23:19:03 +02:00
parent 04e1455d9f
commit 01de7ed4fb
16 changed files with 543 additions and 41 deletions
+1 -1
View File
@@ -29,7 +29,7 @@ Lokales Repo mit dem Webspace verbinden und eine deploybare Grundstruktur anlege
├── httpdocs/ ← public/
│ └── index.php
└── private/ ← nicht öffentlich
├── .env
├── server.env ← Server-Secrets (deployed, nicht .env!)
├── config/bootstrap.php
└── data/ ← später last-checks.json
```
+52 -20
View File
@@ -1,45 +1,77 @@
# 02 — E-Mail & SMTP
**Priorität:** high
**Status:** erledigt (2026-06-11)
**Abhängigkeiten:** 01
**Blockiert:** 03 (Alarmierung)
## Ziel
Mail-Infrastruktur auf 0012.de für Monitoring-Alerts, Skript-Versand und spätere Fremddomains.
Mail-Infrastruktur auf 0012.de für Monitoring-Alerts und Skript-Versand.
Relay von **boka** → ausgelagert nach [`11-boka-smtp-relay.md`](11-boka-smtp-relay.md).
## Postfach-Setup (Plesk)
| | |
|---|---|
| Postfach | `admin@0012.de` |
| Aliase | `monitor@0012.de`, `alert@0012.de` |
| SMTP-Login | `admin@0012.de` (Hauptpostfach, nicht Alias) |
| Absender Monitoring | `SMTP_FROM=monitor@0012.de` |
| Alarm-Empfänger | `ALERT_EMAIL` → persönliche Adresse |
## Checkliste
### Postfächer auf 0012.de
- [ ] Postfach `monitor@0012.de` (oder `alerts@0012.de`) anlegen
- [ ] Passwort in `.env` → `SMTP_USER`, `SMTP_PASSWORD`
- [ ] `ALERT_EMAIL` auf persönliche Adresse setzen
- [ ] `SMTP_FROM=monitor@0012.de` setzen
- [ ] Test: Webmail-Login auf `ha01s019.org-dns.com`
- [x] `admin@0012.de` mit Aliasen `monitor@`, `alert@`
- [x] Passwort in `.env` → `SMTP_USER`, `SMTP_PASSWORD`
- [x] `ALERT_EMAIL` gesetzt
- [x] `SMTP_FROM=monitor@0012.de`
- [x] Webmail-Login auf `ha01s019.org-dns.com`
### SMTP für Skripte
### SMTP für Skripte (0012.de)
- [ ] Port 587 + STARTTLS testen (von lokalem Rechner / boka)
- [ ] SPF für `0012.de` in Plesk DNS prüfen/setzen
- [ ] DKIM in Plesk aktivieren (Deliverability)
- [ ] DMARC optional: `_dmarc.0012.de` mit `p=none` zum Start
- [x] `config/mail.php` — `sendMail()`, `sendAlert()`
- [x] `scripts/test-mail.php` — CLI-Test
- [x] Port 587 + STARTTLS getestet (`php scripts/test-mail.php` → OK)
- [x] SPF gesetzt (Hoster-DNS)
- [x] DKIM in Plesk aktiviert
- [ ] DKIM in **öffentlicher DNS** — fehlt; Hoster per Ticket (kein DNS-Zugang im Paket)
- [x] DMARC vorhanden (Hoster-DNS)
### Relay von boka (später)
### Technische Notizen
- [ ] Entscheiden: dediziertes Relay-Postfach `relay@0012.de` vs. App-spezifische Absender
- [ ] In Plesk: ausgehende Mail-Limits / Relay-Regeln prüfen (Hoster-Doku)
- [ ] boka-Apps: zentraler SMTP-Block in Docker/env (Host, Port, User, Pass)
- **Envelope vs. From:** SMTP-Login als `admin@`, `MAIL FROM` ebenfalls `admin@`; sichtbarer Absender bleibt `monitor@` (Alias). Plesk verwirft sonst oft still nach `250 OK`.
- **Test lokal:** `php scripts/test-mail.php` (liest `.env`)
- **Test vom Webspace:** `mail-test.php?token=…` (liest `private/server.env`)
- **Tuta/strenge Empfänger:** bis DKIM-DNS steht → `ALERT_EMAIL` Gmail o. ä.
- **Kein DNS-Zugang:** DKIM-Records aus Plesk Mail-Einstellungen an wint-Support — siehe [`../HOSTING.md`](../HOSTING.md#dns-zugang-classic-10)
### Cron-Benachrichtigungen Plesk
## `.env` (Beispiel)
- [ ] Geplante Aufgaben: „Nur Fehler“ für PHP-Fatal-Errors — ergänzt App-eigene Alerts, ersetzt sie nicht
```env
SMTP_USER=admin@0012.de
SMTP_FROM=monitor@0012.de
ALERT_EMAIL=you@example.com
```
## Test
```bash
php scripts/test-mail.php
```
Nach Deploy: `server.env` auf Server, Test lokal mit `.env`.
## Akzeptanzkriterien
- Testmail von PHP (`mail()` oder PHPMailer) an `ALERT_EMAIL` kommt an
- SPF/DKIM ohne Hard-Fail in Mail-Header-Test (mail-tester.com o. ä.)
- [x] Testmail an `ALERT_EMAIL` kommt an
- [ ] SPF/DKIM ohne Hard-Fail (mail-tester.com o. ä.) — optional
## Referenz
- [`../HOSTING.md`](../HOSTING.md) — SMTP-Host `ha01s019.org-dns.com`
- [`../HOSTING.md`](../HOSTING.md)
- [`../config/mail.php`](../config/mail.php)
- boka-Relay: [`11-boka-smtp-relay.md`](11-boka-smtp-relay.md)
+15 -1
View File
@@ -17,10 +17,24 @@ Monitoring automatisch alle 5–10 Minuten ausführen.
- [ ] Ausführen: **Cron-Stil**
- [ ] Expression: `*/10 * * * *` (Pull-Checks alle 10 Min)
- [ ] Beschreibung: z. B. „0012 external monitoring pull“
- [ ] Benachrichtigen: **Nur Fehler** (PHP-Crash → Plesk-Mail)
- [ ] Benachrichtigen: **Nur Fehler** (siehe unten)
- [ ] **Jetzt ausführen** — Exit-Code / Log prüfen
- [ ] Optional zweite Aufgabe für leichtgewichtigen Heartbeat-Only-Check (`*/5`) — nur wenn von monitor.php getrennt
## Benachrichtigen: „Nur Fehler“
Erst beim Anlegen der geplanten Aufgabe in Plesk relevant (zusammen mit `monitor.php`).
| Option | Bedeutung |
|--------|-----------|
| **Nicht benachrichtigen** | Cron läuft still; Crash fällt nicht auf |
| **Nur Fehler** | Plesk mailt nur bei Skript-Fehler (PHP-Fatal, Exit ≠ 0, stderr) |
| **Jedes Mal** | Mail bei jeder Ausführung — bei `*/10` unbrauchbar |
**Empfehlung: „Nur Fehler“** — meldet, wenn `monitor.php` auf 0012.de selbst kaputt ist.
**Getrennt von Monitoring-Alerts:** Ausfall von `schwenk.online` kommt aus `sendAlert()` → `ALERT_EMAIL`. Plesk-Cron-Mail betrifft nur die Cron-Ausführung auf dem Webspace.
## Cron-Referenz
```
+39
View File
@@ -0,0 +1,39 @@
# 11 — SMTP-Relay von boka
**Priorität:** medium
**Status:** offen
**Abhängigkeiten:** [02-email-smtp.md](02-email-smtp.md) (erledigt)
**Blockiert:** boka-Apps, die über 0012.de mailen sollen
## Ziel
Prozesse auf **boka** (Docker-Stacks, Cron-Skripte) senden ausgehende Mail über den Plesk-SMTP von `0012.de`.
## Voraussetzungen (0012.de — erledigt in Todo 02)
- Postfach `admin@0012.de` mit Aliasen `monitor@`, `alert@`
- SMTP TLS/587 auf `ha01s019.org-dns.com`
- DKIM aktiv
## Checkliste
- [ ] Entscheiden: dediziertes Relay-Postfach vs. `admin@` + alias From-Adressen
- [ ] In Plesk: ausgehende Mail-Limits / Relay-Regeln prüfen (Hoster-Doku)
- [ ] SPF für `0012.de` verifizieren (boka-IPs nur wenn direkt sendend — bei Relay nicht nötig)
- [ ] boka: zentraler SMTP-Block (Docker env / `.env` auf boka)
- `SMTP_HOST=ha01s019.org-dns.com`
- `SMTP_PORT=587`
- `SMTP_USER=admin@0012.de`
- `SMTP_PASSWORD=…` (gleiches Postfach oder App-Passwort)
- [ ] Test von boka: `curl`/swaks oder kleines Script → Mail an persönliche Adresse
- [ ] Pro Stack: From-Adresse festlegen (`monitor@0012.de`, `alert@0012.de`, …)
## Akzeptanzkriterien
- Mindestens ein Dienst auf boka sendet erfolgreich über 0012.de-SMTP
- Keine Mails im Spam (DKIM pass)
## Referenz
- [`../HOSTING.md`](../HOSTING.md) — SMTP-Zugang
- [`../config/mail.php`](../config/mail.php) — Referenz-Implementierung (PHP)
+4 -1
View File
@@ -5,7 +5,7 @@ Nummerierte Todos für den 0012.de-Webspace. Abhängigkeiten beachten.
| # | Datei | Priorität | Kurzbeschreibung |
|---|-------|-----------|------------------|
| 01 | [01-bootstrap-env-deploy.md](01-bootstrap-env-deploy.md) | **high** | `.env`, Repo-Struktur, erstes FTP-Deployment |
| 02 | [02-email-smtp.md](02-email-smtp.md) | **high** | Postfächer, SMTP für Alerts und Relay |
| 02 | [02-email-smtp.md](02-email-smtp.md) | **high** | Postfächer, SMTP für Alerts (0012.de) |
| 03 | [03-monitoring-pull-phase1.md](03-monitoring-pull-phase1.md) | **high** | `monitor.php`, HTTPS/SSL-Checks, Alarm |
| 04 | [04-monitoring-push-boka.md](04-monitoring-push-boka.md) | **medium** | Push von boka → `ingest.php` |
| 05 | [05-plesk-cron.md](05-plesk-cron.md) | **high** | Geplante Aufgaben in Plesk |
@@ -14,11 +14,14 @@ Nummerierte Todos für den 0012.de-Webspace. Abhängigkeiten beachten.
| 08 | [08-monitoring-phase2.md](08-monitoring-phase2.md) | **medium** | API-Health, Latenz, Backup-Heartbeat |
| 09 | [09-monitoring-phase3.md](09-monitoring-phase3.md) | **low** | Rest-Domains, Dashboard, Header-Checks |
| 10 | [10-optional-plesk-git-composer.md](10-optional-plesk-git-composer.md) | backlog | Plesk Git / Composer evaluieren |
| 11 | [11-boka-smtp-relay.md](11-boka-smtp-relay.md) | **medium** | boka-Apps über 0012.de-SMTP |
## Backlog (ohne Priorität)
Todo **10** — Plesk Git-Deploy und Composer; dokumentiert in [`../PLESK.md`](../PLESK.md), kein Blocker für 02–09.
Todo **11** — boka SMTP-Relay; abhängig von erledigtem **02**, kein Blocker für **03**.
## Empfohlene Reihenfolge
```