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
| Case | Action | Expected behavior to define in your app |
|---|---|---|
| V01: normal | Submit the valid synthetic code or link | The intended account becomes verified once. |
| V02: incorrect | Submit a deliberately wrong code | Verification fails without changing the account state. |
| V03: expiry | Wait past the documented validity window | The server rejects the expired code or link. |
| V04: resend | Request a replacement, then try the older code | The older code is rejected if that is your replacement rule. |
| V05: replay | Reuse an already successful code or link | It cannot repeat a sensitive action or create unintended access. |
| V06: isolation | Try one synthetic account's code for another | The 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.
