What's new Preview emails in real clients

Ethereal for your laptop. Mailloop for CI.

Ethereal is the quickest way to see what your Node app sent. When a test has to check the email, a teammate has to open it or an agent has to read it, point the transport at a Mailloop sandbox.

  • 500 emails a month, no card
  • EU-hosted
  • Plain SMTP, any language
mail/transport.ts +2 −3
Removed: const account = await nodemailer.createTestAccount();
const transport = nodemailer.createTransport({
Removed: host: 'smtp.ethereal.email',
Added: host: 'sandbox.mailloop.io',
port: 587,
Removed: auth: { user: account.user, pass: account.pass },
Added: auth: { user: SMTP_USER, pass: SMTP_PASS },
});
  • Nodemailer Same transport, same send calls
  • Port 587 works as before
  • Local dev Ethereal can stay on your laptop
how a test reads the email
API vs IMAP
how a teammate opens it
Team vs link
messages an hour
No cap vs 200/h
for your coding agent
MCP vs none

Where a throwaway inbox runs out

Four moments where Ethereal stops fitting. Each one is a single change on the Mailloop side.

A test has to check the email

Ethereal has no REST API, so a test that needs the password reset link logs in over IMAP, searches, downloads the raw message and parses it. With Mailloop the test asks for the email and gets it parsed.

reset.test.ts
const email = await client.emails.waitFor(sandboxId, {
  subject: 'Reset your password',
});

expect(email.html).toContain('/reset?token=');

CI runs in parallel

A public Ethereal account takes 200 messages an hour, then rejects the next one until the hour turns over. Mailloop counts volume by the month, and every job can get its own temporary sandbox.

Someone else needs to see it

An Ethereal message is shared by pasting its preview URL, and a few hours later it is gone. A Mailloop sandbox is a shared inbox the whole team opens, a week later if they need to. Free has 1 user, Basic 5.

Welcome to Acme just now
Reset your password 1 hour ago
Your receipt #1042 2 hours ago

An agent is doing the testing

A coding agent that just changed the signup flow should check the email it sends. Mailloop's MCP server lets Claude Code, Cursor, claude.ai or ChatGPT create a sandbox, call wait_for_email, follow the links and screenshot the message, signed in with OAuth.

Agent mailloop MCP

Check the password reset email after my change.

mailloop wait_for_email "Reset"
"Reset your password", 1 link
mailloop screenshot_email gmail-web
Rendered in Gmail web

The reset link points at staging and the button renders in Gmail.

When do you need an Ethereal alternative?

When a message has to outlive a few hours, be seen by someone else, or be checked by an automated test. Ethereal is free and needs no signup, but it deletes mail after a few hours, has no API besides IMAP, caps public accounts at 200 messages an hour and shares messages as public links.

Ethereal vs Mailloop

Ethereal Email compared with Mailloop
Mailloop Ethereal
Getting started
Cost Yes: Free for 500 emails a month, then from $12/mo Yes: Free
Signup Partly: An account, no credit card Yes: None, createTestAccount()
Keeping and sharing mail
How long mail stays Yes: Until you delete it, up to 200 per sandbox on Free No: A few hours, then deleted
Rate limit Yes: Monthly volume, no hourly cap Partly: 200 messages an hour per account
Sharing a message Yes: Shared inbox for your organization Partly: Public preview link
Tests and agents
API Yes: REST API and @mailloop/sdk Partly: IMAP and POP3 only
Wait for an email in a test Yes: waitFor, held on the server No: Search over IMAP in a loop
Inbound address Yes: Every sandbox, every plan No: Disabled on public accounts
Screenshots in email clients Yes: Gmail, Outlook, Apple Mail and more No: HTML preview in your browser
Webhooks Yes: From Basic No: None
MCP server for agents Yes: Hosted, OAuth No: None

Ethereal facts checked on September 24, 2026 against ethereal.email, its FAQ and help pages. Mailloop numbers come from our pricing page.

Seen something inaccurate? Tell us

Use both.

The transport at the top of this page is the whole setup. In development it asks Ethereal for a fresh account, so nobody needs credentials to run the app. Everywhere else it uses a Mailloop sandbox from the environment, which is where tests assert, reviewers look and agents read. Both sides are plain SMTP.

Ethereal, when

  • You are debugging on your own machine and want zero setup
  • A quick script needs to prove an email went out
  • Nobody else needs to see the message tomorrow

Mailloop, when

  • A test in CI has to find the email and check its links or codes
  • Teammates or reviewers need to open the same message
  • Parallel jobs send more than 200 emails an hour
  • A coding agent should verify the emails it changes

Ethereal and Mailloop, common questions

Weighing the hosted options? Mailloop vs Mailtrap covers price, limits and the agent setup, and the fake SMTP server guide explains how capture works if you would rather self-host Mailpit.

Why do my Ethereal messages disappear?
Ethereal deletes messages after a few hours by design (A few hours, then deleted. 100 MB per account). Mailloop keeps captured mail until you delete it or the sandbox reaches its history limit (200 messages on Free, 1,000 on Basic, oldest removed first).
Are Ethereal preview links private?
No. The FAQ says message URLs are public and the authentication is encoded into the URL, so anyone who gets the link can open the message. That is fine for fake data and worth knowing before a staging email with real names ends up in a chat thread. A Mailloop message opens only for members of your organization.
Does nodemailer.createTestAccount() work with Mailloop?
No, it only creates Ethereal accounts. For Mailloop you create a sandbox once (or a temporary one from a test through the SDK) and pass its SMTP credentials to nodemailer.createTransport(), as in the snippet at the top of this page.
Is Ethereal still maintained?
Yes. It is run by the Nodemailer team and funded by EmailEngine, their commercial product, and the site was updated in 2026. It is free; the limit is 200 messages per hour per public account, then rejected until the next hour.
Do I need Node.js to use Mailloop?
No. Anything that speaks SMTP can send to a sandbox, and the REST API works from any language. The @mailloop/sdk package is for JavaScript and TypeScript tests, and the MCP server is for coding agents.

Last updated

Keep Ethereal local, give CI a real inbox

A shared sandbox with an API, webhooks and an MCP server. 500 emails a month free, no credit card.