此腳本使用 getmxrr 和 fsockopen 驗證電子郵件地址
1. 驗證地址的語法。
2. 透過主機名稱取得 MX 記錄
3. 連線到郵件伺服器並驗證信箱(使用 smtp 指令 RCTP TO:<email>)
當函式 "validate_email([email])" 無法連線到 MX 記錄中優先順序最高的郵件伺服器時,它會繼續連線到第二個郵件伺服器,依此類推。
當函式 "validate_email([email])" 在上述 3 個步驟中任何一個失敗時,它會返回 0,否則返回 1
Grtz Lennart Poot
<?
function validate_email($email){
$mailparts=explode("@",$email);
$hostname = $mailparts[1];
// 驗證電子郵件地址語法
$exp = "^[a-z\'0-9]+([._-][a-z\'0-9]+)*@([a-z0-9]+([._-][a-z0-9]+))+$";
$b_valid_syntax=preg_match("/$exp/i", $email);
// 使用 getmxrr 取得 mx 地址
$b_mx_avail=getmxrr( $hostname, $mx_records, $mx_weight );
$b_server_found=0;
if($b_valid_syntax && $b_mx_avail){
// 將 MX 記錄和權重複製到陣列 $mxs 中
$mxs=array();
for($i=0;$i<count($mx_records);$i++){
$mxs[$mx_weight[$i]]=$mx_records[$i];
}
// 排序陣列 mxs 以取得優先順序最高的伺服器
ksort ($mxs, SORT_NUMERIC );
reset ($mxs);
while (list ($mx_weight, $mx_host) = each ($mxs) ) {
if($b_server_found == 0){
//嘗試連線埠 25
$fp = @fsockopen($mx_host,25, $errno, $errstr, 2);
if($fp){
$ms_resp="";
// 向郵件伺服器問好 (HELO)
$ms_resp.=send_command($fp, "HELO microsoft.com");
// 初始化寄送郵件
$ms_resp.=send_command($fp, "MAIL FROM:<support@microsoft.com>");
// 嘗試收件者地址,如果正常,將返回 250..
$rcpt_text = send_command($fp, "RCPT TO:<".$email.">");
$ms_resp .= $rcpt_text;
if (substr($rcpt_text, 0, 3) == "250")
$b_server_found = 1;
// 中斷郵件伺服器連線
$ms_resp .= send_command($fp, "QUIT");
fclose($fp);
}
}
}
}
return $b_server_found;
}
function send_command($fp, $out) {
fwrite($fp, $out . "\r\n");
return get_data($fp);
}
function get_data($fp) {
$s = "";
stream_set_timeout($fp, 2);
for ($i = 0; $i < 2; $i++)
$s .= fgets($fp, 1024);
return $s;
}
// 支援 Windows 平台
if (!function_exists('getmxrr')) {
function getmxrr($hostname, &$mxhosts, &$mxweight) {
if (!is_array($mxhosts)) {
$mxhosts = array();
}
if (!empty($hostname)) {
$output = "";
@exec("nslookup.exe -type=MX $hostname.", $output);
$imx = -1;
foreach ($output as $line) {
$imx++;
$parts = "";
if (preg_match("/^$hostname\tMX preference = ([0-9]+), mail exchanger = (.*)$/", $line, $parts)) {
$mxweight[$imx] = $parts[1];
$mxhosts[$imx] = $parts[2];
}
}
return ($imx != -1);
}
return false;
}
}
?>