java如何验证一个email地址是否真实有效。

Python019

java如何验证一个email地址是否真实有效。,第1张

首先使用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毫秒。