نظرة عامة على البريد الوارد
استقبال ومعالجة رسائل البريد الإلكتروني الواردة عبر بوابة البريد الوارد في Mail.Land
تستقبل بوابة البريد الوارد في MailLand رسائل البريد الإلكتروني على نطاقاتك وتُسلّمها إلى تطبيقك عبر webhooks أو تُخزّنها لاسترجاعها لاحقًا. استخدم معالجة البريد الوارد لبناء صناديق دعم فني، أو لتحليل رسائل مُولَّدة آليًا، أو لتوجيه الردود إلى تطبيقك.
آلية العمل
تكوين نطاقك
وجّه سجلات MX الخاصة بنطاقك إلى خوادم البريد الوارد في MailLand. يحتاج النطاق إلى inboundEnabled ومستأجر نشط. يقبل MailLand البريد فقط للمستلم المطابق لمسار مُفعَّل، أو لأي عنوان إذا كان catchAllEnabled مُفعَّلًا؛ وأي شيء آخر يُرفض عند RCPT.
إنشاء قواعد التوجيه
عرّف مسارات تطابق الجزء المحلي من عنوان المستلم، وحدّد لها إجراءً (إعادة توجيه أو webhook أو تخزين).
استقبال رسائل البريد المُحلَّلة
يعالج MailLand البريد الإلكتروني، فيُحلّل الترويسات والمتن والمرفقات، ثم يُسلّم النتيجة إلى نقطة نهاية webhook الخاصة بك أو يُخزّنها لاسترجاعها عبر API.
إعدادات البريد الوارد
الإعدادات لكل نطاق على حدة، وليست على مستوى مساحة العمل بأكملها:
GET https://api.mail.land/v1/transactional/inbound/domains/{domainId}/settings
PUT https://api.mail.land/v1/transactional/inbound/domains/{domainId}/settingsاستخدم Authorization: Bearer <token> أو X-API-Key: <api key> للمصادقة.
curl https://api.mail.land/v1/transactional/inbound/domains/k3v9x2m8q1w7z4/settings \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."{
"isEnabled": true,
"catchAllEnabled": true,
"maxMessageSizeBytes": 26214400,
"retentionDays": 30,
"dailyLimit": 10000,
"storeEmails": true
}تحديث الإعدادات:
PUT https://api.mail.land/v1/transactional/inbound/domains/k3v9x2m8q1w7z4/settings{
"isEnabled": true,
"catchAllEnabled": true,
"maxMessageSizeBytes": 26214400,
"retentionDays": 30,
"dailyLimit": 10000,
"storeEmails": true
}curl -X PUT https://api.mail.land/v1/transactional/inbound/domains/k3v9x2m8q1w7z4/settings \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{
"isEnabled": true,
"catchAllEnabled": true,
"maxMessageSizeBytes": 26214400,
"retentionDays": 30,
"dailyLimit": 10000,
"storeEmails": true
}'| الحقل | النوع | الوصف |
|---|---|---|
isEnabled | bool | تفعيل/تعطيل معالجة البريد الوارد لهذا النطاق |
catchAllEnabled | bool | قبول البريد لأي مستلم على النطاق، وليس فقط المستلمين المطابقين لمسار مُفعَّل |
maxMessageSizeBytes | int | الحد الأقصى لحجم الرسالة المقبول بالبايت لهذا النطاق، ويُطبَّق برمز SMTP 552 5.3.4. تقبل واجهة الإعدادات قيمًا تصل إلى 50 ميبيبايت، لكن المنصة لا تقبل أبدًا أكثر من 25 ميبيبايت بصرف النظر عن هذا الإعداد |
dailyLimit | int | الحد الأقصى لرسائل البريد الوارد المقبولة يوميًا لهذا النطاق |
retentionDays | int | عدد أيام الاحتفاظ بالرسائل المُخزَّنة. الافتراضي 30، والمسموح من 1 إلى 90 |
storeEmails | bool | ما إذا كان سيتم تخزين البريد الإلكتروني المُحلَّل بالكامل لاسترجاعه لاحقًا |
routeCount | int | عدد المسارات المُهيَّأة لهذا النطاق |
لا يوجد فحص فيروسات، ولا يوجد webhookUrl/webhookSecret واحد على مستوى مساحة العمل؛ تُربط الـ webhooks بكل مسار عبر webhookId (راجع المسارات).
يتم تطبيق maxMessageSizeBytes وdailyLimit وretentionDays فعليًا. يُستقبل البريد على العنوان <inboundSubdomain>.<domain>، وهو المضيف الذي يشير إليه سجل MX، بينما يستمر النطاق الجذري أيضًا في الاستقبال. تُرفض الرسالة التي تتجاوز قيمة maxMessageSizeBytes الخاصة بالنطاق برمز SMTP 552 5.3.4، ولا يتجاوز الرفض أبدًا الحد الأقصى للمنصة البالغ 25 ميبيبايت حتى لو تم ضبط قيمة أكبر (تقبل واجهة الإعدادات حتى 50 ميبيبايت، لكن المُطبَّق فعليًا هو 25 ميبيبايت فقط). وعند بلوغ dailyLimit (القيمة الافتراضية 10000) لليوم، يتلقى المرسلون رمز 452 4.2.2 مؤقتًا ويُتوقع منهم إعادة المحاولة لاحقًا؛ ولا تُفقد الرسالة. تُحذف الرسائل المخزَّنة بعد انقضاء retentionDays (الافتراضي 30 يومًا، والمسموح به من 1 إلى 90).
حالات البريد الإلكتروني
تُعاد كسلاسل نصية، وليست كأرقام:
| الحالة | الوصف |
|---|---|
Received | تم استلام البريد، بانتظار المعالجة |
Processing | قيد المعالجة (التحليل، فحص البريد المزعج، التوجيه) |
Processed | تمت معالجته واكتمل إجراؤه |
Delivered | تم التسليم بنجاح (إعادة توجيه أو إرسال webhook) |
Failed | فشلت المعالجة |
Expired | انتهت فترة الاحتفاظ؛ تم حذف البريد الإلكتروني |
لا توجد حالة منفصلة باسم Quarantined؛ البريد المزعج هو علامة منطقية isSpam على البريد الإلكتروني، مستقلة عن status.
سرد رسائل البريد الوارد
GET https://api.mail.land/v1/transactional/inbound/emailscurl https://api.mail.land/v1/transactional/inbound/emails \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."| المعامل | النوع | الافتراضي | الوصف |
|---|---|---|---|
cursor | string | - | مؤشر غير شفاف من nextCursor الخاص بالصفحة السابقة. اتركه فارغًا للصفحة الأولى. |
limit | int | 20 | عدد العناصر لكل صفحة (بحد أقصى 100)، يُقيَّد بدلًا من أن يُرفض |
domainId | string | - | التصفية حسب المعرّف العام للنطاق |
status | string | - | التصفية حسب حالة البريد الإلكتروني (Received، Processing، Processed، Delivered، Failed، Expired) |
routeId | string | - | التصفية حسب المسار المطابق |
isSpam | bool | - | التصفية حسب علامة البريد المزعج. تحديد isSpam (سواء true أو false) يقرر بُعد البريد المزعج بنفسه ويُعطّل مرشّح excludeQuarantined الافتراضي، لذا فإن isSpam=true تُعيد صفوف البريد المزعج (لا تزال خاضعة لقاعدة "المخزَّن فقط" أدناه). احذف isSpam للإبقاء على الإعداد الافتراضي لصندوق الوارد الذي يُخفي البريد المزعج. |
from | datetime | - | الرسائل المستلمة بعد هذا الوقت |
to | datetime | - | الرسائل المستلمة قبل هذا الوقت |
search | string | - | البحث في الموضوع والمرسل (العنوان أو الاسم)؛ لا يطابق المستلم |
sortBy | string | - | حقل الترتيب: subject أو from أو الافتراضي receivedAt |
sortDesc | bool | true | الترتيب تنازليًا |
excludeQuarantined | bool | true | استبعاد الرسائل المُعلَّمة كبريد مزعج من القائمة. يُتجاهَل عند تحديد isSpam. |
includeWebhookOnly | bool | false | تضمين الرسائل التي لم تُخزَّن عند الاستلام (مسارات webhook فقط أو مسارات الإسقاط). افتراضيًا هذه مخفية، لذا فإن مستأجرًا كل مساراته webhook فقط سيرى قائمة فارغة هنا. |
لا يوجد بحث بالموضوع subject فقط، ولا تصفية بعنوان المرسل/المستلم بمفردهما، وfrom/to هنا تواريخ وليست عناوين (استخدم search لمطابقة نصية في المرسل/الموضوع).
{
"items": [
{
"id": "k7m2x9q4p1w8z3",
"domainId": "k3v9x2m8q1w7z4",
"domainName": "yourdomain.com",
"matchedRouteId": "r7k3m9q2p4w8x1",
"matchedRouteName": "Support inbox",
"fromAddress": "[email protected]",
"fromName": "Customer Name",
"subject": "Need help with my account",
"textPreview": "Hi, I need help with...",
"hasHtml": true,
"hasText": true,
"attachmentCount": 1,
"sizeBytes": 45230,
"status": "Delivered",
"spfResult": "Pass",
"dkimResult": "Pass",
"dmarcResult": "Pass",
"isSpam": false,
"spamScore": 1.2,
"receivedAt": "2026-02-17T14:30:00Z",
"expiresAt": "2026-03-19T14:30:00Z"
}
],
"nextCursor": "eyJ2IjoxLCJzIjoiY3JlYXRlZGF0OmRlc2MiLCJrIjoi...",
"hasMore": true
}لا يوجد حقل to في عنصر القائمة؛ يوجد المستلمون في استجابة التفاصيل ضمن envelopeRecipients/headerRecipients. status سلسلة نصية، وليست رقمًا.
الحصول على تفاصيل البريد الإلكتروني
GET https://api.mail.land/v1/transactional/inbound/emails/{id}curl https://api.mail.land/v1/transactional/inbound/emails/{id} \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."يُعيد بيانات البريد الإلكتروني الوصفية المُحلَّلة والترويسات ومعاينة نصية وبيانات وصفية للمرفقات، وليس نص HTML/النص الكامل. اجلب الرسالة الخام لذلك (انظر أدناه).
{
"id": "k7m2x9q4p1w8z3",
"domainId": "k3v9x2m8q1w7z4",
"domainName": "yourdomain.com",
"matchedRouteId": "r7k3m9q2p4w8x1",
"matchedRouteName": "Support inbox",
"fromAddress": "[email protected]",
"fromName": "Customer Name",
"subject": "Need help with my account",
"textPreview": "Hi, I need assistance with...",
"hasHtml": true,
"hasText": true,
"attachmentCount": 1,
"sizeBytes": 45230,
"status": "Delivered",
"spfResult": "Pass",
"dkimResult": "Pass",
"dmarcResult": "Pass",
"isSpam": false,
"spamScore": 1.2,
"receivedAt": "2026-02-17T14:30:00Z",
"expiresAt": "2026-03-19T14:30:00Z",
"envelopeFrom": "[email protected]",
"replyTo": "[email protected]",
"messageId": "<[email protected]>",
"inReplyTo": null,
"dateHeader": "2026-02-17T14:30:00Z",
"authResultsHeader": "spf=pass dkim=pass dmarc=pass",
"spamReason": null,
"sourceIp": "203.0.113.5",
"heloHostname": "mail.example.com",
"processingError": null,
"processedAt": "2026-02-17T14:30:01Z",
"envelopeRecipients": [
{ "address": "[email protected]", "localPart": "support", "matchedRouteId": "r7k3m9q2p4w8x1" }
],
"headerRecipients": [
{ "type": "To", "address": "[email protected]", "name": null }
],
"attachments": [
{ "id": "a3k7m2q9p4w1x8", "fileName": "screenshot.png", "contentType": "image/png", "sizeBytes": 34500, "isInline": false, "contentId": null }
],
"webhookAttempts": [
{ "attemptNumber": 1, "status": "Delivered", "webhookUrl": "https://yourapp.com/webhooks/inbound", "httpStatusCode": 200, "errorMessage": null, "durationMs": 145, "attemptedAt": "2026-02-17T14:30:02Z", "nextRetryAt": null }
]
}نتائج المصادقة
تتضمن كل رسالة بريد وارد نتائج التحقق من SPF وDKIM وDMARC. القيم الممكنة تختلف لكل فحص:
headerRecipients[].type هي "To" أو "Cc" أو "Bcc" (بحساسية لحالة الأحرف)، وdateHeader هي طابع زمني
بصيغة ISO 8601، وليست نص رأس RFC 2822 الخام.
spfResult | الوصف |
|---|---|
None | لم يُعثر على سجل SPF أو لم يُجرَ الفحص |
Pass | المرسل مخوَّل |
Fail | المرسل غير مخوَّل |
SoftFail | قد لا يكون المرسل مخوَّلًا |
Neutral | لا يوجد بيان بشأن التخويل |
TempError | خطأ DNS مؤقت |
PermError | خطأ DNS دائم |
dkimResult | الوصف |
|---|---|
None | لم يُعثر على توقيع DKIM أو لم يُجرَ الفحص |
Pass | تم التحقق من التوقيع |
Fail | فشل التحقق من التوقيع |
TempError | خطأ DNS مؤقت |
PermError | خطأ DNS دائم |
dmarcResult | الوصف |
|---|---|
None | لم يُعثر على سياسة DMARC أو لم يُجرَ الفحص |
Pass | نجحت المطابقة |
Fail | فشلت المطابقة |
Quarantine | تُوصي السياسة بالحجر |
Reject | تُوصي السياسة بالرفض |
تنزيل البريد الإلكتروني الخام
GET https://api.mail.land/v1/transactional/inbound/emails/{id}/rawcurl https://api.mail.land/v1/transactional/inbound/emails/{id}/raw \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-o email.emlيُعيد البريد الإلكتروني الخام الأصلي (بتنسيق RFC 5322) كملف قابل للتنزيل.
حذف رسائل البريد الإلكتروني
حذف بريد إلكتروني واحد:
DELETE https://api.mail.land/v1/transactional/inbound/emails/{id}curl -X DELETE https://api.mail.land/v1/transactional/inbound/emails/{id} \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."حذف رسائل بالجملة:
POST https://api.mail.land/v1/transactional/inbound/emails/bulk-delete{
"ids": ["k7m2x9q4p1w8z3", "p3q8w2x7m9k4z1", "w9k3p7m2q8x4z6"]
}curl -X POST https://api.mail.land/v1/transactional/inbound/emails/bulk-delete \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{
"ids": ["k7m2x9q4p1w8z3", "p3q8w2x7m9k4z1", "w9k3p7m2q8x4z6"]
}'توجد أيضًا POST /v1/transactional/inbound/emails/bulk-mark-spam بنفس نص الطلب {"ids": [...]}، لوضع علامة بريد مزعج على نفس الدفعة من الرسائل في استدعاء واحد.
العزل
تظهر هنا الرسائل التي تحمل isSpam: true (لا يوجد فحص فيروسات، ولا حالة منفصلة باسم Quarantined؛ البريد المزعج مجرد علامة منطقية). عرض الرسائل المعزولة:
GET https://api.mail.land/v1/transactional/inbound/quarantinecurl https://api.mail.land/v1/transactional/inbound/quarantine \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."إطلاق بريد إلكتروني من العزل:
POST https://api.mail.land/v1/transactional/inbound/quarantine/{id}/releasecurl -X POST https://api.mail.land/v1/transactional/inbound/quarantine/{id}/release \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."يقتصر إطلاق البريد الإلكتروني على مسح علامة isSpam الخاصة به فقط. فهو لا يُعيد تشغيل التوجيه ولا يُعيد إرسال الـ webhooks. لإعادة تسليم webhook لبريد تم إطلاقه (أو أي بريد آخر)، استدعِ POST /v1/transactional/inbound/emails/{id}/replay-webhook: هذا يُدرج تسليمًا واحدًا موثوقًا إلى الـ webhook المطابق للمسار، ويعيد 202 Accepted (انظر Inbound Webhooks). كما تُضيف معلمة استعلام اختيارية ?addToAllowlist=true المرسل إلى قائمة السماح وقت الإطلاق.
قائمة السماح وقائمة الحظر
قائمة السماح
تتجاوز الرسائل من المرسلين المُدرجين في قائمة السماح فلترة البريد المزعج:
GET https://api.mail.land/v1/transactional/inbound/allowlistcurl https://api.mail.land/v1/transactional/inbound/allowlist \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."POST https://api.mail.land/v1/transactional/inbound/allowlist{
"pattern": "[email protected]",
"matchType": "ExactEmail",
"description": "Trusted partner"
}curl -X POST https://api.mail.land/v1/transactional/inbound/allowlist \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{
"pattern": "[email protected]",
"matchType": "ExactEmail",
"description": "Trusted partner"
}'تُعاد وتُرسَل كسلاسل نصية، وليست كأرقام:
| نوع المطابقة | الوصف |
|---|---|
ExactEmail | مطابقة عنوان بريد إلكتروني دقيق |
Domain | مطابقة جميع الرسائل من نطاق |
WildcardPattern | مطابقة نمط عام (wildcard) |
قائمة الحظر
تتم معالجة الرسائل من المرسلين المحظورين تلقائيًا:
GET https://api.mail.land/v1/transactional/inbound/blocklistcurl https://api.mail.land/v1/transactional/inbound/blocklist \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."POST https://api.mail.land/v1/transactional/inbound/blocklist{
"pattern": "[email protected]",
"matchType": "ExactEmail",
"action": "RejectAtSmtp",
"description": "Known spammer"
}curl -X POST https://api.mail.land/v1/transactional/inbound/blocklist \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{
"pattern": "[email protected]",
"matchType": "ExactEmail",
"action": "RejectAtSmtp",
"description": "Known spammer"
}'تُعاد وتُرسَل كسلاسل نصية، وليست كأرقام. الإجراء الافتراضي هو MarkAsSpam إذا لم يُحدَّد:
| إجراء الحظر | الوصف |
|---|---|
RejectAtSmtp | الرفض على مستوى SMTP (استجابة 550) |
MarkAsSpam | القبول مع وضع علامة بريد مزعج (افتراضي) |
Drop | إسقاط البريد الإلكتروني بصمت |
الحذف من قائمة السماح أو الحظر:
DELETE https://api.mail.land/v1/transactional/inbound/allowlist/{id}
DELETE https://api.mail.land/v1/transactional/inbound/blocklist/{id}# Delete from allowlist
curl -X DELETE https://api.mail.land/v1/transactional/inbound/allowlist/{id} \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
# Delete from blocklist
curl -X DELETE https://api.mail.land/v1/transactional/inbound/blocklist/{id} \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."إحصائيات البريد الوارد
GET https://api.mail.land/v1/transactional/inbound/statscurl https://api.mail.land/v1/transactional/inbound/stats \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."| المعامل | النوع | الوصف |
|---|---|---|
domainId | string | التصفية حسب المعرّف العام للنطاق |
from | datetime | التصفية حسب receivedAt عند هذا الوقت أو بعده |
to | datetime | التصفية حسب receivedAt قبل نهاية هذا اليوم |
{
"totalEmails": 1500,
"todayEmails": 42,
"receivedCount": 1500,
"processingCount": 5,
"processedCount": 1345,
"failedCount": 20,
"spamCount": 80,
"webhookFailedCount": 3,
"storageUsedBytes": 52428800,
"byDomain": [
{ "domainId": "k3v9x2m8q1w7z4", "domainName": "yourdomain.com", "count": 1500 }
],
"byStatus": { "Received": 5, "Processing": 5, "Processed": 1345, "Delivered": 1300, "Failed": 20, "Expired": 50 },
"dailyStats": [
{ "date": "2026-02-17", "total": 120, "processed": 115, "spam": 8 }
]
}لا يوجد حقل spamRate/averageSizeBytes؛ الشكل أعلاه شامل بالكامل.
استجابات الأخطاء
| الحالة | الرمز | الوصف |
|---|---|---|
400 | VALIDATION_FAILED | معاملات طلب غير صالحة |
403 | FORBIDDEN | صلاحيات غير كافية |
404 | RESOURCE_NOT_FOUND | البريد الإلكتروني غير موجود |