Sign inGet Started

Amazon SES से माइग्रेट करें

यह पेज SES v2 की SendEmail कॉल, अकाउंट-स्तरीय सप्रेशन सूची और 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 और कॉन्फ़िगरेशन सेट की व्यवस्था में बाँट देता है। हमारा POST /v1/email/messages एक ही सपाट पेलोड है:

यह क्या करता हैSES (SendEmail v2)Bird
प्रेषकFromEmailAddressfrom
प्राप्तकर्ताDestination.*Addressesto / cc / bcc (ऐरे)
विषयContent.Simple.Subjectsubject
मुख्य भागContent.Simple.Body.Html/Texthtml / text (कम से कम एक)
जवाब का पताReplyToAddressesreply_to (ऐरे)
कस्टम हेडरContent.Simple.Headersheaders (string → string ऑब्जेक्ट)
फ़िल्टर किए जा सकने वाले लेबलEmailTagstags: {name, value} जोड़े
वापस लौटने वाला संदर्भ(कोई नहीं)metadata: कोई भी JSON
संग्रहीत टेम्पलेटContent.Templatetemplate + template.parameters
ओपन/क्लिक ट्रैकिंगकॉन्फ़िगरेशन सेटtrack_opens / track_clicks (डिफ़ॉल्ट true)
IP पूलसमर्पित IP पूल (कॉन्फ़िगरेशन सेट)ip_pool_id (ipp_... या ipp_shared)
श्रेणी(कोई नहीं)category: marketing (डिफ़ॉल्ट) या transactional

हमारे फ़ील्ड की सीमाएँ और डिफ़ॉल्ट मान (प्राप्तकर्ताओं की संख्या, टैग और मेटाडेटा की सीमाएँ) ईमेल भेजना में दिए गए हैं।

पोर्टिंग से जुड़े नोट:

  • कॉन्फ़िगरेशन सेट हर संदेश के फ़ील्ड में बँट जाते हैं। SES पर ट्रैकिंग, IP पूल और इवेंट रूटिंग कॉन्फ़िगरेशन सेट के ज़रिए तय होते थे। यहाँ पहले दो पेलोड फ़ील्ड हैं, और इवेंट रूटिंग एक webhook सब्सक्रिप्शन से होती है।
  • ऑथेंटिकेशन SigV4 की जगह bearer टोकन से होता है। अनुरोध पर हस्ताक्षर करने की ज़रूरत नहीं है, बस एक सादा Authorization: Bearer bk_... हेडर भेजें। इस कोड पाथ से AWS SDK क्रेडेंशियल चेन हटा दें।
  • SES टेम्पलेट स्टोर किए गए टेम्पलेट में बदल जाते हैं। Content.Template (टेम्पलेट का नाम और TemplateData) हमारे template फ़ील्ड से मेल खाता है, और मान template.parameters में जाते हैं। टेम्पलेट के साथ भेजना देखें।
  • Content.Raw (MIME) का कोई समकक्ष नहीं है। हम संदेश को संरचित फ़ील्ड से बनाते हैं। अगर आप फ़ाइलें अटैच करने के लिए raw MIME बनाते हैं, तो उन्हें हमारी अटैचमेंट array में भेजें (हर फ़ाइल के लिए base64 content, और inline इमेज के लिए content_id)।
  • SES sandbox और Bird sandbox एक जैसे नहीं हैं। SES का sandbox यह सीमित करता है कि आप किसे भेज सकते हैं। हमारा मेल sandbox खास पतों वाला एक सिम्युलेटर है: इसमें पतों को allowlist नहीं करना पड़ता, और कुछ भी डिलीवर नहीं होता।

सप्रेशन एक्सपोर्ट करें

अकाउंट-स्तर की सप्रेशन सूची एक्सपोर्ट करें और उसे इम्पोर्ट लूप से चलाएँ:

  • GET /v2/email/suppressed-destinations (NextToken से पेजिनेट करें; हर एंट्री में कारण के रूप में BOUNCE या COMPLAINT होता है)

webhook इवेंट का अनुवाद करें

SES इवेंट SNS या EventBridge के ज़रिए प्रकाशित करता है। हम हस्ताक्षरित webhook सीधे POST करते हैं। इसलिए SNS टॉपिक, सब्सक्रिप्शन की पुष्टि वाला हैंडशेक और संदेश के लिफ़ाफ़े को खोलने की ज़रूरत खत्म हो जाती है। इवेंट के नाम इस तरह मेल खाते हैं:

परिणामSESBird
स्वीकार/प्रोसेस किया गयाSendemail.accepted → email.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 की तुलना में नया है: हम सप्रेस किए गए प्राप्तकर्ताओं को भेजने और बाउंस होने के चक्र में गिनने के बजाय स्पष्ट रूप से रिपोर्ट करते हैं (स्टेटस rejected, rejection_reason: recipient_suppressed)। इसके लिए एक हैंडलर जोड़ें।

SNS संदेश सत्यापन की जगह हम Standard Webhooks स्पेसिफिकेशन के अनुसार साइन करते हैं, और हर डिलीवरी में HMAC हेडर होते हैं। सत्यापन का तरीका वेबहुक और इवेंट में दिया गया है।

स्विच करें

मुख्य गाइड में डोमेन और DNS और सैंडबॉक्स स्मोक टेस्ट के चरण पूरे करें। ये दोनों किसी भी प्रोवाइडर पर निर्भर नहीं हैं। DNS चरण के लिए SES से जुड़ी एक बात: बदलाव के दौरान SES के DKIM CNAME रिकॉर्ड अपनी जगह बने रहते हैं। हमारा DKIM TXT रिकॉर्ड अपना अलग सेलेक्टर इस्तेमाल करता है, इसलिए दोनों साथ-साथ रह सकते हैं।

अगले कदम

  • भेजने वाले डोमेन: रजिस्ट्रेशन, सत्यापन की प्रक्रिया, और वे DNS रिकॉर्ड जिन्हें आप नई जगह पॉइंट कर रहे हैं
  • वेबहुक और इवेंट: एंडपॉइंट सेटअप और Standard Webhooks सत्यापन
  • टेस्टिंग सैंडबॉक्स: कटओवर से पहले नए इंटीग्रेशन का स्मोक टेस्ट करें
  • सप्रेशन: अपनी इम्पोर्ट की गई सूची की पुष्टि करें और जानें कि आगे से हम इसे कैसे बनाए रखते हैं

इस विषय के लिए दस्तावेज़, गाइड और उदाहरणों के साथ आगे बढ़ें।