Inceptmail
Local development email testing

Test email on localhost without a fake SMTP server

Nothing to run, nothing to port-forward. Swap in a real test address and your app sends exactly the way it will in staging and production.

Free plan includes 500 emails a month. No credit card.

.env.local
- [email protected]+ MAIL_TO=dev.acme@inceptmail.dev# everything else is unchangedMAIL_PROVIDER=ses[email protected]

One line changes. No local server, no port, no extra dependency.

The problem

Why local email testing usually needs extra infrastructure

Most fixes for local email either add a server to run or risk sending a real message.

A local SMTP catcher

Tools like a local mail-catcher container work, but they mean another service to run, another port to remember, and configuration that has to change again for staging and production.

Sending real mail by accident

Without a catcher, it is easy to leave production mail credentials in a local .env file and send a real email while testing on your own machine.

Different setup per teammate

One developer's local mail-catcher setup is not another's, so a bug that only shows up with real delivery is hard to reproduce across the team.

How to

How to set up local email testing in four steps

Do it once per project, then every developer's local setup just works.

  1. 01

    Create a local dev inbox

    Add an inbox such as [email protected], or one per developer if you prefer, no server to run.

  2. 02

    Point your local .env at it

    Set the recipient in your seed data or test account to the inbox address, nothing else changes.

  3. 03

    Run your app as usual

    Whatever provider your app sends through in every other environment, keep using it here too.

  4. 04

    Watch mail arrive live

    Messages show up in the dashboard the moment they are sent, with no local server to check.

Checklist

What a good local email setup looks like

Local development should be a smaller version of production, not a special case.

No local-only mail behaviour

Your app sends the exact same way in local development as it does in staging and production.

Nothing runs on a port

There is no local SMTP catcher container to start, stop, or forget about.

Same address model everywhere

Local, staging, and production each use their own Inceptmail project, following one pattern.

Safe by default

A real, private address means an accidental send never reaches an actual customer.

Consistent for the whole team

Every developer's local setup behaves the same, so an email bug reproduces reliably.

Works with any provider

SES, Postmark, Resend, SendGrid, or your own SMTP relay, the recipient is what changed, not the sender.

Watch for

Common local email setup problems

Most of these come from local development needing a different setup than everywhere else.

ProblemWhat you will notice
Real mail sent locallyA live provider key in .env sends an actual email during development.
Catcher-only behaviourThe email works locally but breaks once it hits a real provider in staging.
Forgotten local serverA background mail-catcher container from months ago is still running, unnoticed.
Port conflictTwo projects fight over the same local SMTP port.
Config driftOne teammate's .env still points at an old local catcher setup.
Silent failureThe catcher is not running, so mail just disappears with no error shown.
Why Inceptmail

Test local email with Inceptmail

A real address instead of a local server, so local development looks like every other environment.

Nothing to run

No local SMTP server, no port, no container. A real address, ready instantly.

The same setup, everywhere

Local, staging, and production all use a real recipient address, not a special local-only path.

Preview and raw HTML

See the rendered email and the underlying markup, exactly as it will look for a real user.

One address per developer

Give each teammate their own inbox, or share one for the whole team.

Once your app is deployed, the same pattern covers staging environment email and automated tests in CI.

Local development email testing FAQ

How do I test email in local development without sending real mail?

Point your local environment's recipient address at a private test inbox instead of a real one. Your app keeps sending through whichever provider it normally uses, so nothing about your local setup needs a special mail-catcher path.

Do I need to run a local SMTP server like MailHog or Mailpit?

No. Those tools work by capturing your app's own outbound SMTP traffic locally, which means running a container and reconfiguring your app for local development specifically. Using a real test address means local development behaves the same as every other environment.

Can every developer on the team have their own inbox?

Yes. Create one inbox per developer, or per feature branch, so everyone's local test mail stays separate without any shared local infrastructure.

Does this slow down my local development loop?

No, delivery is live. The email shows up in the dashboard the moment your app sends it, the same as watching a local mail-catcher's inbox.

Will this behave differently once I deploy to staging or production?

No, that is the point. The only thing that changes between environments is which Inceptmail inbox (or a real customer, in production) receives the mail, not how your app sends it.

Is Inceptmail free for local development?

Yes. The Free plan includes 500 emails a month, 3 inboxes per project, and 7 days of message history, with no credit card needed.

Give your test email a proper home.

Create your first inbox in under a minute. The Free plan covers a whole project.

Get started free