Programiści
Skrzynce nie robi różnicy,
kto ją obsługuje.
Wszystko, co robi aplikacja, robi Twój kod: 104 udokumentowane operacje w 68 ścieżkach, za dokumentem OpenAPI 3.1, który przeczytasz bez klucza. Klient TypeScript jest przy każdym buildzie trzymany w zgodzie z tym dokumentem.
MCP nie wymaga wklejania klucza. Klient odnajduje serwer autoryzacji na podstawie endpointu, rejestruje się sam i odsyła Cię tutaj, żebyś się zalogował.
104
udokumentowanych operacji
68
ścieżek pod jednym hostem
116
metod SDK, pokrywających je wszystkie
20
zdarzeń webhooków, w trzech rodzinach
Dokument OpenAPI 3.1 jest pod GET /openapi.json, a jego odczyt nie wymaga klucza.
Interfejsy
Troje drzwi,
jedna skrzynka.
Klucz przestrzeni roboczej decyduje, co wolno wywołaniu i z jakich adresów może wysyłać. Unieważnienie to aktualizacja, a nie usunięcie, więc późniejsze wywołanie dostaje informację, że klucz został unieważniony.
Klucz wysyła z maksymalnie 25 całych domen i 50 pojedynczych adresów. GET /ping odczytuje zakresy, które ma, i zakresy, jakie zostawiła mu jego rola.
Wskaż klientowi endpoint i zaloguj się. Nie ma klucza do wklejenia, bo klient rejestruje się sam i odsyła Cię tutaj.
Narzędzia budowane są z tego, co wolno wywołującemu, więc klient ograniczony do czytania nie ma w sobie narzędzia do wysyłki. Token wciąż sięga całej skrzynki.
Zarejestruj endpoint https, a skrzynka będzie do niego wysyłać. Dostarczenia wywołuje sama skrzynka, a nie wywołanie API, więc napisanie wiadomości w aplikacji i wysłanie jej przez API powodują to samo.
20 zdarzeń w trzech rodzinach i dziesięć endpointów na skrzynkę.
Zgodność
Klient nie może zostać w tyle za
API.
Kontrola zgodności czyta dokument OpenAPI przy każdym buildzie i pada przy rozjeździe: metoda wskazująca na operację, której specyfikacja nie ma, udokumentowana operacja bez metody albo lista zakresów niezgodna z tym, czego operacja wymaga. Wypisuje, co udowodniła, i dziś brzmi to: 116 metod SDK na wszystkie 104 udokumentowane operacje.
Konfiguracja, żądanie i wywołanie to ta sama operacja, zapisana na trzy sposoby.
Agenci, API i MCP
OpenEmail ma być obsługiwany zarówno przez oprogramowanie, jak i przez ludzi. Skrzynka w obu przypadkach jest ta sama.
Serwer MCP
Skieruj Claude, albo dowolnego klienta MCP, na swoją skrzynkę.
OAuth dla klientów zewnętrznych
WkrótceSamodzielna rejestracja klienta z PKCE, żeby aplikacja mogła poprosić o dostęp jak należy.
Zgoda i cofnięcie dostępu są; zakres nie, więc token sięga całej skrzynki, a nie tej części, o którą poprosiła aplikacja.
REST API
Udokumentowane API HTTP z kluczami, które można wydawać, ograniczać zakresem i unieważniać.
Szybki start
Od zera do wysłanej wiadomości.
Trzy kroki.
- 1
Wygeneruj klucz
Ustawienia, Klucze API, na skrzynce, którą posiadasz. Wybierz jego zakresy i zawęź adresy, z których może wysyłać, do całych domen lub pojedynczych adresów. Sekret pokazujemy raz, a przechowujemy jednokierunkowy hash.
GET /ping odpowiada zakresami na kluczu i zakresami, jakie zostawiła mu jego rola. export OPENEMAIL_API_KEY=oe_live_9f2c1a4b7e05d3862c1f0a44_kX7… curl https://api.openemail.uk/ping \ -H "Authorization: Bearer $OPENEMAIL_API_KEY" - 2
Zainstaluj klienta
Klient TypeScript bez zależności, publikowany jako ESM i CommonJS, czytający klucz z OPENEMAIL_API_KEY. Pomiń go, jeśli wolisz sam wysyłać JSON, bo każdy endpoint to zwykły HTTP.
Node 18 wzwyż, Workers, Deno, Bun i przeglądarka. bun add @openemail/sdk - 3
Wyślij
Odpowiedź niesie id. GET /emails/{id} je rozwiązuje, /events ma ślad dla każdego odbiorcy, a /tracking otwarcia i kliknięcia.
Ponowienie z tym samym Idempotency-Key zwraca pierwszy wynik z 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)
Nieobecne
Czego jeszcze nie zrobi
za Ciebie.
Pięć rzeczy, które warto wiedzieć, zanim coś na tym zbudujesz, a nie potem.
- Brak endpointu do wysyłki plików
- Załączniki inline idą jako base64 z łącznym limitem 5 MB. Większy plik wysyła się, wskazując po id plik już obecny w przestrzeni roboczej — podróżuje wtedy jako link do pobrania.
- Odbicia kończą się na skrzynce
- Raport doręczenia jest parsowany, dopasowywany po Message-ID, oznaczany na wątku i wypychany jako webhook email.bounced. Nic nie zapisuje się z powrotem do wiersza wysyłki, więc przez GET /emails odbita wiadomość nadal czyta się jako wysłana.
- Poczty z edytora nie ma w GET /emails
- Poczta wysłana z edytora w aplikacji nie pojawia się na tej liście, bo edytor nie zapisuje przez tę samą ścieżkę wysyłki.
- OAuth ma zgodę, nie zakres
- Prośba jest pokazywana, zanim zostanie przyznana, a Połączone aplikacje ją cofają, ale token sięga całej Twojej skrzynki, a nie tej części, o którą aplikacja prosiła.
- Brak procesu wydawniczego
- Publikacja klienta to ręczne uruchomienie preflightu, builda i bun publish, więc wersja trafia do npm wtedy, gdy ktoś to uruchomi, a nie wtedy, gdy zmiana wyląduje.
Weryfikacja dostarczenia
Każde dostarczenie jest podpisane,
a każde ponowienie niesie jego id.
Podpis to HMAC-SHA-256 z sygnatury czasowej, kropki i surowego ciała żądania. Weryfikuj na bajtach w takiej postaci, w jakiej dotarły, bo parsowanie i ponowna serializacja zmieniają kolejność kluczy i to psują.
X-OpenEmail-Signature: t=1758240000,v1=9f0c4b2e7d1a86c3X-OpenEmail-Event: email.deliveredX-OpenEmail-Delivery: evt_4b7e05d3862c1f0a- Okno powtórzeń
- 300 sekund, a ich egzekwowanie to zadanie odbiorcy. Weryfikator w SDK przyjmuje je domyślnie.
- Idempotency-Key
- Rezerwowany przez unikalny indeks na kluczu razem z Twoim kluczem API, więc ponowienie po przekroczeniu czasu zwraca pierwszy wynik z Idempotency-Replayed: true, zamiast wysyłać dwa razy.
- Ponowienia
- Pięć prób: w chwili zdarzenia, a potem po 1 minucie, 5, 25 i 2 godzinach. Powtarzane są tylko przekroczenie czasu, odrzucone połączenie, 408, 425, 429 lub 5xx.
- X-OpenEmail-Delivery
- Id zdarzenia powstaje raz i niesie je każda próba, więc odbiorca, który widzi to samo id dwa razy, może odrzucić drugie zamiast działać ponownie.
Dla kogo to jest
Jedna skrzynka.
Trzy drogi wejścia.
Darmowy adres w openemail.uk, a za nim klient poczty.
Adresy dla wszystkich, bez liczenia członków jako stanowisk.
Ta sama skrzynka przez API, SDK i MCP.
Wygeneruj klucz.
Wyślij coś.
Full API, MCP and SDK access w każdym planie. Free niesie ze sobą 50 AI actions a day.