---
title: "Test your signup mail"
description: "Give each test run its own address and read the mail it receives."
url: "https://openemail.uk/features/email-testing"
---

Built on top Soon

# Test your signup mail on every CI run

Give each test run its own address and read the mail it receives.

[Open mail](https://openemail.uk/mail/inbox) [Get Started](https://openemail.uk/signup.md)[Every walkthrough](https://openemail.uk/features/in-practice.md)

signup-42@acme.com

signup-03 @acme.com

Confirm your email 264831

Test run 3/3

signup-01 @acme.com 418204

signup-02 @acme.com 730915

signup-03 @acme.com 264831

Nothing creates the address first. Catch-all takes the mail and the test reads the code.

How it works

## Running in three steps.

1. 01
   
   Invent an address
   
   Use signup-42@yourdomain.com in the test. Nothing has to exist first.
2. 02
   
   Wait for the mail
   
   Search for it, or take the webhook when it lands.
3. 03
   
   Pull out the code
   
   Read the body and any file, then bin the thread.

What it runs on

## The parts doing the work.

Nothing here is a separate product. Each one is a piece of the mailbox you already have.

Catch-all addresses

Every address on the domain receives, including ones that have never been created. One switch closes it.

hello@ yourdomain.com delivered

billing@ yourdomain.com delivered

careers@ yourdomain.com delivered

anything-at-all@ yourdomain.com delivered

oct-2026-signup@ yourdomain.com delivered

REST API

A documented HTTP API with issuable, scopable, revocable keys.

/threads?query=invoice

{ "threads": 12 }

Same mailbox, whether a person or a program is holding it.

Typed SDKs

A TypeScript client first, then the rest.

/threads?query=invoice

{ "threads": 12 }

Same mailbox, whether a person or a program is holding it.

Webhooks

Tell your endpoint when mail arrives, instead of making you poll.

/threads?query=invoice

{ "threads": 12 }

Same mailbox, whether a person or a program is holding it.

Full-text search

Forgiving words and operators like from: and has:, inside the folder you are reading.

invoice from stripe

Stripe · Invoice #4021

Stripe · Receipt for Aug

Attachments

Pick them with the paperclip or paste them in. A pasted image lands in the body rather than the file list, and a file dragged onto the composer is not attached at all. On an OpenEmail mailbox incoming files sit in object storage, one object each, and opening a thread pulls every one of them.

contract\_v3.pdf 2.4 MB

brand-kit.zip 18 MB

Temporary addresses

A free inbox that takes real mail for an hour, then closes, so a signup cannot follow you.

trial-signup@example.com 60 min

extend it an hour at a time, up to a day

Nearby

## Other jobs for the same inbox.

Email into your app

Mail arriving at your domain reaches your server as a signed webhook, seconds later.

billing@in.yourapp.com Arrived

POST hooks.acme.dev/mail 200

type email.received

to billing@in.yourapp.com

An address per customer

Give every ticket, record or customer its own address, with nothing to create.

Ticket 8123 ticket-8123@ in.yourapp.com

Ticket 8124 ticket-8124@ in.yourapp.com

To ticket-8123@ in.yourapp.com

From ticket-8123@ in.yourapp.com Same address

Email inside your product

Send, read and organise mail from your own code with a typed client.

await openemail.emails.send({

from: 'receipts@acme.com',

})

id msg\_3e91c7

queued sent delivered

email.opened email.clicked

[Every walkthrough](https://openemail.uk/features/in-practice.md)
