mail: zentrale Bounce-Suppression mit Versand-Gate und Circuit Breaker (Roadmap 1b.6, Schritte 1–2)

email_suppressions/email_bounces als Zustand und Ereignis-Log; ein
MessageSending-Listener streicht gesperrte Empfänger aus JEDER ausgehenden
Mail und setzt den Return-Path. Zweiter Aufnahmepfad: SMTP-Ablehnungen im
Worker — 5.1.x sperrt den Empfänger, Relay-Ablehnungen zählen für den
Circuit Breaker, der den Versand anhält statt gesunde Adressen zu sperren.
X-Pk-Ref-Header auf den Mails, API-Meldungen fallen auf die Firmen-E-Mail
zurück, der Bounce-Import schreibt in die zentrale Liste.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-09-15 13:48:56 +00:00
parent 87f95fb7a7
commit 0a658bb34b
25 changed files with 1312 additions and 4 deletions

View file

@ -34,9 +34,20 @@ trait Unsubscribable
public function headers(): Headers
{
return new Headers(text: [
return new Headers(text: array_filter([
'List-Unsubscribe' => '<'.$this->unsubscribeUrl.'>',
'List-Unsubscribe-Post' => 'List-Unsubscribe=One-Click',
]);
// Bounce-Referenz (Roadmap 1b.6), sofern die Mailable eine hat.
(string) config('bounces.reference_header', 'X-Pk-Ref') => $this->bounceReference(),
]));
}
/**
* Ein DSN bringt die Original-Header zurück; hiermit ordnet der
* Bounce-Parser den Rückläufer dem Datensatz zu. Mailables überschreiben.
*/
public function bounceReference(): ?string
{
return null;
}
}