| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 | <?phperror_reporting(0);function get_spf_allowed_hosts($check_domain, $expand_ipv6 = false) {	$hosts = array();		$records = dns_get_record($check_domain, DNS_TXT);	foreach ($records as $record)	{		$txt = explode(' ', $record['entries'][0]);		if (array_shift($txt) != 'v=spf1') // only handle SPF records			continue;				foreach ($txt as $mech)		{			$qual = substr($mech, 0, 1);			if ($qual == '-' || $qual == '~') // only handle pass or neutral records				continue(2);						if ($qual == '+' || $qual == '?')				$mech = substr($mech, 1); // remove the qualifier						if (strpos($mech, '=') !== FALSE) // handle a modifier			{				$mod = explode('=', $mech);				if ($mod[0] == 'redirect') // handle a redirect				{					$hosts = get_spf_allowed_hosts($mod[1],true);					return $hosts;				}			}			else			{				unset($cidr);				// reset domain to check_domain				$domain = $check_domain;				if (strpos($mech, ':') !== FALSE) // handle a domain specification				{					$split = explode(':', $mech);					$mech = array_shift($split);					$domain = implode(':', $split);					if (strpos($domain, '/') !== FALSE) // remove CIDR specification					{						$split = explode('/', $domain);						$domain = $split[0];						$cidr = $split[1];					}				}								$new_hosts = array();        if ($mech == 'include' && $check_domain != $domain) // handle an inclusion				{					$new_hosts = get_spf_allowed_hosts($domain);				}				elseif ($mech == 'a') // handle a mechanism				{					$new_hosts = get_a_hosts($domain);				}				elseif ($mech == 'mx') // handle mx mechanism				{					$new_hosts = get_mx_hosts($domain);				}				elseif ($mech == 'ip4' || $mech == 'ip6') // handle ip mechanism				{					$new_hosts = array($domain);				}								if (isset($cidr)) // add CIDR specification if present				{					foreach ($new_hosts as &$host)					{						$host .= '/' . $cidr;					}					unset($host);				}								$hosts = array_unique(array_merge($hosts,$new_hosts), SORT_REGULAR);			}		}	}	foreach ($hosts as &$host) {		if (filter_var($host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {			if ($expand_ipv6 === true) {				$hex = unpack("H*hex", inet_pton($host));				$host = substr(preg_replace("/([A-f0-9]{4})/", "$1:", $hex['hex']), 0, -1);			}			else {				$host = $host;			}		}	}	return $hosts;}function get_mx_hosts($domain){	$hosts = array();  try {    $mx_records = dns_get_record($domain, DNS_MX);    if ($mx_records) {      foreach ($mx_records as $mx_record) {        $new_hosts = get_a_hosts($mx_record['target']);        $hosts = array_unique(array_merge($hosts,$new_hosts), SORT_REGULAR);      }    }  }  catch (Exception $e) {    if ($e->getMessage() !== 'dns_get_record(): A temporary server error occurred.') {      throw $e;    }    $mx_records = false;  }	return $hosts;}function get_a_hosts($domain){	$hosts = array();		$a_records = dns_get_record($domain, DNS_A);	foreach ($a_records as $a_record)	{		$hosts[] = $a_record['ip'];	}	$a_records = dns_get_record($domain, DNS_AAAA);	foreach ($a_records as $a_record) {    $hosts[] = $a_record['ipv6'];	}		return $hosts;}function get_outgoing_hosts_best_guess($domain){	// try the SPF record to get hosts that are allowed to send outgoing mails for this domain	$hosts = get_spf_allowed_hosts($domain);	if ($hosts) return $hosts;		// try the MX record to get mail servers for this domain	$hosts = get_mx_hosts($domain);	if ($hosts) return $hosts;		// fall back to the A record to get the host name for this domain	return get_a_hosts($domain);}?>
 |