在Java中验证电子邮件地址

3

我应该如何验证电子邮件地址的域名部分?我需要先在Java类中列出现有的域名,还是Java的InternetAddress.validate()会自动执行?我已经使用了以下代码:

public static boolean verifyEmailAddress(String regEmail) {
    boolean result = true;
    try {
        InternetAddress emailAddr = new InternetAddress(regEmail);
        emailAddr.validate();
    } catch (AddressException ex) {
        result = false;
    }
    return result;
}

请求中有一个邮箱地址,存储在regEmail参数中。问题是即使对于无效的电子邮件(如san@hhhgggmail.com),它也显示为有效。我需要做什么才能解决这个问题?请帮我解决。另外,这个函数是否对使用和测试过它的人有效?

请记得接受有帮助的答案。 - rekire
5个回答

3

我认为您从错误的角度来看待了这个问题。从您的应用程序的角度来看,如果一个电子邮件地址可以接收到邮件,它应该被视为 有效(更好,有用)。这就是为什么所有那些论坛都会不断给您发送激活电子邮件的原因 :) 您应该向每个新的电子邮件地址发送一些随机字符串,并将其保留在 隔离 状态,直到用户可以证明他已阅读该密钥。

这是因为域名可能存在,或者DNS中可能存在该域名的MX记录,但这些条件都不能保证该地址是 有效 的 - 再次强调,当您 验证 某些内容时,其实是在声明它可以在以后的代码中用于某些目的,而邮箱地址的目的就是接收邮件。


1

我不知道Java中是否有自动的方法。但是我会查找域名的MX记录。如果存在MX记录,则该域名可能会收到邮件。

另请参见此页面以获取更多信息。


1

0

我认为没有确切有效的方法来验证它。我们所能做的就是验证模式,或者更多地验证邮件域名,例如hhhgggmail.com。但是你如何验证“san@hhhgggmail.com存在”呢?

SMTP确实有一个“VEFY”命令,但几乎所有SMTP服务器都不实现此命令,出于安全原因。

哦,你想验证域名。所有SMTP服务器都需要一个MX DNS记录。您可以使用dnsjava模块进行验证。代码如下:

public static MXRecord digOptimalMxRecords(String domainName) throws TextParseException {
        List<MXRecord> records = DNSHelper.digMxRecords(domainName);
        if (CollectionUtils.isNotEmpty(records)) {
            Collections.sort(records, new Comparator<MXRecord>() {
                @Override
                public int compare(MXRecord o1, MXRecord o2) {
                    return o2.getPriority() - o1.getPriority();
                }
            });
            return records.get(0);
        }
        return null;
    }

public static List<MXRecord> digMxRecords(String domainName) throws TextParseException {
    List<MXRecord> list = new ArrayList<MXRecord>();
    Lookup mxLookupper = new Lookup(domainName, Type.MX);
    mxLookupper.run();
    if (mxLookupper.getResult() == Lookup.SUCCESSFUL) {
        Record[] answers = mxLookupper.getAnswers();
        for (Record record : answers) {
            list.add((MXRecord) record);
        }
    }
    return list;
}

哦,你想验证域名。所有 SMTP 服务器都需要 MX DNS 记录。你可以使用 dnsjava 模块来验证它。 - NewBee

0
请忽略变量名,因为它们不够专业。
import java.util.regex.Matcher;

import java.util.regex.Pattern;

import java.util.Scanner;

