Desenvolupadors
A la bústia li és igual
qui hi ha al volant.
Tot el que fa l'aplicació, ho fa el teu codi: 104 operacions documentades en 68 rutes, darrere d'un document OpenAPI 3.1 que pots llegir sense cap clau. El client de TypeScript es contrasta amb aquest document a cada compilació.
MCP no necessita cap clau per enganxar. El client descobreix el servidor d'autorització a partir de l'endpoint, es registra sol i t'envia aquí a iniciar sessió.
104
operacions documentades
68
rutes sota un sol host
116
mètodes de l'SDK, que les cobreixen totes
20
esdeveniments de webhook, en tres famílies
El document OpenAPI 3.1 és a GET /openapi.json, i llegir-lo no demana cap clau.
Superfícies
Tres portes,
una bústia.
Una clau d'espai de treball decideix què pot fer una crida i des de quines adreces pot enviar. Revocar-la és una actualització i no una eliminació, així que a una crida posterior se li diu que la clau s'ha revocat.
Una clau pot enviar des de fins a 25 dominis sencers i 50 adreces concretes. GET /ping retorna els abasts que té i els abasts que el seu rol li ha deixat.
Apunta un client a l'endpoint i inicia sessió. No hi ha cap clau per enganxar, perquè el client es registra sol i t'envia aquí.
Les eines es construeixen a partir del que pot fer qui truca, així que un client limitat a llegir no hi té cap eina d'enviament. Un testimoni, però, arriba a tota la bústia.
Registra un endpoint https i la bústia hi publica. Els lliuraments els genera la bústia mateixa i no una crida a l'API, així que redactar a l'aplicació i publicar a l'API provoquen el mateix.
20 esdeveniments en tres famílies, i deu endpoints per bústia.
Paritat
El client no pot anar per darrere
de l'API.
Una comprovació de paritat llegeix el document OpenAPI a cada compilació i falla si hi ha desviacions: un mètode que apunta a una operació que l'especificació no té, una operació documentada sense mètode, o una llista d'abasts que no concorda amb el que l'operació exigeix. Imprimeix què ha demostrat, i avui això diu 116 mètodes de l'SDK sobre les 104 operacions documentades.
La configuració, la petició i la crida són la mateixa operació, escrita de tres maneres.
Agents, API i MCP
OpenEmail està pensat perquè l'operi tant el programari com les persones. La bústia és la mateixa en tots dos casos.
Servidor MCP
Apunta Claude, o qualsevol client MCP, cap a la teva bústia.
OAuth per a clients de tercers
AviatRegistre de clients en autoservei amb PKCE, perquè una aplicació pugui demanar accés com cal.
El consentiment i la revocació hi són; l'abast, no, de manera que un token arriba a tota la teva bústia i no a la part que ha demanat una aplicació.
API REST
Una API HTTP documentada amb claus que es poden emetre, acotar i revocar.
Guia ràpida
Del no-res a un missatge enviat.
Tres passos.
- 1
Crea una clau
Configuració, claus API, en una bústia que sigui teva. Tria'n els abasts i restringeix des d'on pot enviar a dominis sencers o adreces concretes. El secret es mostra una sola vegada i el que es desa és un hash d'un sol sentit.
GET /ping respon amb els abasts de la clau i els abasts que el seu rol li ha deixat. export OPENEMAIL_API_KEY=oe_live_9f2c1a4b7e05d3862c1f0a44_kX7… curl https://api.openemail.uk/ping \ -H "Authorization: Bearer $OPENEMAIL_API_KEY" - 2
Instal·la el client
Un client de TypeScript sense dependències, publicat com a ESM i CommonJS, que llegeix la clau d'OPENEMAIL_API_KEY. Salta-te'l si prefereixes enviar el JSON tu mateix, perquè cada endpoint és HTTP pur.
Node 18 i superior, Workers, Deno, Bun i el navegador. bun add @openemail/sdk - 3
Envia
La resposta porta l'id. GET /emails/{id} el resol, /events té el rastre per destinatari i /tracking té les obertures i els clics.
Un reintent que porta la mateixa Idempotency-Key torna el primer resultat amb 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)
Absent
El que encara no farà
per tu.
Cinc coses que val la pena saber abans de construir-hi a sobre, i no després.
- Cap endpoint de pujada
- Els adjunts en línia van en base64 amb un límit total de 5 MB. Un fitxer més gran s'envia indicant per l'id un fitxer que ja és a l'espai de treball, que viatja com a enllaç de descàrrega.
- Els rebots es queden a la bústia
- Un informe de lliurament s'analitza, es vincula pel Message-ID, s'etiqueta al fil i s'envia com a webhook email.bounced. No s'escriu res de tornada a la fila d'enviament, així que a través de GET /emails un missatge rebotat encara consta com a enviat.
- El correu del redactor no és a GET /emails
- El correu enviat des del redactor de l'aplicació no apareix en aquesta llista, perquè el redactor no escriu pel mateix camí d'enviament.
- OAuth té consentiment, no abast
- Una sol·licitud es mostra abans de concedir-se i Aplicacions connectades la pot retirar, però un testimoni arriba a tota la teva bústia i no només a la part que ha demanat una aplicació.
- Cap flux de publicació
- Publicar el client és una execució manual del preflight, la compilació i bun publish, així que una versió arriba a npm quan algú l'executa i no quan el canvi entra.
Verificar un lliurament
Cada lliurament va signat,
i cada reintent en porta l'id.
La signatura és un HMAC-SHA-256 sobre la marca de temps, un punt i el cos en cru. Verifica-la contra els bytes tal com han arribat, perquè analitzar-los i tornar-los a serialitzar reordena les claus i la trenca.
X-OpenEmail-Signature: t=1758240000,v1=9f0c4b2e7d1a86c3X-OpenEmail-Event: email.deliveredX-OpenEmail-Delivery: evt_4b7e05d3862c1f0a- Finestra de repetició
- 300 segons, i fer-la complir és feina del receptor. El verificador de l'SDK l'aplica per defecte.
- Idempotency-Key
- Es reclama contra un índex únic sobre la clau i la teva clau API alhora, així que un reintent després d'un temps d'espera esgotat torna el primer resultat amb Idempotency-Replayed: true en comptes d'enviar dues vegades.
- Reintents
- Cinc intents: quan passa l'esdeveniment, i després al cap d'1 minut, 5, 25 i 2 hores. Només es repeteix un temps d'espera esgotat, una connexió rebutjada, un 408, 425, 429 o un 5xx.
- X-OpenEmail-Delivery
- L'id de l'esdeveniment es crea una sola vegada i cada intent el porta, així que un receptor que vegi dues vegades el mateix id pot descartar el segon en comptes de tornar a actuar-hi.
Per a qui és
Una bústia.
Tres maneres d'entrar-hi.
Una adreça gratuïta a openemail.uk, amb el client darrere.
La mateixa bústia a través d'una API, un SDK i MCP.
Crea una clau.
Envia alguna cosa.
Full API, MCP and SDK access a tots els plans. Free hi porta 50 AI actions a day inclòs.