Sendmail увисва, когато домейн MX не съществува

Използвам библиотеката SwiftMailer на PHP за масово изпращане на имейли (следвайки CANSPAM и RFC).

Всичко работи добре, докато не срещна домейн, който няма съответен MX запис в DNS. В този момент моят скрипт просто увисва -- предполагам, че е така, защото sendmail не се е върнал. Това може да продължи само няколко минути или може да продължи много часове.

Потвърдих, че адресите, на които моят скрипт (наклонена черта sendmail) висят, са тези без DNS MX запис. Всичко останало се изпраща добре.

Има ли начин да проверя дали DNS MX съществува в PHP, преди да се опитам да изпратя съобщението? Това мащабируемо ли е (т.е. това допълнително търсене в DNS наистина ли ще ме забави, или ще бъде добре b/c, тогава MX се кешира локално, за да се използва от sendmail при доставяне на съобщението)?

Благодаря за вашата помощ

--- АКТУАЛИЗАЦИЯ --- Опитах решенията по-долу, които ми помогнаха да стесня проблема. Изглежда не е въпросът дали MX записът съществува или не. Проблемът е, че DNS търсенето отнема цяла вечност, за да се върне. Има ли лесен начин да задам времето за изчакване, така че ако DNS не се върне след ‹ 5 секунди, мога да продължа?


person Travis Leleu    schedule 10.11.2010    source източник


Отговори (3)


getmxrr(substr($email,strrpos($email,'@')+1),$hosts);
if (!$hosts)
    echo 'No MX record found';

Можете също така да опитате това, за да предотвратите блокиране (няма опции за коригиране на времето за изчакване на getmxrr):

if (!@fsockopen(substr($email,strrpos($email,'@')+1),25,$errno,$errstr,5))
    echo 'No MX record found';
person bcosca    schedule 10.11.2010
comment
Благодаря! това помогна; сега изглежда, че проблемът не е дали съществува или не, а забавянето при връщането на тази стойност. Актуализиран въпросът по-горе, някакви предложения как да направите тази заявка за изчакване след 5 s? - person Travis Leleu; 10.11.2010
comment
Така че няма ли да опитате просто да отворите сокет връзка към домейна на имейла? Проблемът ми е, че (често) изпращам до onedomain.com (който може или не може да има A запис), но MX е за two.onedomain.com. Така че, когато отворя сокет, той все още няма да ми каже (точно) дали този имейл трябва да бъде изпратен (той ми казва, че има запис A за onedomain.com, където наистина искам да знам [с зададено кратко изчакване MX търсене], ако има MX запис за този домейн). Прав ли съм да мисля, че тези две не са едно и също нещо? - person Travis Leleu; 11.11.2010
comment
ако даден домейн има MX запис, трябва да има хост, който ще получи връзка със сокет на порт 25. ако този хост не отговори след 5 секунди, fsockopen() се отказва. няма значение дали one.onedomain.com или two.onedomain.com отговаря. за това служат множеството MX записи: излишък/толерантност към грешки. - person bcosca; 11.11.2010
comment
Добре, но само защото onedomain.com отговаря навреме на заявката за сокет, не означава непременно, че съществува MX запис. нали Тук започвам да се въртя в кръг. Наистина оценявам приноса ви, много ви благодаря. - person Travis Leleu; 11.11.2010

Можете да използвате getmxrr:

if (getmxrr($hostname, $mxhosts)) {
   // MX record exists
   var_dump($mxhosts);
}
person netcoder    schedule 10.11.2010
comment
fsockopen ще свърши работа. Вижте отговора на stillstanding по-горе. - person netcoder; 10.11.2010

DNS търсенията се мащабират добре при повтарящи се заявки. Най-близкият DNS сървър ще кешира търсените стойности за определен период. Използването на локален DNS кеш сървър може да подобри производителността, но ще използва повече памет (малко или много в зависимост от софтуера и броя на кешираните адреси.

Ако помня RFC правилно, хостовете със запис A също трябва да са валидни имейл дестинации. Въпреки това, домейни само със запис A може да нямат пощенски сървър на този адрес. (Същото важи и за MX цели, но това трябва да е много по-рядко и обикновено временно.)

Правилните имейл услуги трябва да изпращат имейла в буфер и да опитат отново доставката след време. Ако вашият sendmail не прави това, тогава трябва да проверите неговата конфигурация. Ще трябва също така да обмислите какво да правите с имейл адресите, на които имейлите не могат да бъдат доставени.

person BillThor    schedule 10.11.2010