From 2d37e5598d432a9cf8d7d4af9e59586549be7c2d Mon Sep 17 00:00:00 2001 From: jelveh Date: Mon, 20 Jul 2026 11:46:26 -0700 Subject: [PATCH] feat(email): document per-recipient best-effort delivery via `failed` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The email-send driver now attempts every recipient's private delivery even when one fails, returning failed addresses in the result's `failed` array instead of failing the whole call — so callers retry only the failed subset and never re-mail delivered recipients. Adds the field to the public EmailSendResult typing and module docs. Co-Authored-By: Claude Fable 5 --- src/puter-js/src/modules/Email.js | 5 +++++ src/puter-js/types/modules/email.d.ts | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/src/puter-js/src/modules/Email.js b/src/puter-js/src/modules/Email.js index d87385ae8..98cb2836d 100644 --- a/src/puter-js/src/modules/Email.js +++ b/src/puter-js/src/modules/Email.js @@ -27,6 +27,11 @@ import * as utils from '../lib/utils.js'; * Recipients who unsubscribe are dropped from future sends — they come * back in the result's `suppressed` array — and a send whose `to` list * is entirely unsubscribed is rejected. + * + * Each recipient gets a private delivery. A recipient whose delivery + * fails comes back in the result's `failed` array (everyone else got + * their copy — retry with just those addresses); the call only rejects + * when no recipient could be delivered. */ class Email { /** diff --git a/src/puter-js/types/modules/email.d.ts b/src/puter-js/types/modules/email.d.ts index e865d970f..3b2b820a1 100644 --- a/src/puter-js/types/modules/email.d.ts +++ b/src/puter-js/types/modules/email.d.ts @@ -42,6 +42,12 @@ export interface EmailSendResult { cost: number; /** Recipients omitted because they opted out of this sender's mail. */ suppressed: string[]; + /** + * Recipients whose delivery attempt failed. Everyone else got their + * copy — retry with just these addresses. A send where every delivery + * fails rejects instead. + */ + failed: string[]; } /**