دليل الانتقال
الانتقال من Mailgun إلى Mail.Land
إذا كنت ترسل عبر SMTP، فالتغيير مضيف وكلمة مرور. وإذا كنت تستخدم واجهة الرسائل، فهذا الدليل يطابق كل حقل شائع في Mailgun مع Mail.Land ويعدّد ما يحتاج إلى تغيير في الشيفرة.
# Before (Mailgun)
SMTP_HOST=smtp.mailgun.org
SMTP_PORT=587 # STARTTLS
SMTP_USER=<SMTP login of your sending domain>
SMTP_PASS=<SMTP password of that login>
# After (Mail.Land)
SMTP_HOST=smtp.mail.land
SMTP_PORT=587 # STARTTLS
SMTP_USER=apikey # any value; Mail.Land ignores it
SMTP_PASS=ml_pet_... # a Mail.Land key with SMTP enabledمفاهيم Mailgun في Mail.Land
| Mailgun | Mail.Land |
|---|---|
| نطاق الإرسال | نطاق موثّق (SPF وDKIM وDMARC ومسار الإرجاع) |
| مفتاح API ومفاتيح إرسال النطاق | مفاتيح API (بيانات اعتماد)، كل منها مقيّد بالواجهة البرمجية أو SMTP، وبنطاقات وعناوين IP |
| بيانات اعتماد SMTP لكل نطاق | مفتاح API نفسه، مستخدماً ككلمة مرور SMTP |
| القوالب (Handlebars) | قوالب بعناصر نائبة {{name}} |
| قوائم الارتدادات والشكاوى وإلغاءات الاشتراك | قوائم منع إرسال بنوع ونطاق تطبيق |
| Webhooks | Webhooks موقّعة بـ HMAC-SHA256، بسرّ منفصل لكل Webhook |
| المسارات (Routes) | المسارات الواردة |
أنشئ مفاتيح API المناسبة
تخبرك بادئة مفتاح Mail.Land بوضعه وتدفقه. أنشئ مفتاحاً لكل تطبيق ولكل تدفق، وأبقِ مفاتيح الإنتاج بعيداً عن أنظمة الاختبار.
| البادئة | الغرض منه |
|---|---|
ml_pet_ | إنتاج، معاملاتي: الإيصالات وإعادة تعيين كلمات المرور والتنبيهات. حتى 5 مستلمين في كل طلب. |
ml_pem_ | إنتاج، تسويقي: النشرات الإخبارية والإرسال الجماعي عبر send-batch، حتى 10,000 مستلم في كل استدعاء. |
ml_set_ | اختبار، معاملاتي: مع sandboxBehavior بالقيمة LogOnly (الافتراضية) تُقبل الطلبات وتُسجَّل ولا تُسلَّم أبداً. استخدمه لاختبارات التكامل. |
يمكن تقييد كل مفتاح بالواجهة البرمجية أو SMTP أو كليهما، وبنطاقات محددة وعناوين IP معروفة. يُعرض المفتاح مرة واحدة، ولا تحفظ Mail.Land إلا قيمة مجزّأة (hash) منه.
تبديل SMTP: غيّر المضيف وكلمة المرور
تستخدم Mailgun اسم دخول SMTP لكل نطاق إرسال. أما Mail.Land فتستخدم مفتاح API ككلمة مرور وتتجاهل اسم المستخدم.
| الإعداد | Mailgun | Mail.Land |
|---|---|---|
| المضيف | smtp.mailgun.org | smtp.mail.land |
| المنفذ | 25 أو 587 أو 2525 مع STARTTLS، أو 465 مع TLS | 587 مع STARTTLS |
| اسم المستخدم | اسم دخول SMTP لنطاق الإرسال | أي قيمة، مثل apikey |
| كلمة المرور | كلمة مرور اسم الدخول ذاك | مفتاح API من Mail.Land مفعّل لـ SMTP (ml_pet_ للبريد المعاملاتي) |
لا تقبل Mail.Land تسجيل الدخول إلا بعد STARTTLS، ولا يُتاح المنفذ 465. إذا كان تطبيقك يستخدم 465، فحوّله إلى 587 مع STARTTLS. يمكن أن يصل حجم الرسالة إلى 15 MiB.
تبديل استدعاء API
تستقبل Mailgun حقول نموذج مع مصادقة HTTP Basic، وتستقبل Mail.Land متن JSON مع الترويسة X-API-Key. إليك الرسالة نفسها في الواجهتين، وإرسالاً دفعياً.
curl -s --user "api:$MAILGUN_API_KEY" \
https://api.mailgun.net/v3/yourdomain.com/messages \
-F from="Your Shop <[email protected]>" \
-F to="Jane <[email protected]>" \
-F subject="Order 12345 has shipped" \
-F text="Your order is on its way." \
-F html="<p>Your order is on its way.</p>" \
-F h:Reply-To="[email protected]" \
-F o:tag="order-shipped"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)مطابقة حقول استدعاء الإرسال
من POST /v3/<domain>/messages إلى POST /v1/transactional/send.
| Mailgun | Mail.Land | ملاحظة |
|---|---|---|
--user api:<key> (مصادقة Basic) | X-API-Key: <key> | ترويسة بدلاً من مصادقة Basic، ومتن JSON بدلاً من حقول النموذج. |
from | from.email, from.name | افصل اسم العرض عن العنوان. يجب أن يكون العنوان على نطاق موثّق. |
to | to[].email, to[].name | حتى 5 مستلمين في كل طلب مع مفتاح معاملاتي؛ ويتلقى كل منهم نسخة منفصلة. |
cc, bcc | لا يوجد | غير مدعوم. أرسل رسالة منفصلة إلى كل مستلم. |
subject | subject | مطلوب ما لم تستخدم قالباً. |
text | textContent | |
html | htmlContent | |
amp-html | لا يوجد | لا يوجد جزء AMP. |
template, t:version | templateId | أعد إنشاء القالب في Mail.Land أولاً. لا توجد إصدارات للقوالب. |
t:variables | variables | قيم مشتركة بين كل المستلمين، ككائن JSON بدلاً من سلسلة JSON. |
v:<name> (metadata) | tags | لا توجد في Mail.Land بيانات وصفية بصيغة مفتاح وقيمة على الأحداث. انقل المعرّف في tags أو في ترويسة مخصصة. |
recipient-variables | to[].variables | قيم خاصة بكل مستلم. لأكثر من 5 مستلمين استخدم send-batch مع مفتاح تسويقي وrecipients[].variables. |
o:tag | tags | مصفوفة من السلاسل النصية. |
h:<Header-Name> | customHeaders | كائن من أسماء الترويسات وقيمها. |
h:Reply-To | replyTo | سلسلة عنوان بسيطة. |
attachment, inline | attachments[].fileName, contentType, content, contentId, inline | محتوى Base64 داخل JSON بدلاً من ملفات multipart. حتى 10 مرفقات و10 MiB إجمالاً. |
o:deliverytime | scheduledAt | تاريخ ووقت UTC بصيغة ISO 8601، حتى 7 أيام مقدماً. |
o:tracking-opens, o:tracking-clicks | tracking.opens, tracking.clicks | قيم منطقية. يُقدَّم اختيار النطاق نفسه لتتبع الفتح. |
لا مقابل له | الترويسة X-Idempotency-Key | خلال فترة الاحتفاظ، تعيد المحاولة بالمفتاح نفسه الاستجابة الأصلية بدلاً من الإرسال مجدداً. |
تردّ Mail.Land بـ 202 Accepted مع jobId ومعرّف رسالة لكل مستلم مقبول وقائمتي المستلمين المقبولين والمرفوضين.
أضف نطاقك وسجلات DNS
أضف النطاق في Mail.Land وانشر السجلات التي تعرضها لوحة التحكم. يجب التحقق من SPF وDKIM وDMARC قبل أن تتمكن من الإرسال. يمكنك فعل ذلك بينما لا تزال Mailgun ترسل.
| السجل | الاسم | القيمة | ملاحظة |
|---|---|---|---|
| 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 الخاص بـ Mailgun. |
| DMARC (TXT) | _dmarc.yourdomain.com | v=DMARC1; p=... | مطلوب. احتفظ بسجل DMARC واحد؛ ويكفي سجل قائم يتضمن سياسة. |
| مسار الإرجاع (CNAME) | bounce.yourdomain.com | bounce.mlnd.net | اضبطه على DNS only دون وكيل (proxy). تأكد من أن هذا الاسم غير مستخدم أصلاً. |
احتفظ بسجلات DNS الخاصة بـ Mailgun حتى ينتهي الانتقال، واحذفها فقط بعد خروج آخر رسالة منها.
استورد قوائم منع الإرسال أولاً
تحتفظ Mailgun بالارتدادات والشكاوى وإلغاءات الاشتراك لكل نطاق إرسال، فصدّر قوائم كل نطاق ترسل منه، مثلاً عبر GET /v3/<domain>/bounces. ثم استورد كل قائمة إلى Mail.Land بالنوع ونطاق التطبيق المطابقين، من لوحة التحكم أو عبر POST /v1/transactional/suppressions/import.
| قائمة Mailgun | النوع في Mail.Land | نطاق التطبيق |
|---|---|---|
| الارتدادات (Bounces) | HardBounce | Global |
| الشكاوى (Complaints) | Complaint | Global |
| إلغاءات الاشتراك (كل البريد) | Unsubscribe | Global |
| إلغاءات الاشتراك لوسم واحد أو قائمة بريدية واحدة | Unsubscribe | Marketing؛ أو List، الذي ينطبق فقط على الحملات المرسلة إلى القائمة البريدية المطابقة في Mail.Land |
استورد قبل أول إرسال عبر Mail.Land، كي يبقى من ألغوا اشتراكهم ممنوعين من البداية. تُتخطى العناوين الموجودة مسبقاً ولا تتكرر.
وجّه Webhooks إلى Mail.Land
أضف نقطة النهاية في Mail.Land واختر الأحداث وتحقق من الترويسة X-MLND-Signature. توقّع Mailgun طابعاً زمنياً ورمزاً بمفتاح واحد للحساب كله؛ أما Mail.Land فتوقّع الطابع الزمني والمتن الخام بسرّ لكل Webhook، لذا حدّث شيفرة التحقق أيضاً.
| حدث Mailgun | حدث Mail.Land | ملاحظة |
|---|---|---|
accepted | لا يوجد حالياً | message.sent غير متاح بعد؛ تؤكد الاستجابة 202 القبول. |
delivered | message.delivered | |
temporary_fail | message.deferred | |
permanent_fail | message.bounced | رفض من خادم الاستقبال. أما message.failed فيبلّغ عن توقف من جهة Mail.Land. |
complained | message.complained | |
unsubscribed | message.unsubscribed | يُرسل عند إلغاء المستلم اشتراكه بنفسه، لا عند تغييرات تجريها عبر الواجهة البرمجية. |
opened, clicked | غير متاح بعد | أحداث الفتح والنقر مدرجة في الكتالوج لكنها لا تُرسل اليوم. |
أزل التكرار بالاعتماد على event_id، لأن التسليم المعاد يحمل معرّف الحدث نفسه. قد تُصحَّح الحالة لاحقاً، فواصل معالجة الأحداث بعد الحدث النهائي وقارن status_version.
أعد إنشاء قوالبك
أنشئ كل قالب في لوحة تحكم Mail.Land أو عبر واجهة القوالب، ثم أرسله باستخدام templateId وvariables. يجب أن يكون لكل عنصر نائب قيمة، وإلا رُفض الإرسال برمز 422 مع أسماء القيم الناقصة.
| Mailgun | Mail.Land |
|---|---|
{{firstName}} | {{firstName}} |
%recipient.firstName% | {{firstName}} |
{{#if}}, {{#unless}}, {{#each}}, {{#with}}, {{#equal}} | لا يوجد |
إصدارات القوالب (t:version) | لا يوجد |
العناصر النائبة في Mail.Land بسيطة: دون شروط أو حلقات أو مرشحات أو أجزاء. انقل هذا المنطق إلى تطبيقك، أو احتفظ بقالب لكل حالة.
التبديل خطوة بخطوة
- أضف نطاق الإرسال في Mail.Land وتحقق منه، مع إضافة include:spf.mlnd.net إلى سجل SPF الحالي.
- صدّر قوائم منع الإرسال لكل نطاق في Mailgun واستوردها.
- أعد إنشاء القوالب وWebhooks.
- أنشئ مفتاح اختبار مع sandboxBehavior بالقيمة LogOnly، وشغّل اختبارات التكامل على Mail.Land دون تسليم بريد.
- أرسل رسائل حقيقية إلى عناوين تتحكم بها وتحقق منها في سجل البريد.
- انقل تطبيقاً واحداً أو حصة صغيرة من حركة الإرسال، ثم راقب التسليم والارتدادات والشكاوى.
- ما دام المزودان يعملان، أبقِ إلغاءات الاشتراك متزامنة في الاتجاهين: انسخ إلغاءات الاشتراك والشكاوى والارتدادات الجديدة من Mailgun إلى Mail.Land ومن Mail.Land إلى Mailgun، وأجرِ مزامنة أخيرة قبل نقل ما تبقى من الحركة.
- تحقق من الإحماء لنطاقك: في Free وPro يكون للنطاق الجديد حد يومي يرتفع على مراحل، وتُرفض الرسائل التي تتجاوزه. خطط للانتقال ضمن هذه الحدود، أو اسألنا عن جدول مخصص. خطة Max لا تمر بالإحماء.
- ثم انقل الباقي، وأبقِ Mailgun فعّالة حتى تخرج آخر رسائلها المجدولة والمعاد إرسالها.
المصادر
صفحات Mailgun العامة المستخدمة في هذا الدليل.
- [1]Mailgun API: إرسال رسالةhttps://documentation.mailgun.com/docs/mailgun/api-reference/send/mailgun/messages/post-v3--domain-name--messagesتم التحقق في 4 نوفمبر 2026
- [2]Mailgun API: المصادقةhttps://documentation.mailgun.com/docs/mailgun/api-reference/authenticationتم التحقق في 4 نوفمبر 2026
- [3]Mailgun: الإرسال عبر SMTPhttps://documentation.mailgun.com/docs/mailgun/user-manual/sending-messages/send-smtpتم التحقق في 4 نوفمبر 2026
- [4]Mailgun: الإرسال بالقوالبhttps://documentation.mailgun.com/docs/mailgun/user-manual/sending-messages/send-templatesتم التحقق في 4 نوفمبر 2026
- [5]Mailgun: Webhookshttps://documentation.mailgun.com/docs/mailgun/user-manual/webhooks/webhooksتم التحقق في 4 نوفمبر 2026
- [6]Mailgun: تأمين Webhookshttps://documentation.mailgun.com/docs/mailgun/user-manual/webhooks/securing-webhooksتم التحقق في 4 نوفمبر 2026
- [7]Mailgun API: الارتداداتhttps://documentation.mailgun.com/docs/mailgun/api-reference/send/mailgun/bounces/get-v3--domainid--bouncesتم التحقق في 4 نوفمبر 2026
الأسئلة الشائعة
هل يمكنني مواصلة الإرسال عبر Mailgun أثناء الاختبار؟
نعم. التحقق من نطاق في Mail.Land لا يمنع Mailgun من الإرسال باسمه، فيمكنك تشغيل الاثنين ونقل الحركة تدريجياً.
تتيح لي Mailgun اختيار منطقة في الولايات المتحدة أو الاتحاد الأوروبي. أين تعمل Mail.Land؟
لا توجد في Mail.Land مناطق للاختيار. النسخة الأساسية من بياناتك في ألمانيا؛ والمزودون خارج الاتحاد الأوروبي مدرجون في صفحة GDPR لدينا.
كيف أرسل إلى مستلمين كثيرين دفعة واحدة؟
استخدم POST /v1/transactional/send-batch مع مفتاح تسويقي (ml_pem_). يقبل حتى 10,000 مستلم، لكل منهم متغيراته. أما المفتاح المعاملاتي فيقبل حتى 5 مستلمين في كل طلب.
هل توجد SDK رسمية لـ Mail.Land؟
ليس بعد. تتضمن الوثائق أمثلة جاهزة للنسخ لـ REST API بلغات cURL وNode.js وPython وPHP وC# وJava وGo، وتعمل أي مكتبة SMTP مع المرحّل.
هل أنت مستعد للانتقال من Mailgun؟
أنشئ حساباً مجانياً وأرسل أول رسالة اختبار اليوم. وإن أردت المساعدة، فأخبرنا عن إعدادك.