مهندسی · 21 سپتامبر 2026

راهنمای جامع مهاجرت ایمیل تراکنشی

مهاجرت میان ارائه‌دهندگان ایمیل تراکنشی بدون از دست دادن مشاهده‌پذیری به رویکردی مرحله‌ای نیاز دارد: ارسال دوگانه، نگاشت هم‌ارزی رویدادها و انتقال تدریجی DNS.

چالش اصلی مهاجرت

برای مهاجرت ایمیل تراکنشی بدون از دست دادن مشاهده‌پذیری، باید محرک ارسال را از پیاده‌سازی ارائه‌دهنده جدا کنید. راهبرد این است که یک لایه انتزاعی ارائه‌دهنده پیاده‌سازی کنید که امکان ارسال دوگانه (shadowing) و نگاشت رویدادها را فراهم کند. با هدایت درصد کمی از ترافیک به ارائه‌دهنده جدید و ادامه ردیابی رویدادهای تحویل از طریق وب‌هوک، می‌توانید پیش از تغییر جریان اصلی بررسی کنید که ارائه‌دهنده جدید ایمیل را می‌پذیرد و pipeline مشاهده‌پذیری شما نتایج را ثبت می‌کند.

چرا مهاجرت رخ می‌دهد

بیشتر مهاجرت‌ها به‌خاطر هزینه، تجربه توسعه‌دهنده یا الزامات انطباق انجام می‌شوند. برای مثال، اختلاف هزینه میان ارائه‌دهندگان قابل‌توجه است. طبق قیمت‌گذاری Amazon SES، ارسال a la carte برابر 0.10 USD به‌ازای هر 1,000 ایمیل است. در مقابل، قیمت‌گذاری Postmark از 15 USD در ماه برای 10,000 ایمیل شروع می‌شود و مصرف مازاد آن بین 1.80 تا 1.20 USD به‌ازای هر 1,000 است. ارسال 50,000 ایمیل در SES با مدل a la carte حدود 5 USD هزینه دارد، در مقایسه با تقریباً 66 USD در سطوح Postmark.

از دیگر عوامل می‌توان به حرکت به سمت تله‌متری حداقلی از نظر حریم خصوصی و فقط در EU یا نیاز به آمادگی بهتر برای ایجنت‌ها (مانند پشتیبانی از سرور MCP) اشاره کرد. دلیل هرچه باشد، ریسک یکسان است: یک نقطه کور در pipeline تحویل شما در دوره انتقال.

مرحله 1: لایه انتزاعی

اگر برنامه شما مستقیماً در منطق کسب‌وکار SDK یک ارائه‌دهنده را فراخوانی می‌کند، به آن وابسته شده‌اید. به یک wrapper نیاز دارید که درخواست و پاسخ را استاندارد کند.

payload یکپارچه

یک schema داخلی مستقل از ارائه‌دهنده تعریف کنید. این کار باعث می‌شود برای برنامه شما مهم نباشد API زیرین to را به‌صورت آرایه انتظار دارد یا یک رشته.

{ "message_id": "msg_12345", "recipient": "user@example.com", "template_id": "welcome_email", "variables": { "name": "Alex" }, "idempotency_key": "unique_request_id_789" }

هنگام کار با ایجنت‌های هوش مصنوعی یا گردش‌کارهای خودکار، در نظر گرفتن ایمیل به‌عنوان اثر جانبی خارجی حیاتی است. باید از کلید idempotency استفاده کنید تا تکرار یک حلقه ایجنت باعث نشود یک ایمیل تراکنشی پنج بار برای یک کاربر ارسال شود.

مرحله 2: راه‌اندازی DNS و هویت

