التحقق من النطاق
التحقق من ملكية النطاق عبر التحقق من سجلات DNS
بعد تهيئة سجلات DNS، قم بتشغيل عملية التحقق لإثبات ملكية النطاق وفتح إمكانية إرسال البريد الإلكتروني. تتحقق MailLand من سجلات SPF و DKIM و DMARC ومسار العودة.
التحقق من نطاق
POST https://api.mail.land/v1/domains/{id}/verifyقم بالمصادقة باستخدام Authorization: Bearer <token> أو X-API-Key: <api key>.
curl -X POST https://api.mail.land/v1/domains/k3v9x2m8q1w7z4/verify \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."الاستجابة
{
"domainId": "k3v9x2m8q1w7z4",
"domain": "yourdomain.com",
"isVerified": true,
"spfStatus": "valid",
"dkimStatus": "valid",
"dmarcStatus": "valid",
"verifiedAt": "2026-02-17T10:15:00Z",
"message": "Domain successfully verified with all DNS records valid",
"dnsRecords": {
"spfRecord": "v=spf1 include:spf.mlnd.net ~all",
"dkimSelector": "mlnd",
"dkimRecord": "v=DKIM1; k=rsa; p=MIIBIjANBgkq...",
"dmarcRecord": "v=DMARC1; p=none; rua=mailto:[email protected]"
},
"trackingVerified": false,
"bounceVerified": true,
"bounceVerifiedAt": "2026-02-17T10:15:00Z",
"mxVerified": false,
"lastDnsCheckAt": "2026-02-17T10:15:00Z"
}| الحقل | النوع | الوصف |
|---|---|---|
domainId | string | المعرّف العام للنطاق |
domain | string | اسم النطاق |
isVerified | boolean | true فقط عندما تكون SPF وDKIM وDMARC كلها valid |
spfStatus, dkimStatus, dmarcStatus | enum | حالة السجل: pending أو valid أو invalid |
verifiedAt | datetime | وقت التحقق من النطاق |
message | string | ملخص النتيجة |
dnsRecords | object | سجلات SPF وDKIM (مع dkimSelector) وDMARC الموجودة في DNS، أو القيمة المتوقعة عند عدم العثور على أي سجل |
spfErrorMessage, dkimErrorMessage, dmarcErrorMessage | string | سبب فشل السجل؛ يُحذف عند نجاحه |
trackingVerified, bounceVerified, mxVerified | boolean | ما إذا كان نطاق التتبع المخصص ونطاق الارتداد المخصص (Return-Path) وسجل MX الوارد قد تم التحقق منها |
trackingVerifiedAt, bounceVerifiedAt, mxVerifiedAt | datetime | وقت التحقق من كل منها |
trackingErrorMessage, bounceErrorMessage, mxErrorMessage | string | سبب فشل أي منها؛ يُعاد فقط لما قمت بتفعيله |
lastDnsCheckAt | datetime | وقت آخر فحص لـ DNS |
حالات السجلات
يُرجع كل فحص لسجل DNS إحدى هذه الحالات:
| الحالة | الوصف |
|---|---|
pending | لم يُفحص بعد |
valid | السجل موجود وصحيح |
invalid | السجل مفقود أو غير صحيح |
متطلبات التحقق
لكي يُعدّ النطاق متحققًا منه (isVerified: true)، يجب أن تكون SPF وDKIM وDMARC كلها valid:
| السجل | مطلوب | يجب أن يجتاز |
|---|---|---|
| SPF | نعم | يجب وجود include:spf.mlnd.net |
| DKIM | نعم | مفتاح عام صالح لمفتاح DKIM النشط |
| DMARC | نعم | سجل في _dmarc يبدأ بـ v=DMARC1 ويتضمن سياسة (p=none أو p=quarantine أو p=reject) |
| مسار العودة | لا (مفعّل افتراضيًا للنطاقات الجديدة؛ لا يمنع الإرسال) | CNAME يشير إلى bounce.mlnd.net، بوضع DNS فقط (بدون وكيل) |
| التتبع | لا (فقط مع نطاق تتبع مخصص) | CNAME يشير إلى track.mlnd.net، بوضع DNS فقط (بدون وكيل) |
| MX الوارد | لا (فقط مع البريد الوارد) | MX يشير إلى mx.mlnd.net |
السجلات الاختيارية لا تغيّر isVerified. لا يُستخدم نطاق التتبع أو الارتداد المخصص في الإرسال إلا بعد التحقق من سجله الخاص؛ وحتى ذلك الحين يستخدم MailLand مضيفيه الافتراضيين.
التحقق الجزئي
إذا تم العثور على بعض السجلات لكن أخرى مفقودة، تُظهر الاستجابة بدقة ما يحتاج إلى اهتمام:
{
"domainId": "k3v9x2m8q1w7z4",
"domain": "yourdomain.com",
"isVerified": false,
"spfStatus": "valid",
"dkimStatus": "invalid",
"dmarcStatus": "invalid",
"message": "Domain verification incomplete. Please check DNS records below.",
"dnsRecords": {
"spfRecord": "v=spf1 include:spf.mlnd.net ~all",
"dkimSelector": "mlnd",
"dkimRecord": "v=DKIM1; k=rsa; p=MIIBIjANBgkq...",
"dmarcRecord": "v=DMARC1; p=quarantine; pct=100; adkim=r; aspf=r; rua=mailto:[email protected]; sp=none"
},
"dkimErrorMessage": "DKIM record not found. Please add the TXT record to your DNS.",
"dmarcErrorMessage": "DMARC record not found. Please add TXT record at _dmarc subdomain.",
"trackingVerified": false,
"trackingErrorMessage": "CNAME record not found. Please add a CNAME record for track.yourdomain.com pointing to track.mlnd.net",
"bounceVerified": false,
"mxVerified": false,
"lastDnsCheckAt": "2026-02-17T10:20:00Z"
}إعادة التحقق التلقائية
تُعيد MailLand التحقق من النطاقات المُتحقَّق منها بشكل دوري في الخلفية عبر PendingDomainVerificationWorker وDnsHealthCheckWorker:
- النطاقات المعلقة: تُعاد فحصها كل ساعة لمدة 7 أيام بعد إضافتها؛ بعد ذلك، يجب التحقق يدوياً
- النطاقات المُتحقَّق منها: يتم فحص صحة DNS بشكل دوري للكشف عن السجلات المُزالة أو المُغيَّرة
إذا تمت إزالة سجلات DNS لنطاق مُتحقَّق منه أو تغييرها لاحقاً، تصبح حالة السجل المتأثر (spfStatus/dkimStatus/dmarcStatus) هي invalid، وتصبح isFullyVerified قيمتها false، ويتوقف الإرسال حتى يتم إصلاح السجل. تبقى verificationStatus نفسها Verified: تستعيد MailLand حالة السجل تلقائياً عندما يصبح DNS صحيحاً مجدداً.
فحص صحة النطاق
قم بتشغيل فحص صحة عند الطلب يتجاوز التحقق الأساسي:
POST https://api.mail.land/v1/domains/{id}/health-checkcurl -X POST https://api.mail.land/v1/domains/k3v9x2m8q1w7z4/health-check \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."{
"domainName": "yourdomain.com",
"status": "warning",
"previousStatus": "healthy",
"issues": [
{
"code": "DmarcNonePolicy",
"message": "DMARC policy is set to 'none' (monitoring only)",
"severity": "warning",
"record": "DMARC",
"details": "Consider upgrading to p=quarantine or p=reject"
}
],
"statusChanged": true,
"checkedAt": "2026-02-17T10:30:00Z",
"observationId": { "value": "3f2c9a1e-7b4d-4c1a-9e0f-5a6b7c8d9e0f" },
"spf": {
"lookupCompleted": true,
"isValid": true,
"value": "v=spf1 include:spf.mlnd.net ~all",
"issues": [],
"recordVerdict": "valid"
},
"dkim": {
"lookupCompleted": true,
"isValid": true,
"issues": [],
"recordVerdict": "valid"
},
"dmarc": {
"lookupCompleted": true,
"isValid": true,
"value": "v=DMARC1; p=none; rua=mailto:[email protected]",
"issues": [
{
"code": "DmarcNonePolicy",
"message": "DMARC policy is set to 'none' (monitoring only)",
"severity": "warning",
"record": "DMARC",
"details": "Consider upgrading to p=quarantine or p=reject"
}
],
"recordVerdict": "valid"
}
}حالات الصحة
| الحالة | الوصف |
|---|---|
healthy | جميع الفحوصات ناجحة: لم يتم اكتشاف أي مشاكل |
warning | النطاق يعمل لكن هناك تحسينات محتملة |
critical | يحتوي النطاق على مشاكل قد تمنع تسليم البريد الإلكتروني |
unknown | تعذّر تحديد الحالة (فشل البحث في DNS) |
رموز المشاكل
| الرمز | الخطورة | الوصف |
|---|---|---|
DnsNxDomain | critical | النطاق غير موجود (بتأكيد من محلّل ثانٍ مستقل) |
SpfMissing | critical | لم يتم العثور على سجل SPF |
SpfMissingInclude | critical | سجل SPF لا يتضمن spf.mlnd.net |
SpfPermError | critical | أكثر من سجل SPF واحد (خطأ SPF دائم) |
SpfTooManyLookups | warning | يحتاج سجل SPF إلى أكثر من 10 استعلامات DNS |
DkimMissing | critical | لم يتم العثور على سجل DKIM |
DkimMissingSelector | critical | لا يوجد سجل DKIM عند محدد مفتاح نشط |
DkimKeyMismatch | critical | مفتاح DKIM في DNS لا يطابق مفتاح MailLand |
DkimRevoked | critical | تم إبطال مفتاح DKIM (وسم p= فارغ) |
DmarcMissing | warning | لم يتم العثور على سجل DMARC |
DmarcNonePolicy | warning | سياسة DMARC هي none (مراقبة فقط) |
MxMissing | critical | لا يوجد سجل MX (يُفحص فقط عند تفعيل البريد الوارد) |
MxWrongHost | warning | سجل MX لا يشير إلى mx.mlnd.net |
DnsTimeout, DnsServFail, DnsLookupFailed | warning | لم يكتمل استعلام DNS؛ لم يُستنتج شيء عن السجل |
سجل الصحة
عرض نتائج فحوصات الصحة التاريخية. معاملات الاستعلام الاختيارية from/to (بصيغة ISO 8601) تُضيّق النطاق الزمني:
GET https://api.mail.land/v1/domains/{id}/health-historycurl https://api.mail.land/v1/domains/k3v9x2m8q1w7z4/health-history \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."[
{
"domainName": "yourdomain.com",
"prevStatus": "healthy",
"newStatus": "warning",
"issues": ["DmarcNonePolicy"],
"reason": "Scheduled health check",
"checkedAt": "2026-02-17T10:30:00Z"
},
{
"domainName": "yourdomain.com",
"prevStatus": "warning",
"newStatus": "healthy",
"issues": [],
"reason": "Scheduled health check",
"checkedAt": "2026-02-16T10:30:00Z"
}
]الاستجابة مصفوفة عادية (بلا غلاف items، وبلا nextCursor/hasMore).
استكشاف الأخطاء وإصلاحها
لم يتم العثور على سجل SPF
- تأكد من وجود سجل TXT واحد بالضبط لـ SPF في نطاقك الجذر
- تتسبب سجلات SPF المتعددة في فشل، ادمجها في سجل واحد
- تحقق من أن
include:spf.mlnd.netيظهر قبل آلية~allأو-all
لم يتم العثور على سجل DKIM
- تحقق من أن السجل موجود في
mlnd._domainkey.yourdomain.com(وليسmlnd._domainkey) - يجب أن يكون نوع السجل TXT (وليس CNAME)
- يتطلب بعض مزودي DNS وضع علامات اقتباس حول قيم TXT الطويلة
- تحقق من وجود مسافات أو أسطر جديدة في المفتاح العام المُلصق
لم يتم العثور على CNAME مسار العودة
- تأكد من أن CNAME موجود في
bounce.yourdomain.com(أو نطاق الارتداد المخصص الخاص بك) - يجب أن تكون قيمة CNAME
bounce.mlnd.net(وليس عنوان IP ولا سجل MX) - مستخدمو Cloudflare: تأكد من تعطيل البروكسي (سحابة رمادية / DNS only)
تأخير انتشار DNS
- تنتشر معظم تغييرات DNS في غضون 5 إلى 15 دقيقة
- إذا كنت تستخدم TTL منخفضاً (300 ثانية)، يجب أن تظهر التغييرات بسرعة
- قد تستغرق السجلات الموجودة ذات TTL العالية ما يصل إلى 48 ساعة للتحديث على مستوى العالم
- حاول التحقق مرة أخرى بعد الانتظار 15 دقيقة
الخطوات التالية
- إعداد DNS: مراجعة سجلات DNS المطلوبة
- تدوير مفاتيح DKIM: تدوير مفاتيح التوقيع DKIM
- REST API: بدء إرسال البريد الإلكتروني بعد التحقق