PHP MX kaydından hostname / IP adresini belirleme

6 Cevap php

Bir kullanıcının e-posta etki aldığı IP adresini çözer ve daha sonra denetleyen bir temel e-posta etki alanı doğrulama komut dosyası var yayınlanmış çeşitli kara karşı olduğunu. Burada IP belirleyici am nasıl:

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

Sorun gibi soandso@alumni.example.net gibi bazı e-posta adresi etki, yani çözmek için başarısız olur ('alumni.example.net') Gethostbyname kullanarak, yerine bir A kaydı daha bir MX kaydı kullanmaktır. Bir kullanıcının e-posta PHP checkdnsrr işlevini kullanarak e-posta kendisi bir MX kullanıyor bilmek, ama bir kez bu aşamada devam etmek olarak nasıl biraz şaşırıp.

Teorik olarak, ben 'root' alanı, yani 'example.net' ayrıştırmak ve kontrol, ama ben kullanıcının kolayca bir e-posta kullanıcı @ corp biçimi olabilir zaman bu görevi yerine getirebilecek güvenilir regex bulunamadı olabilirdi . example.co.uk ...

Peki, nasıl herhangi bir öneriniz iyi bu mücadele?

6 Cevap

Yerine Gethostbyname kullanarak, dns_get_record($domain,DNS_MX) gibi dns_get_record, bir şey kullanın. Dönüş değerleri yapılandırılmıştır nasıl dokümanlar bakın.

En kolay muhtemelen

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

Sonra Gethostbyname çağırarak sonuçları üzerinde döngü, () ve hiçbiri kara listeye alınmış (veya düşük ağırlığı ile sonuç almak olabilir, ama bu kolayca kara liste aşmak için kullanılan olabilir) olduğunu kontrol.

Ben bir hedef fişliyor yararlılığını sorgulamaya ediyorum; DNS Spam kara liste genellikle kaynakları fişliyor için yapılır.

(Genel olarak) her yerde internet üzerinde herhangi bir parti içinde başka kimsenin e-posta adresi ile herhangi bir e-posta gönderebilir, çünkü kişinin e-posta adresine dayalı olarak source doğrulama yapamaz.

$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/>';
}

Ben aşağıdaki sırayla (Terc, host, ip, ttl) gibi ip adresi ile sonuç var.

0-cluster4a.us.messagelabs.com-85.158.139.103-453
1-cluster4.us.messagelabs.com-216.82.242.179-453

Yalnızca en az bir mx kayıtlarını kontrol edebilirsiniz bu işlevi kullanarak belirli bir etki için kullanılabilir. Kod birden çok etki ile test değildir.

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.');
}

Bu fonksiyon herhangi bir iyileşme bulursanız, yorumlar takdir edilmektedir.

Deneyin:

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

var_dump ($result);

veya

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

var_dump ($result);

You will get list of MX recveyads, you can parse it and check each recveyad with gethostbyname().

Edit

dns_get_recveyad() mentioned by Ycros will be better.