Search the Community
Showing results for tags 'php mx dns'.
-
Hi I have an old php4 box that I'm trying to make some use of. I don't have nslookup, php getmxrr etc. I found on the php.net site a function to return the MX records for a domain. In this example I'm using gmail, but I get different results compared to getmxrr(). getmxrr shows: 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 ) yet this function returns: Array ( [0] => google.com [1] => alt3.google.com [2] => alt4.google.com [3] => alt2.google.com [4] => alt2.google.com.google.com ) The code below shows how I've called getmxrr and the function, can anyone advise if it's possible to get the results to match getmxrr ?? It's querying the same server on port 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>"; ?> adding a var_dump to the gdi function is showing the correct DNS entries, so it's something to do with how the script is joining the results back together. function gdi(&$cIx,$bytes=1) { $this->cIx++; var_dump(substr($this->dns_reply, $this->cIx-1, $bytes)); return(substr($this->dns_reply, $this->cIx-1, $bytes)); } anyone any ideas ? Thanks Thanks