网上找的很多方法基本就是通过查找MX记录配合SMTP协议进行有效性验证

当通过互联网发送电子邮件时,发送方的邮件传输代理(MTA,Mail transfer agent)将会向DNS发送请求,
查询每个收件人的邮箱域名的MX记录。这个请求将会返回可以接受发往该邮箱域名的邮件交换服务器的列表,
以及它们的优先级。接下来,发送方的传输代理将会尝试和这些服务器建立SMTP连接
原文链接:https://baike.baidu.com/item/MX%E8%AE%B0%E5%BD%951.SMTP是工作在两种情况下:一是电子邮件从客户机传输到服务器;二是从某一个服务器传输到另一个服务器
2.SMTP是个请求/响应协议,命令和响应都是基于ASCII文本,并以CR和LF符结束。响应包括一个表示返 回状态的三位数字代码
3.SMTP在TCP协议25号端口监听连接请求
4.连接和发送过程
SMTP协议说复杂也不复杂(明明带有“简单”这个词嘛),说简单如果你懂得Sock。不过现在只是我们利用的就是第一条中说的,从客户机传输到服务器,当我们向一台服务器发送邮件时,邮件服务器会首先验证邮件发送地址是否真的存在于本服务器上。
操作的步骤如下:
连接服务器的25端口(如果没有邮件服务,连了也是白连)
发送helo问候
发送mail from命令,如果返回250表示正确可以,连接本服务器,否则则表示服务器需要发送人验证。
发送rcpt to命令,如果返回250表示则Email存在
发送quit命令,退出连接
————————————————
原文链接:https://blog.csdn.net/VipWangJian/article/details/84251675
```java
pom.xml<dependencies><dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>2.2</version></dependency><dependency><groupId>org.xbill</groupId><artifactId>dnsjava</artifactId><version>2.1.1</version></dependency></dependencies>

工具类代码:

package com.dongang.service;
import org.apache.commons.net.smtp.SMTPClient;
import org.apache.commons.net.smtp.SMTPReply;
import org.xbill.DNS.Lookup;
import org.xbill.DNS.MXRecord;
import org.xbill.DNS.Record;
import org.xbill.DNS.Type;import java.io.IOException;public class CheckEmailOK{public static final String SENDER_EMAIL = "no-reply@domain.com";//"no-reply@domain.com";public static final String SENDER_EMAIL_SERVER = SENDER_EMAIL.split("@")[1];//"domain.com";/**** @param email  The recipient's email address, it need to be validate if it is real exists or doesn't exists.* @return True if email is real exists, false if not.*/public boolean checkEmailMethod(String email) {if (!email.matches("[\\w\\.\\-]+@([\\w\\-]+\\.)+[\\w\\-]+")) {System.err.println("Format error");return false;}String log = "";String host = "";String hostName = email.split("@")[1];Record[] result = null;SMTPClient client = new SMTPClient();client.setConnectTimeout(8000);  //设置连接超时时间,有些服务器比较慢try {// 查找MX记录Lookup lookup = new Lookup(hostName, Type.MX);lookup.run();if (lookup.getResult() != Lookup.SUCCESSFUL) {log += "找不到MX记录\n";return false;} else {result = lookup.getAnswers();}
/*if(result.length > 1) { // 优先级排序List<Record> arrRecords = new ArrayList<Record>();Collections.addAll(arrRecords, result);Collections.sort(arrRecords, new Comparator<Record>() {public int compare(Record o1, Record o2) {return new CompareToBuilder().append(((MXRecord)o1).getPriority(), ((MXRecord)o2).getPriority()).toComparison();}});host = ((MXRecord)arrRecords.get(0)).getTarget().toString();}**/// 连接到邮箱服务器for (int i = 0; i < result.length; i++) {System.out.println(result[i].getAdditionalName().toString());System.out.println(((MXRecord)result[i]).getPriority());}int count=0;
//          String tempLog ="";for (int i = 0; i < result.length; i++) {log="";host = result[i].getAdditionalName().toString();try{client.connect(host);   //连接到接收邮箱地址的邮箱服务器}catch(Exception e){       //捕捉连接超时的抛出的异常count++;if(count>=result.length){   //如果由MX得到的result服务器都连接不上,则认定email无效log +="Connect mail server timeout...\n";return false;}}if (!SMTPReply.isPositiveCompletion(client.getReplyCode())) { //服务器通信不成功client.disconnect();continue;} else {log += "MX record about " + hostName + " exists.\n";log += "Connection succeeded to " + host + "\n";log += client.getReplyString();// HELO <$SENDER_EMAIL_SERVER>   //domain.comtry{client.login(SENDER_EMAIL_SERVER);   //这一步可能会出现空指针异常}catch(Exception e){return false;}log += ">HELO "+SENDER_EMAIL_SERVER+"\n";log += "=" + client.getReplyString();client.setSender(SENDER_EMAIL);if(client.getReplyCode()!=250){     //为解决hotmail有的MX可能出现=550 OU-001 (SNT004-MC1F43) Unfortunately, messages from 116.246.2.245 weren't sent.client.disconnect();continue;                         //把client.login 和client.setSender放在循环体内,这样所有的如果某mx不行就换其他mx,但这样会对无效的邮箱进行所有mx遍历,耗时}log += ">MAIL FROM: <"+SENDER_EMAIL+">\n";log += "=" + client.getReplyString();// RCPT TO: <$email>try{client.addRecipient(email);}catch(Exception e){return false;}log += ">RCPT TO: <" + email + ">\n";log += "=" + client.getReplyString();//最后从收件邮箱服务器返回true,说明服务器中能够找到此收件地址,邮箱有效if (250 == client.getReplyCode()) {return true;}client.disconnect();}}
//          log+=tempLog;
//          log += ">MAIL FROM: <"+SENDER_EMAIL+">\n";
//          log += "=" + client.getReplyString();
//
//          // RCPT TO: <$email>
//          try{//              client.addRecipient(email);
//          }catch(Exception e){//              return false;
//          }
//          log += ">RCPT TO: <" + email + ">\n";
//          log += "=" + client.getReplyString();
//
//          //最后从收件邮箱服务器返回true,说明服务器中能够找到此收件地址,邮箱有效
//          if (250 == client.getReplyCode()) {//              return true;
//          }} catch (Exception e) {e.printStackTrace();} finally {try {client.disconnect();} catch (IOException e) {}// print logSystem.out.println(log);}return false;}/*** This method is more accurate than checkEmailMethod(String email);** @param email  The recipient's email address, it need to be validate if it is real exists or doesn't exists.* @return True if email is real exists, false if not.*/public boolean checkEmail(String email){if(email.split("@")[1].equals("qq.com")){if( checkEmailMethod(email) && checkEmailMethod(email) && checkEmailMethod(email)){return true;}else{return false;}}return checkEmailMethod(email);}}

测试:

  public static void main(String[] args) {CheckEmailOK ce = new CheckEmailOK();if(ce.checkEmail("19asdas6@163.com")){System.out.println("true");}else{System.out.println("false");}}

java实现验证邮箱有效性相关推荐

  1. Yahoo邮箱验证,Yahoo邮箱清洗 - EmailCamel免费在线批量验证邮箱有效性!

    Yahoo邮箱验证,Yahoo邮箱清洗 - EmailCamel免费在线批量验证邮箱有效性! 简单.易懂的邮箱验证报告 通过Excel.Text导入验证领取+100,快速体验 验证结果说明 立马体验, ...

  2. java正则表达式验证邮箱、IP地址、手机号码

    1.java验证IP地址: Pattern pattern = Pattern.compile("\\b((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5 ...

  3. php邮箱有效性验证,PHP验证邮箱有效性验证邮箱后缀域名是否真实存在的方法(过滤+DNS验证)...

    PHP检验邮箱有效性的方法其实可以很简单,用到内部函数就行,连正则都可以不用写. 首先是filter_var函数 filter_var是PHP内置的一个变量过滤的方法, 提供了很多实用的过滤器, 可以 ...

  4. java正则验证邮箱

    我看了网上很多验证邮箱的正则格式,最后到网易邮箱注册查看了邮箱的规则,再重写了这个程序,以后邮箱校验的时候使用 //验证email地址// 字母数字下划线,首位以字母开头6-18位,在不包括@163. ...

  5. Java 正则验证邮箱

    做邮件的功能的时候难免会碰到邮箱的验证,接下来我就把邮件的正则记录下来,方便以后查看. Java方式: public static boolean isEmail(String email){ if ...

  6. java 正则表达式验证邮箱格式是否合规 以及 正则表达式元字符

    package com.ykmimi.testtest; /*** 测试邮箱地址是否合规* @author ukyor**/ public class EmailTest {public static ...

  7. Linux shell验证邮箱的有效性

    最近又好多天没总结了,这两天偶然间网上听了一节课用shell脚本做爬虫.于是就从最基本的邮箱搞起来,今天总结了一些正则表达式的基础写了一个一个验证邮箱有效性的shell脚本.一下是总结内容: 电子邮箱 ...

  8. Java实现QQ邮箱验证激活 Java简单发送邮箱

    Java简单发送邮箱 1.首先要去qq邮箱 设置–账户–把所有服务都开启 (记住其中任意一个授权码就OK了) 如下图: 2. 导入jar包 创建测试类 (复制即可) 如下: package testE ...

  9. python使用正则表达式验证邮箱地址语法有效性

    python使用正则表达式验证邮箱地址语法有效性 #python使用正则表达式验证邮箱地址语法有效性 import re # mail regular expression formula# rege ...

最新文章

  1. 9patch的用法,简单两句就会用了。
  2. valgrind 详解
  3. 通过 Visual Studio 的“代码度量值”来改进代码质量
  4. 转-Redis AOF 持久化详解
  5. 如何把照片正面变成反面_各国签证照片要求大全 (含模板)
  6. 模拟组合键 postmessage ctrl+v_《模拟江湖》:TapTap热门榜单第一,测试版评分8.0的汉家松鼠工作室新作...
  7. mysql select符合查询_MySQL SELECT 联合查询
  8. 云栖社区 mysql_mysql
  9. 微信授权获取基本信息java_Java微信网页授权授权获取用户基本信息
  10. Atitit 程序设计概论 艾提拉著作 目录 1. 界面ui设计 1 2. 编程语言部分 1 3. 面向对象的程序设计 1 4. 算法章节 数据结构 1 5. 第21章 标准库 2 5.1. 文件i
  11. python项目方案书模板格式_项目策划书格式及范文
  12. 大数据产品价值主张_从「商业模式画布」看产品的价值主张和用户需求
  13. 三菱FX系列PLC数据采集和点表自动侦测
  14. 最有效的赚钱方法,只有100元如何赚到10万?
  15. Python开发mysql和mongo 连接类
  16. Explicit 关键字
  17. Dev C++的安装以及基本使用方法
  18. 简约大气昼夜wordpress免费导航主题
  19. 那些三十五岁失业的程序员,后来都干什么去了?
  20. 微信的一些优点整理(持续更新)

热门文章

  1. 江苏省高等学校计算机等级考试操作题,江苏省高等学校计算机等级考试09春一级操作题汇总...
  2. python实现xmind_Python 使用Python操作xmind文件
  3. Typora 设置代码块的默认编程语言以及字体颜色设置
  4. 在线电影订票系统 - 数据库建模
  5. 【V2ray 报错 failed to read response header】
  6. Unity Shader学习-高光反射
  7. Java代码审计学习笔记
  8. 服务器客户端传输文件,服务器传输文件到客户端
  9. 打开Word文档的时候提示 “安全警告 宏已被禁用”
  10. 如何搭建一个自己的FTP服务器