تابع getmxrr() در PHP
تابع getmxrr() در PHP برای واکشی رکوردهای MX (Mail eXchanger) مربوط به یک دامنه استفاده میشود. این رکوردها نشان میدهند که کدام سرورها مسئول دریافت ایمیل برای آن دامنه هستند. در این مقاله به شکل دقیق عملکرد، پارامترها، نمونههای کد عملی و نکات فنی و امنیتی مرتبط با این تابع را بررسی میکنیم.
شرح تابع و پارامترها
امضای تابع به صورت زیر است:
bool getmxrr ( string $hostname , array &$mxhosts [, array &$weight ] )توضیحات:
- $hostname: نام دامنهای که میخواهید رکوردهای MX آن را بگیرید (مثلاً example.com).
- $mxhosts: مرجع آرایهای که لیست میزبانهای MX در آن قرار میگیرد.
- $weight (اختیاری): مرجع آرایهای که اولویت (Preference) یا وزن هر رکورد MX را دریافت میکند.
- تابع مقدار bool برمیگرداند؛ true در صورت یافتن رکورد (حتی اگر خالی باشد) و false در صورت خطا.
مثال ساده
<?php
$domain = 'example.com';
if (getmxrr($domain, $mxhosts, $mxweights)) {
print_r($mxhosts);
print_r($mxweights);
} else {
echo "No MX records found or lookup failed.n";
}
?>شرح: این کد رکوردهای MX دامنه را واکشی و آرایه میزبانها و وزنها را چاپ میکند. اگر واکشی موفق نباشد، پیام خطا نمایش داده میشود.
عملکرد عملیتر: مرتبسازی براساس اولویت و اتصال آزمایشی SMTP
<?php
$domain = 'example.com';
$mxhosts = $mxweights = [];
if (getmxrr($domain, $mxhosts, $mxweights)) {
// آرایش ترکیبی از weight و host برای مرتبسازی
$mx = array_combine($mxhosts, $mxweights);
asort($mx); // مرتبسازی بر اساس وزن (اولویت کمتر = بالاتر)
foreach ($mx as $host => $priority) {
echo "Trying $host (priority $priority)...n";
$fp = @fsockopen($host, 25, $errno, $errstr, 5);
if ($fp) {
echo "Connected to $host on SMTP port 25n";
fclose($fp);
break; // متصل شدیم؛ میتوانیم متوقف شویم یا ادامه دهیم
} else {
echo "Cannot connect to $host: $errstr ($errno)n";
}
}
} else {
echo "No MX records found.n";
}
?>شرح: این اسکریپت ابتدا رکوردها را میگیرد، آنها را بر اساس مقدار اولویت مرتب میکند، سپس سعی میکند به هر سرور از طریق پورت SMTP (25) متصل شود تا در صورت نیاز بررسی سلامت اتصال انجام شود. توجه کنید که اتصال SMTP صرفاً برای بررسی reachability است و به معنای تأیید صحت گیرنده ایمیل نیست.
Fallback به A/AAAA بر اساس RFC
براساس RFC، اگر دامنه رکورد MX نداشته باشد، باید از رکورد A یا AAAA دامنه بهعنوان مقصد دریافت ایمیل استفاده شود. در عمل بهتر است این fallback را پیاده کنید:
<?php
function get_mail_hosts($domain) {
$mxhosts = $mxweights = [];
if (getmxrr($domain, $mxhosts, $mxweights) && count($mxhosts)) {
// مرتبسازی براساس اولویت
$mx = array_combine($mxhosts, $mxweights);
asort($mx);
return array_keys($mx);
}
// fallback: بررسی رکورد A/AAAA
$ips = dns_get_record($domain, DNS_A + DNS_AAAA);
$hosts = [];
foreach ($ips as $r) {
if (isset($r['ip'])) $hosts[] = $domain;
if (isset($r['ipv6'])) $hosts[] = $domain;
}
return array_unique($hosts);
}
?>شرح: تابع بالا ابتدا MX را بررسی میکند، اگر نبود با استفاده از dns_get_record رکوردهای A/AAAA را چک میکند و دامنه را به عنوان میزبان ایمیل بازمیگرداند.
مقایسه getmxrr با dns_get_record
<?php
// استفاده از dns_get_record برای دریافت رکوردهای MX همراه با جزئیات
$records = dns_get_record('example.com', DNS_MX);
print_r($records);
?>شرح: dns_get_record قابلیت بیشتری در بازگرداندن جزییات رکورد دارد (مثلاً زمان TTL و سایر فیلدها). در بسیاری از پروژهها dns_get_record انعطافپذیرتر و با اطلاعات دقیقتر است. از طرف دیگر getmxrr سادهتر و مستقیمتر برای دریافت لیست میزبانهاست.
نکات فنی، سازگاری و محدودیتها
- سازگاری پلتفرم: تابع getmxrr در نسخههای قدیمیتر PHP روی ویندوز ممکن است پشتیبانی نشود. از PHP 5.3 به بعد پشتیبانی بهبود یافته است، اما در هر صورت dns_get_record در محیطهای مختلف قابل اعتمادتر است.
- IDN: برای دامنههای بینالمللی (حروف غیرلاتین) از تابع idn_to_ascii (از افزونه intl یا idn) استفاده کنید تا نام دامنه قبل از lookup به ASCII تبدیل شود.
- امنیت: وجود رکورد MX نشاندهنده صحت گیرنده نیست. همواره لازم است برای اعتبارسنجی ایمیل از روشهای تکمیلی مانند VRFY/EXPN (با احتیاط)، ارسال ایمیل تأییدی، یا بررسی SMTP و قواعد پراسینگ استفاده کنید.
- حساسیت به DNS poisoning و کش: نتایج DNS ممکن است دستکاری شده یا کش شوند؛ برای حساسترین کاربردها از سرورهای DNS معتبر یا DNSSEC استفاده کنید.
- زمانبندی و timeout: درخواست DNS و تلاش برای اتصال SMTP ممکن است زمانبر شود؛ از timeout مناسب و تحمل خطا استفاده کنید.
موارد کاربرد رایج
- اعتبارسنجی اولیه ایمیل هنگام ثبتنام: بررسی اینکه دامنه گیرنده رکورد MX معتبر دارد.
- سیستمهای ارسال ایمیل مستقیم: تعیین مقصد تحویل ایمیل بر اساس MX برای انجام تحویل مستقیم به سرور مقصد.
- عیبیابی و مانیتورینگ: بررسی در دسترس بودن سرورهای دریافت ایمیل و اولویتبندی آنها.
جدول خلاصه وضعیتها
| وضعیت | معنی |
|---|---|
| تابع true و آرایه غیرخالی | رکورد MX موجود و واکشی موفق |
| تابع true و آرایه خالی | عملخوانی موفق اما رکورد MX وجود ندارد (ممکن است از A/AAAA استفاده شود) |
| تابع false | خطا در lookup یا عدم دسترسی به سرویس DNS |
نکات تکمیلی برای توسعهدهندگان
- برای عملکرد بهتر در سیستمهای پراستفاده، نتایج DNS را بهصورت موقتی cache کنید.
- به جای اعتماد صرف به getmxrr، از ترکیب dns_get_record، بررسی A/AAAA، و تست اتصال TCP استفاده کنید.
- در محیطهای مولتیپلتفرم، قبل از استقرار عملکرد را روی ویندوز و لینوکس تست کنید.
در مجموع تابع getmxrr ابزار ساده و مفیدی برای بهدستآوردن رکوردهای MX است، اما برای پیادهسازیهای مقاوم و تولیدی بهتر است از روشهای تکمیلی مانند dns_get_record، تبدیل IDN، fallback به A/AAAA و تستهای ارتباطی استفاده کنید.
آیا این مطلب برای شما مفید بود ؟



