此脚本使用 getmxrr 和 fsockopen 验证电子邮件地址。
1. 验证地址的语法。
2. 通过主机名获取 MX 记录。
3. 连接邮件服务器并验证邮箱(使用 SMTP 命令 RCTP TO:<email>)。
当函数“validate_email([email])”无法连接 MX 记录中优先级最高的邮件服务器时,它将继续连接第二个邮件服务器,依此类推。
函数“validate_email([email])”在上述 3 个步骤中的任何一个失败时返回 0,否则返回 1。
致意 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=eregi($exp, $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;
}
}
?>