Email sandbox for developers
An email sandbox is an isolated environment that captures every email your application sends instead of delivering it. Messages land in a shared inbox where you and your team inspect rendered HTML, headers, links, and spam scores, and where automated tests assert on content through an API. Nothing reaches a real recipient.
Free plan: 1 sandbox, 500 emails per month, no credit card.
How is an email sandbox different from a fake SMTP server?
A fake SMTP server is the capture mechanism that accepts a message and never relays it, while an email sandbox is the product built around that mechanism: shared inboxes, rendering previews, spam scoring, and an API for assertions.
| Aspect | Fake SMTP server | Email sandbox |
|---|---|---|
| Goal | Capture outgoing mail so nothing is delivered | Inspect, share, and assert on captured mail |
| Scope | A protocol-level mechanism: handshake, store, never relay | A product around that mechanism: team inboxes, previews, spam scoring, API |
| Key question it answers | Did my app send an email? | Is the email correct, and what would the recipient actually see? |
Every sandbox contains a fake SMTP server; not every fake SMTP server is a sandbox. If you only want the capture mechanism and a config snippet for your framework, the fake SMTP server guide covers that on its own.
What does an email sandbox catch that logs miss?
An email sandbox stores the full MIME message, so it catches rendering failures, broken links, double-encoded tokens, high spam scores, and wrong recipients, none of which show up in a log line that says the send succeeded. These are the things that break in production:
HTML rendering
Tables that collapse on mobile, dark mode inverting your logo, a CSS property one client ignores. Mailloop renders the HTML next to the plain text part, with desktop and mobile viewport toggles and full-page screenshots.
Broken links and tokens
A password reset link pointing at localhost, a confirmation token that got double-encoded. The sandbox extracts every link from the captured message so you can check each one before a user does.
Spam score
SpamAssassin-style scoring: below 2.0 is clean, 5.0 and above gets filtered by many receiving servers, 8.0 and above is typically rejected outright. Mailloop runs deliverability checks on captured email so you see the score before launch.
Wrong recipients
The classic staging accident: a batch job emails 3,000 real customers because someone copied the production config. A sandbox captures by SMTP authentication, not by recipient address, so even a wrong To field goes nowhere.
How do teams organize email sandboxes?
Teams give each environment, feature branch, or workstream its own sandbox with its own SMTP credentials, so staging, dev, and QA traffic stay separate while everyone in the organization can open any inbox. The useful pattern is one sandbox per workstream, not one giant inbox for everything:
- One per environment. A
stagingsandbox and adevsandbox keep test traffic separate. QA reviews release emails in the staging inbox without digging through local development noise. - One per feature branch. Working on a new onboarding flow? Create a sandbox for the branch, point the branch's config at it, delete it when the branch merges. On Mailloop, creating a sandbox is one click or one API call.
- Shared by the whole team. Everyone in the organization sees the same captured emails, so a designer can review the rendered template a backend developer triggered. Mailloop's Basic plan ($12/month) covers 5 members and 5 sandboxes; Pro ($29/month) covers 10 members and 20 sandboxes.
- Receiving external email too. Each Mailloop sandbox has a catch-all
address at
[email protected], so it also captures inbound mail from third-party services you integrate with.
How do I test emails in CI?
To test emails in CI, create a throwaway sandbox at the start of the test, point your
app's SMTP config at it, trigger the action that sends email, block until the message
arrives, and assert on its content. Visual inspection does not scale to a test suite.
With @mailloop/sdk from npm:
import { MailloopClient } from '@mailloop/sdk';
const client = new MailloopClient({ apiKey: process.env.MAILLOOP_API_KEY });
// One throwaway inbox per test, deleted automatically
const sandbox = await client.sandboxes.createTemporary({ duration: 60 });
// Your app sends through sandbox.mailloop.io
// using sandbox.username / sandbox.password as SMTP credentials
await registerUser('[email protected]');
// Block until the email lands, then assert on it
const email = await client.emails.waitFor(sandbox.id, {
subject: 'Welcome',
timeout: 30000,
});
expect(email.to).toContain('[email protected]');
expect(email.html).toContain('Confirm your account');
Three details make this reliable in CI. Temporary sandboxes auto-delete after a set
duration, so parallel test runs never share an inbox and nothing piles up. The
waitFor call polls server-side, so there is no sleep-and-retry loop in your
test code. And because capture is keyed on SMTP credentials, the test passes or fails on
what your app actually sent, not on a mock.
For event-driven setups, sandboxes can also fire webhooks when an email arrives (Basic plan and up), which lets a separate job kick off the moment the message lands instead of polling at all.
Can an AI agent run the email test?
Yes: an agent connected to a sandbox over MCP can create a temporary inbox, run your
signup flow, wait for the welcome email, read its content and links, and report what
broke, all without a human opening an inbox. Mailloop runs a hosted MCP server at
https://api.mailloop.io/mcp with OAuth, so Claude Code, Cursor, or claude.ai
can do the whole loop with wait_for_email and get_email.
That turns "did the confirmation email go out with the right link?" into something you can ask your coding agent mid-session, without leaving the editor or pasting an API key. The agent skills that teach the workflow live at github.com/mailloop/skills. Setup instructions for each client are on the MCP server page.
Which email sandbox should you use?
Use a hosted sandbox such as Mailloop, Mailtrap, or Mailosaur when a team shares inboxes or CI runs in the cloud, and use self-hosted Mailpit when you only test on your own machine and want zero cost. The main options:
| Tool | Type | Free tier | Paid entry | CI and AI agent support |
|---|---|---|---|---|
| Mailloop | Hosted | 1 sandbox, 500 emails/mo | $12/mo (Basic) | REST API + SDK with server-side wait-for-email; official MCP server with OAuth |
| Mailtrap | Hosted | 50 emails/mo, 1 inbox | $14/mo annual (Basic) | REST API, unlimited API calls; official MCP server, 24 tools |
| Mailosaur | Hosted | None (14-day trial) | $20/mo annual (Personal) | SDKs for 8 languages, Cypress/Playwright integrations; third-party MCP only |
| Mailpit | Self-hosted OSS | Fully free (MIT) | None | REST API; third-party MCP only |
If you only test on your own machine and want zero cost, run Mailpit: a single Go binary, actively maintained, with a REST API and webhooks. Its trade-off is that it is local by design, so shared team inboxes and CI staging need extra networking, and spam scoring requires a separately running SpamAssassin server.
Mailosaur is strong when multi-language SDK support for Playwright or Cypress suites is the whole job, and it also tests SMS, but there is no permanent free tier. Mailtrap bundles a sandbox with a transactional sending platform, which fits if you want both from one vendor; its free sandbox caps at 50 emails per month. Mailloop's free plan captures 500 emails per month into 1 sandbox, and is the only one of the four with an official OAuth MCP server, so coding agents connect without an API key. Full comparison on the alternatives page, or read the ranked comparison of 8 email testing tools in 2026 for the wider field.
Frequently asked questions
Can't find what you're looking for? Email our team →