Quitter Postmark
Gardez la bibliothèque Postmark et envoyez par OpenEmail. Changez son hôte et son jeton de serveur, et votre code d’envoi reste tel quel.
Ce qu’il faut changer
Pointez la bibliothèque vers https://api.openemail.uk/compat/postmark et mettez, là où va le jeton de serveur, une clé d’API OpenEmail dotée de la permission emails:send. Elle passe dans le même en-tête X-Postmark-Server-Token. Vos appels qui envoient du courrier restent tels quels, et l’adresse From décide si un message peut partir, comme partout dans OpenEmail.
import { ServerClient } from 'postmark' const client = new ServerClient(process.env.OPENEMAIL_API_KEY, { requestHost: 'api.openemail.uk/compat/postmark',}) await client.sendEmail({ From: '[email protected]', To: '[email protected]', Subject: 'Your invoice', HtmlBody: '<p>Your invoice is attached.</p>', MessageStream: 'outbound',})En Node, requestHost réunit l’hôte et le chemin, sans schéma ni barre oblique finale. En Ruby, path_prefix demande une barre oblique aux deux bouts. En Python, utilisez le paquet officiel postmark-python avec base_url. Le paquet communautaire postmarker ne sait pas atteindre un chemin sous un hôte, il ne fonctionne donc pas ici. En PHP, PostmarkClient::$BASE_URL prend le schéma, l’hôte et le chemin, sans barre oblique finale. Elle est statique : elle s’applique donc à tous les clients Postmark du processus, PostmarkAdminClient compris.
Ce qui correspond à quoi
Les points d’accès servis sont POST /email, /email/batch, /email/withTemplate et /email/batchWithTemplates. Les noms de champs correspondent quelle que soit la casse, comme chez Postmark, et une chaîne vide compte comme absente.
| Postmark | Dans OpenEmail |
|---|---|
| From | L’expéditeur, avec son nom. |
| To | Des destinataires séparés par des virgules. Avec Cc et Bcc, jusqu’à 50 par message. |
| ReplyTo | Une seule adresse de réponse. |
| Subject | L’objet. |
| HtmlBody | Le corps HTML. TextBody devient le corps texte, et l’un des deux est obligatoire. |
| Headers | Des en-têtes personnalisés, donnés par Name et Value : X-*, List-*, Reply-To, Precedence, Auto-Submitted, Importance, Priority et Feedback-ID. |
| Attachments | Des fichiers, 20 au plus et 5 Mo en tout. Une image dont le HTML utilise le ContentID comme cid: est insérée là où elle apparaît. Tout autre fichier arrive comme une pièce jointe ordinaire. |
| Tag | Un tag nommé tag. |
| Metadata | Des tags de mêmes noms et valeurs. Avec Tag, au plus 10 par message. |
| TrackOpens | Active ou désactive le suivi des ouvertures pour le message. |
| TrackLinks | HtmlAndText et HtmlOnly activent le suivi des clics, et None le désactive. |
| MessageStream | outbound, ou l’id de tout autre flux transactionnel, envoie le message normalement. |
| TemplateAlias | Le slug ou l’id (tpl_...) d’un modèle OpenEmail, rempli à partir de TemplateModel. InlineCss est accepté et ne change rien. |
Ce qui est refusé, et pourquoi
TemplateId, avec l’ErrorCode 1101. Un id de modèle Postmark ne signifie rien ici : recréez donc le modèle dans OpenEmail et envoyez son slug ou son id dansTemplateAlias.- Le flux
broadcast, avec l’ErrorCode 1236. Ces points d’accès envoient du courrier transactionnel, et les newsletters partent comme des diffusions OpenEmail. Subject,HtmlBodyouTextBodysur un message à modèle, avec l’ErrorCode 1123, car le modèle les fournit.TrackLinksréglé surTextOnly, car OpenEmail suit les liens de la partie HTML.- Plus d’une adresse de réponse, un en-tête donné deux fois ou hors de la liste ci-dessus, plus de 10 tags, et un nom de tag ou de
Metadatafait d’autre chose que de lettres, de chiffres, de_et de-. - Un lot de plus de 100 messages, avec l’ErrorCode 410. Postmark en accepte 500 : découpez donc les lots plus grands.
Réponses et erreurs
- Un envoi répond 200 avec
To,SubmittedAt,MessageID,ErrorCodeà 0 etMessageà OK.MessageIDest l’id du message OpenEmail, celui qu’utilisentGET /emails/{id}et les webhooks. Un en-têteIdempotency-Keyfonctionne comme dans le reste de l’API. - Un lot répond 200 avec un résultat par message, dans l’ordre. Un message qui a échoué ne porte que son
ErrorCodeet sonMessage, et les autres partent quand même. - Les erreurs reviennent sous la forme
ErrorCodeetMessage. Une clé absente ou inconnue, ou sansemails:send, répond HTTP 401 avec l’ErrorCode 10. Le reste répond HTTP 422 : ErrorCode 300 pour le message lui-même, 400 pour une adresse From que la clé ne peut pas utiliser, 401 pour un domaine qui ne peut pas encore envoyer, 402 pour un corps qui n’est pas du JSON et 405 pour un espace de travail qui a épuisé son quota d’envoi. HTTP 413 signifie que le corps dépasse 10 Mo, ou 50 Mo pour un lot, ou que les pièces jointes dépassent 5 Mo.