Migrer depuis Amazon SES
Cette page fait correspondre l'appel SES v2 SendEmail, la liste de suppression au niveau du compte et les notifications d'événements SNS à Bird. Suivez le guide de migration principal dans l'ordre et utilisez ces correspondances pour les étapes 1, 3 et 4.
Confiez ceci à votre agent
Collez ceci dans Claude Code, Cursor ou Codex. L'agent parcourt cette page en regard de votre propre dépôt, en utilisant la surface Bird dont il dispose déjà : le serveur MCP s'il est connecté, le CLI s'il est installé et authentifié.
Exemple de code
I am moving an email integration from Amazon SES to Bird. Route through it with me.
1. Check what you already have before setting anything up. If Bird's MCP server is connected, use its tools. If the Bird CLI is installed and signed in, use that. Either one is enough, and every step below is an action you take with whichever you have. Only if neither is present, follow https://bird.com/docs/ai/set-up-your-agent.md to set one up and sign me in. Every Bird docs page serves Markdown at its own URL with `.md` appended, so fetch that rather than the HTML.
2. Read https://bird.com/docs/guides/email/migrate/ses.md for the payload, suppression and event mapping, and https://bird.com/docs/guides/email/migrate.md for the order the steps go in.
3. Find and list my SES usage in this repository and its infrastructure before you change anything: the SendEmail and SendRawEmail call sites through the AWS SDK or CLI, the configuration sets they name, the SNS topics or EventBridge rules carrying my events, the handler subscribed to them, and every identity I send from. Say which of these live in infrastructure code rather than application code, because those change by a different route.
4. Register each of those sending domains with Bird and give me the DNS records to publish, following https://bird.com/docs/guides/email/sending-domains.md. Leave the SES DKIM CNAMEs exactly as they are: Bird's DKIM record uses its own selector, so the two coexist and both providers authenticate side by side until I switch traffic. Publishing DNS affects mail for the whole domain, so show me the records and let me publish them.
5. Export my account-level suppression list from SES and import it into Bird before any production traffic goes through Bird, so my first sends do not reach addresses that already bounced or complained. Read it from GET /v2/email/suppressed-destinations, paginating with NextToken to the end, and keep both the BOUNCE and COMPLAINT reasons. The Bird import takes one address per request and is idempotent, so a partial re-run is safe. https://bird.com/docs/guides/email/suppressions.md has the reason taxonomy.
6. Port the send call and replace the event plumbing. Bird posts signed webhooks straight to an endpoint, so the SNS topic, the subscription-confirmation handshake, and the message-envelope unwrapping all go away rather than being ported: my handler reads the event body directly and verifies it per Standard Webhooks. See https://bird.com/docs/guides/webhooks.md and https://bird.com/docs/guides/email/events.md. Tell me which SNS or EventBridge resources become unused, but do not delete any of them.
7. Run my whole integration against Bird's mail sandbox before any production traffic, following https://bird.com/docs/guides/email/testing-sandbox.md. Sandbox sends run the real pipeline without reaching an inbox or touching my sending reputation.
8. Stop and ask me wherever a step needs a decision. Do not point production traffic at Bird until I have seen the sandbox results and replied with the words cut over to Bird. Retiring the SES path is a separate step that comes later: ask me again and wait for me to reply with the words retire the SES path. A reply that agrees without naming what it is authorising is not authorisation. Finish by telling me what is left that only a person can do.Faire correspondre l'appel d'envoi
SES répartit un envoi entre Destination, Content et la plomberie de configuration sets. Notre POST /v1/email/messages est un payload unique et plat :
| Fonction | SES (SendEmail v2) | Bird |
|---|---|---|
| Expéditeur | FromEmailAddress | from |
| Destinataires | Destination.*Addresses | to / cc / bcc (tableaux) |
| Objet | Content.Simple.Subject | subject |
| Corps | Content.Simple.Body.Html/Text | html / text (au moins un) |
| Reply-to | ReplyToAddresses | reply_to (tableau) |
| En-têtes personnalisés | Content.Simple.Headers | headers (objet string → string) |
| Libellés filtrables | EmailTags | tags : paires {name, value} |
| Contexte aller-retour | (aucun) | metadata : JSON arbitraire |
| Template stocké | Content.Template | template + template.parameters |
| Suivi ouverture/clic | configuration set | track_opens / track_clicks (par défaut true) |
| Pool d'IP | pool d'IP dédiées (config set) | ip_pool_id (ipp_... ou ipp_shared) |
| Catégorie | (aucun) | category : marketing (par défaut) ou transactional |
Les limites et valeurs par défaut de nos champs (nombre de destinataires, limites de tags et de métadonnées) se trouvent dans Envoi d'e-mails.
Notes de portage :
- Les configuration sets se dissolvent en champs par message. Le suivi, le pool d'IP et le routage d'événements étaient gérés par les configuration sets sur SES. Ici, les deux premiers sont des champs du payload et le routage d'événements est un abonnement webhook.
- L'authentification passe de SigV4 à un bearer token. Pas de signature de requête ; un simple en-tête Authorization: Bearer bk_.... Supprimez la chaîne de credentials AWS SDK de ce chemin de code.
- Les templates SES se portent vers les templates stockés. Content.Template (nom du template plus TemplateData) correspond à notre champ template avec les valeurs dans template.parameters. Voir envoi avec un template.
- Content.Raw (MIME) n'a pas d'équivalent. Nous construisons le message à partir de champs structurés. Si vous assemblez du MIME brut pour joindre des fichiers, envoyez-les via notre tableau attachments (base64 content par fichier, content_id pour les images inline).
- Le sandbox SES ≠ le sandbox Bird. Le sandbox SES restreint les destinataires autorisés. Notre sandbox mail est un simulateur avec des adresses magiques : pas d'allowlisting et rien n'est livré.
Exporter les suppressions
Exportez la liste de suppression au niveau du compte et passez-la dans la boucle d'import :
- GET /v2/email/suppressed-destinations (paginer avec NextToken, chaque entrée ayant BOUNCE ou COMPLAINT comme raison)
Transposer les événements webhook
SES publie les événements via SNS ou EventBridge. Nous envoyons des webhooks signés par POST directement : le topic SNS, le handshake de confirmation d'abonnement et le déballage de l'enveloppe de message disparaissent. Les noms d'événements se transposent ainsi :
| Résultat | SES | Bird |
|---|---|---|
| Accepté/traité | Send | email.accepted → email.processed |
| Livré | Delivery | email.delivered |
| Échec temporaire | DeliveryDelay | email.deferred |
| Rebond permanent | Bounce | email.bounced / email.out_of_band_bounce |
| Plainte spam | Complaint | email.complained |
| Bloqué/supprimé | (aucun) | email.rejected |
| Ouverture | Open | email.opened |
| Clic | Click | email.clicked |
| Désinscription | Subscription | email.list_unsubscribed |
email.rejected est nouveau par rapport à SES : nous signalons les destinataires supprimés de manière visible (statut rejected, rejection_reason: recipient_suppressed) au lieu de les comptabiliser dans le cycle envoi-rebond. Ajoutez un handler pour cet événement.
En remplacement de la vérification des messages SNS, nous signons selon la spécification Standard Webhooks, avec des en-têtes HMAC sur la livraison elle-même. La procédure de vérification se trouve dans Webhooks & events.
Basculer
Suivez les étapes domaines & DNS et le test de fumée sandbox dans le guide principal. Les deux sont indépendantes du fournisseur. Une note spécifique à SES pour l'étape DNS : les CNAME DKIM de SES restent en place pendant la transition. Notre enregistrement TXT DKIM utilise son propre sélecteur, les deux coexistent donc.
Étapes suivantes
- Domaines d'envoi : enregistrement, cycle de vie de la vérification et enregistrements DNS que vous redirigez
- Webhooks & events : configuration de l'endpoint et vérification Standard Webhooks
- Sandbox de test : testez la nouvelle intégration avant la bascule
- Suppressions : vérifiez votre liste importée et la façon dont nous la maintenons à partir de maintenant
Ressources associées
Poursuivez avec la documentation, les guides et les exemples sur ce sujet. Les ressources sont en anglais.
Regarder le guideGetting started with emailExplorer la fonctionnalitéEmailSuivre le parcours d'apprentissageBuild your first integrationGuide d'implémentationSend your first email
Essayez la pratique et obtenez un guide d'implémentation