使用正则表达式验证邮箱的格式是否有效;最后,查询邮箱的 DNS 记录来判断邮箱是否存在。
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Scanner;
public class EmailValidator {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入邮箱地址:");
String email = scanner.nextLine();
scanner.close();
boolean isValid = email.matches("[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}");
if (!isValid) {
System.out.println("邮箱格式无效");
return;
}
String domain = email.substring(email.indexOf("@") + 1);
try {
InetAddress inetAddress = InetAddress.getByName(domain);
if (inetAddress == null) {
System.out.println("邮箱不存在");
} else {
System.out.println("邮箱存在");
}
} catch (UnknownHostException e) {
System.out.println("查询失败");
}
}
/**
* <dependency>
* <groupId>commons-net</groupId>
* <artifactId>commons-net</artifactId>
* <version>2.2</version>
* </dependency>
*
* <dependency>
* <groupId>dnsjava</groupId>
* <artifactId>dnsjava</artifactId>
* <version>2.1.1</version>
* </dependency>
*
*/
public static void main(String[] args) {
String email = "445087460@qq.com";
long start = System.currentTimeMillis();
boolean b = checkEmail(email);
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end-start));
System.out.println("是否有效:" + b);
}
public static boolean checkEmail(String email) {
if (!email.matches("[\\w\\.\\-]+@([\\w\\-]+\\.)+[\\w\\-]+")) {
return false;
}
String host = "";
String hostName = email.split("@")[1];
Record[] result = null;
SMTPClient client = new SMTPClient();
try {
// 查找MX记录
Lookup lookup = new Lookup(hostName, Type.MX);
lookup.run();
if (lookup.getResult() != Lookup.SUCCESSFUL) {
return false;
} else {
result = lookup.getAnswers();
}
// 连接到邮箱服务器
for (int i = 0; i < result.length; i++) {
host = result[i].getAdditionalName().toString();
client.connect(host);
if (!SMTPReply.isPositiveCompletion(client.getReplyCode())) {
client.disconnect();
continue;
} else {
break;
}
}
//以下2项自己填写快速的,有效的邮箱
client.login("163.com");
// 发送人
client.setSender("shyboy_fei@163.com");
// 接收人
client.addRecipient(email);
if (250 == client.getReplyCode()) {
return true;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
client.disconnect();
} catch (IOException e) {
}
}
return false;
}
}
// 方式二:
package org.javaboy.mailserver.receiver;
import org.apache.commons.net.smtp.SMTPClient;
import org.apache.commons.net.smtp.SMTPReply;
import org.xbill.DNS.*;
import org.xbill.DNS.Record;
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();
}
// 连接到邮箱服务器
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;
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.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: <"+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();
}
}
} 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);
}
}
package org.javaboy.mailserver.receiver;
public class CheckEmailTest {
public static void main(String[] args) {
CheckEmailOK ce = new CheckEmailOK();
long start = System.currentTimeMillis();
boolean b = ce.checkEmail("19asdas6@163.com");
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end-start));
if(b){
System.out.println("true");
}else{
System.out.println("false");
}
}
}