在PHP中确定MX记录中的主机名/ IP地址

时间:2010-05-25 14:33:34

标签: php dns

有一个基本的电子邮件域验证脚本,它接受用户的电子邮件域,从中解析IP地址,然后针对各种已发布的黑名单进行检查。以下是我如何确定IP:

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

问题是某些电子邮件地址域(例如soandso@alumni.example.net)使用MX记录而不是A记录,因此使用gethostbyname('alumni.example.net')将无法解析。我知道当用户的电子邮件通过使用PHP checkdnsrr函数在电子邮件本身中使用MX时,但是在那个阶段,我对如何继续进行操作有点困惑。

理论上,我可以解析'root'域,即'example.net'并检查它,但是当用户可以轻松地使用电子邮件的格式时,我找不到可以处理此任务的可靠正则表达式user@corp.example.co.uk ...

那么,有关如何最好地解决这个问题的任何建议吗?

6 个答案:

答案 0 :(得分:3)

使用dns_get_record代替dns_get_record($domain,DNS_MX),而不是使用gethostbyname。请参阅文档,了解返回值的结构。

答案 1 :(得分:1)

$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

答案 2 :(得分:0)

最简单的可能是

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

然后遍历结果,调用gethostbyname()并检查没有被列入黑名单(或者你可以选择权重最低的结果,但这可以很容易地用来规避黑名单)。

我质疑将目的地列入黑名单的有用性; DNS垃圾邮件黑名单通常用于黑名单来源。

答案 3 :(得分:0)

您不能仅根据某人的电子邮件地址进行来源验证,因为(一般情况下)互联网上的任何一方都可以发送任何电子邮件与其他人的电子邮件地址在其中

答案 4 :(得分:0)

使用此功能,您只能检查至少一个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.');
}

如果在此功能中找到任何改进,则表示赞赏。

答案 5 :(得分:-1)

尝试:

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

var_dump ($result);

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

var_dump ($result);

您将获得MX记录列表,您可以解析它并使用gethostbyname()检查每条记录。

修改

Ycros提到的

dns_get_record()会更好。