تایید دامنه
تایید مالکیت دامنه از طریق اعتبارسنجی رکوردهای 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 بررسی میکند:
- دامنههای در انتظار: تا ۷ روز پس از افزودن، هر ساعت دوباره بررسی میشوند؛ پس از آن باید بهصورت دستی تأیید شوند
- دامنههای تأییدشده: سلامت 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 | دامنه وجود ندارد (با تأیید یک resolver مستقل دوم) |
SpfMissing | critical | رکورد SPF پیدا نشد |
SpfMissingInclude | critical | رکورد SPF شامل spf.mlnd.net نیست |
SpfPermError | critical | بیش از یک رکورد SPF (خطای دائمی SPF) |
SpfTooManyLookups | warning | رکورد SPF به بیش از ۱۰ جستجوی 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 ظرف ۵ تا ۱۵ دقیقه منتشر میشوند
- اگر از TTL پایین (۳۰۰ ثانیه) استفاده میکنید، تغییرات باید سریع ظاهر شوند
- رکوردهای موجود با TTL بالا ممکن است تا ۴۸ ساعت طول بکشد تا در سطح جهانی بهروز شوند
- پس از ۱۵ دقیقه صبر دوباره تأیید را امتحان کنید
مراحل بعدی
- تنظیمات DNS: بررسی رکوردهای DNS مورد نیاز
- چرخش کلید DKIM: چرخش کلیدهای امضای DKIM
- REST API: شروع ارسال ایمیل پس از تأیید