Kein Zugriff"; include "footer.php"; exit; } $ergebnisse = null; $dryRun = true; if ($_SERVER["REQUEST_METHOD"] === "POST") { $dryRun = !empty($_POST['dry_run']); $settings = saas_fetch_tenant_settings($pdo, $tenantId); $dashboardUrl = saas_app_url('index.php'); $createdByUserId = $saasUser['user_id'] ?? null; $teilnehmer = ledger_fetch_participant_summaries($pdo, $tenantId, ['active_only' => true]); $ergebnisse = []; foreach ($teilnehmer as $person) { $email = trim((string)($person['email'] ?? '')); if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $ergebnisse[] = ['name' => $person['display_name'], 'email' => $email, 'status' => 'ohne_email']; continue; } $subject = 'Kaffeeliste - Dein aktueller Stand'; $body = saas_render_balance_mail_body( $person['display_name'], (int)$person['balance_cents'], $settings, $dashboardUrl ); if ($dryRun) { saas_log_outbound_email($pdo, $tenantId, $person['participant_id'], 'balance_notice', $subject, 'dry_run', null, $createdByUserId); $ergebnisse[] = ['name' => $person['display_name'], 'email' => $email, 'status' => 'dry_run']; continue; } $sendResult = saas_send_mail($email, $subject, $body); if ($sendResult['ok']) { saas_log_outbound_email($pdo, $tenantId, $person['participant_id'], 'balance_notice', $subject, 'sent', null, $createdByUserId); $ergebnisse[] = ['name' => $person['display_name'], 'email' => $email, 'status' => 'sent']; } else { saas_log_outbound_email($pdo, $tenantId, $person['participant_id'], 'balance_notice', $subject, 'failed', $sendResult['error'] ?? 'unbekannter Fehler', $createdByUserId); $ergebnisse[] = ['name' => $person['display_name'], 'email' => $email, 'status' => 'failed']; } } if (!$dryRun) { app_audit_log($pdo, $tenantId, $createdByUserId, 'mail_broadcast.sent', 'tenant', $tenantId, ['empfaenger' => count($ergebnisse)]); } } $log = saas_fetch_outbound_email_log($pdo, $tenantId, 20); function mailversenden_status_label(string $status): string { return match ($status) { 'sent' => 'Versendet', 'failed' => 'Fehlgeschlagen', 'dry_run' => 'Dry-Run (nicht versendet)', 'ohne_email' => 'Keine E-Mail-Adresse', default => $status, }; } ?>

Info-Mail versenden

Verschickt an alle aktiven Mitglieder eine E-Mail mit dem aktuellen Kaffeelisten-Stand. Im Dry-Run wird nichts wirklich versendet, aber jeder Empfänger wird im Versandlog unten protokolliert.

Ergebnis dieses Laufs ()

NameE-MailStatus
">

Versandlog (letzte 20)

DatumMitgliedBetreffStatusFehler
Noch kein Versand protokolliert.