# Mail-Prozess

## Überblick

Der Versand aller Bestellmails ist zentral in `includes/functions.php` implementiert und wird synchron innerhalb der jeweiligen HTTP-Requests ausgeführt.

- Kernfunktion für Versand: `sendEmail(...)`
- Fachlicher Mail-Trigger: `createOrder(...)`
- Laufzeit-Einstellungen: `getSystemSettings()` aus `data/settings.json`
- Startwerte/Fallbacks: `config.php`

Hinweis:

- Es gibt keine Queue, keinen Hintergrundjob und keine Retry-Logik. Versand erfolgt direkt per PHP-`mail()`.

## Relevante Einstellungen

Die folgenden Parameter steuern den Mailfluss:

| Schlüssel | Quelle | Wirkung |
|---|---|---|
| `order_recipient_email` | Admin-Einstellungen (`data/settings.json`) | Empfänger für interne Bestellmail |
| `attach_order_pdf_to_admin_email` | Admin-Einstellungen | Hängt PDF an interne Bestellmail an |
| `FROM_EMAIL`, `FROM_NAME` | `config.php` | Absender/Anzeigename für alle ausgehenden Mails |

## Mail-Typen und Auslöser

### 1) Eingangsbestätigung an Besteller

- Funktion: `sendOrderCreatedCustomerEmail($order)`
- Trigger: direkt nach `createOrder(...)`
- Empfänger: `order.customer_email`
- Inhalt: Bestellung erfasst und intern weitergeleitet

### 2) Interne Bestellmail

- Funktion: `sendConfirmedOrderAdminNotification($order)`
- Trigger: direkt nach `createOrder(...)`
- Empfänger: `getOrderRecipientEmail()` (normalisiert/validiert)
- Inhalt: HTML-Bestellzusammenfassung
- Optional: PDF-Anhang `bestellung-<order-id>.pdf` bei aktivem `attach_order_pdf_to_admin_email`
- PDF-Erzeugung: `renderOrderPdf($order)` (intern `prepareOrderForDocument()` + `generateOrderPdf()`); enthält keine Bearbeitungs-/Lieferstatus-Felder aus der Admin-Oberfläche
- Admin-Nachdruck: `admin/order-pdf.php?id=<order-id>` (Schaltfläche „Bestellung drucken“ auf `admin/order.php`)

## Ablauf

1. `createOrder(...)` speichert die Bestellung.
2. Interne Bestellmail wird versendet.
3. Besteller erhält Eingangsbestätigung.

## Technische Versanddetails

- Ohne Anhang: HTML- oder Textmail direkt über `mail($to, $subject, $message, $headers)`.
- Mit Anhang: `multipart/mixed` mit Base64-kodierten Attachments.
- Standard-Header:
  - `From: <FROM_NAME> <FROM_EMAIL>`
  - `Reply-To: FROM_EMAIL`
  - `X-Mailer: PHP/<version>`

## Fehlerverhalten und Nachvollziehbarkeit

- Rückgaben von `sendEmail(...)` werden nur teilweise ausgewertet:
  - Bei interner Bestellmail wird bei Erfolg `admin_notified_at` gesetzt.
  - Schlägt die interne Mail fehl, bleibt `admin_notified_at` leer.
  - Fehlschläge von Bestellermails blockieren den Bestellprozess nicht.
- Es gibt keine automatische Wiederholung fehlgeschlagener Mails.
- Betriebsvoraussetzung bleibt eine funktionierende Server-Mailkonfiguration für PHP-`mail()`.
