The moment the app says “check your email”, most automation stops. This does not.
When a project enables the mailbox capability, a mail catcher runs beside the application in its environment and the app's SMTP settings point at it. The agent gets the mail as tools: wait for a message, read it, search, and follow the link or code it contains, in the same browser session.
agentSubmitted the participant email on /register. The page says "Check your inbox for a sign-in link". Waiting for the message.
toolwait_for_email({ to: "participant+7f2a@qa.test", subject_contains: "Your sign-in link", timeout_s: 60 })
→ { id: "m_41", from: "noreply@jade.events", received_at: "…12:04:31Z", links: ["https://…/auth/magic?token=…"] }
toolbrowser_navigate("https://127.0.0.1:41733/auth/magic?token=…")
agentLanded on the participant dashboard as Jordan Ruiz. The welcome banner and the event card are present. Continuing with step 4.
What it looks like in a run.
The excerpt is the shape of a real transcript: the agent explains what it sees, calls a mail tool, gets back the message with its links already extracted, and navigates. Nothing is mocked in the app; the email really was sent and really was read.
| Tool | Does |
|---|---|
wait_for_email | blocks until a message matching recipient and subject arrives, or times out |
get_email | returns one message with text, HTML, links and codes parsed out |
search_emails | lists recent messages by recipient, sender or subject |
send_email | sends into the app for inbound-mail flows (a support inbox, a reply-to) |
Flows this unlocks.
- Magic-link sign-in: request the link, read it, land signed in, continue the test.
- One-time codes: the code is parsed from the message and typed into the form.
- Invitations: an admin invites a colleague; the agent accepts as the invitee from the email.
- Verification and receipts: assert the confirmation mail arrived with the right event, dates and reference, not just that the page said so.
- Rendered email: open the HTML body in a tab and screenshot it, so the recording shows what the recipient would see.
mailbox:
enabled: true
# Injected into the app's boot env by the platform:
SMTP_HOST: 127.0.0.1 SMTP_PORT: 1025
EMAIL_DOMAIN_ALLOWLIST: qa.test # apps that allow-list recipients need this
# The agent's own test addresses use a plus-tag so parallel runs never
# read each other's mail: participant+<job-id-prefix>@qa.testWhere it stops today
- The mailbox is part of an isolated environment. A project that tests a fixed URL has no captured mail unless that deployment already points at a catcher the platform can read.
- Mail the app sends through a third-party API (rather than SMTP) is only captured if the app can be pointed at the catcher's SMTP port in test configuration.
- The catcher is Mailpit. Its readiness probe is known to fail on the docker backend in local development; it works on the cluster and native box backends.
- Inbound mail (send_email) reaches the app only if the app polls or receives from the catcher; most do not, and the seeded examples that do are Jade's support inbox.