دليل الانتقال
الانتقال من Amazon SES إلى Mail.Land
الانتقال من SES يستبدل بيانات اعتماد AWS ومجموعات الإعداد ووجهات الأحداث بمفتاح API واحد وWebhooks موقّعة. يطابق هذا الدليل كل حقل شائع في SendEmail ويعدّد ما يحتاج إلى تغيير في الشيفرة.
# Before (Amazon SES)
SMTP_HOST=email-smtp.eu-central-1.amazonaws.com # your Region's endpoint
SMTP_PORT=587 # STARTTLS (465 for TLS wrapper)
SMTP_USER=<SES SMTP user name for that Region>
SMTP_PASS=<SES SMTP password for that Region>
# After (Mail.Land)
SMTP_HOST=smtp.mail.land
SMTP_PORT=587 # STARTTLS; 465 is not offered
SMTP_USER=apikey # any value; Mail.Land ignores it
SMTP_PASS=ml_pet_... # a Mail.Land key with SMTP enabledمفاهيم Amazon SES في Mail.Land
| Amazon SES | Mail.Land |
|---|---|
| مستخدم IAM وتوقيع الطلبات SigV4 | مفتاح API (بيانات اعتماد) في الترويسة X-API-Key |
| بيانات اعتماد SMTP لكل منطقة في AWS | مفتاح API نفسه، مستخدماً ككلمة مرور SMTP |
| هوية موثّقة (نطاق) وMAIL FROM مخصص | نطاق موثّق (SPF وDKIM وDMARC ومسار الإرجاع) |
| مجموعات الإعداد ووجهات الأحداث (SNS وEventBridge وFirehose) | Webhooks موقّعة بـ HMAC-SHA256، تُرسل مباشرة إلى نقطة النهاية لديك |
| قائمة منع الإرسال على مستوى الحساب | قوائم منع إرسال بنوع ونطاق تطبيق |
| قوالب البريد (Handlebars) | قوالب بعناصر نائبة {{name}} |
| قوائم جهات الاتصال والموضوعات (topics) | القوائم البريدية والحملات وإدارة إلغاء الاشتراك (Pro وMax) |
| بيئة الاختبار (Sandbox) | مفاتيح اختبار (ml_set_ وml_sem_): مع sandboxBehavior بالقيمة LogOnly تُقبل الطلبات وتُسجَّل ولا تُسلَّم أبداً |
أنشئ مفاتيح API المناسبة
لا حاجة إلى كتابة سياسات IAM. تخبرك بادئة مفتاح Mail.Land بوضعه وتدفقه؛ أنشئ مفتاحاً لكل تطبيق ولكل تدفق، وقيّده بالنطاقات وعناوين IP التي تستخدمه.
| البادئة | الغرض منه |
|---|---|
ml_pet_ | إنتاج، معاملاتي: الإيصالات وإعادة تعيين كلمات المرور والتنبيهات. حتى 5 مستلمين في كل طلب. |
ml_pem_ | إنتاج، تسويقي: النشرات الإخبارية والإرسال الجماعي عبر send-batch، حتى 10,000 مستلم في كل استدعاء. |
ml_set_ | اختبار، معاملاتي: مع sandboxBehavior بالقيمة LogOnly (الافتراضية) تُقبل الطلبات وتُسجَّل ولا تُسلَّم أبداً. استخدمه لاختبارات التكامل. |
يمكن تقييد كل مفتاح بالواجهة البرمجية أو SMTP أو كليهما، وبنطاقات محددة وعناوين IP معروفة. يُعرض المفتاح مرة واحدة، ولا تحفظ Mail.Land إلا قيمة مجزّأة (hash) منه.
تبديل SMTP: غيّر المضيف وبيانات الاعتماد
تُنشأ بيانات اعتماد SMTP في SES عبر IAM وتختلف في كل منطقة من AWS. أما Mail.Land فتستخدم مفتاح API ككلمة مرور وتتجاهل اسم المستخدم.
| الإعداد | Amazon SES | Mail.Land |
|---|---|---|
| المضيف | email-smtp.<region>.amazonaws.com | smtp.mail.land |
| المنفذ | 25 أو 587 أو 2587 مع STARTTLS، أو 465 و2465 مع TLS wrapper | 587 مع STARTTLS |
| اسم المستخدم | اسم مستخدم SMTP لتلك المنطقة | أي قيمة، مثل apikey |
| كلمة المرور | كلمة مرور SMTP لتلك المنطقة | مفتاح API من Mail.Land مفعّل لـ SMTP (ml_pet_ للبريد المعاملاتي) |
لا تقبل Mail.Land تسجيل الدخول إلا بعد STARTTLS، ولا يُتاح المنفذان 465 و2465. إذا كان تطبيقك يستخدم TLS wrapper، فحوّله إلى 587 مع STARTTLS. لا تعمل Mail.Land بترويسات X-SES-* مثل X-SES-CONFIGURATION-SET، فيمكنك حذفها. يمكن أن يصل حجم الرسالة إلى 15 MiB.
تبديل استدعاء API
تُوقَّع طلبات SES بـ AWS Signature Version 4، عادةً عبر AWS SDK. أما Mail.Land فلا تحتاج إلا إلى الترويسة X-API-Key ومتن JSON أبسط. إليك الرسالة نفسها في الاثنتين، وإرسالاً بقالب.
aws sesv2 send-email --region eu-central-1 \
--from-email-address "[email protected]" \
--destination '{"ToAddresses":["[email protected]"]}' \
--reply-to-addresses "[email protected]" \
--email-tags Name=type,Value=order-shipped \
--content '{
"Simple": {
"Subject": { "Data": "Order 12345 has shipped" },
"Body": {
"Text": { "Data": "Your order is on its way." },
"Html": { "Data": "<p>Your order is on its way.</p>" }
}
}
}'curl -X POST https://api.mail.land/v1/transactional/send \
-H "X-API-Key: $MAILLAND_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"from": { "email": "[email protected]", "name": "Your Shop" },
"to": [{
"email": "[email protected]", "name": "Jane",
"variables": { "orderNumber": "12345" }
}],
"replyTo": "[email protected]",
"subject": "Order {{orderNumber}} has shipped",
"textContent": "Your order {{orderNumber}} is on its way.",
"htmlContent": "<p>Your order {{orderNumber}} is on its way.</p>",
"tags": ["order-shipped"]
}'
# MAILLAND_API_KEY=ml_pet_... (production, transactional)مطابقة حقول استدعاء الإرسال
من SES API v2 SendEmail (POST /v2/email/outbound-emails) إلى POST /v1/transactional/send.
| Amazon SES | Mail.Land | ملاحظة |
|---|---|---|
AWS Signature Version 4 | X-API-Key: <key> | لا توقيع للطلبات؛ أرسل المفتاح عبر HTTPS. |
FromEmailAddress | from.email, from.name | يجب أن يكون العنوان على نطاق موثّق. |
Destination.ToAddresses | to[].email, to[].name | حتى 5 مستلمين في كل طلب مع مفتاح معاملاتي؛ ويتلقى كل منهم نسخة منفصلة. |
Destination.CcAddresses, BccAddresses | لا يوجد | غير مدعوم. أرسل رسالة منفصلة إلى كل مستلم. |
ReplyToAddresses | replyTo | سلسلة عنوان واحدة بدلاً من قائمة. إذا كنت تستخدم عدة عناوين، فاحتفظ بواحد. |
Content.Simple.Subject.Data | subject | مطلوب ما لم تستخدم قالباً. |
Content.Simple.Body.Html.Data | htmlContent | |
Content.Simple.Body.Text.Data | textContent | |
Content.Simple.Headers [{ Name, Value }] | customHeaders | كائن من أسماء الترويسات وقيمها بدلاً من مصفوفة. |
Content.Simple.Attachments[].FileName, ContentType, RawContent, ContentId, ContentDisposition | attachments[].fileName, contentType, content, contentId, inline | محتوى Base64. اضبط inline: true للصورة المضمّنة. حتى 10 مرفقات و10 MiB إجمالاً. |
Content.Raw.Data (MIME) | غير موجود في الواجهة البرمجية | أرسل رسائل MIME الجاهزة عبر مرحّل SMTP بدلاً من ذلك. |
Content.Template.TemplateName, TemplateArn | templateId | أعد إنشاء القالب في Mail.Land أولاً. |
Content.Template.TemplateData | variables, to[].variables | كائن JSON بدلاً من سلسلة JSON. |
EmailTags [{ Name, Value }] | tags | مصفوفة سلاسل نصية بدلاً من أزواج الاسم والقيمة. |
ConfigurationSetName | لا يوجد | تُضبط Webhooks والتتبع في حسابك في Mail.Land وعلى كل نطاق. |
ConfigurationOverrides.Tracking | tracking.opens, tracking.clicks | يُقدَّم اختيار النطاق نفسه لتتبع الفتح. |
ListManagementOptions | غير موجود في استدعاء الإرسال | تتولى قوائم Mail.Land وحملاتها إلغاءات الاشتراك التسويقية. |
لا مقابل له | scheduledAt | جدول الرسالة حتى 7 أيام مقدماً. |
لا مقابل له | الترويسة X-Idempotency-Key | خلال فترة الاحتفاظ، تعيد المحاولة بالمفتاح نفسه الاستجابة الأصلية بدلاً من الإرسال مجدداً. |
تردّ SES بـ 200 مع MessageId. وتردّ Mail.Land بـ 202 Accepted مع jobId ومعرّف رسالة لكل مستلم مقبول وقائمتي المستلمين المقبولين والمرفوضين.
أضف نطاقك وسجلات DNS
أضف النطاق في Mail.Land وانشر السجلات التي تعرضها لوحة التحكم. يجب التحقق من SPF وDKIM وDMARC قبل أن تتمكن من الإرسال. يمكنك فعل ذلك بينما لا تزال SES ترسل.
| السجل | الاسم | القيمة | ملاحظة |
|---|---|---|---|
| SPF (TXT) | yourdomain.com | include:spf.mlnd.net | أضف include إلى سجل SPF الحالي. يجب أن يكون للنطاق سجل SPF واحد فقط. |
| DKIM (TXT) | mlnd._domainkey.yourdomain.com | v=DKIM1; k=rsa; p=... | المحدِّد (selector) هو mlnd، فيوجد السجل إلى جانب سجلات DKIM التي تستخدمها SES. |
| DMARC (TXT) | _dmarc.yourdomain.com | v=DMARC1; p=... | مطلوب. احتفظ بسجل DMARC واحد؛ ويكفي سجل قائم يتضمن سياسة. |
| مسار الإرجاع (CNAME) | bounce.yourdomain.com | bounce.mlnd.net | اضبطه على DNS only دون وكيل (proxy). إذا كان نطاق MAIL FROM المخصص لديك في SES يستخدم هذا الاسم، فأبقِه حتى تتوقف SES عن الإرسال. |
احتفظ بسجلات DNS الخاصة بـ SES حتى ينتهي الانتقال، واحذفها فقط بعد خروج آخر رسالة منها.
استورد قائمة منع الإرسال أولاً
تنطبق قائمة منع الإرسال على مستوى الحساب في SES على كل منطقة من AWS على حدة. صدّرها من كل منطقة ترسل منها عبر ListSuppressedDestinations (aws sesv2 list-suppressed-destinations)، ثم استوردها إلى Mail.Land بالنوع ونطاق التطبيق المطابقين، من لوحة التحكم أو عبر POST /v1/transactional/suppressions/import.
| السبب أو المصدر في SES | النوع في Mail.Land | نطاق التطبيق |
|---|---|---|
| BOUNCE | HardBounce | Global |
| COMPLAINT | Complaint | Global |
| إلغاءات الاشتراك من موضوعات قوائم جهات الاتصال | Unsubscribe | Marketing؛ أو List، الذي ينطبق فقط على الحملات المرسلة إلى القائمة البريدية المطابقة في Mail.Land |
لا تضيف SES إلى القائمة إلا الارتدادات الدائمة، ولا تصلها بلاغات البريد المزعج من Gmail، لذا استورد أيضاً أي قوائم منع إرسال تحتفظ بها أنظمتك. استورد قبل أول إرسال عبر Mail.Land، كي يبقى من ألغوا اشتراكهم ممنوعين من البداية.
وجّه Webhooks إلى Mail.Land
استبدل مجموعة الإعداد ووجهة أحداثها بـ Webhook في Mail.Land: أضف نقطة نهاية HTTPS واختر الأحداث وتحقق من الترويسة X-MLND-Signature بسرّ ذلك الـ Webhook. لا يوجد اشتراك SNS يلزم تأكيده.
| حدث SES | حدث Mail.Land | ملاحظة |
|---|---|---|
Send | لا يوجد حالياً | message.sent غير متاح بعد؛ تؤكد الاستجابة 202 القبول. |
التسليم (Delivery) | message.delivered | |
DeliveryDelay | message.deferred | |
الارتداد (Bounce) | message.bounced | |
Complaint | message.complained | |
Subscription | message.unsubscribed | يُرسل عند إلغاء المستلم اشتراكه بنفسه، لا عند تغييرات تجريها عبر الواجهة البرمجية. |
Reject | لا يوجد | |
RenderingFailure | لا يوجد | تُرفض القيمة الناقصة في القالب عند استدعاء الواجهة البرمجية، برمز 422 TEMPLATE_VARIABLE_MISSING. |
الفتح، النقر (Open, Click) | غير متاح بعد | أحداث الفتح والنقر مدرجة في الكتالوج لكنها لا تُرسل اليوم. |
أزل التكرار بالاعتماد على event_id، لأن التسليم المعاد يحمل معرّف الحدث نفسه. قد تُصحَّح الحالة لاحقاً، فواصل معالجة الأحداث بعد الحدث النهائي وقارن status_version.
أعد إنشاء قوالبك
أنشئ كل قالب في لوحة تحكم Mail.Land أو عبر واجهة القوالب، ثم أرسله باستخدام templateId وvariables. يجب أن يكون لكل عنصر نائب قيمة، وإلا رُفض الإرسال برمز 422 مع أسماء القيم الناقصة.
| Amazon SES | Mail.Land |
|---|---|
{{firstName}} | {{firstName}} |
{{contact.firstName}} (متداخل) | {{firstName}} |
{{#each}}, {{#if}} ... {{else}} | لا يوجد |
الأجزاء المضمّنة ({{> name}}) | لا يوجد |
العناصر النائبة في Mail.Land بسيطة: دون قيم متداخلة أو شروط أو حلقات أو أجزاء. مرّر قيماً بسيطة وانقل المنطق إلى تطبيقك، أو احتفظ بقالب لكل حالة.
التبديل خطوة بخطوة
- أضف نطاق الإرسال في Mail.Land وتحقق منه، مع إضافة include:spf.mlnd.net إلى سجل SPF الحالي.
- صدّر قائمة منع الإرسال لكل منطقة AWS تستخدمها واستوردها.
- أنشئ مفاتيح Mail.Land لكل تطبيق ولكل تدفق، مقيّدة بنطاقاتك وعناوين IP لديك.
- أعد إنشاء القوالب، واستبدل كل وجهة أحداث بـ Webhook.
- أنشئ مفتاح اختبار مع sandboxBehavior بالقيمة LogOnly، وشغّل اختبارات التكامل على Mail.Land دون تسليم بريد.
- أرسل رسائل حقيقية إلى عناوين تتحكم بها وتحقق منها في سجل البريد.
- انقل تطبيقاً واحداً أو حصة صغيرة من حركة الإرسال، ثم راقب التسليم والارتدادات والشكاوى.
- ما دام المزودان يعملان، أبقِ إلغاءات الاشتراك متزامنة في الاتجاهين: انسخ إلغاءات الاشتراك والشكاوى والارتدادات الجديدة من SES إلى Mail.Land ومن Mail.Land إلى SES، وأجرِ مزامنة أخيرة قبل نقل ما تبقى من الحركة.
- تحقق من الإحماء لنطاقك: في Free وPro يكون للنطاق الجديد حد يومي يرتفع على مراحل، وتُرفض الرسائل التي تتجاوزه. خطط للانتقال ضمن هذه الحدود، أو اسألنا عن جدول مخصص. خطة Max لا تمر بالإحماء.
- ثم انقل الباقي، وأبقِ SES فعّالة حتى تخرج آخر رسائلها.
المصادر
صفحات AWS العامة المستخدمة في هذا الدليل.
- [1]Amazon SES API v2: SendEmailhttps://docs.aws.amazon.com/ses/latest/APIReference-V2/API_SendEmail.htmlتم التحقق في 4 نوفمبر 2026
- [2]Amazon SES: الاتصال بنقطة نهاية SMTPhttps://docs.aws.amazon.com/ses/latest/dg/smtp-connect.htmlتم التحقق في 4 نوفمبر 2026
- [3]Amazon SES: الحصول على بيانات اعتماد SMTPhttps://docs.aws.amazon.com/ses/latest/dg/smtp-credentials.htmlتم التحقق في 4 نوفمبر 2026
- [4]Amazon SES: التخصيص المتقدم للبريدhttps://docs.aws.amazon.com/ses/latest/dg/send-personalized-email-advanced.htmlتم التحقق في 4 نوفمبر 2026
- [5]Amazon SES: نشر الأحداثhttps://docs.aws.amazon.com/ses/latest/dg/monitor-using-event-publishing.htmlتم التحقق في 4 نوفمبر 2026
- [6]Amazon SES: قائمة منع الإرسال على مستوى الحسابhttps://docs.aws.amazon.com/ses/latest/dg/sending-email-suppression-list.htmlتم التحقق في 4 نوفمبر 2026
الأسئلة الشائعة
هل يمكنني مواصلة الإرسال عبر SES أثناء الاختبار؟
نعم. التحقق من نطاق في Mail.Land لا يمنع SES من الإرسال باسمه، فيمكنك تشغيل الاثنين ونقل الحركة تدريجياً.
هل ما زلت أحتاج إلى AWS SDK؟
لا. يمكن لأي عميل HTTP استدعاء واجهة Mail.Land البرمجية مع الترويسة X-API-Key، وتعمل أي مكتبة SMTP مع المرحّل.
كيف أرسل البريد الجماعي الذي كنت أرسله عبر SendBulkEmail؟
استخدم POST /v1/transactional/send-batch مع مفتاح تسويقي (ml_pem_). يقبل حتى 10,000 مستلم، لكل منهم متغيراته.
أين تعمل Mail.Land؟
لا توجد في Mail.Land مناطق للاختيار. النسخة الأساسية من بياناتك في ألمانيا؛ والمزودون خارج الاتحاد الأوروبي مدرجون في صفحة GDPR لدينا.
هل أنت مستعد للانتقال من Amazon SES؟
أنشئ حساباً مجانياً وأرسل أول رسالة اختبار اليوم. وإن أردت المساعدة، فأخبرنا عن إعدادك.