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.
One line changes. No local server, no port, no extra dependency.
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 set up local email testing in four steps
Do it once per project, then every developer's local setup just works.
- 01
Create a local dev inbox
Add an inbox such as [email protected], or one per developer if you prefer, no server to run.
- 02
Point your local .env at it
Set the recipient in your seed data or test account to the inbox address, nothing else changes.
- 03
Run your app as usual
Whatever provider your app sends through in every other environment, keep using it here too.
- 04
Watch mail arrive live
Messages show up in the dashboard the moment they are sent, with no local server to check.
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.
Common local email setup problems
Most of these come from local development needing a different setup than everywhere else.
| Problem | What you will notice |
|---|---|
| Real mail sent locally | A live provider key in .env sends an actual email during development. |
| Catcher-only behaviour | The email works locally but breaks once it hits a real provider in staging. |
| Forgotten local server | A background mail-catcher container from months ago is still running, unnoticed. |
| Port conflict | Two projects fight over the same local SMTP port. |
| Config drift | One teammate's .env still points at an old local catcher setup. |
| Silent failure | The catcher is not running, so mail just disappears with no error shown. |
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