feat: pause campaign batches on SMTP failure

This commit is contained in:
2026-08-20 17:39:08 +02:00
parent 69e6588a89
commit c846c249b8
12 changed files with 385 additions and 33 deletions
@@ -932,10 +932,11 @@ export default function ReviewSendPage({
const sent = result.sent_count ?? 0;
const failed = result.failed_count ?? 0;
const unknown = result.outcome_unknown_count ?? 0;
const paused = result.paused_count ?? 0;
setMessage(
effectiveDryRun ?
"i18n:govoplan-campaign.dry_run_finished_no_message_was_sent.c026c6cd" :
`Send finished. SMTP accepted ${String(sent)} message(s), failed ${String(failed)}, outcome unknown ${String(unknown)}.`
`Send finished. SMTP accepted ${String(sent)} message(s), failed ${String(failed)}, outcome unknown ${String(unknown)}, paused ${String(paused)}.`
);
setSendConfirmOpen(false);
await reload();
@@ -1765,6 +1766,13 @@ export default function ReviewSendPage({
{sendResult &&
<div className="review-flow-data-section">
<p className="muted small-note">i18n:govoplan-campaign.attempted.a9eb9c90 {String(sendResult.attempted_count ?? "—")}i18n:govoplan-campaign.smtp_accepted.a5d0dccc {String(sendResult.sent_count ?? "—")}i18n:govoplan-campaign.failed.fac9f871 {String(sendResult.failed_count ?? "—")}i18n:govoplan-campaign.outcome_unknown.4383023a {String(sendResult.outcome_unknown_count ?? 0)}i18n:govoplan-campaign.skipped.6b98496c {String(sendResult.skipped_count ?? "—")}.</p>
<p className="muted small-note">
SMTP batch: {humanize(String(sendResult.batch_state ?? "not_started"))} · connections {String(sendResult.smtp_connection_count ?? 0)} · reconnects {String(sendResult.smtp_reconnect_count ?? 0)} · paused {String(sendResult.paused_count ?? 0)}.
</p>
{sendResult.batch_state === "paused" &&
<DismissibleAlert tone="warning" resetKey={String(sendResult.batch_pause_reason_code ?? "smtp_systemic_failure")}>
Remaining messages were paused before SMTP after a systemic transport failure ({String(sendResult.batch_pause_reason_code ?? "smtp_systemic_failure")}). Review the Mail profile, then resume the campaign queue.
</DismissibleAlert>}
{sendResultRows.length > 0 &&
<DataGrid
id={`campaign-${campaignId}-workflow-send-results`}