پیش از ارسال حتی یک ایمیل، باید هویت خود را برقرار کنید. بیشتر مهاجرت‌ها در همین مرحله به‌دلیل تأخیر در انتشار DNS یا پیکربندی نادرست شکست می‌خورند.

  1. دامنه‌ها را تأیید کنید: رکوردهای DKIM و SPF ارائه‌دهنده جدید را اضافه کنید. با ابزاری مانند بررسی DNS ایمیل SendHQ مطمئن شوید رکوردهایتان فعال و با قالب درست هستند.
  2. رکوردها را بشناسید: مطمئن شوید تفاوت SPF (که سرور را مجاز می‌کند) و DKIM (که پیام را امضا می‌کند) را می‌دانید. اگر در طول مهاجرت از چند ارائه‌دهنده استفاده می‌کنید، رکورد SPF شما باید هر دو را include کند.
  3. هم‌راستایی DMARC: در مرحله اولیه مهاجرت، سیاست DMARC را روی p=none تنظیم کنید تا اگر هم‌راستایی کمی ناقص بود، با برگشت دائمی روبه‌رو نشوید. برای مراحل دقیق راه‌اندازی، به راهنمای DKIM، SPF و DMARC در SendHQ مراجعه کنید.

مرحله 3: ارسال سایه (ارسال دوگانه)

یک‌باره سوئیچ نکنید. به‌جای آن منطق مسیریابی‌ای پیاده‌سازی کنید که به ارائه‌دهنده اصلی ارسال کند و به‌صورت ناهمگام یک نسخه تکراری (یا درصدی نمونه‌برداری‌شده) را به ارائه‌دهنده جدید بفرستد.

منطق پیاده‌سازی

