Sign inGet started

Migreren vanaf Amazon SES

Deze pagina vertaalt de SES v2 SendEmail-aanroep, de suppressielijst op accountniveau en SNS-eventnotificaties naar Bird. Volg de hoofdmigratiegids op volgorde en gebruik deze vertalingen voor stap 1, 3 en 4.

Geef dit aan je agent

Plak dit in Claude Code, Cursor of Codex. De agent werkt deze pagina door tegen je eigen repository, via het Bird-oppervlak dat hij al heeft: de MCP-server als er een verbonden is, de CLI als die geïnstalleerd en ingelogd is.
Codevoorbeeld
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.

Vertaal de verzendaanroep

SES verdeelt een verzending over Destination, Content en configuration-set-plumbing. Onze POST /v1/email/messages is één platte payload:
Wat het doetSES (SendEmail v2)Bird
AfzenderFromEmailAddressfrom
OntvangersDestination.*Addressesto / cc / bcc (arrays)
OnderwerpContent.Simple.Subjectsubject
BodyContent.Simple.Body.Html/Texthtml / text (minstens één)
Reply-toReplyToAddressesreply_to (array)
Eigen headersContent.Simple.Headersheaders (string → string object)
Filterbare labelsEmailTagstags: {name, value}-paren
Round-trip-context(geen)metadata: willekeurige JSON
Opgeslagen templateContent.Templatetemplate + template.parameters
Open-/kliktrackingconfiguration settrack_opens / track_clicks (standaard true)
IP-pooldedicated IP pool (config set)ip_pool_id (ipp_... of ipp_shared)
Categorie(geen)category: marketing (standaard) of transactional
Onze veldlimieten en standaardwaarden (aantal ontvangers, tag- en metadatalimieten) staan in E-mail verzenden.
Opmerkingen bij het overzetten:
  • Configuration sets verdwijnen in per-berichtvelden. Tracking, IP-pool en eventrouting waren configuration-set-zaken op SES. Hier zijn de eerste twee payloadvelden en eventrouting is een webhookabonnement.
  • Auth verandert van SigV4 naar een bearer token. Geen request signing; een gewone Authorization: Bearer bk_...-header. Verwijder de AWS SDK-credentialchain uit dit codepad.
  • SES-templates worden opgeslagen templates. Content.Template (templatenaam plus TemplateData) wordt ons template-veld met waarden in template.parameters. Zie verzenden met een template.
  • Content.Raw (MIME) heeft geen equivalent. We bouwen het bericht op uit gestructureerde velden. Als je ruwe MIME samenstelt om bestanden bij te voegen, verstuur ze dan als onze attachments-array (base64 content per bestand, content_id voor inline afbeeldingen).
  • SES-sandbox ≠ Bird-sandbox. De sandbox van SES beperkt naar wie je kunt versturen. Onze mailsandbox is een simulator met magische adressen: geen allowlisting, en er wordt niets bezorgd.

Suppressies exporteren

Exporteer de suppressielijst op accountniveau en verwerk die via de importloop:
  • GET /v2/email/suppressed-destinations (pagineer met NextToken, elke vermelding heeft BOUNCE of COMPLAINT als reden)

Webhookevents vertalen

SES publiceert events via SNS of EventBridge. Wij POSTen ondertekende webhooks rechtstreeks, dus het SNS-topic, de subscription-confirmation-handshake en het uitpakken van de message-envelope vervallen allemaal. De eventnamen vertalen zo:
ResultaatSESBird
Geaccepteerd/verwerktSendemail.acceptedemail.processed
BezorgdDeliveryemail.delivered
Tijdelijke foutDeliveryDelayemail.deferred
Permanente bounceBounceemail.bounced / email.out_of_band_bounce
SpamklachtComplaintemail.complained
Geblokkeerd/onderdrukt(geen)email.rejected
OpenOpenemail.opened
KlikClickemail.clicked
UitschrijvingSubscriptionemail.list_unsubscribed
email.rejected is nieuw ten opzichte van SES: we melden onderdrukte ontvangers zichtbaar (status rejected, rejection_reason: recipient_suppressed) in plaats van ze mee te tellen in de verzend-en-bouncecyclus. Voeg hiervoor een handler toe.
In plaats van SNS-berichtverificatie ondertekenen we volgens de Standard Webhooks-specificatie, met HMAC-headers op de delivery zelf. Het verificatierecept staat in Webhooks & events.

Overschakelen

Doorloop domeinen & DNS en de sandbox-rooktest in de hoofdgids. Beide zijn provideronafhankelijk. Eén SES-specifieke opmerking voor de DNS-stap: de DKIM-CNAMEs van SES blijven staan tijdens de transitie. Ons DKIM-TXT-record gebruikt een eigen selector, dus de twee bestaan naast elkaar.

Volgende stappen

  • Verzenddomeinen: registratie, verificatielevenscyclus en de DNS-records die je omzet
  • Webhooks & events: endpointconfiguratie en Standard Webhooks-verificatie
  • Testsandbox: rooktest van de nieuwe integratie vóór de overschakeling
  • Suppressies: controleer je geïmporteerde lijst en hoe we die vanaf hier onderhouden