Your product gets the mail
and your code writes back
Every ticket, record or customer can have its own address. Mail sent there reaches your endpoint as a signed event, and your code answers as that address.
Nobody created these addresses. The reply leaves as the one the mail arrived at.
Where it starts
What this looks like today.
Replies land outside the product
A customer answers a notification, and the reply sits in a shared mailbox rather than on the record.
Somebody creates each address first
A new ticket cannot be written to until a mailbox exists for it, so addresses are set up by hand.
Your server polls for new mail
Nothing tells your code a message has arrived, so a job checks a mailbox on a timer.
How it works
Running in four steps.
- 01
Point a domain at OpenEmail
Add the domain and publish the records, and every address on it receives, including ones nobody created.
- 02
Install the typed client
Add the package to your app, then set a workspace key you can scope and revoke later.
- 03
Register your endpoint
Pick the events you want, copy the signing secret, and answer each delivery within five seconds.
- 04
Answer from your own code
Fetch the thread and its files by id, then send from the address the message was delivered to.
What it runs on
The parts doing the work.
It runs on a documented HTTP API, a typed client, webhooks to your endpoint, catch-all addresses on every domain you point here, and your own branding, files and tracked links.
A documented HTTP API with issuable, scopable, revocable keys.
A TypeScript client first, then the rest.
Tell your endpoint when mail arrives, instead of making you poll.
Every address on the domain receives, including ones that have never been created. One switch closes it.
Point several domains at one inbox, subdomains included.
Put your own mark and logo in the sidebar, in place of ours.
In practice
Every piece, walked through.
Four shorter pages sit under this one, one job each: an address per customer, mail out of your code, mail into your code, and an address for every test run, which is still to come.
Give every ticket, record or customer its own address, with nothing to create.
Send, read and organise mail from your own code with a typed client.
Mail arriving at your domain reaches your server as a signed webhook, seconds later.
Questions
Asked before signing up.
Do I have to create an address before it works?
No. With catch-all on, [email protected] receives the first time somebody writes to it. Mail to typos and made-up addresses arrives as well, and one switch closes the catch-all.
How does my code hear that mail arrived?
Your endpoint takes a signed webhook seconds after the message lands. The event names the thread and the address it was delivered to, so you fetch the message and its files by id.
Is there a client for my language?
Not yet, unless you write TypeScript. The typed client is TypeScript first and the others follow, so every other language calls the documented HTTP API directly for now.
Nearby
Other jobs for the same mailbox.
Your app posts a message and OpenEmail sends it from your own domain. Every call sits against the key that made it, and every send has an outcome to read.
Give an agent an address of its own and a key scoped to what it may do. It reads, labels, drafts and sends, and every call it makes is logged.