一.探索中的意外:
在使用telnet过程中发现使用QQ邮箱时,在输入隶属于QQ邮箱的邮件接收方后,服务器会自动检索是否存在这个用户,并返回完全正确的信息;网易也是。
于是,想到:是不是每个邮件服务器都会在 用户输入 所属域为 这个邮件服务器的邮件 时,执行用户存在性检索操作。
二.思路:
(1)判断邮箱基本格式是否正确
(2)邮箱的域名后缀是否有效
(3)通过smtp判断账户有效性
三.开始
1.首先判断最外部
//对验证结果进行处理,存在返回true,否则返回false if (validate_email($email)) echo 'ok<br />'; else echo 'failed<br />';
2.验证邮箱格式
$exp = "/([a-z0-9]*[-_.]?[a-z0-9]+)*@([a-z0-9]*[-_]?[a-z0-9]+)+[.][a-z]{2,3}([.][a-z]{2})?/i"; $check_format = preg_match($exp,$email);
3.判断验证结果
if ($check_format) { //进入域名MX记录可用性判断 }else{ return false; }
4.判断MX可用性
$email0 = explode("@",$email); $email1 = array_pop($email0); $email2 = checkdnsrr($email1,"MX"); if ($email2) { //QQ域名邮箱 $emailmx = dns_get_record($email1,DNS_MX); $emailmx_target = $emailmx[0]['target']; if ($emailmx_target == 'mxdomain.qq.com') $email1 = 'qq.com'; //进入邮箱用户名有效性判断 }else{ return false; }
5.判断账户可用性
根据邮箱进行判断
switch ($email1) { case 'qq.com': check_user($qquser,$qqpass,'smtp.qq.com',25,$email);//调用QQ邮箱用户存在性检测函数 break; case '163.com': check_user($wyuser,$wypass,'smtp.163.com',25,$email);//调用网易邮箱存在性检测函数 break; default: return true; }
6.定义邮箱用户存在性检测函数:
function check_user($user,$pass,$smtp_server,$port = 25,$mail) { /** * 通过邮件服务器 验证邮箱是否存在 * 这里要明白的是用户名是 带域名的:admin@ayfre.com *$mail = 'admin@ayfre.com'; *$user = '帐号'; *$pass = '密码'; *$smtp_server = '相对应的邮件服务器'; *$port = 25; */ $handle = fsockopen($smtp_server, $port); if (!$handle) return false; $mes = fgets($handle); //echo $mes.'<br>'; if (!$mes) { fclose($handle); return false; } $status = explode(" ",$mes); if ($status[0] != 220) { //链接服务器失败 fclose($handle); return false; } fwrite($handle, 'HELO mystore'."\r\n"); //表明身份,这里的mystore是随便写的 $mes = fgets($handle).'<br>'; //echo $mes; if (!$mes) { fclose($handle); return false; } $status = explode(" ",$mes); if ($status[0] != 250) { //服务器HELO失败 fclose($handle); return false; } fwrite($handle, 'AUTH LOGIN'."\r\n"); $mes = fgets($handle); //echo $mes.'<br>'; if (!$mes) { fclose($handle); return false; } $status = explode(" ",$mes); if ($status[0] != 334) { //请求验证登陆失败 fclose($handle); return false; } fwrite($handle,base64_encode($user)."\r\n"); $mes = fgets($handle); //echo $mes.'<br>'; if (!$mes) { fclose($handle); return false; } $status = explode(" ",$mes); if ($status[0] != 334) { //验证用户名失败 fclose($handle); return false; } fputs($handle,base64_encode($pass)."\r\n"); $mes = fgets($handle); //echo $mes.'<br>'; if (!$mes) { fclose($handle); return false; } $status = explode(" ",$mes); if ($status[0] != 235) { //验证密码失败 return false; } fputs($handle,'MAIL FROM:<'.$user.">\r\n"); $mes = fgets($handle); //echo $mes.'<br>'; fwrite($handle, 'RCPT TO:<'.$mail.">\r\n"); $mes = fgets($handle); fclose($handle); //echo $mes.'<br>'; $status = explode(" ",$mes); if ($status[0] != 250) { //echo '邮箱不存在<br>'; //用户不存在 return false; } else { return true; } }
7.将邮箱信息填入即可使用
© 版权声明
吾爱博客|AYFRE.COM 版权所有,转载请标明出处。
THE END
请登录后查看评论内容