You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 5757bea
Browse filesBrowse the repository at this point in the historyBrowse files
fix(outreach): stop paying for a fresh draft every tick when a send cannot happen (#332)
Since 2026-09-25 the sender mailbox SMTP login has failed (535 from
forwardemail). A failed send logs the draft as dry_run and leaves the
prospect "researched", so every 15-minute tick drafted the same 26 people
again: ~2,800 model calls and ~$56/day on gpt-5.6-sol, zero emails sent.
- checkRecipient() runs before drafting; permanent refusals (machine
mailbox, suppressed, unsubscribed, bad address) mark the prospect skipped
- reuse the newest logged draft for the prospect+step (7 days)
- halt the campaign's tick on a provider failure or a sender failure
(bad SMTP creds, unreachable relay), not on one recipient's bounce
- OpenAI: reasoning headroom on max_output_tokens and low effort when the
caller disabled thinking; 900 tokens at medium came back empty but billed
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
// A sender failure halts the campaign tick, so misreading one recipient's
5
+
// bounce as a dead sender would stop a healthy campaign, and missing a dead
6
+
// sender pays for a fresh draft to every prospect in the queue.
7
+
describe("isSenderFailure",()=>{
8
+
it("treats rejected SMTP credentials as the sender's failure",()=>{
9
+
// Verbatim from forwardemail.net, the failure that ran from 2026-09-25.
10
+
expect(
11
+
isSenderFailure(
12
+
'Invalid login: 535 5.7.8 Invalid username or password, please try again or go to https://forwardemail.net/my-account/domains/profullstack.com/aliases and click "Generate Password"',
13
+
),
14
+
).toBe(true);
15
+
});
16
+
17
+
it("treats an unreachable relay as the sender's failure",()=>{
0 commit comments