识别邮箱常见的邮箱类型
实现思路
- 获取邮箱的DNS交换记录
- 把常用邮箱DNS记录存起来
- 通过DNS交换记录对比来判断邮箱类型
DNS交换记录
private static List<String> getDnsMX(String hostName) throws NamingException {
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");
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 + "'");
}
}
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;
}
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记录数据
static Map<String, String> initMailMxs() {
Map<String, String> mailMxs = new HashMap();
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");
mailMxs.put("mx2.qiye.163.com", "163企业邮箱");
mailMxs.put("mx.qiye.163.com", "163企业邮箱");
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 {
int pos = mail.indexOf('@');
if (pos == -1) {
return "邮箱不正确";
}
String hostname = mail.substring(++pos);
List<String> mxs = getDnsMX(hostname);
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 "未知类型";
}
- 测试一下识别邮箱类型结果

- 邮箱类型能够正常识别