# 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](/fr/docs/migrate/) 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](/fr/docs/workspaces/), ou un seul espace de travail avec plusieurs domaines d’envoi |
| Jeton d’API de serveur (Server API token) | [Clé API](/fr/docs/developers/api-keys/) **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](/fr/docs/email-api/) et le [relais SMTP](/fr/docs/smtp/) |
| Flux de messages broadcast | Des [campagnes](/fr/docs/campaigns/) vers des [listes de contacts](/fr/docs/audiences/), ou l’API avec votre propre en-tête `List-Unsubscribe` |
| Flux de messages entrants | [E-mails entrants](/fr/docs/inbound/) sur un sous-domaine comme `inbound.acme.com` |
| Signatures d’expéditeur et domaines | [Domaines d’envoi](/fr/docs/domains/). Les signatures d’expéditeur pour une adresse unique ne sont pas disponibles. |
| Modèles et layouts | [Modèles](/fr/docs/templates/) avec un alias et des versions. Il n’y a pas de layouts. |
| Webhooks par flux | [Webhooks](/fr/docs/webhooks/) par espace de travail |
| Suppressions par flux | Une seule [liste d’adresses bloquées](/fr/docs/suppressions/) par espace de travail |
| Activity | **Email API → Emails** et **Email API → Logs** |
| `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 :

```bash title="Before: Postmark"
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"
  }'
```

```bash title="After: Emailit"
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](/fr/docs/email-api/send-email/).

## 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](/fr/docs/smtp/settings/).

## 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}`](/fr/docs/api-reference/emails/get/) |

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 dans `type` et l’e-mail dans `data.object`.
- Utilisez `data.object.id`, l’ID `em_` de la réponse d’envoi, au lieu de `MessageID`. Vos valeurs `meta` se trouvent dans `data.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 de `X-Emailit-Timestamp` et de votre secret `whsec_`. Consultez [Signature des requêtes](/fr/docs/webhooks/request-signature/).

```javascript
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

1. 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.

2. Constituez un seul CSV avec les colonnes `email,type,reason` :

```csv
email,type,reason
old-address@example.com,recipient,postmark hard bounce
angry@example.com,recipient,postmark spam complaint
```

   Utilisez le type `recipient` pour 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 type `unsubscribe`, qui arrête les campagnes mais laisse passer les e-mails transactionnels.

3. Dans **Email API → Suppressions**, 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](/fr/docs/suppressions/manage/).

## Transférer les modèles

Copiez le HTML de chaque modèle depuis Postmark, layout compris, puis importez-le dans **Email Marketing → Templates** ou créez-le avec l’[API des modèles](/fr/docs/api-reference/templates/create/). 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](/fr/docs/templates/temple/).

## Modifier le DNS

Ajoutez votre domaine dans **Email API → Domains** 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](/fr/docs/domains/dns-records/).

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](/fr/docs/inbound/set-up/).

## Étapes suivantes

- [Liste de contrôle avant la mise en production](/fr/docs/get-started/go-live/)
- [Configurer des webhooks](/fr/docs/webhooks/set-up/)
- [Migration prioritaire](/fr/docs/programs/priority-migration/) : laissez les ingénieurs d’Emailit effectuer la migration avec vous

---
Source: https://emailit.com/fr/docs/migrate/postmark/
