Sign inGet started

Amazon SES से माइग्रेशन

यह पेज SES v2 SendEmail कॉल, account-level suppression list, और SNS इवेंट नोटिफिकेशन को Bird पर मैप करता है। मुख्य माइग्रेशन गाइड को क्रम से फ़ॉलो करें, और स्टेप 1, 3, और 4 के लिए इन मैपिंग्स का उपयोग करें।

इसे अपने एजेंट को दें

इसे Claude Code, Cursor, या Codex में पेस्ट करें। एजेंट इस पेज को आपकी रिपॉज़िटरी पर चलाता है, जो भी Bird सरफ़ेस उसके पास पहले से है उसका उपयोग करते हुए: MCP सर्वर अगर कनेक्टेड है, या CLI अगर इंस्टॉल और साइन इन है।
कोड उदाहरण
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.

Send कॉल मैप करें

SES एक send को Destination, Content, और configuration-set प्लंबिंग में बाँटता है। हमारा POST /v1/email/messages एक फ़्लैट पेलोड है:
क्या करता हैSES (SendEmail v2)Bird
प्रेषकFromEmailAddressfrom
प्राप्तकर्ताDestination.*Addressesto / cc / bcc (arrays)
विषयContent.Simple.Subjectsubject
बॉडीContent.Simple.Body.Html/Texthtml / text (कम से कम एक)
Reply-toReplyToAddressesreply_to (array)
कस्टम हेडरContent.Simple.Headersheaders (string → string object)
फ़िल्टर करने योग्य लेबलEmailTagstags: {name, value} पेयर
राउंड-ट्रिप कॉन्टेक्स्ट(कोई नहीं)metadata: आर्बिट्रेरी JSON
स्टोर किया हुआ टेम्प्लेटContent.Templatetemplate + template.parameters
ओपन/क्लिक ट्रैकिंगconfiguration settrack_opens / track_clicks (default true)
IP पूलdedicated IP pool (config set)ip_pool_id (ipp_... या ipp_shared)
कैटेगरी(कोई नहीं)category: marketing (default) या transactional
हमारी फ़ील्ड सीमाएँ और डिफ़ॉल्ट (प्राप्तकर्ता संख्या, टैग और मेटाडेटा सीमाएँ) ईमेल भेजना में हैं।
पोर्टिंग नोट्स:
  • Configuration sets प्रति-मैसेज फ़ील्ड में बदल जाते हैं। ट्रैकिंग, IP पूल, और इवेंट रूटिंग SES पर configuration-set की चिंताएँ थीं। यहाँ, पहले दो पेलोड फ़ील्ड हैं और इवेंट रूटिंग एक webhook सब्सक्रिप्शन है।
  • Auth SigV4 से bearer token में बदलता है। कोई request signing नहीं; एक सादा Authorization: Bearer bk_... हेडर। इस कोड पाथ से AWS SDK credential chain हटा दें।
  • SES टेम्प्लेट स्टोर किए हुए टेम्प्लेट में पोर्ट होते हैं। Content.Template (टेम्प्लेट नाम और TemplateData) हमारे template फ़ील्ड में मैप होता है, वैल्यू template.parameters में। देखें टेम्प्लेट के साथ भेजना
  • Content.Raw (MIME) का कोई समकक्ष नहीं है। हम मैसेज structured फ़ील्ड से बनाते हैं। अगर आप फ़ाइलें अटैच करने के लिए raw MIME असेम्बल करते हैं, तो उन्हें हमारे attachments array के रूप में भेजें (प्रति फ़ाइल base64 content, इनलाइन इमेज के लिए content_id)।
  • SES sandbox ≠ Bird sandbox। SES का sandbox सीमित करता है कि आप किसे भेज सकते हैं। हमारा mail sandbox magic addresses वाला एक सिम्युलेटर है: कोई allowlisting नहीं, और कुछ भी डिलीवर नहीं होता।

Suppressions एक्सपोर्ट करें

Account-level suppression list एक्सपोर्ट करें और इसे इम्पोर्ट लूप से चलाएँ:
  • GET /v2/email/suppressed-destinations (NextToken से पेजिनेट करें, और हर एंट्री में कारण के रूप में BOUNCE या COMPLAINT होता है)

Webhook इवेंट ट्रांसलेट करें

SES इवेंट SNS या EventBridge के ज़रिए पब्लिश करता है। हम signed webhooks सीधे POST करते हैं, इसलिए SNS topic, subscription-confirmation handshake, और message-envelope unwrapping सब हट जाते हैं। इवेंट नाम इस तरह मैप होते हैं:
परिणामSESBird
स्वीकृत/प्रोसेस कियाSendemail.acceptedemail.processed
डिलीवर हुआDeliveryemail.delivered
अस्थायी विफलताDeliveryDelayemail.deferred
स्थायी बाउंसBounceemail.bounced / email.out_of_band_bounce
स्पैम शिकायतComplaintemail.complained
ब्लॉक/सप्रेस किया(कोई नहीं)email.rejected
ओपनOpenemail.opened
क्लिकClickemail.clicked
अनसब्सक्राइबSubscriptionemail.list_unsubscribed
email.rejected SES की तुलना में नया है: हम सप्रेस किए गए प्राप्तकर्ताओं को दृश्य रूप से रिपोर्ट करते हैं (status rejected, rejection_reason: recipient_suppressed) बजाय उन्हें send-and-bounce साइकल में गिनने के। इसके लिए एक हैंडलर जोड़ें।
SNS मैसेज सत्यापन की जगह, हम Standard Webhooks स्पेसिफ़िकेशन के अनुसार साइन करते हैं, डिलीवरी पर HMAC हेडर के साथ। सत्यापन रेसिपी Webhooks & events में है।

कटओवर

मुख्य गाइड में domains & DNS और sandbox स्मोक टेस्ट पूरा करें। दोनों प्रोवाइडर-इंडिपेंडेंट हैं। DNS स्टेप के लिए एक SES-विशिष्ट नोट: ट्रांज़िशन के दौरान SES के DKIM CNAMEs यथावत रहते हैं। हमारा DKIM TXT रिकॉर्ड अपना अलग selector उपयोग करता है, इसलिए दोनों सह-अस्तित्व में रहते हैं।

अगले कदम

  • भेजने वाले डोमेन: रजिस्ट्रेशन, सत्यापन लाइफ़साइकल, और जो DNS रिकॉर्ड आप री-पॉइंट कर रहे हैं
  • Webhooks & events: endpoint सेटअप और Standard Webhooks सत्यापन
  • टेस्टिंग sandbox: कटओवर से पहले नए इंटीग्रेशन का स्मोक-टेस्ट करें
  • Suppressions: अपनी इम्पोर्ट की गई लिस्ट की पुष्टि करें और जानें कि हम इसे आगे कैसे मैनेज करते हैं

संबंधित संसाधन

इस विषय के लिए डॉक्यूमेंटेशन, गाइड और उदाहरणों के साथ आगे बढ़ें। संसाधन अंग्रेज़ी में हैं।

अभ्यास करें और इम्प्लीमेंटेशन ब्रीफ़ पाएँ