首先使用java提供的格式类判断email是否格式有误,然后使用开源框架,验证邮箱是否有用,示例如下:
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("[email protected]")
client.addRecipient(email)
if (250 == client.getReplyCode()) {
return true
}
} catch (Exception e) {
e.printStackTrace()
} finally {
try {
client.disconnect()
} catch (IOException e) {
}
}
return false
}
需要的jar支持:commons-net-2.2.jar,dnsjava-2.1.1.jar
一般的验证是 验证邮件地址格式是否正确,如果你需要验证邮箱是否存在就需要发个邮件过去,即使发过去 你也不知道是否存在,除非有邮件返回。所以一般只是验证邮件格式是否正确就可以了。
自己写逻辑验证的方式可以做到。我写了下面的:public static boolean validateEmail(String email) {
boolean flag = false
int pos = email.indexOf("@")
if (pos == -1 || pos == 0 || pos == email.length() - 1) {
return false
}
String[] strings = email.split("@")
if (strings.length != 2) {// 如果邮箱不是xxx@xxx格式
return false
}
CharSequence cs = strings[0]
for (int i = 0i <cs.length()i++) {
char c = cs.charAt(i)
if (!Character.isLetter(c) &&!Character.isDigit(c)) {
return false
}
}
pos = strings[1].indexOf(".")// 如果@后面没有.,则是错误的邮箱。
if (pos == -1 || pos == 0 || pos == email.length() - 1) {
return false
}
strings = strings[1].split(".")
for (int j = 0j <strings.lengthj++) {
cs = strings[j]
if (cs.length() == 0) {
return false
}
for (int i = 0i <cs.length()i++) {//如果保护不规则的字符,表示错误
char c = cs.charAt(i)
if (!Character.isLetter(c) &&!Character.isDigit(c)) {
return false
}
}
}
return true
}
这个效率也不会差很多,不过我推荐matches方法,经过测试的,matches匹配方式运行10000次的时间比上面的时间少了20毫秒。