async function sendEmail(payload) { // Primary send (Current Provider) const primaryResult = await primaryProvider.send(payload); // Shadow send (New Provider) - do not await or block the main thread if (Math.random() < 0.1) { // 10% sample newProvider.send(payload).catch(err => console.error("Shadow send failed", err) ); } return primaryResult; }

در این مرحله پذیرش توسط ارائه‌دهنده را آزمایش می‌کنید. این لحظه‌ای است که ارائه‌دهنده می‌گوید "بله، این پیام را می‌پذیرم." این با تحویل (رسیدن پیام به سرور گیرنده) و رسیدن به صندوق ورودی (نرفتن پیام به پوشه اسپم) متفاوت است.

مرحله 4: مشاهده‌پذیری و هم‌ارزی رویدادها

مشاهده‌پذیری یعنی توانایی ردیابی یک پیام از sent تا delivered یا bounced. هر ارائه‌دهنده schema وب‌هوک متفاوتی دارد.

نگاشت رویدادها

برای یکسان‌سازی رویدادها در پایگاه داده داخلی خود یک جدول نگاشت بسازید:

رویداد داخلی | Amazon SES | Resend | Postmark | SendHQ

sent | Send | sent | Sent | sent

delivered | Delivery | delivered | Delivered | delivered

bounced | Bounce | bounced | Bounced | bounced

complaint | Complaint | complained | Complaint | complaint

مدیریت payloadهای وب‌هوک

listener وب‌هوک شما باید عمومی باشد. اگر payloadی از یک ارائه‌دهنده جدید دریافت کنید، باید پیش از رسیدن به موتور analytics از یک مبدل (transformer) عبور کند.

function transformWebhook(provider, payload) { switch(provider) { case 'resend': return { event: payload.data.delivered ? 'delivered' : 'failed', id: payload.data.id }; case 'sendhq': return { event: payload.event, id: payload.message_id }; default: throw new Error("Unknown provider"); } }

مرحله 5: انتقال تدریجی

پس از اینکه تأیید کردید ارائه‌دهنده جدید ایمیل را می‌پذیرد و وب‌هوک‌های شما رویدادها را درست نگاشت می‌کنند، به توزیع وزن‌دار بروید.

  1. 1% ترافیک: 1% از کل ایمیل تراکنشی را به ارائه‌دهنده جدید هدایت کنید. نرخ برگشت را پایش کنید.
  2. 10% ترافیک: بار را افزایش دهید. محدودیت‌های نرخ را بررسی کنید. برای مثال، سطح رایگان Resend سقف 100 ایمیل در روز دارد که می‌تواند در طول آزمایش گلوگاه شود.
  3. 50% ترافیک: این آزمون پایداری است. مطمئن شوید تأخیر (latency) در حد قابل‌قبول باقی می‌ماند.
  4. 100% ترافیک: انتقال نهایی.

عیب‌یابی خطاهای رایج مهاجرت

"حذف بی‌صدا"

برخی ارائه‌دهندگان ایمیل را می‌پذیرند (202 Accepted) اما به‌دلیل فیلترهای محتوا یا هویت‌های فرستنده تأییدنشده آن را در داخل سیستم کنار می‌گذارند. به همین دلیل مرحله ارسال سایه غیرقابل‌چشم‌پوشی است. اگر رویدادهای sent شما زیاد اما رویدادهای delivered کم باشند، مشکل تحویل دارید، نه مشکل API.

جهش‌های محدودیت نرخ

ارائه‌دهندگان مختلف محدودیت‌های burst متفاوتی دارند. قیمت‌گذاری Mailgun و قیمت‌گذاری SendGrid (که اکنون برای سطوح رایگان از دوره آزمایشی 60 روزه استفاده می‌کند) اغلب سهمیه‌های توان عملیاتی متفاوتی دارند. اگر از یک حساب با محدودیت بالا به حسابی جدید مهاجرت کنید، ممکن است با throttling روبه‌رو شوید. برای هموار کردن جهش‌ها یک صف (مانند RabbitMQ یا SQS) پیاده‌سازی کنید.

خطاهای idempotency

هنگام تغییر ارائه‌دهنده، ممکن است به‌طور تصادفی تلاش مجدد یک دسته (batch) را فعال کنید. اگر از ایجنت‌های هوش مصنوعی برای ارسال ایمیل استفاده می‌کنید، مطمئن شوید ایجنت یک شناسه درخواست یکتا ارائه می‌دهد. اگر ایجنت برای تعامل با API ایمیل شما از یک سرور MCP استفاده می‌کند، API باید مقادیر تکراری idempotency_key را در بازه 24 ساعته رد کند.

چک‌لیست مهاجرت

  • لایه انتزاع پیاده‌سازی شده است (payload مستقل از ارائه‌دهنده).
  • رکوردهای DNS (SPF، DKIM) برای ارائه‌دهنده جدید اضافه شده‌اند.
  • DNS از طریق sendhq.cc/tools/email-dns-checker تأیید شده است.
  • listener وب‌هوک برای مدیریت schemaهای ارائه‌دهنده جدید به‌روزرسانی شده است.
  • جدول نگاشت رویداد تکمیل شده است (Sent، Delivered، Bounced، Complaint).
  • ارسال سایه با 1% تا 10% فعال است.
  • کلیدهای idempotency برای ارسال‌های مبتنی بر ایجنت تأیید شده‌اند.
  • افزایش تدریجی (1%، 10%، 50%، 100%).
  • کلیدهای API ارائه‌دهنده قدیمی پس از 7 روز پایداری 100% لغو شده‌اند.

جمع‌بندی درباره انتخاب ارائه‌دهنده

انتخاب ارائه‌دهنده بده‌بستانی میان هزینه و سرعت توسعه است. اگر به کمترین هزینه مطلق نیاز دارید، رقابت با Amazon SES با 0.10 USD به‌ازای هر 1,000 ایمیل در مدل a la carte دشوار است، هرچند پلن‌های سطح‌بندی‌شده جدید آن (Essentials با 0.16 USD و Pro با 0.22 USD) از 21 ژوئیه 2026 ساختارهای هزینه متفاوتی ایجاد کرده‌اند. اگر به یک API مدرن با آمادگی داخلی برای ایجنت‌ها و تله‌متری حداقلی از نظر حریم خصوصی و فقط در EU نیاز دارید، SendHQ جایگزینی ساده‌تر ارائه می‌دهد.

صرف‌نظر از ارائه‌دهنده، هدف این است که تیم مهندسی شما به SDK یک ارائه‌دهنده خاص وابسته نباشد. با در نظر گرفتن ایمیل به‌عنوان یک اثر جانبی استاندارد، یک مهاجرت پرریسک را به یک تغییر پیکربندی روزمره تبدیل می‌کنید.

درباره ساخت گردش‌کارهای ایمیل قابل‌اعتماد در https://sendhq.cc بیشتر بخوانید.