Разработчикам
Почтовому ящику безразличен
тот, кто им управляет.
Всё, что делает приложение, делает и ваш код: 104 документированные операции на 68 путях за документом OpenAPI 3.1, который можно прочитать без ключа. TypeScript-клиент сверяется с этим документом при каждой сборке.
Для MCP не нужно вставлять ключ. Клиент сам находит сервер авторизации по эндпоинту, регистрируется и отправляет вас сюда для входа.
104
документированных операций
68
путей на одном хосте
116
методов SDK, покрывающих их все
20
событий вебхуков, в трёх семействах
Документ OpenAPI 3.1 лежит по GET /openapi.json, и для чтения ключ не нужен.
Интерфейсы
Три двери,
один ящик.
Ключ рабочего пространства решает, что может сделать вызов и от каких адресов он может отправлять. Отзыв — это обновление, а не удаление, поэтому следующему вызову сообщат, что ключ отозван.
Ключ отправляет от имени до 25 целых доменов и 50 отдельных адресов. GET /ping возвращает области доступа, которые у него есть, и те, что оставила ему его роль.
Направьте клиент на эндпоинт и войдите. Вставлять ключ не нужно: клиент регистрируется сам и отправляет вас сюда.
Инструменты строятся из того, что разрешено вызывающему, поэтому у клиента, ограниченного чтением, инструмента отправки нет. Токен всё равно достаёт до всего ящика.
Зарегистрируйте https-эндпоинт, и ящик будет слать на него запросы. Доставки порождает сам ящик, а не вызов API, поэтому письмо, написанное в приложении, и запрос к API вызывают одну и ту же.
20 событий в трёх семействах и десять эндпоинтов на ящик.
Паритет
Клиенту не отстать
от API.
Проверка паритета читает документ OpenAPI при каждой сборке и падает при расхождении: метод указывает на операцию, которой нет в спецификации; документированная операция без метода; список областей доступа, не совпадающий с тем, что требует операция. Она печатает то, что доказала, и сегодня это 116 методов SDK на все 104 документированные операции.
Конфигурация, запрос и вызов — это одна и та же операция, записанная тремя способами.
Агенты, API и MCP
OpenEmail рассчитан на то, что им управляют и программы, и люди. Ящик в обоих случаях один и тот же.
MCP-сервер
Направьте Claude или любой другой MCP-клиент на свой ящик.
OAuth для сторонних клиентов
СкороСамостоятельная регистрация клиента с PKCE, чтобы приложение могло запросить доступ как положено.
Согласие и отзыв есть; областей доступа нет, поэтому токен получает весь ваш ящик, а не ту часть, о которой просило приложение.
REST API
Документированный HTTP API с ключами, которые можно выпускать, ограничивать и отзывать.
Быстрый старт
От нуля до отправленного письма.
Три шага.
- 1
Выпустите ключ
Настройки, ключи API, в вашем собственном ящике. Выберите области доступа и сузьте, от чего он может отправлять, до целых доменов или отдельных адресов. Секрет показывается один раз, а хранится односторонний хеш.
GET /ping отвечает областями доступа ключа и теми, что оставила ему его роль. export OPENEMAIL_API_KEY=oe_live_9f2c1a4b7e05d3862c1f0a44_kX7… curl https://api.openemail.uk/ping \ -H "Authorization: Bearer $OPENEMAIL_API_KEY" - 2
Установите клиент
TypeScript-клиент без зависимостей, опубликованный как ESM и CommonJS, читает ключ из OPENEMAIL_API_KEY. Пропустите его, если предпочитаете слать JSON сами: каждый эндпоинт — это обычный HTTP.
Node 18 и новее, Workers, Deno, Bun и браузер. bun add @openemail/sdk - 3
Отправьте
В ответе приходит id. GET /emails/{id} его раскрывает, /events хранит историю по каждому получателю, а /tracking — открытия и клики.
Повтор с тем же Idempotency-Key вернёт первый результат с Idempotency-Replayed: true. import { init, openemail } from '@openemail/sdk' init({ apiKey: process.env.OPENEMAIL_API_KEY }) const email = await openemail.emails.send({ from: 'Acme Billing <[email protected]>', to: '[email protected]', subject: 'Your September invoice', html: '<p>Invoice attached.</p>',}) console.log(email.id, email.status)
Отсутствует
Чего он пока
для вас не сделает.
Пять вещей, которые лучше узнать до того, как начнёте на этом строить, а не после.
- Нет эндпоинта загрузки
- Встроенные вложения передаются в base64 с общим ограничением в 5 МБ. Файл побольше отправляют, назвав по id файл, уже лежащий в рабочем пространстве, — он уходит ссылкой на скачивание.
- Возвраты не идут дальше ящика
- Отчёт о доставке разбирается, сопоставляется по Message-ID, помечается в цепочке и уходит вебхуком email.bounced. В запись об отправке ничего не записывается обратно, поэтому через GET /emails отклонённое письмо по-прежнему выглядит отправленным.
- Писем из редактора нет в GET /emails
- Письма, отправленные из редактора в приложении, в этот список не попадают, потому что редактор пишет не через тот же путь отправки.
- У OAuth есть согласие, но нет областей доступа
- Запрос показывается до того, как его одобрят, и «Подключённые приложения» позволяют его отозвать, но токен получает доступ ко всему ящику, а не к той части, которую попросило приложение.
- Нет процесса релиза
- Публикация клиента — это ручной запуск предварительной проверки, сборки и bun publish, поэтому версия попадает в npm тогда, когда её кто-то запустит, а не когда изменение вливается.
Проверка доставки
Каждая доставка подписана,
и каждый повтор несёт её id.
Подпись — это HMAC-SHA-256 по метке времени, точке и сырому телу запроса. Проверяйте по байтам в том виде, в каком они пришли: разбор и повторная сериализация меняют порядок ключей и ломают подпись.
X-OpenEmail-Signature: t=1758240000,v1=9f0c4b2e7d1a86c3X-OpenEmail-Event: email.deliveredX-OpenEmail-Delivery: evt_4b7e05d3862c1f0a- Окно повтора
- 300 секунд, и следить за ними — дело получателя. Верификатор в SDK берёт это значение по умолчанию.
- Idempotency-Key
- Занимается по уникальному индексу, объединяющему этот ключ и ваш ключ API, поэтому повтор после таймаута вернёт первый результат с Idempotency-Replayed: true, а не отправит письмо дважды.
- Повторы
- Пять попыток: в момент события, затем через 1 минуту, 5, 25 и 2 часа. Повторяются только таймаут, отказ в соединении, 408, 425, 429 или 5xx.
- X-OpenEmail-Delivery
- Id события создаётся один раз, и его несёт каждая попытка, поэтому получатель, увидевший один и тот же id дважды, может отбросить второй, а не обработать его снова.
Для кого это
Один почтовый ящик.
Три входа.
Бесплатный адрес на openemail.uk, и за ним клиент.
Тот же почтовый ящик через API, SDK и MCP.
Выпустите ключ.
Отправьте что-нибудь.
Full API, MCP and SDK access — на всех тарифах. Free приносит с собой 50 AI actions a day.