انتقل إلى المحتوى الرئيسي
MailLand

دليل الانتقال

الانتقال من Postmark إلى Mail.Land

تستقبل Postmark وMail.Land كلتاهما استدعاء إرسال بصيغة JSON، فتتطابق معظم الحقول واحداً بواحد. يعدّد هذا الدليل كل حقل شائع، والإعدادات الواجب تغييرها في SMTP، والفروق التي تحتاج إلى تغيير في الشيفرة.

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
PostmarkMail.Land
Server وServer API tokenمساحة عمل ومفاتيح API (بيانات اعتماد)، كل منها مقيّد بالواجهة البرمجية أو SMTP، وبنطاقات وعناوين IP
تدفقات الرسائل (معاملاتي، جماعي)تدفق المفتاح: معاملاتي (ml_pet_) أو تسويقي (ml_pem_)
توقيعات المرسل والنطاقاتنطاق موثّق (SPF وDKIM وDMARC ومسار الإرجاع)
القوالب والتخطيطات (Mustachio)قوالب بعناصر نائبة {{name}}
قوائم منع الإرسال لكل تدفق رسائلقوائم منع إرسال بنوع ونطاق تطبيق
WebhooksWebhooks موقّعة بـ HMAC-SHA256، بسرّ منفصل لكل Webhook
التدفق الواردالمسارات الواردة

أنشئ مفاتيح API المناسبة

في Postmark يختار الحقل أو الترويسة MessageStream التدفق. أما في Mail.Land فالمفتاح هو الذي يختاره: تخبرك بادئته بوضعه وتدفقه. أنشئ مفتاحاً لكل تطبيق ولكل تدفق.

أنشئ مفاتيح API المناسبة
البادئةالغرض منه
ml_pet_إنتاج، معاملاتي: الإيصالات وإعادة تعيين كلمات المرور والتنبيهات. حتى 5 مستلمين في كل طلب.
ml_pem_إنتاج، تسويقي: النشرات الإخبارية والإرسال الجماعي عبر send-batch، حتى 10,000 مستلم في كل استدعاء.
ml_set_اختبار، معاملاتي: مع sandboxBehavior بالقيمة LogOnly (الافتراضية) تُقبل الطلبات وتُسجَّل ولا تُسلَّم أبداً. استخدمه لاختبارات التكامل.

يمكن تقييد كل مفتاح بالواجهة البرمجية أو SMTP أو كليهما، وبنطاقات محددة وعناوين IP معروفة. يُعرض المفتاح مرة واحدة، ولا تحفظ Mail.Land إلا قيمة مجزّأة (hash) منه.

وثائق مفاتيح API

تبديل SMTP: غيّر المضيف وبيانات الاعتماد

تستخدم Postmark رمز Server API token أو SMTP token، وترويسة لاختيار التدفق. أما Mail.Land فتستخدم مفتاح API ككلمة مرور، وتتجاهل اسم المستخدم، وتأخذ التدفق من المفتاح.

تبديل SMTP: غيّر المضيف وبيانات الاعتماد
الإعدادPostmarkMail.Land
المضيفsmtp.postmarkapp.com، أو smtp-broadcasts.postmarkapp.com للرسائل الجماعيةsmtp.mail.land
المنفذ25 أو 587 أو 2525، مع STARTTLS587 مع 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.

وثائق مرحّل SMTP

تبديل استدعاء 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.

