java实现验证邮箱有效性
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@";//"no-reply@";
public static final String SENDER_EMAIL_SERVER = SENDER_EMAIL.split("@")[1];//"";
/**
*
* @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( > 1) { // 优先级排序
List<Record> arrRecords = new ArrayList<Record>();
(arrRecords, result);
(arrRecords, new Comparator<Record>() {
public int compare(Record o1, Record o2) {
return new CompareToBuilder().append(((MXRecord)o1).getPriority(), ((MXRecord)o2).getPriority()).toComparison();
}
});
host = ((MXRecord)(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> //
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; //把 和放在循环体内,这样所有的如果某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 += "=" + ();
//
// // RCPT TO: <$email>
// try{
// (email);
// }catch(Exception e){
// return false;
// }
// log += ">RCPT TO: <" + email + ">\n";
// log += "=" + ();
//
// //最后从收件邮箱服务器返回true,说明服务器中能够找到此收件地址,邮箱有效
// if (250 == ()) {
// 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("")){
if( checkEmailMethod(email) && checkEmailMethod(email) && checkEmailMethod(email)){
return true;
}else{
return false;
}
}
return checkEmailMethod(email);
}
}