• 修复在线人数的显示

  • 修复了Baidu与Github登陆的小Bug

  • 优化网站整体代码布局,提高速度

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

php 祭夜ゐ 1个月前 (06-17) 92次浏览 未收录 0个评论 扫描二维码
文章目录[隐藏]

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

近期发现有些“路人”途经小站时,注册完那东西就跑(我承认这小地方确实没什么能吸引眼球的 #受虐滑稽 )。
这不是关键,关键是有人提问题,可是没留邮箱;这除非小伙伴常来看看,不然是无法获得回复提示的。于是,为此加了登陆时强制提示没邮件地址的小伙伴填写邮箱,但有小伙伴填了虚构的不存在的邮件地址,所以想加强邮件验证(本篇重点 #太开心 )。分析原因,可能是不想留下个人信息,所以又加了一个删除自己账户的功能(在个人资料页可见)。但邮件验证并不简单,想在网上找现成的却没有(都是一些半残的老旧代码 #摊手 ),所以参考这些代码自己搞了一个,凑合用 #酷 。

1.探索中的意外:

在使用telnet过程中发现使用QQ邮箱时,在输入隶属于QQ邮箱的邮件接收方后,服务器会自动检索是否存在这个用户,并返回完全正确的信息;网易也是。
于是,想到:是不是每个邮件服务器都会在 用户输入 所属域为 这个邮件服务器的邮件 时,执行用户存在性检索操作。(只能但这个结论正确了,不然玩儿什么 #受虐滑稽 )

2.思路:

(1)判断邮箱基本格式是否正确

(2)邮箱的域名后缀是否有效

(3)通过smtp判断账户有效性

已知可以此判断的邮箱:QQ邮箱(包括域名邮箱),网易邮箱
已知不可以此判断的邮箱:Gmail

3.处理:

(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) {
    /**
     * 通过邮件服务器 验证邮箱是否存在
     * 这里要明白的是用户名是 带域名的:aaa@163.com
     *$mail = '待测邮箱';
     *$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;
    }
}
3.注册qq邮箱与网易邮箱,并填入账号密码,进行调用

祭夜blog , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:判断一个邮箱地址是否真的存在
喜欢 (0)
[1690127128@qq.com]
分享 (0)