Guide
Migrer depuis Postmark
Passez de Postmark à Emailit. Faites correspondre les serveurs, les flux de messages et les jetons, convertissez les champs de l’API, changez les paramètres SMTP, et transférez webhooks, adresses bloquées et modèles.
Ce guide fait correspondre les concepts, les appels API, les webhooks, les adresses bloquées et les modèles de Postmark à leurs équivalents dans Emailit. Lisez d’abord Migrer vers Emailit pour l’ordre général et la façon de faire fonctionner les deux fournisseurs en parallèle.
Concepts
| Postmark | Emailit |
|---|---|
| Compte | Compte |
| Serveur | Espace de travail, ou un seul espace de travail avec plusieurs domaines d’envoi |
| Jeton d’API de serveur (Server API token) | Clé API Sending Only, éventuellement restreinte à un domaine |
| Jeton d’API de compte (Account API token) | Clé API Full Access |
| Flux de messages transactionnels | L’API e-mail et le relais SMTP |
| Flux de messages broadcast | Des campagnes vers des listes de contacts, ou l’API avec votre propre en-tête List-Unsubscribe |
| Flux de messages entrants | E-mails entrants sur un sous-domaine comme inbound.acme.com |
| Signatures d’expéditeur et domaines | Domaines d’envoi. Les signatures d’expéditeur pour une adresse unique ne sont pas disponibles. |
| Modèles et layouts | Modèles avec un alias et des versions. Il n’y a pas de layouts. |
| Webhooks par flux | Webhooks par espace de travail |
| Suppressions par flux | Une seule liste d’adresses bloquées par espace de travail |
| Activity | Email APIEmails et Email APILogs |
Tag et Metadata |
meta |
Pour séparer la réputation transactionnelle et la réputation marketing, envoyez-les depuis des domaines ou sous-domaines différents, comme mail.acme.com pour les reçus et news.acme.com pour les newsletters.
Mettre à jour vos appels API
Le POST /email de Postmark avec un X-Postmark-Server-Token devient POST /v2/emails avec un jeton bearer. Les noms de champs passent du PascalCase au snake_case :
curl https://api.postmarkapp.com/email \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "X-Postmark-Server-Token: $POSTMARK_SERVER_TOKEN" \
-d '{
"From": "Acme <hello@acme.com>",
"To": "ada@example.com",
"Subject": "Your receipt",
"TextBody": "Thanks for your order.",
"HtmlBody": "<p>Thanks for your order.</p>",
"MessageStream": "outbound"
}'curl https://api.emailit.com/v2/emails \
-H "Authorization: Bearer $EMAILIT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"from": "Acme <hello@acme.com>",
"to": "ada@example.com",
"subject": "Your receipt",
"text": "Thanks for your order.",
"html": "<p>Thanks for your order.</p>"
}'| Postmark | Emailit |
|---|---|
En-tête X-Postmark-Server-Token |
Authorization: Bearer secret_… |
From |
from |
To, Cc, Bcc (chaînes séparées par des virgules) |
to, cc, bcc sous forme de chaîne ou de tableau, 50 adresses au maximum pour chacun |
ReplyTo |
reply_to |
Subject |
subject |
HtmlBody, TextBody |
html, text |
Headers: [{ "Name": "…", "Value": "…" }] |
headers: { "Name": "Value" } |
Metadata, Tag |
meta, renvoyé dans les événements webhook |
TrackOpens, TrackLinks |
tracking: { "loads": true, "clicks": true } |
Attachments[] avec Name, Content, ContentType, ContentID |
attachments[] avec filename, content, content_type, content_id |
MessageStream |
Inutile |
POST /email/withTemplate avec TemplateAlias ou TemplateId et TemplateModel |
Le même POST /v2/emails avec template (un alias ou un ID) et variables |
Réponse avec MessageID et ErrorCode: 0 |
200 avec id (em_…), status: "accepted" et ids par destinataire. Les erreurs utilisent les codes de statut HTTP. |
Emailit n’a pas d’endpoint d’envoi par lots. Envoyez une requête par message, avec 50 destinataires au maximum chacune, et ajoutez un en-tête Idempotency-Key pour sécuriser les relances. Consultez Envoyer un e-mail.
Changer les paramètres SMTP
| Paramètre | Postmark | Emailit |
|---|---|---|
| Hôte | smtp.postmarkapp.com |
smtp.emailit.com |
| Port | 587, 2525 ou 25 |
587 (STARTTLS), 465 (TLS), 2525, 2587 ou 25 |
| Nom d’utilisateur | Votre jeton d’API de serveur | emailit |
| Mot de passe | Votre jeton d’API de serveur | Votre clé API Emailit |
Emailit ne lit pas les en-têtes X-PM-* comme X-PM-Message-Stream ou X-PM-Tag. Supprimez-les et réglez plutôt le suivi au niveau du domaine. Consultez Paramètres SMTP.
Faire correspondre les événements webhook
| Webhook Postmark | Événement Emailit |
|---|---|
| Delivery | email.delivered |
| Bounce, types hard bounce | email.bounced |
| Bounce, types soft ou transient | email.attempted pendant qu’Emailit réessaie, puis email.bounced si toutes les nouvelles tentatives échouent |
| Spam complaint | email.complained |
| Open | email.loaded |
| Click | email.clicked |
| Subscription change | email.unsubscribed pour les e-mails de campagne, et suppression.created ou suppression.deleted pour les blocages que vous ajoutez ou supprimez avec l’API |
| Inbound | email.received, puis récupérez le contenu avec GET /emails/{id} |
Emailit envoie aussi email.accepted quand l’API accepte un e-mail, ce pour quoi Postmark n’a pas de webhook.
Le format des requêtes change :
- Postmark envoie un enregistrement par requête et le nomme dans
RecordType. Emailit envoie un tableau JSON de 100 événements au maximum, avec le nom danstypeet l’e-mail dansdata.object. - Utilisez
data.object.id, l’IDem_de la réponse d’envoi, au lieu deMessageID. Vos valeursmetase trouvent dansdata.object.meta. - Les webhooks Postmark sont généralement protégés par des identifiants d’authentification basique dans l’URL. Emailit signe plutôt chaque requête : vérifiez
X-Emailit-Signatureà l’aide deX-Emailit-Timestampet de votre secretwhsec_. Consultez Signature des requêtes.
for (const event of req.body) {
const email = event.data.object;
if (event.type === 'email.bounced') markBounced(email.to, email.id);
if (event.type === 'email.complained') unsubscribe(email.to);
}Transférer les adresses bloquées
-
Exportez les adresses bloquées (suppressions) de chaque flux de messages Postmark depuis lequel vous envoyez, depuis la page des suppressions du flux ou avec l’API de dump des suppressions. Incluez les rebonds définitifs (hard bounces), les plaintes pour spam et les blocages manuels.
-
Constituez un seul CSV avec les colonnes
email,type,reason:email,type,reason old-address@example.com,recipient,postmark hard bounce angry@example.com,recipient,postmark spam complaintUtilisez le type
recipientpour les adresses qui ne doivent jamais recevoir d’e-mail. Il bloque les envois par l’API, par SMTP et par les campagnes. Pour les personnes qui se sont seulement désinscrites de vos envois broadcast, utilisez le typeunsubscribe, qui arrête les campagnes mais laisse passer les e-mails transactionnels. -
Dans Email APISuppressions, sélectionnez Import et chargez le fichier. Chaque fichier peut contenir 10 000 lignes et peser 8 Mo au maximum. Les doublons sont ignorés.
Consultez Gérer les adresses bloquées.
Transférer les modèles
Copiez le HTML de chaque modèle depuis Postmark, layout compris, puis importez-le dans Email MarketingTemplates ou créez-le avec l’API des modèles. Emailit n’a pas de layouts : fusionnez donc le layout et le contenu en un seul modèle. Reprenez l’alias que vous utilisiez dans Postmark pour limiter les modifications de code.
Les modèles Postmark utilisent Mustachio. Temple couvre les valeurs simples et les conditions :
| Postmark (Mustachio) | Emailit (Temple) |
|---|---|
{{name}} |
{{name}} |
{{company.name}} |
{{company.name}} |
Sections {{#company}}…{{/company}} |
{{#if company}}…{{/if}}, avec des chemins complets comme {{company.name}} à l’intérieur |
Sections inversées {{^name}}…{{/name}} |
{{#if name}}{{else}}…{{/if}} |
{{#each items}}…{{/each}} |
Non pris en charge. Générez la liste dans votre code et transmettez-la comme une seule variable. |
TemplateModel |
variables |
Temple n’échappe jamais le HTML : échappez les saisies des utilisateurs avant de les transmettre. Une valeur manquante produit une chaîne vide, sauf si vous ajoutez une valeur par défaut, comme {{name|"there"}}. Consultez Temple.
Modifier le DNS
Ajoutez votre domaine dans Email APIDomains et publiez les enregistrements Emailit. Ils utilisent leurs propres noms (emailit._domainkey, emailit.<domain>, et éventuellement go et inbound) : ils n’entrent donc pas en conflit avec l’enregistrement DKIM de Postmark ni avec son CNAME de return-path pm-bounces. Conservez votre enregistrement DMARC. Après la bascule, supprimez les enregistrements Postmark. Consultez Enregistrements DNS.
Si vous traitez les e-mails entrants avec Postmark, déplacez-les vers un sous-domaine de réception Emailit et mettez à jour les adresses que votre application communique. Consultez Configurer la réception.
Étapes suivantes
- Liste de contrôle avant la mise en production
- Configurer des webhooks
- Migration prioritaire : laissez les ingénieurs d’Emailit effectuer la migration avec vous