SableMail guide

← Back to blog

How to Test Email Verification with SableMail in Staging

Run a controlled staging signup with synthetic data, then record wrong codes, expiry, resends, replay, and recipient isolation in a reusable test matrix.

Testing email verification flows is a routine part of building any product that requires user accounts. Whether you are testing a confirmation email, a one-time password, a welcome sequence, or a password reset link, you need a real inbox that can receive the message — and you need to be able to check it quickly.

The problem with using a real inbox for testing

Many developers start by using their personal or work email address for testing. This works at first, but it causes real problems: your inbox fills up with test emails, your email provider may start flagging or filtering your own test messages, and sharing test credentials with teammates becomes awkward when it involves a personal account.

Some teams create a shared Gmail or Outlook account for testing. This helps with sharing, but it still requires account setup, password sharing, and it accumulates test messages over time. It also fails to represent how real users — with real, varied email clients — would receive the message.

Using a temporary public inbox for testing

Choose a fresh public name for each safe staging run and use it as the recipient. When mail is delivered, SableMail lets you inspect it in the browser. Delivery is not guaranteed, and opening one inbox does not reproduce rendering in other email clients.

Multiple people can open the same public name, including people outside your team. Do not send valuable staging credentials or real customer information. Messages follow a 24-hour retention policy with daily automatic AWS cleanup. Invalidate test accounts and tokens in your own system after a run; removing an email does not revoke its code or link.

Practical testing patterns that work well

For signup and confirmation flows, use a fresh test address, trigger signup from your own staging environment, then compare the sender, recipient, subject, and verification destination with your expected values. Only use a code or link intentionally generated for your own synthetic test account.

For OTP testing, use a fresh inbox name for each test run to avoid confusion with old messages. Send the OTP, open the inbox, and verify the code matches what your system generated. This also helps you measure delivery speed under real conditions.

For transactional email testing, compare the available text and isolated HTML views. SableMail blocks remote images and active links in HTML, so it does not reproduce every email client's behavior. Test Gmail, Outlook, mobile clients, and accessibility separately when those are release requirements. The mail processor limits extracted text to 5,000 characters and HTML to 50,000, and this website has no attachment viewer. Long-message completeness and attachment checks need your own private mail testing setup.

Walk through one controlled staging signup

First define your application's rules: code expiry, resend replacement, attempt limit, and expected account state after verification. These are rules of your application, not controls enforced by SableMail. Restrict the synthetic account so its code or link cannot reach production data or perform a valuable action.

  • Choose a fresh name such as qa-signup-oct07-a91f. This is an example; generate a different name for each run. A unique name reduces collisions but remains public.
  • Open the name on SableMail and use Copy Email. Check that the full recipient ends in @sablemail.in.
  • Create a synthetic user in the staging app you control. Record the case ID and time when you trigger its verification email.
  • Return to the inbox and press Refresh. If nothing arrives, inspect your application's send attempt and provider logs before repeatedly resending.
  • Open the expected message in Text View. Compare the sender, subject, recipient, and message body with your application requirements.
  • Inspect any verification URL as text before using it. Check that its host is your known staging host. Do not put the full token-bearing URL into a search engine or public scanner.
  • Use the synthetic code or verified staging URL in your app, then confirm the intended account state changed there. Receiving an email alone does not prove verification succeeded.

Record these six verification cases

A suggested test matrix, not results of completed tests
CaseActionExpected behavior to define in your app
V01: normalSubmit the valid synthetic code or linkThe intended account becomes verified once.
V02: incorrectSubmit a deliberately wrong codeVerification fails without changing the account state.
V03: expiryWait past the documented validity windowThe server rejects the expired code or link.
V04: resendRequest a replacement, then try the older codeThe older code is rejected if that is your replacement rule.
V05: replayReuse an already successful code or linkIt cannot repeat a sensitive action or create unintended access.
V06: isolationTry one synthetic account's code for anotherThe code cannot verify a different account.

Copy the tab-separated worksheet below into verification-matrix.tsv and open it in a spreadsheet. Fill in observed results from your own controlled run. Keep codes and complete verification URLs out of the worksheet; use redacted request IDs when investigation needs a reference.

case_id	trigger_time	received_time	expected	observed	result
V01			Valid code verifies intended account		
V02			Wrong code rejected		
V03			Expired code rejected		
V04			Resend follows documented replacement rule		
V05			Used code cannot repeat the action		
V06			Code is bound to the intended account		

Separate delivery observations from precise latency

The time until you see a message includes sending, transport, and the delay until an inbox refresh. It is not a precise mail-server latency measurement. Use application and provider timestamps to investigate delays. Provider acceptance alone is not proof of final receipt. After testing, disable the synthetic account or invalidate its tokens in your own environment.

What to watch out for

Public temporary inboxes are not suitable for production-level testing that involves real customer data, private information, or sensitive credentials. Use them only in development, staging, or QA environments where the data involved is synthetic or safe to expose.

Delivery speed can vary based on the sending service, mail server configuration, and network conditions. For latency-sensitive testing, use multiple test runs and measure average delivery time rather than relying on a single result.

Found an error or a behavior that changed? Send a correction with the guide URL and a synthetic example.

Need a temporary inbox for testing or signups?

Open SableMail