مطابقة حقول استدعاء الإرسال
PostmarkMail.Landملاحظة
X-Postmark-Server-Token: <token>X-API-Key: <key>ترويسة مختلفة.
Fromfrom.email, from.nameافصل اسم العرض عن العنوان. يجب أن يكون العنوان على نطاق موثّق.
Toto[].email, to[].nameمصفوفة كائنات بدلاً من سلسلة مفصولة بفواصل. حتى 5 مستلمين في كل طلب مع مفتاح معاملاتي؛ ويتلقى كل منهم نسخة منفصلة.
Cc, Bccلا يوجدغير مدعوم. أرسل رسالة منفصلة إلى كل مستلم.
Subjectsubjectمطلوب ما لم تستخدم قالباً.
HtmlBodyhtmlContent
TextBodytextContent
ReplyToreplyToسلسلة عنوان واحدة. إذا كنت تستخدم عدة عناوين reply-to مفصولة بفواصل، فاحتفظ بواحد.
Tagtagsمصفوفة، فيمكن أن تحمل الرسالة الواحدة عدة وسوم.
Metadataلا يوجدلا يوجد حقل بيانات وصفية بصيغة مفتاح وقيمة. استخدم tags أو ترويسة مخصصة.
Headers [{ Name, Value }]customHeadersكائن من أسماء الترويسات وقيمها بدلاً من مصفوفة.
TrackOpenstracking.opensيُقدَّم اختيار النطاق نفسه لتتبع الفتح.
TrackLinkstracking.clicksقيمة منطقية بدلاً من None أو HtmlAndText أو HtmlOnly أو TextOnly.
Attachments[].Name, Content, ContentType, ContentIDattachments[].fileName, content, contentType, contentId, inlineمحتوى Base64 كما هو. اضبط inline: true للصورة المضمّنة. حتى 10 مرفقات و10 MiB إجمالاً.
MessageStreamلا يوجدالمفتاح هو الذي يحدد التدفق: ml_pet_ أو ml_pem_.
TemplateId, TemplateAliastemplateIdأعد إنشاء القالب في Mail.Land أولاً؛ وسيحصل على معرّف جديد.
TemplateModelvariables, to[].variablesقيم بسيطة فقط، لأن العناصر النائبة لا تدعم الأقسام أو الحلقات.
POST /email/batch (حتى 500 رسالة)POST /v1/transactional/send-batchنموذج مختلف: محتوى مشترك لما يصل إلى 10,000 مستلم، لكل منهم متغيراته، يُرسل بمفتاح تسويقي. أما الرسائل المختلفة فأرسل كلاً منها باستدعاء مستقل.
لا مقابل لهscheduledAtجدول الرسالة حتى 7 أيام مقدماً.
لا مقابل لهالترويسة X-Idempotency-Keyخلال فترة الاحتفاظ، تعيد المحاولة بالمفتاح نفسه الاستجابة الأصلية بدلاً من الإرسال مجدداً.

تردّ Mail.Land بـ 202 Accepted مع jobId ومعرّف رسالة لكل مستلم مقبول وقائمتي المستلمين المقبولين والمرفوضين.

وثائق REST API

أضف نطاقك وسجلات DNS

أضف النطاق في Mail.Land وانشر السجلات التي تعرضها لوحة التحكم. يجب التحقق من SPF وDKIM وDMARC قبل أن تتمكن من الإرسال. يمكنك فعل ذلك بينما لا تزال Postmark ترسل.

أضف نطاقك وسجلات DNS
السجلالاسمالقيمةملاحظة
SPF (TXT)yourdomain.cominclude:spf.mlnd.netأضف include إلى سجل SPF الحالي. يجب أن يكون للنطاق سجل SPF واحد فقط.
DKIM (TXT)mlnd._domainkey.yourdomain.comv=DKIM1; k=rsa; p=...المحدِّد (selector) هو mlnd، فيوجد السجل إلى جانب سجل DKIM الخاص بـ Postmark.
DMARC (TXT)_dmarc.yourdomain.comv=DMARC1; p=...مطلوب. احتفظ بسجل DMARC واحد؛ ويكفي سجل قائم يتضمن سياسة.
مسار الإرجاع (CNAME)bounce.yourdomain.combounce.mlnd.netاضبطه على DNS only دون وكيل (proxy). تأكد من أن هذا الاسم غير مستخدم أصلاً.

احتفظ بسجلات DNS الخاصة بـ Postmark حتى ينتهي الانتقال، واحذفها فقط بعد خروج آخر رسالة منها.

وثائق إعداد DNS

استورد قوائم منع الإرسال أولاً

تحتفظ Postmark بقوائم منع الإرسال لكل تدفق رسائل. صدّر قائمة كل تدفق، مثلاً عبر GET /message-streams/<stream>/suppressions/dump، ثم استوردها إلى Mail.Land بالنوع ونطاق التطبيق المطابقين، من لوحة التحكم أو عبر POST /v1/transactional/suppressions/import.

استورد قوائم منع الإرسال أولاً
السبب في Postmarkالنوع في Mail.Landنطاق التطبيق
HardBounceHardBounceGlobal
SpamComplaintComplaintGlobal
ManualSuppression في تدفق جماعي (إلغاءات الاشتراك)UnsubscribeMarketing؛ أو List، الذي ينطبق فقط على الحملات المرسلة إلى القائمة البريدية المطابقة في Mail.Land
ManualSuppression في تدفق معاملاتيManualTransactional

