Skip to content

Mailboxes page: add a sending mailbox with just its address and password - #112

Merged
ralyodio merged 1 commit into
mainfrom
feat/mailboxes
Oct 6, 2026
Merged

ralyodio merged 1 commit into
mainfrom
feat/mailboxes

Conversation

@ralyodio

@ralyodio ralyodio commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

Anthony asked for a way to add a mailbox to outreachgraph.com, with UX like Swokei's /mailboxes, for fully automated cold email.

What ships

  • /mailboxes page, linked from Settings. It has a stats strip and one card per mailbox, with an empty state that prompts for the first connection.

  • Add mailbox dialog, in the Swokei flow:

    1. Google / Microsoft / Any other provider (IMAP and SMTP) tiles.
    2. Email + password. The servers are detected (see below), the daily limit and warm-up are set here, and server settings are folded away.
    3. Live test.
    4. Domain DNS check.
  • Detection (POST /api/v1/mailboxes/detect) tries, in order:

    1. known consumer domains
    2. the MX provider (Google, Microsoft, Forward Email, Fastmail, Zoho)
    3. Mozilla ISPDB autoconfig
    4. a labelled smtp./imap. guess

    Live checks: anthony@profullstack.com → Forward Email, and anthropic.com and octavehot.org → Google Workspace.

  • Connect verifies IMAP too. Before this, only SMTP was checked, which is how a mailbox sent about 280 emails and never read a reply.

  • Per-mailbox health:

    • a 0–100 score: warm-up progress minus a stopped account, bounces, and unread replies
    • bounce risk (low/medium/high, 30 days)
    • sent today / cap, and the warm-up day
    • "inbox checked N min ago", or the last IMAP error (migration 0047, written by the reply poller)
  • DNS check (GET /api/v1/mailboxes/:id/dns): SPF (including whether it names the provider), DKIM (known selectors), DMARC and MX, each with the record to add. Live result for profullstack.com: SPF, DMARC and MX pass, and DKIM warns because Forward Email's fe-… selector can't be looked up from outside.

  • CLI: og mailboxes, og mailboxes detect|dns|add <email>. add reads the password from a hidden prompt or OG_MAILBOX_PASSWORD.

  • MCP: list_mailboxes, check_mailbox_dns.

Sending rotation, sticky per-lead mailboxes, warm-up and bounce auto-pause already exist (sender pool, #91). This PR is the page, onboarding and health on top of them.

Not included

  • Google/Microsoft OAuth connect. Google and Microsoft tiles use app passwords over IMAP/SMTP, as before.
  • A managed pre-warmed mailbox pool like Explee's.

Checks

  • Tests: domain, providers, pipeline, API (mailboxes.test.ts, senders.test.ts), CLI and MCP all pass locally.
  • bun run typecheck and apps/web tsc --noEmit are clean.
  • /mailboxes rendered against a local API with seeded mailboxes.

🤖 Generated with Claude Code

A Swokei-style Mailboxes page (/mailboxes, linked from Settings) for the
addresses cold email is sent from:

- Add mailbox: Google / Microsoft / "Any other provider (IMAP and SMTP)"
  tiles, then email + password. Servers are detected from the address
  (known domains, MX provider, Mozilla ISPDB autoconfig, then a labelled
  smtp./imap. guess). Daily limit and warm-up set in the same step.
- Connecting now logs in over IMAP as well as SMTP, so a mailbox that
  sends but cannot be read fails on the form instead of silently never
  showing a reply.
- Each mailbox card: health score (warm-up progress minus bounces, a
  stopped account and unread replies), bounce risk over 30 days,
  sent today / cap, warm-up day, when its inbox was last read and the
  last IMAP error (migration 0047, written by the reply poller), and an
  SPF / DKIM / DMARC / MX check with what to add.
- API: GET /mailboxes, POST /mailboxes/detect, GET /mailboxes/:id/dns.
- CLI: og mailboxes [detect|dns|add]; MCP: list_mailboxes,
  check_mailbox_dns.

The single-mailbox form on Settings is replaced by a link to the page;
the social sending accounts panel stays there.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ralyodio
ralyodio merged commit 82d9f2e into main Oct 6, 2026
4 checks passed
ralyodio added a commit that referenced this pull request Oct 6, 2026
…alive (#113)

Every dev2 deploy on 2026-10-06 failed the same way: the runtime stage's
RUN chown -R bun:bun /app walked all of node_modules for over four minutes
without printing, and the runner's idle SSH session was dropped (Broken
pipe, exit 255). Production stayed on the last good image, so merged
changes (including #112) never reached outreachgraph.com.

Copy the Next build with --chown=bun:bun (the only tree written at
runtime) and drop the recursive chown; add ServerAliveInterval to the
deploy's ssh calls.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
@ralyodio ralyodio mentioned this pull request Oct 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant