Mail Servermailzen.dev
Sign in with Microsoft
Receiving mail

Every address at mailzen.dev is already an inbox.

A capture inbox for testing the email your applications actually send. Address a message to anything you like at this domain and it lands here in seconds — no mailbox to create, and nothing to change on the sending side.

Nothing is registered in advance — pick an address and send
signup-test-8185@mailzen.dev

Everything before the @ is yours to invent. No mailbox to create, no address to register — it works the first time you use it.

  • signup-test-8185@mailzen.dev
  • qa-reset-flow@mailzen.dev
  • www3-notify-2026@mailzen.dev
  • literally-anything@mailzen.dev

All four land in the same inbox. Use a fresh one per test run and your results stay isolated from everyone else's.

How it works

1

Your app sends as usual

No SMTP host to point at, no credentials to swap. Mail arrives because it is addressed to this domain, so application config stays untouched.

2

Cloudflare receives on port 25

The domain's MX records deliver to Email Routing, which hands each message straight to a Worker — the one thing an ordinary platform cannot do.

3

Read it, or assert on it

Messages appear in the dashboard immediately, with the same REST API underneath for automated tests to poll.

What you get

Unlimited addresses

A catch-all accepts every local part, so each run can take its own address without registering it first.

The whole message

HTML, plain text, headers, raw RFC822 source and attachment metadata, each on its own tab.

Safe HTML preview

Captured markup renders in a sandboxed frame with no permissions, so scripts and forms stay inert.

Bounded retention

Messages expire on a schedule an administrator sets — monthly and quarterly are a click — under a hard cap on how many are kept. A public inbox attracts spam; this keeps it finite. Ask /api/mail/stats for the policy in force.

Built for automation

Every endpoint returns { success, data | error } and takes the same credentials as the dashboard.

Isolate runs with a fresh address and a since timestamp. The inbox is shared, so deleting from it is reserved for administrators — retention clears old mail on its own, and nothing a suite asserts on needs removing by hand.

# wait for a signup mail, then read its subject
curl -s -u qa:"$PASSWORD" \
  "https://mailzen.dev/api/mail?search=signup&since=$START" \
  | jq -r '.data.emails[].subject'
GET /api/mailList and filter: limit, offset, search, unread, since
GET /api/mail/:idOne message in full — add ?markRead=false so polling does not mutate state
PATCH /api/mail/:idFlip the read flag back with {"read": false}
GET /api/mail/statsCounts, retention and per-environment breakdown