Use case

Test OTP & 2FA email flows

When you're building your own product's one-time-passcode, two-factor, or email-verification flow, you need to receive the code reliably and read it fast — over and over, as you iterate. Perenmail gives you a private inbox on a real domain: point your app's email at it, watch the code land live, copy it in one tap, and come back to it later because the inbox doesn't disappear on you.

How it works

From send to copied code, in one place

  1. 01

    Spin up a private inbox on a real domain

    Create a registered-only address in one click. It lives on a real domain, so your product's mail server treats it like any other recipient — no special routing to work around.

  2. 02

    Enter it in your app's signup or login

    Paste the address into the flow you're testing: account signup, a login 2FA challenge, or an email-verification step. Trigger the send exactly as a real user would.

  3. 03

    The code lands live

    A listening indicator and poll heartbeat surface the message at the top of the inbox the moment it arrives — no reload, and the unread state updates in place. You watch the OTP land in real time.

  4. 04

    One-tap copy the OTP

    The verification code is extracted from the body for you. Copy it in a single click and drop it straight back into your login screen — no squinting at the message to find the six digits.

  5. 05

    The inbox persists for the re-send

    Inboxes are persistent by default: they never expire on their own. A resent code, a delayed second attempt, or the message you triggered five minutes ago is all still there, waiting.

Why persistence matters

OTP testing punishes inboxes that expire

A one-time code seems like the most ephemeral email there is — but testing the flow around it is anything but. You end up triggering the same send repeatedly, and the details you need to verify often arrive out of band from when you asked for them.

Rate-limited resends

Testing your resend logic means firing several codes in a row and confirming the right one wins. On an inbox that self-destructs you lose the earlier attempts; here every code stays put so you can compare them side by side.

Delayed delivery

A queued job or a slow upstream provider can push a code out minutes after you requested it. A persistent inbox is still there when it finally lands, so a late code is a message you read — not a test run you have to start over.

Because inboxes persist by default and mail streams in live, you can request a code, step away to check your app's logs, and come back to find it waiting at the top of the inbox. To debug whether a missing code is a delivery problem rather than a rendering one, open the raw source and check the synthesized SPF, DKIM and DMARC results on your own outbound mail.

What you get

The parts that make OTP testing quick

Live delivery

New mail appears at the top the instant it lands, with the unread count updating in place. You never refresh to check whether the code arrived.

One-tap OTP capture

Verification codes and every link in a message are extracted automatically. Copy the code or open the confirmation link in a single click while you iterate.

Private, registered-only

Addresses are private and not publicly browsable. Only your account can read the inbox, so the codes your product sends stay yours during testing.

Weighing tools for this? See how the persistent-inbox approach compares in Perenmail vs Mailtrap, or read the FAQ for how the free and Personal+ plans differ.

Ready when you are

Watch your next OTP land live.

Create a private inbox on a real domain, point your app's verification flow at it, and copy the code in one tap. Free forever, no credit card.