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.
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
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.
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.
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'
?markRead=false so polling does not mutate state{"read": false}