| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 | 
							- <?php
 
- error_reporting(0);
 
- function get_spf_allowed_hosts($check_domain)
 
- {
 
- 	$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]);
 
- 					return $hosts;
 
- 				}
 
- 			}
 
- 			else
 
- 			{
 
- 				unset($cidr);
 
- 				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);
 
- 			}
 
- 		}
 
- 	}
 
- 	
 
- 	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);
 
- }
 
- ?>
 
 
  |