Send test emails.
Nobody receives them.
MailBench is a testing SMTP inbox for developers and QA. Connect your staging and CI environments to capture and inspect every email, without accidentally sending messages to real customers. Your AI coding agent can check them too, over MCP.
Free plan included, no credit card. Paid plans from $15/month. See pricing.
Try it with your own app
Get a real MailBench inbox for the next hour. Send it an email from your code or a one-line command and watch it land here, live.
Lasts 60 minutes. Up to 25 messages. No account, no card.
1. Point your app at this inbox
- Host
- Port
- Username
- Password
2. Watch it arrive
LiveWaiting for your first email…
Send one with the snippet on the left, or from your own app.
It works. Keep this inbox?
Sign up free and this inbox moves into your account with its messages. Your app keeps the same SMTP credentials, and you get the full viewer: HTML preview, spam score, link checks and the raw source.
Sign up to keep this inboxThis demo inbox has expired.
Demo inboxes and their messages are deleted after an hour.
Swap four lines and you're done
Keep your mailer as it is, or move over from another sandbox. Change the SMTP credentials in your staging environment and every message lands in MailBench instead.
Create an inbox
Sign up and add a project. Copy its SMTP credentials.
Swap the credentials
Update your staging and CI environment variables. Your mailer code stays the same. Sending through SendGrid, Mailgun, Postmark or Resend? Change the SDK's base URL instead.
Send a test email
It appears in your MailBench inbox instead of anyone's real mailbox.
Laravel: .env
MAIL_MAILER=smtp
MAIL_HOST=smtp.mailbench.dev
MAIL_PORT=587
MAIL_USERNAME=your-inbox-user
MAIL_PASSWORD=your-inbox-pass
MAIL_ENCRYPTION=tlsNode.js: mailer.ts (Nodemailer, works in Next.js route handlers and server actions)
import nodemailer from 'nodemailer';
export const transport = nodemailer.createTransport({
host: process.env.SMTP_HOST, // smtp.mailbench.dev
port: Number(process.env.SMTP_PORT ?? 587),
secure: false, // STARTTLS on 587; use true with port 465
auth: {
user: process.env.SMTP_USER, // your-inbox-user
pass: process.env.SMTP_PASS, // your-inbox-pass
},
});Rails: config/environments/staging.rb
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
address: 'smtp.mailbench.dev',
port: 587,
user_name: ENV['SMTP_USER'], # your-inbox-user
password: ENV['SMTP_PASS'], # your-inbox-pass
authentication: :plain,
enable_starttls_auto: true
}Django: settings.py
import os
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.mailbench.dev'
EMAIL_PORT = 587
EMAIL_USE_TLS = True # STARTTLS
EMAIL_HOST_USER = os.environ['SMTP_USER'] # your-inbox-user
EMAIL_HOST_PASSWORD = os.environ['SMTP_PASS'] # your-inbox-passPlain SMTP
Host: smtp.mailbench.dev
Ports: 587 (STARTTLS), 465 (TLS), 2525 (STARTTLS, if 587 is blocked)
Username: your-inbox-user
Password: your-inbox-pass
Auth: PLAIN or LOGINMore frameworks and a curl test on the integrations page
Works with: Laravel, Node.js, Django, Rails, GitHub Actions, GitLab CI, anything that speaks SMTP, and the SendGrid, Mailgun, Postmark and Resend SDKs.
Everything you check before an email ships
Testing SMTP inbox
A private inbox per project. Messages are captured and never delivered.
Every view
Switch between rendered HTML, plain text, raw source, and full headers.
HTML, link and spam checks
Catch broken HTML, dead links and spam triggers before an email ships.
Teams and roles
Separate inboxes for dev, staging, and QA, shared with your team by role.
MCP for AI agents
Let Claude Code, Cursor or any MCP client create an inbox, wait for your app’s email and follow its links.
REST API and webhooks for CI
Wait for the next email in your test suite and assert on it, or get a webhook the moment one lands.
Pricing you can read in one glance
You pay for a monthly or yearly subscription to the hosted service. Every plan includes the SMTP inbox, dashboard, email checks, REST API and MCP; Pro and Team lift the API's daily cap and add more mail, retention and webhooks.
Free
For trying it out and side projects.
Free forever
- 2,500 emails per month
- 7-day retention
- Up to 5 team members
- REST API and MCP for AI agents, 1,000 requests a day
- 1 webhook
Pro
For a product team with staging and CI.
Billed monthly, or $144/year billed yearly
$12/month, billed yearly
- 50,000 emails per month
- 30-day retention
- Up to 15 team members
- REST API and MCP for AI agents, 30 requests per second
- 10 webhooks
Team
For busy test suites and several teams.
Billed monthly, or $468/year billed yearly
$39/month, billed yearly
- 250,000 emails per month
- 90-day retention
- Unlimited team members
- REST API and MCP for AI agents, 100 requests per second
- Unlimited webhooks
Prices in USD, taxes added at checkout. Payments are handled by Paddle, our merchant of record.
Safe for the data you test with
Never delivered
Captured messages are stored for you to inspect and are never sent onward.
Retention by plan
Messages are deleted after 7, 30 or 90 days, depending on your plan.
GDPR
Data processing agreement available on request at hello@ivivelabs.com.
Data location
Customer data is hosted in Germany (EU).
Questions people ask first
Is it safe to use with production data?
Use it with test data whenever you can. MailBench never delivers messages onward, and captured messages are deleted when your plan's retention period ends.
Do emails ever get delivered?
No. Every message stops in your MailBench inbox. There is no setting that forwards mail to real recipients.
Can I switch from another email sandbox?
Yes. Replace your SMTP host, port, username, and password. Nothing else in your app changes.
What are the limits, and how do I get support?
Limits for each plan are on the pricing page. For help, email support@mailbench.dev.
Stop emailing real users from staging
Create a free inbox, point your staging environment at it, and see every email your app sends.

