判断一个邮箱地址是否存在

图片[1]-判断一个邮箱地址是否存在-吾爱博客

一.探索中的意外:

在使用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.将邮箱信息填入即可使用

温馨提示: 本文最后更新于2019-06-21,至今已有1994天,某些文章具有时效性,若有错误或已失效,请在下方留言
© 版权声明
THE END
喜欢就支持一下吧❀
点赞2投币 分享
评论 共1条

    请登录后查看评论内容