Определение имени хоста / IP-адреса из записи MX в PHP - PullRequest
1 голос
/ 25 мая 2010

имеют базовый сценарий проверки домена электронной почты, который берет почтовый домен пользователя, разрешает IP-адрес и проверяет его по различным опубликованным черным спискам. Вот как я определяю IP:

$domain = substr(strchr($email, '@'), 1);
$ip     = gethostbyname($domain);

Проблема в том, что некоторые домены адресов электронной почты, такие как soandso@alumni.example.net, используют запись MX, а не запись A, поэтому использование gethostbyname ('alumni.example.net') не может быть разрешено. Я знаю, когда электронная почта пользователя использует MX в самой электронной почте с помощью функции PHP checkdnsrr, но однажды на этом этапе я немного застрял в том, как действовать.

Теоретически, я мог бы разобрать «корневой» домен, т.е. «example.net», и проверить его, но я не нашел надежного регулярного выражения, которое могло бы справиться с этой задачей, когда пользователь мог легко получить электронное письмо в формате user@corp.example.co.uk ...

Итак, какие-либо предложения о том, как наилучшим образом решить эту проблему?

Ответы [ 6 ]

3 голосов
/ 25 мая 2010

Вместо использования gethostbyname, используйте dns_get_record , что-то вроде dns_get_record($domain,DNS_MX). См. Документы о том, как возвращаемые значения структурированы.

1 голос
/ 03 мая 2013
$Arr = dns_get_record('ford.com' , DNS_MX);


$count = count($Arr);
for($i=0; $i<$count; $i++) {

    echo $i.'-'.$Arr[$i]['target'].'-'.gethostbyname($Arr[$i]['target']).'-'.$Arr[$i]['ttl'].'<br/>';
}

Я получил результат с IP-адресом в следующем порядке (Pref, host, ip, ttl).

0-cluster4a.us.messagelabs.com-85.158.139.103-453
1-cluster4.us.messagelabs.com-216.82.242.179-453
0 голосов
/ 12 марта 2014

Используя эту функцию, вы можете проверить, что по крайней мере одна mx-запись доступна для данного домена. Код не тестируется с несколькими доменами.

function mxrecordValidate($email){
        list($user, $domain) = explode('@', $email);
        $arr= dns_get_record($domain,DNS_MX);
        if($arr[0]['host']==$domain&&!empty($arr[0]['target'])){
                return $arr[0]['target'];
        }
}
$email= 'user@radiffmail.com';

if(mxrecordValidate($email)) {
        echo('This MX records exists; I will accept this email as valid.');
}
else {
        echo('No MX record exists;  Invalid email.');
}

Если вы обнаружите какие-либо улучшения в этой функции, комментарии приветствуются.

0 голосов
/ 25 мая 2010

Вы не можете выполнить проверку source исключительно на основе чьего-либо адреса электронной почты, поскольку (в общем случае) любая сторона в Интернете может отправлять любые сообщения электронной почты с чьим-либо другим адресом.

0 голосов
/ 25 мая 2010

Самый простой, вероятно,

if (!getmxrr($host, $result)) {
  $result=array($host);
}

Затем переберите результаты, вызвав gethostbyname () и проверив, что ни один из них не занесен в черный список (или вы можете выбрать результат с наименьшим весом, но это можно легко использовать для обхода черного списка).

Я бы поставил под сомнение полезность внесения в черный список пункта назначения; Черные списки спама в DNS обычно создаются для источников черного списка.

0 голосов
/ 25 мая 2010

Попробуйте:

$result = shell_exec ('host -t MX '.$domain);

var_dump ($result);

или

exec ('host -t MX '.$domain, $result = array ());

var_dump ($result);

Вы получите список записей MX, вы можете проанализировать его и проверить каждую запись с помощью gethostbyname ().

Редактировать

dns_get_record (), упомянутая Ycros, будет лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...