Email Testing for Developers
Test emails like you debug code. SMTP in, IMAP/API out. Inspect headers, MIME and raw source. Nothing leaves the sandbox.
SMTP, IMAP, POP3
Your existing mail clients work out of the box. No vendor SDK, no lock-in.
- Quick setupPoint an MX record and the domain receives real email from any service. No setup wizard, no 50-page guide.
- REST APIAccounts, messages, domains, tokens. API-first.
- Message inspectionHeaders, MIME tree, raw RFC 5322. See exactly what arrived.

After delivery
Check what arrived in the UI or wire it into CI.
- Delivery checksHTML preview, text, headers, raw source. Plus SPF/DKIM/DMARC results via API.
- CI-readyStandard SMTP - any CI that sends email works. GitHub Actions, Jenkins, GitLab CI, whatever you use.
- Deliverability auditSender config, HTML structure, links, and the content patterns spam filters flag. Grouped by severity.

Quickstart
Send, read, assert
Your app sends over SMTP. Your test reads the result over the API. The whole loop fits on one screen.
# create an inbox
curl -X POST https://api.smtp.dev/accounts \
-H "X-API-KEY: $SMTP_DEV_API_KEY" \
-H "Content-Type: application/json" \
-d '{"address": "qa@example.com", "password": "use-a-secret"}'
# your app sends to it, then read what arrived
curl "https://api.smtp.dev/accounts/$ACCOUNT/mailboxes/$INBOX/messages" \
-H "X-API-KEY: $SMTP_DEV_API_KEY"
const transport = nodemailer.createTransport({
host: 'send.smtp.dev',
port: 587,
requireTLS: true,
auth: { user: 'ci@example.com', pass: process.env.SMTP_DEV_PASSWORD },
})
await transport.sendMail({
from: 'ci@example.com',
to: 'qa@example.com',
subject: `Welcome ${Date.now()}`,
text: 'Confirm your address: https://example.com/confirm/abc123',
})
// read it back over the API, newest first
const { member } = await fetch(
`https://api.smtp.dev/accounts/${account}/mailboxes/${inbox}/messages`,
{ headers: { 'X-API-KEY': process.env.SMTP_DEV_API_KEY } },
).then(res => res.json())
assert.match(member[0].text, /\/confirm\//)
msg = EmailMessage()
msg["From"], msg["To"] = "ci@example.com", "qa@example.com"
msg["Subject"] = "Reset your password"
msg.set_content("https://example.com/reset/abc123")
with smtplib.SMTP("send.smtp.dev", 587) as smtp:
smtp.starttls()
smtp.login("ci@example.com", os.environ["SMTP_DEV_PASSWORD"])
smtp.send_message(msg)
# read it back over the API, newest first
messages = requests.get(
f"https://api.smtp.dev/accounts/{account}/mailboxes/{inbox}/messages",
headers={"X-API-KEY": os.environ["SMTP_DEV_API_KEY"]},
).json()["member"]
What you can test
Each card links to a guide.
Features
Custom Domains
Bring your own domains and subdomains. One MX record each.
Disposable Accounts
Create an address per test run over the API. Delete it after.
Unlimited Messages
On every plan - no daily caps, no metering.
Sandboxed
Receives real email from any service. Sends only within the sandbox.
SPF, DKIM, DMARC
Checked on every inbound message. Results in the UI and the API.
Retention Timers
Messages kept for your plan's window, up to 90 days. Per-message expiry for shorter.
REST API
Domains, accounts, mailboxes, messages, tokens. OpenAPI spec included.
Real-time Updates
New messages pushed via SSE. No polling.
Catch-All & Aliasing
Wildcard accounts and plus-sign addressing. Capture everything or route by tag.
Start testing
Sign up, add a domain, receive your first test email.