java 自动识别邮箱服务器类型_Java实现通过smtp服务器验证邮箱的真实有效性
要用到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服务器验证邮箱的真实有效性相关推荐
- 邮箱 POP3服务器(端口110) SMTP服务器(端口25)
gmail(google.com) POP3服务器地址:pop.gmail.com(SSL启用 端口:995) SMTP服务器地址:smtp.gmail.com(SSL启用 端口:587) 21cn. ...
- java获取泛型的类型_Java反射获取泛型类型
public class Person{ }importjava.lang.reflect.ParameterizedType;importjava.lang.reflect.Type;public ...
- java 二进制是什么类型_Java基础类型与其二进制表示
Java中的基础类型有:byte.short.int.long.float.double.char和boolean. 它们可被分为四种类型,整型.浮点型.char型和boolean型. 整型:byte ...
- java gmail smtp_使用Javamail连接到Gmail smtp服务器会忽略指定的端口,并尝试使用25...
我正在尝试在groovy脚本中使用javamail通过gmail发送电子邮件.我在网上看了很多地方,到目前为止还无法正常工作.运行脚本时出现的错误是: DEBUG SMTP: useEhlo true ...
- 使用python批量验证邮箱密码_【日常Py】利用SMTP批量验证邮箱真实性
沉寂的一个月,经历了事情不少,心情也是起伏波动:希望早点结束. 回归正题,前一段时间一朋友给我提了一需求,需要批量验证QQ是否开通邮箱:然而我的第一反应是:判断邮箱是否开通,往这个邮箱发一封邮件不就知 ...
- linux网页无法连接到服务器,linux – 无法连接到SMTP服务器
我无法从PC连接到SMTP服务器. 我使用Debian sid. telnet mail.example.com 25 Trying 12.23.34.45... telnet: Unable to ...
- linux无法连接邮件服务器,linux – 无法连接到SMTP服务器
我无法从PC连接到SMTP服务器. 我使用Debian sid. telnet mail.example.com 25 Trying 12.23.34.45... telnet: Unable to ...
- 注册smtp服务器,轻松架设自己的SMTP服务器
应用目标:更稳定地发送邮件 实现难度:★★☆☆☆ 我们在发送电子邮件的时候,这封E-mail首先来到ISP提供的邮件服务器,再通过它发送出去.但如果ISP因为网络出现一些问题,则可能会耽搁邮件的发送, ...
- java方法未定义类型_java - 方法未定义为类 - SO中文参考 - www.soinside.com
我试图在eclipse中运行一个使用名为getArea(一个对象)的方法的代码.我目前收到错误说 对于getArea(ComparableRectangle)类型,方法RectangleTest未定义 ...
最新文章
- mysql主从复制实战
- 关于雅可比迭代的Python实现
- 基于 Kafka + Flink + Redis 的电商大屏实时计算案
- js 取html自定义属性,JS操作html中的自定义属性
- python输入错误提示再次输入_Python实现用户登录并且输入错误三次后锁定该用户...
- TensorFlow精进之路(三):两层卷积神经网络模型将MNIST未识别对的图片筛选出来
- thinkphp5 与 endroid 二维码生成
- 第二季-专题8-不用内存怎么行
- 安装libgl1-mesa-dri:i386重启后黑屏问题解决
- pycharm安装scrapy失败_大数据开发神器——Scrapy 框架(读懂Spider流程图)
- Echarts教程篇:概览
- maxscale mysql_安装maxscale MySql读写分离
- 9.电阻线性电压转换电路
- 橡皮擦的英语_英语单词这样写,老师想扣卷面分都难!(建议收藏学习)
- Real Time Transfer (RTT)
- 麦克劳林公式求sin
- 无限循环小数四则运算_无尽小数的公理及其四则运算.doc
- PCB中MARK点画法与注意事项
- 已解决NameError: name ‘unichr‘ is not defined
- NO7.const和volatile
热门文章
- 汇编语言第4周学生总结反馈
- e代理创始人兼CEO何文迪:中国财富管理行业正式进入“开放平台”阶段
- flappy+bird+android源代码,Flappy Bird(安卓版)逆向分析(一)
- Java实现替换Word中文本
- linux系统桌面环境选择,你应该选择Cinnamon作为Linux桌面环境的十个理由
- python字典改键_python 字典修改键(key)的几种方法
- 阿里云DataWorks介绍
- [NLP --- 3] 文档检索算法TF-IDF
- 在国企的日子(第三章中部 出差)
- 计算机会计与手工会计的区别与联系,会计电算化与手工会计的差异和共同点各是什么...