要用到commons-net-3.3.jar、dnsjava-2.1.7.jar包

大部分的国内常见邮箱都能准确验证。

验证频率和数量多的话容易被封掉ip

package com.tieniu;

import java.io.IOException;

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;

public class CheckEmail {

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 arrRecords = new ArrayList();

Collections.addAll(arrRecords, result);

Collections.sort(arrRecords, new Comparator() {

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 //domain.com

try{

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: \n";

log += "=" + client.getReplyString();

// RCPT TO:

try{

client.addRecipient(email);

}catch(Exception e){

return false;

}

log += ">RCPT TO: \n";

log += "=" + client.getReplyString();

//最后从收件邮箱服务器返回true,说明服务器中能够找到此收件地址,邮箱有效

if (250 == client.getReplyCode()) {

return true;

}

client.disconnect();

}

}

//log+=tempLog;

//log += ">MAIL FROM: \n";

//log += "=" + client.getReplyString();

//

RCPT TO:

//try{

//client.addRecipient(email);

//}catch(Exception e){

//return false;

//}

//log += ">RCPT TO: \n";

//log += "=" + client.getReplyString();

//

最后从收件邮箱服务器返回true,说明服务器中能够找到此收件地址,邮箱有效

//if (250 == client.getReplyCode()) {

//return true;

//}

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

client.disconnect();

} catch (IOException e) {

}

// print log

System.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) {

CheckEmail ce = new CheckEmail();

if(ce.checkEmail("dfdegcex@qq.com")){

System.out.println("true");

}else{

System.out.println("false");

}

}

}

其中还写了一点开发过程中的相关文档,生成了该功能相应的jar包。也生成了dll,写了供C#调用的使用方法。很简单。

这里附上附件的链接:http://pan.baidu.com/s/1jHpdDjC 密码:wio6

java 自动识别邮箱服务器类型_Java实现通过smtp服务器验证邮箱的真实有效性相关推荐

  1. 邮箱 POP3服务器(端口110) SMTP服务器(端口25)

    gmail(google.com) POP3服务器地址:pop.gmail.com(SSL启用 端口:995) SMTP服务器地址:smtp.gmail.com(SSL启用 端口:587) 21cn. ...

  2. java获取泛型的类型_Java反射获取泛型类型

    public class Person{ }importjava.lang.reflect.ParameterizedType;importjava.lang.reflect.Type;public ...

  3. java 二进制是什么类型_Java基础类型与其二进制表示

    Java中的基础类型有:byte.short.int.long.float.double.char和boolean. 它们可被分为四种类型,整型.浮点型.char型和boolean型. 整型:byte ...

  4. java gmail smtp_使用Javamail连接到Gmail smtp服务器会忽略指定的端口,并尝试使用25...

    我正在尝试在groovy脚本中使用javamail通过gmail发送电子邮件.我在网上看了很多地方,到目前为止还无法正常工作.运行脚本时出现的错误是: DEBUG SMTP: useEhlo true ...

  5. 使用python批量验证邮箱密码_【日常Py】利用SMTP批量验证邮箱真实性

    沉寂的一个月,经历了事情不少,心情也是起伏波动:希望早点结束. 回归正题,前一段时间一朋友给我提了一需求,需要批量验证QQ是否开通邮箱:然而我的第一反应是:判断邮箱是否开通,往这个邮箱发一封邮件不就知 ...

  6. linux网页无法连接到服务器,linux – 无法连接到SMTP服务器

    我无法从PC连接到SMTP服务器. 我使用Debian sid. telnet mail.example.com 25 Trying 12.23.34.45... telnet: Unable to ...

  7. linux无法连接邮件服务器,linux – 无法连接到SMTP服务器

    我无法从PC连接到SMTP服务器. 我使用Debian sid. telnet mail.example.com 25 Trying 12.23.34.45... telnet: Unable to ...

  8. 注册smtp服务器,轻松架设自己的SMTP服务器

    应用目标:更稳定地发送邮件 实现难度:★★☆☆☆ 我们在发送电子邮件的时候,这封E-mail首先来到ISP提供的邮件服务器,再通过它发送出去.但如果ISP因为网络出现一些问题,则可能会耽搁邮件的发送, ...

  9. java方法未定义类型_java - 方法未定义为类 - SO中文参考 - www.soinside.com

    我试图在eclipse中运行一个使用名为getArea(一个对象)的方法的代码.我目前收到错误说 对于getArea(ComparableRectangle)类型,方法RectangleTest未定义 ...

最新文章

  1. mysql主从复制实战
  2. 关于雅可比迭代的Python实现
  3. 基于 Kafka + Flink + Redis 的电商大屏实时计算案
  4. js 取html自定义属性,JS操作html中的自定义属性
  5. python输入错误提示再次输入_Python实现用户登录并且输入错误三次后锁定该用户...
  6. TensorFlow精进之路(三):两层卷积神经网络模型将MNIST未识别对的图片筛选出来
  7. thinkphp5 与 endroid 二维码生成
  8. 第二季-专题8-不用内存怎么行
  9. 安装libgl1-mesa-dri:i386重启后黑屏问题解决
  10. pycharm安装scrapy失败_大数据开发神器——Scrapy 框架(读懂Spider流程图)
  11. Echarts教程篇:概览
  12. maxscale mysql_安装maxscale MySql读写分离
  13. 9.电阻线性电压转换电路
  14. 橡皮擦的英语_英语单词这样写,老师想扣卷面分都难!(建议收藏学习)
  15. Real Time Transfer (RTT)
  16. 麦克劳林公式求sin
  17. 无限循环小数四则运算_无尽小数的公理及其四则运算.doc
  18. PCB中MARK点画法与注意事项
  19. 已解决NameError: name ‘unichr‘ is not defined
  20. NO7.const和volatile

热门文章

  1. 汇编语言第4周学生总结反馈
  2. e代理创始人兼CEO何文迪:中国财富管理行业正式进入“开放平台”阶段
  3. flappy+bird+android源代码,Flappy Bird(安卓版)逆向分析(一)
  4. Java实现替换Word中文本
  5. linux系统桌面环境选择,你应该选择Cinnamon作为Linux桌面环境的十个理由
  6. python字典改键_python 字典修改键(key)的几种方法
  7. 阿里云DataWorks介绍
  8. [NLP --- 3] 文档检索算法TF-IDF
  9. 在国企的日子(第三章中部 出差)
  10. 计算机会计与手工会计的区别与联系,会计电算化与手工会计的差异和共同点各是什么...