识别邮箱类型

4 篇文章 0 订阅

识别邮箱常见的邮箱类型

实现思路
  1. 获取邮箱的DNS交换记录
  2. 把常用邮箱DNS记录存起来
  3. 通过DNS交换记录对比来判断邮箱类型
DNS交换记录
  • 获取邮箱域名在DNS的交换记录
    /**
     * 获取dns mx记录
     * 验证是否是邮件服务器
     *
     * @param hostName
     * @return
     * @throws NamingException
     */
    private static List<String> getDnsMX(String hostName) throws NamingException {
        // 查询dns mx记录
        Hashtable environment = new Hashtable();
        environment.put("java.naming.factory.initial", "com.sun.jndi.dns.DnsContextFactory");
        DirContext dirContext = new InitialDirContext(environment);
        Attributes attrs = dirContext.getAttributes(hostName, new String[]{"MX"});
        Attribute attr = attrs.get("MX");

        // 是否存在mx记录
        if ((attr == null) || (attr.size() == 0)) {
            attrs = dirContext.getAttributes(hostName, new String[]{"MX"});
            attr = attrs.get("A");
            if (attr == null) {
                throw new NamingException("No match for name '" + hostName + "'");
            }
        }

        // mx记录列表
        List<String> mxList = new ArrayList();
        NamingEnumeration en = attr.getAll();

        while (en.hasMore()) {
            String mailHost;
            String enStr = (String) en.next();
            String[] f = enStr.split(" ");

            if (f.length == 1) {
                mailHost = f[0];
            } else if (f[1].endsWith(".")) {
                mailHost = f[1].substring(0, (f[1].length() - 1));
            } else {
                mailHost = f[1];
            }

            mxList.add(mailHost);
        }
        
        return mxList;
    }
  • 获取163.com域名的DNS交换记录
    public static void main(String[] arg) throws NamingException {
        List<String> mx = getDnsMX("163.com");

        if (mx.size() > 0) {
            mx.forEach(System.out::println);
        }
    }
  • 163.com的交换记录结果
    在这里插入图片描述
  • 下面测试一个不存在的域名
    在这里插入图片描述
  • 现在很多公司都是用企业邮箱,域名是自定义的,但是同一类邮箱的DNS交换地址是相同的不会改变的
  • 我们可以把常用的邮箱的DNS交换记录存起来,根据邮箱域名交换记录可以识别邮箱的类型
初始化常用邮箱DNS记录数据
    /**
     * 常用邮箱域名DNS交换地址
     */
    static Map<String, String> initMailMxs() {
        Map<String, String> mailMxs = new HashMap();
        // 163邮箱
        mailMxs.put("163mx00.mxmail.netease.com", "163");
        mailMxs.put("163mx03.mxmail.netease.com", "163");
        mailMxs.put("163mx02.mxmail.netease.com", "163");
        mailMxs.put("163mx01.mxmail.netease.com", "163");
        // 163企业邮箱
        mailMxs.put("mx2.qiye.163.com", "163企业邮箱");
        mailMxs.put("mx.qiye.163.com", "163企业邮箱");
        // qq邮箱
        mailMxs.put("mx1.qq.com", "qq邮箱");
        mailMxs.put("mx1.qq.com", "qq邮箱");
        // 腾讯企业邮箱
        mailMxs.put("mxbiz2.qq.com", "qq企业邮箱");
        mailMxs.put("mxbiz1.qq.com", "qq企业邮箱");
        // 阿里云邮箱
        mailMxs.put("mx2.mail.aliyun.com", "阿里云邮箱");

        return mailMxs;
    }
识别邮箱类型方法
    /**
     * 获取邮箱类型
     */
    private static String getMailType(String mail) throws NamingException {
        // 1、获取邮箱域名
        int pos = mail.indexOf('@');
        if (pos == -1) {
            return "邮箱不正确";
        }
        String hostname = mail.substring(++pos);

        // 2.根据域名获取DNS交换记录
        List<String> mxs = getDnsMX(hostname);

        // 3.通过DNS交换记录判断邮箱类型
        Map<String, String> mailMxs = initMailMxs();
        if (mxs.size() > 0) {
            for (String mxStr : mxs) {
                System.out.println("----------" + mailMxs.get(mxStr));
                if (Objects.nonNull(mailMxs.get(mxStr))) {

                    return mailMxs.get(mxStr);
                }
            }
        }

        return "未知类型";
    }
  • 测试一下识别邮箱类型结果
    在这里插入图片描述
  • 邮箱类型能够正常识别
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值