استورد قبل أول إرسال عبر Mail.Land، كي يبقى من ألغوا اشتراكهم ممنوعين من البداية. تُتخطى العناوين الموجودة مسبقاً ولا تتكرر.

وثائق قوائم منع الإرسال

وجّه Webhooks إلى Mail.Land

أضف نقطة النهاية في Mail.Land واختر الأحداث وتحقق من الترويسة X-MLND-Signature بسرّ ذلك الـ Webhook. إذا كنت تحمي نقطة نهاية Postmark بمصادقة Basic أو قائمة سماح لعناوين IP، فتحقق من التوقيع بدلاً من ذلك.

وجّه Webhooks إلى Mail.Land
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.

أحداث Webhook

التحقق من توقيع Webhook

أعد إنشاء قوالبك

أنشئ كل قالب في لوحة تحكم Mail.Land أو عبر واجهة القوالب، ثم أرسله باستخدام templateId وvariables. يجب أن يكون لكل عنصر نائب قيمة، وإلا رُفض الإرسال برمز 422 مع أسماء القيم الناقصة.

أعد إنشاء قوالبك
PostmarkMail.Land
{{firstName}}{{firstName}}
{{#each items}} ... {{/each}}لا يوجد
{{#section}}, {{^section}}لا يوجد
قوالب التخطيط (layout)لا يوجد

العناصر النائبة في Mail.Land بسيطة: دون أقسام أو حلقات أو تخطيطات. مرّر قيماً بسيطة، وابنِ القوائم في تطبيقك، وكرّر HTML المشترك للترويسة والتذييل في كل قالب.

وثائق القوالب

التبديل خطوة بخطوة

  1. أضف نطاق الإرسال في Mail.Land وتحقق منه، مع إضافة include:spf.mlnd.net إلى سجل SPF الحالي.
  2. صدّر قوائم منع الإرسال لكل تدفق رسائل في Postmark واستوردها.
  3. أنشئ مفتاحاً معاملاتياً لكل تطبيق، ومفتاحاً تسويقياً إذا كنت ترسل رسائل جماعية.
  4. أعد إنشاء القوالب وWebhooks.
  5. أنشئ مفتاح اختبار مع sandboxBehavior بالقيمة LogOnly، وشغّل اختبارات التكامل على Mail.Land دون تسليم بريد.
  6. أرسل رسائل حقيقية إلى عناوين تتحكم بها وتحقق منها في سجل البريد.
  7. انقل تطبيقاً واحداً أو حصة صغيرة من حركة الإرسال، ثم راقب التسليم والارتدادات والشكاوى.
  8. ما دام المزودان يعملان، أبقِ إلغاءات الاشتراك متزامنة في الاتجاهين: انسخ إلغاءات الاشتراك والشكاوى والارتدادات الجديدة من Postmark إلى Mail.Land ومن Mail.Land إلى Postmark، وأجرِ مزامنة أخيرة قبل نقل ما تبقى من الحركة.
  9. تحقق من الإحماء لنطاقك: في Free وPro يكون للنطاق الجديد حد يومي يرتفع على مراحل، وتُرفض الرسائل التي تتجاوزه. خطط للانتقال ضمن هذه الحدود، أو اسألنا عن جدول مخصص. خطة Max لا تمر بالإحماء.
  10. ثم انقل الباقي، وأبقِ Postmark فعّالة حتى تخرج آخر رسائلها.

Mail.Land مقابل Postmark: المقارنة الموثّقة

المصادر

صفحات Postmark العامة المستخدمة في هذا الدليل.

  1. [1]Postmark Email APIhttps://postmarkapp.com/developer/api/email-apiتم التحقق في 4 نوفمبر 2026
  2. [2]Postmark Templates APIhttps://postmarkapp.com/developer/api/templates-apiتم التحقق في 4 نوفمبر 2026
  3. [3]Postmark: إرسال البريد عبر SMTPhttps://postmarkapp.com/developer/user-guide/send-email-with-smtpتم التحقق في 4 نوفمبر 2026
  4. [4]نظرة عامة على Webhooks في Postmarkhttps://postmarkapp.com/developer/webhooks/webhooks-overviewتم التحقق في 4 نوفمبر 2026
  5. [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؟

أنشئ حساباً مجانياً وأرسل أول رسالة اختبار اليوم. وإن أردت المساعدة، فأخبرنا عن إعدادك.