M6: Mailversand als nachvollziehbaren Versandjob mit Dry-Run/Log

mailversenden.php hatte keine Zugriffskontrolle, versendete bei jedem
GET-Request sofort echte Mails und nutzte PHPMailer, dessen Quelldateien
im Repo gar nicht vorhanden waren (nur composer.json/Lizenz) - der Aufruf
waere also ohnehin mit Fatal Error abgebrochen. Zusaetzlich waren SMTP-
Host, Absender, PayPal-Link und FAQ-URL fest auf einen Alt-Kunden (AOK)
codiert.

- Ersetzt PHPMailer durch die bestehende saas_send_mail()-Abstraktion aus
  M3 (Transport log/mail je nach APP_MAIL_TRANSPORT) statt eine fehlende
  Abhaengigkeit nachzuvendoren.
- Neue Tabelle outbound_emails protokolliert jeden Versandversuch:
  Mandant, Mitglied, Vorlage, Betreff, Status, Fehler - das Versandlog.
- Formular hat eine standardmaessig aktive Dry-Run-Checkbox; im Dry-Run
  wird nur geloggt, saas_send_mail() nicht aufgerufen.
- Mailtext ist jetzt tenant-generisch (Saldo, optionaler PayPal-Link nur
  wenn der Mandant PayPal aktiviert hat, eigener Dashboard-Link) statt
  hartcodierter Alt-Kunden-Inhalte.
- Zugriffskontrolle ergaenzt (owner/admin/treasurer + Legacy-Fallback).
- http-smoke.php: mailversenden.php ist jetzt reguel</EOF>
This commit is contained in:
2026-07-15 16:13:38 +02:00
parent 81dfff51a0
commit d5195e7f9f
6 changed files with 286 additions and 117 deletions
@@ -0,0 +1,23 @@
CREATE TABLE IF NOT EXISTS outbound_emails (
id INT AUTO_INCREMENT PRIMARY KEY,
tenant_id INT NOT NULL,
participant_id INT NULL,
template VARCHAR(60) NOT NULL,
subject VARCHAR(255) NOT NULL,
status VARCHAR(30) NOT NULL,
sent_at DATETIME NULL,
error VARCHAR(500) NULL,
created_by_user_id INT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
KEY idx_outbound_emails_tenant_created (tenant_id, created_at),
KEY idx_outbound_emails_participant (participant_id),
CONSTRAINT fk_outbound_emails_tenant
FOREIGN KEY (tenant_id) REFERENCES tenants(id)
ON DELETE CASCADE,
CONSTRAINT fk_outbound_emails_participant
FOREIGN KEY (participant_id) REFERENCES participants(id)
ON DELETE SET NULL,
CONSTRAINT fk_outbound_emails_created_by_user
FOREIGN KEY (created_by_user_id) REFERENCES users(id)
ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;