public class EmailValidator {

public static void main(String[] args) {

    recursion();

}

static void recursion () {

    Scanner scanner = new Scanner(System.in);

    System.out.println("Welcome to the game of typing a correct email address!");
    
    System.out.println();
    
    System.out.println("As the game says, enter a correct email address.");

    System.out.println();

    String snow = scanner.nextLine();

    String[] sssp = snow.split("@");
    
    if (sssp.length != 2) {
        
    System.out.println();
        
    System.out.println("This is not a correct email address."); 
    
    System.out.println();
        
    recursion();
    
    } else {

        String regex = "[^a-z0-9._]";

        String regex1 = "^\\.|\\.$";
        
        String regex2 = "\s";
        
        String regex3 = "^$";
        
        String regex7 = "\\._|_\\.";
        
        String regex39 = "__";
        
        String regex19 = "\\.\\.";
        
        String regex20 = "^_|_$";

        Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);

        Pattern pattern1 = Pattern.compile(regex1, Pattern.CASE_INSENSITIVE);
        
        Pattern pattern2 = Pattern.compile(regex2, Pattern.CASE_INSENSITIVE);
        
        Pattern pattern3 = Pattern.compile(regex3, Pattern.CASE_INSENSITIVE);
        
        Pattern pattern11 = Pattern.compile(regex7, Pattern.CASE_INSENSITIVE);
        
        Pattern pattern12 = Pattern.compile(regex19, Pattern.CASE_INSENSITIVE);
        
        Pattern pattern13 = Pattern.compile(regex20, Pattern.CASE_INSENSITIVE);
        
        Pattern pattern14 = Pattern.compile(regex39, Pattern.CASE_INSENSITIVE);

        Matcher matcher = pattern.matcher(sssp[0]);

        Matcher matcher1 = pattern1.matcher(sssp[0]);
        
        Matcher matcher2 = pattern2.matcher(sssp[0]);
        
        Matcher matcher3 = pattern3.matcher(sssp[0]);
        
        Matcher matcher11 = pattern11.matcher(sssp[0]);
        
        Matcher matcher12 = pattern12.matcher(sssp[0]);
        
        Matcher matcher13 = pattern13.matcher(sssp[0]);
        
        Matcher matcher14 = pattern14.matcher(sssp[0]);

        boolean matchFound = matcher.find();

        boolean matchFound1 = matcher1.find();
        
        boolean matchFound2 = matcher2.find();
        
        boolean matchFound3 = matcher3.find();
        
        boolean matchFound10 = matcher11.find();
        
        boolean matchFound11 = matcher12.find();
        
        boolean matchFound12 = matcher13.find();
        
        boolean matchFound13 = matcher14.find();
        
        String hello = sssp[1];
        
        String[] whoop = hello.split("\\.", 2);
        
        if (whoop.length != 2) {
            
        System.out.println();

        System.out.println("This is not a correct email address."); 

        System.out.println();   
            
        recursion();
        
        } else {
            
            String regex4 = "[^a-z]";
            
            String regex5 = "^$";
            
            String regex6 = "\s";
            
            Pattern pattern4 = Pattern.compile(regex4, Pattern.CASE_INSENSITIVE);

            Pattern pattern5 = Pattern.compile(regex5, Pattern.CASE_INSENSITIVE);
            
            Pattern pattern6 = Pattern.compile(regex6, Pattern.CASE_INSENSITIVE);
            
            Matcher matcher4 = pattern4.matcher(whoop[0]);

            Matcher matcher5 = pattern5.matcher(whoop[0]);
            
            Matcher matcher6 = pattern6.matcher(whoop[0]);
            
            boolean matchFound4 = matcher4.find();

            boolean matchFound5 = matcher5.find();
            
            boolean matchFound6 = matcher6.find();
            
            Pattern pattern7 = Pattern.compile(regex4, Pattern.CASE_INSENSITIVE);

            Pattern pattern8 = Pattern.compile(regex5, Pattern.CASE_INSENSITIVE);
            
            Pattern pattern9 = Pattern.compile(regex6, Pattern.CASE_INSENSITIVE);
            
            Matcher matcher7 = pattern7.matcher(whoop[1]);

            Matcher matcher8 = pattern8.matcher(whoop[1]);
            
            Matcher matcher9 = pattern9.matcher(whoop[1]);
            
            boolean matchFound7 = matcher7.find();

            boolean matchFound8 = matcher8.find();
            
            boolean matchFound9 = matcher9.find();
            
            System.out.println();

            if(matchFound || matchFound1 || matchFound2 || matchFound3 || matchFound4 || matchFound5 || matchFound6 || matchFound7 || matchFound8 || matchFound9 || matchFound10 || matchFound11 || matchFound12 || matchFound13) {

                System.out.println("This is not a correct email address.");

                System.out.println();

                recursion();

            } else {

                System.out.println("This is a correct email address.");

                System.out.println();

                System.out.println("Do you still want to play? (say yes to play) ");

                System.out.println();

                Scanner scanner1 = new Scanner(System.in);

                String snow1 = scanner1.nextLine();

                if (snow1.equalsIgnoreCase("yes")) {

                    System.out.println();

                    recursion();

                } else {

                    System.out.println();  

                    System.out.println("Okay, then.");  
                    
                    scanner.close();
                    
                    scanner1.close();
                    
                }

            }   
            
        }
        
    }

}

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接