У меня есть старая коробка php4, которую я пытаюсь использовать.
У меня нет nslookup, php getmxrr и т. Д.
На сайте php.net я обнаружил функцию, которая возвращает записи MX для домена. В этом примере я использую gmail, но я получаю другие результаты по сравнению с getmxrr ().
getmxrr показывает:
Array
(
[0] => alt1.gmail-smtp-in.l.google.com
[1] => alt3.gmail-smtp-in.l.google.com
[2] => alt2.gmail-smtp-in.l.google.com
[3] => gmail-smtp-in.l.google.com
[4] => alt4.gmail-smtp-in.l.google.com
)
пока эта функция возвращает:
Array
(
[0] => google.com
[1] => alt3.google.com
[2] => alt4.google.com
[3] => alt2.google.com
[4] => alt2.google.com.google.com
)
Приведенный ниже код показывает, как я вызвал getmxrr и функцию, кто-нибудь может посоветовать, можно ли получить результаты, совпадающие с getmxrr ?? Он запрашивает тот же сервер на порту 53.
<?php
getmxrr ( "gmail.com", $mxhosts);
echo "<pre>";
print_r($mxhosts);
echo "</pre>";class mxlookup
{
var $dns_socket = NULL;
var $QNAME = "";
var $dns_packet= NULL;
var $ANCOUNT = 0;
var $cIx = 0;
var $dns_repl_domain;
var $arrMX = array();
function mxlookup($domain, $dns="8.8.8.8")
{
$this->QNAME($domain);
$this->pack_dns_packet();
$dns_socket = fsockopen("udp://$dns", 53);
fwrite($dns_socket,$this->dns_packet,strlen($this->dns_packet));
$this->dns_reply = fread($dns_socket,1);
$bytes = stream_get_meta_data($dns_socket);
$this->dns_reply .= fread($dns_socket,$bytes['unread_bytes']);
fclose($dns_socket);
$this->cIx=6;
$this->ANCOUNT = $this->gord(2);
$this->cIx+=4;
$this->parse_data($this->dns_repl_domain);
$this->cIx+=7;
for($ic=1;$ic<=$this->ANCOUNT;$ic++)
{
$QTYPE = ord($this->gdi($this->cIx));
if($QTYPE!==15){print("[MX Record not returned]"); die();}
$this->cIx+=9;
$mxPref = ord($this->gdi($this->cIx));
$this->parse_data($curmx);
$this->arrMX[] = $curmx;
$this->cIx+=3;
}
}
function parse_data(&$retval)
{
$arName = array();
$byte = ord($this->gdi($this->cIx));
while($byte!==0)
{
if($byte==192) //compressed
{
$tmpIx = $this->cIx;
$this->cIx = ord($this->gdi($cIx));
$tmpName = $retval;
$this->parse_data($tmpName);
$retval=$retval.".".$tmpName;
$this->cIx = $tmpIx+1;
return;
}
$retval="";
$bCount = $byte;
for($b=0;$b<$bCount;$b++)
{
$retval .= $this->gdi($this->cIx);
}
$arName[]=$retval;
$byte = ord($this->gdi($this->cIx));
}
$retval=join(".",$arName);
}
function gdi(&$cIx,$bytes=1)
{
$this->cIx++;
return(substr($this->dns_reply, $this->cIx-1, $bytes));
}
function QNAME($domain)
{
$dot_pos = 0; $temp = "";
while($dot_pos=strpos($domain,"."))
{
$temp = substr($domain,0,$dot_pos);
$domain = substr($domain,$dot_pos+1);
$this->QNAME .= chr(strlen($temp)).$temp;
}
$this->QNAME .= chr(strlen($domain)).$domain.chr(0);
}
function gord($ln=1)
{
$reply="";
for($i=0;$i<$ln;$i++){
$reply.=ord(substr($this->dns_reply,$this->cIx,1));
$this->cIx++;
}
return $reply;
}
function pack_dns_packet()
{
$this->dns_packet = chr(0).chr(1).
chr(1).chr(0).
chr(0).chr(1).
chr(0).chr(0).
chr(0).chr(0).
chr(0).chr(0).
$this->QNAME.
chr(0).chr(15).
chr(0).chr(1);
}
}
/* Exampe of use: */
$mx = new mxlookup("gmail.com");
echo "<pre>";
print_r($mx->arrMX);
echo "</pre>";
?>
Спасибо
Задача ещё не решена.
Других решений пока нет …