【问题标题】:Validating E-Mail Addresses and printing valid ones in Java验证电子邮件地址并在 Java 中打印有效地址
【发布时间】:2013-10-13 10:12:07
【问题描述】:

我正在尝试在 java 中练习异常处理,并通过运行一些(无效)有效的电子邮件地址并验证它们来实现。到目前为止,我可以打印出未验证的,但我正在寻找一种方法来打印已验证的。如果我在 try 块中使用 println,则 john.doe.gmail.com 地址会因某种原因打印为正在验证。

有人可以提出一些建议吗?

import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;

public class AdressChecker  {
  public static void main(String args[]) {
    String toTest[] =
          {"john.doe@gmail.com", "john.doe.gmail.com", "john.doe@", "@gmail.com"};

    System.out.println("Addresses to be verified");
    for (String x : toTest)
      System.out.println(x);
    for (String s : toTest) {
      try {
        InternetAddress emailAddr = new InternetAddress(s);                    
        emailAddr.validate();                        
      } catch (AddressException ex) {
        System.out.println(s + " is not a valid E-Mail Address.");
      }
    }
  }
}    

现在工作。输出是:

Addresses to be verified
john.doe@gmail.com
john.doe.gmail.com
john.doe@
@gmail.com
john.doe@gmail.com is a valid E-Mail Address.
john.doe.gmail.com is not a valid E-Mail Address.
john.doe@ is not a valid E-Mail Address.
@gmail.com is not a valid E-Mail Address.
BUILD SUCCESSFUL (total time: 0 seconds)

【问题讨论】:

    标签: java validation exception-handling try-catch


    【解决方案1】:

    尝试在emailAddr.validate() 行检查后打印电子邮件:

    for (String s : toTest) 
            {
                try
                 {
                     InternetAddress emailAddr = new InternetAddress(s);                    
                     emailAddr.validate();
                     System.out.println(s + " is a valid E-Mail Address.");                        
                 }    
                catch (AddressException ex)
                 {
                 System.out.println(s + " is not a valid E-Mail Address.");
                  }
    
           }
    

    【讨论】:

    • 那么这可能是java邮件API的问题,你可以尝试只使用john.doe.gmail.com地址,无论是验证还是抛出任何异常。
    • 因为它是有效的InternetAddress。您需要其他方法来检查电子邮件。对于这种简单的情况,正则表达式可以完成这项工作:^\w+(\.\w+){0,1}@\w+\.\w+$@Boricode
    • 使用 Java Mail API 1.5,只有 john.doe@gmail.com 被标记为有效。不需要正则表达式。
    【解决方案2】:

    您可以在.validate() 调用之后添加您的println 语句。 由于地址无效时会引发异常,所以不会执行println调用。

    【讨论】:

      【解决方案3】:

      使用InternetAddress.validate() 方法,您检查电子邮件地址的有效性。 RFC 822(第 6.1 节)中的语法比我们今天通常用作电子邮件地址的地址要广泛得多。想想像ssh 这样的工具,它们也将互联网地址作为参数,它们看起来像:user@localhost。这通过了InternetAddress 验证,因为它是一个有效的 Internet 地址。并且在某些网络场景中也可以是有效的电子邮件地址。

      那么你会有这样的答案吗?

      Addresses to be verified
      john@gmail is a valid E-Mail Address
      john@gmail.coooooooooooooom is a valid E-Mail Address
      john+1@gmail.com is a valid E-Mail Address
      john+2@gmail.com is a valid E-Mail Address
      john+3000@gmail.com is a valid E-Mail Address
      

      非常取决于您应用程序中的场景。有时你想:

      • 避免使用别名(john+1@gmail.com 与 Gmail 的 john@gmail.com 相同)
      • 避免不存在的顶级域 (cooooooom)(直到 new generic top level domains 真正存在)

      如果您的电子邮件地址必须是 Web 上使用的有效电子邮件地址(例如具有域和子域),我建议使用正则表达式。为此,您有很多答案:

      【讨论】:

      猜你喜欢
      • 2013-01-05
      • 2013-11-20
      • 2011-11-02
      • 2014-06-12
      • 1970-01-01
      • 2021-07-03
      • 2012-10-16
      • 2012-04-08
      • 1970-01-01
      相关资源
      最近更新 更多