دليل الانتقال
الانتقال من Postmark إلى Mail.Land
تستقبل Postmark وMail.Land كلتاهما استدعاء إرسال بصيغة JSON، فتتطابق معظم الحقول واحداً بواحد. يعدّد هذا الدليل كل حقل شائع، والإعدادات الواجب تغييرها في SMTP، والفروق التي تحتاج إلى تغيير في الشيفرة.
# Before (Postmark)
SMTP_HOST=smtp.postmarkapp.com # broadcasts: smtp-broadcasts.postmarkapp.com
SMTP_PORT=587 # STARTTLS
SMTP_USER=<Server API token, or SMTP token access key>
SMTP_PASS=<Server API token, or SMTP token secret key>
# 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_... # transactional; use an ml_pem_ key for broadcastsمفاهيم Postmark في Mail.Land
| Postmark | Mail.Land |
|---|---|
| Server وServer API token | مساحة عمل ومفاتيح API (بيانات اعتماد)، كل منها مقيّد بالواجهة البرمجية أو SMTP، وبنطاقات وعناوين IP |
| تدفقات الرسائل (معاملاتي، جماعي) | تدفق المفتاح: معاملاتي (ml_pet_) أو تسويقي (ml_pem_) |
| توقيعات المرسل والنطاقات | نطاق موثّق (SPF وDKIM وDMARC ومسار الإرجاع) |
| القوالب والتخطيطات (Mustachio) | قوالب بعناصر نائبة {{name}} |
| قوائم منع الإرسال لكل تدفق رسائل | قوائم منع إرسال بنوع ونطاق تطبيق |
| Webhooks | Webhooks موقّعة بـ HMAC-SHA256، بسرّ منفصل لكل Webhook |
| التدفق الوارد | المسارات الواردة |
أنشئ مفاتيح API المناسبة
في Postmark يختار الحقل أو الترويسة MessageStream التدفق. أما في Mail.Land فالمفتاح هو الذي يختاره: تخبرك بادئته بوضعه وتدفقه. أنشئ مفتاحاً لكل تطبيق ولكل تدفق.
| البادئة | الغرض منه |
|---|---|
ml_pet_ | إنتاج، معاملاتي: الإيصالات وإعادة تعيين كلمات المرور والتنبيهات. حتى 5 مستلمين في كل طلب. |
ml_pem_ | إنتاج، تسويقي: النشرات الإخبارية والإرسال الجماعي عبر send-batch، حتى 10,000 مستلم في كل استدعاء. |
ml_set_ | اختبار، معاملاتي: مع sandboxBehavior بالقيمة LogOnly (الافتراضية) تُقبل الطلبات وتُسجَّل ولا تُسلَّم أبداً. استخدمه لاختبارات التكامل. |
يمكن تقييد كل مفتاح بالواجهة البرمجية أو SMTP أو كليهما، وبنطاقات محددة وعناوين IP معروفة. يُعرض المفتاح مرة واحدة، ولا تحفظ Mail.Land إلا قيمة مجزّأة (hash) منه.
تبديل SMTP: غيّر المضيف وبيانات الاعتماد
تستخدم Postmark رمز Server API token أو SMTP token، وترويسة لاختيار التدفق. أما Mail.Land فتستخدم مفتاح API ككلمة مرور، وتتجاهل اسم المستخدم، وتأخذ التدفق من المفتاح.
| الإعداد | Postmark | Mail.Land |
|---|---|---|
| المضيف | smtp.postmarkapp.com، أو smtp-broadcasts.postmarkapp.com للرسائل الجماعية | smtp.mail.land |
| المنفذ | 25 أو 587 أو 2525، مع STARTTLS | 587 مع STARTTLS |
| اسم المستخدم | Server API token، أو access key الخاص بـ SMTP token | أي قيمة، مثل apikey |
| كلمة المرور | Server API token، أو secret key الخاص بـ SMTP token | مفتاح API من Mail.Land مفعّل لـ SMTP |
| التدفق | الترويسة X-PM-Message-Stream | المفتاح: ml_pet_ للمعاملاتي، وml_pem_ للتسويقي |
لا تقبل Mail.Land تسجيل الدخول إلا بعد STARTTLS. ولا تعمل Mail.Land بالترويسة X-PM-Message-Stream: المفتاح هو الذي يحدد التدفق. يمكن أن يصل حجم الرسالة إلى 15 MiB.
تبديل استدعاء API
تستقبل الواجهتان JSON. تستخدم Postmark أسماء بصيغة PascalCase والترويسة X-Postmark-Server-Token؛ وتستخدم Mail.Land أسماء بصيغة camelCase والترويسة X-API-Key. إليك الرسالة نفسها في الاثنتين، وإرسالاً بقالب.
curl -X POST https://api.postmarkapp.com/email \
-H "X-Postmark-Server-Token: $POSTMARK_SERVER_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"From": "Your Shop <[email protected]>",
"To": "[email protected]",
"ReplyTo": "[email protected]",
"Subject": "Order 12345 has shipped",
"TextBody": "Your order is on its way.",
"HtmlBody": "<p>Your order is on its way.</p>",
"Tag": "order-shipped",
"MessageStream": "outbound"
}'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 /email و/email/withTemplate إلى POST /v1/transactional/send.
| Postmark | Mail.Land | ملاحظة |
|---|---|---|
X-Postmark-Server-Token: <token> | X-API-Key: <key> | ترويسة مختلفة. |
From | from.email, from.name | افصل اسم العرض عن العنوان. يجب أن يكون العنوان على نطاق موثّق. |
To | to[].email, to[].name | مصفوفة كائنات بدلاً من سلسلة مفصولة بفواصل. حتى 5 مستلمين في كل طلب مع مفتاح معاملاتي؛ ويتلقى كل منهم نسخة منفصلة. |
Cc, Bcc | لا يوجد | غير مدعوم. أرسل رسالة منفصلة إلى كل مستلم. |
Subject | subject | مطلوب ما لم تستخدم قالباً. |
HtmlBody | htmlContent | |
TextBody | textContent | |
ReplyTo | replyTo | سلسلة عنوان واحدة. إذا كنت تستخدم عدة عناوين reply-to مفصولة بفواصل، فاحتفظ بواحد. |
Tag | tags | مصفوفة، فيمكن أن تحمل الرسالة الواحدة عدة وسوم. |
Metadata | لا يوجد | لا يوجد حقل بيانات وصفية بصيغة مفتاح وقيمة. استخدم tags أو ترويسة مخصصة. |
Headers [{ Name, Value }] | customHeaders | كائن من أسماء الترويسات وقيمها بدلاً من مصفوفة. |
TrackOpens | tracking.opens | يُقدَّم اختيار النطاق نفسه لتتبع الفتح. |
TrackLinks | tracking.clicks | قيمة منطقية بدلاً من None أو HtmlAndText أو HtmlOnly أو TextOnly. |
Attachments[].Name, Content, ContentType, ContentID | attachments[].fileName, content, contentType, contentId, inline | محتوى Base64 كما هو. اضبط inline: true للصورة المضمّنة. حتى 10 مرفقات و10 MiB إجمالاً. |
MessageStream | لا يوجد | المفتاح هو الذي يحدد التدفق: ml_pet_ أو ml_pem_. |
TemplateId, TemplateAlias | templateId | أعد إنشاء القالب في Mail.Land أولاً؛ وسيحصل على معرّف جديد. |
TemplateModel | variables, to[].variables | قيم بسيطة فقط، لأن العناصر النائبة لا تدعم الأقسام أو الحلقات. |
POST /email/batch (حتى 500 رسالة) | POST /v1/transactional/send-batch | نموذج مختلف: محتوى مشترك لما يصل إلى 10,000 مستلم، لكل منهم متغيراته، يُرسل بمفتاح تسويقي. أما الرسائل المختلفة فأرسل كلاً منها باستدعاء مستقل. |
لا مقابل له | scheduledAt | جدول الرسالة حتى 7 أيام مقدماً. |
لا مقابل له | الترويسة X-Idempotency-Key | خلال فترة الاحتفاظ، تعيد المحاولة بالمفتاح نفسه الاستجابة الأصلية بدلاً من الإرسال مجدداً. |
تردّ Mail.Land بـ 202 Accepted مع jobId ومعرّف رسالة لكل مستلم مقبول وقائمتي المستلمين المقبولين والمرفوضين.
أضف نطاقك وسجلات DNS
أضف النطاق في Mail.Land وانشر السجلات التي تعرضها لوحة التحكم. يجب التحقق من SPF وDKIM وDMARC قبل أن تتمكن من الإرسال. يمكنك فعل ذلك بينما لا تزال Postmark ترسل.
| السجل | الاسم | القيمة | ملاحظة |
|---|---|---|---|
| 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 الخاص بـ Postmark. |
| DMARC (TXT) | _dmarc.yourdomain.com | v=DMARC1; p=... | مطلوب. احتفظ بسجل DMARC واحد؛ ويكفي سجل قائم يتضمن سياسة. |
| مسار الإرجاع (CNAME) | bounce.yourdomain.com | bounce.mlnd.net | اضبطه على DNS only دون وكيل (proxy). تأكد من أن هذا الاسم غير مستخدم أصلاً. |
احتفظ بسجلات DNS الخاصة بـ Postmark حتى ينتهي الانتقال، واحذفها فقط بعد خروج آخر رسالة منها.
استورد قوائم منع الإرسال أولاً
تحتفظ Postmark بقوائم منع الإرسال لكل تدفق رسائل. صدّر قائمة كل تدفق، مثلاً عبر GET /message-streams/<stream>/suppressions/dump، ثم استوردها إلى Mail.Land بالنوع ونطاق التطبيق المطابقين، من لوحة التحكم أو عبر POST /v1/transactional/suppressions/import.
| السبب في Postmark | النوع في Mail.Land | نطاق التطبيق |
|---|---|---|
| HardBounce | HardBounce | Global |
| SpamComplaint | Complaint | Global |
| ManualSuppression في تدفق جماعي (إلغاءات الاشتراك) | Unsubscribe | Marketing؛ أو List، الذي ينطبق فقط على الحملات المرسلة إلى القائمة البريدية المطابقة في Mail.Land |
| ManualSuppression في تدفق معاملاتي | Manual | Transactional |
استورد قبل أول إرسال عبر Mail.Land، كي يبقى من ألغوا اشتراكهم ممنوعين من البداية. تُتخطى العناوين الموجودة مسبقاً ولا تتكرر.
وجّه Webhooks إلى Mail.Land
أضف نقطة النهاية في Mail.Land واختر الأحداث وتحقق من الترويسة X-MLND-Signature بسرّ ذلك الـ Webhook. إذا كنت تحمي نقطة نهاية Postmark بمصادقة Basic أو قائمة سماح لعناوين IP، فتحقق من التوقيع بدلاً من ذلك.
| Webhook في Postmark | حدث Mail.Land | ملاحظة |
|---|---|---|
التسليم (Delivery) | message.delivered | |
الارتداد (Bounce) | message.bounced | يشمل الارتدادات الدائمة والمؤقتة. أما التأخيرات المؤقتة فهي message.deferred. |
شكوى بريد مزعج (Spam complaint) | message.complained | |
تغيير الاشتراك (Subscription change) | message.unsubscribed | يُرسل عند إلغاء المستلم اشتراكه بنفسه، لا عند تغييرات تجريها عبر الواجهة البرمجية. |
الفتح، النقر (Open, Click) | غير متاح بعد | أحداث الفتح والنقر مدرجة في الكتالوج لكنها لا تُرسل اليوم. |
الوارد (Inbound) | inbound.received | أنشئ مساراً وارداً لعنوان الاستقبال. |
خطأ SMTP API | لا يوجد | يرفض مرحّل SMTP الرسالة أثناء الجلسة، مع رمز رد. |
أزل التكرار بالاعتماد على event_id، لأن التسليم المعاد يحمل معرّف الحدث نفسه. قد تُصحَّح الحالة لاحقاً، فواصل معالجة الأحداث بعد الحدث النهائي وقارن status_version.
أعد إنشاء قوالبك
أنشئ كل قالب في لوحة تحكم Mail.Land أو عبر واجهة القوالب، ثم أرسله باستخدام templateId وvariables. يجب أن يكون لكل عنصر نائب قيمة، وإلا رُفض الإرسال برمز 422 مع أسماء القيم الناقصة.
| Postmark | Mail.Land |
|---|---|
{{firstName}} | {{firstName}} |
{{#each items}} ... {{/each}} | لا يوجد |
{{#section}}, {{^section}} | لا يوجد |
قوالب التخطيط (layout) | لا يوجد |
العناصر النائبة في Mail.Land بسيطة: دون أقسام أو حلقات أو تخطيطات. مرّر قيماً بسيطة، وابنِ القوائم في تطبيقك، وكرّر HTML المشترك للترويسة والتذييل في كل قالب.
التبديل خطوة بخطوة
- أضف نطاق الإرسال في Mail.Land وتحقق منه، مع إضافة include:spf.mlnd.net إلى سجل SPF الحالي.
- صدّر قوائم منع الإرسال لكل تدفق رسائل في Postmark واستوردها.
- أنشئ مفتاحاً معاملاتياً لكل تطبيق، ومفتاحاً تسويقياً إذا كنت ترسل رسائل جماعية.
- أعد إنشاء القوالب وWebhooks.
- أنشئ مفتاح اختبار مع sandboxBehavior بالقيمة LogOnly، وشغّل اختبارات التكامل على Mail.Land دون تسليم بريد.
- أرسل رسائل حقيقية إلى عناوين تتحكم بها وتحقق منها في سجل البريد.
- انقل تطبيقاً واحداً أو حصة صغيرة من حركة الإرسال، ثم راقب التسليم والارتدادات والشكاوى.
- ما دام المزودان يعملان، أبقِ إلغاءات الاشتراك متزامنة في الاتجاهين: انسخ إلغاءات الاشتراك والشكاوى والارتدادات الجديدة من Postmark إلى Mail.Land ومن Mail.Land إلى Postmark، وأجرِ مزامنة أخيرة قبل نقل ما تبقى من الحركة.
- تحقق من الإحماء لنطاقك: في Free وPro يكون للنطاق الجديد حد يومي يرتفع على مراحل، وتُرفض الرسائل التي تتجاوزه. خطط للانتقال ضمن هذه الحدود، أو اسألنا عن جدول مخصص. خطة Max لا تمر بالإحماء.
- ثم انقل الباقي، وأبقِ Postmark فعّالة حتى تخرج آخر رسائلها.
المصادر
صفحات Postmark العامة المستخدمة في هذا الدليل.
- [1]Postmark Email APIhttps://postmarkapp.com/developer/api/email-apiتم التحقق في 4 نوفمبر 2026
- [2]Postmark Templates APIhttps://postmarkapp.com/developer/api/templates-apiتم التحقق في 4 نوفمبر 2026
- [3]Postmark: إرسال البريد عبر SMTPhttps://postmarkapp.com/developer/user-guide/send-email-with-smtpتم التحقق في 4 نوفمبر 2026
- [4]نظرة عامة على Webhooks في Postmarkhttps://postmarkapp.com/developer/webhooks/webhooks-overviewتم التحقق في 4 نوفمبر 2026
- [5]Postmark Suppressions APIhttps://postmarkapp.com/developer/api/suppressions-apiتم التحقق في 4 نوفمبر 2026
الأسئلة الشائعة
هل يمكنني مواصلة الإرسال عبر Postmark أثناء الاختبار؟
نعم. التحقق من نطاق في Mail.Land لا يمنع Postmark من الإرسال باسمه، فيمكنك تشغيل الاثنين ونقل الحركة تدريجياً.
هل تدعم Mail.Land الحقلين cc وbcc؟
ليس في استدعاء الإرسال. يتلقى كل مستلم نسخة منفصلة، فأرسل رسالة منفصلة حيث كنت تستخدم cc أو bcc.
كيف أستبدل التدفق الجماعي لديّ؟
استخدم مفتاحاً تسويقياً (ml_pem_) مع send-batch للإرسال عبر الواجهة البرمجية، أو أنشئ حملة في لوحة التحكم على خطة Pro أو Max.
هل توجد SDK رسمية لـ Mail.Land؟
ليس بعد. تتضمن الوثائق أمثلة جاهزة للنسخ لـ REST API بلغات cURL وNode.js وPython وPHP وC# وJava وGo، وتعمل أي مكتبة SMTP مع المرحّل.
هل أنت مستعد للانتقال من Postmark؟
أنشئ حساباً مجانياً وأرسل أول رسالة اختبار اليوم. وإن أردت المساعدة، فأخبرنا عن إعدادك.