使用Java的电子邮件验证RFC 2821

时间:2013-05-09 07:12:09

标签: email-validation javax.mail rfc822 rfc2822

我正在使用考虑了RFC 2821的java进行电子邮件验证。 我使用以下代码验证我的所有电子邮件地址:

InternetAddress emailAddr = new InternetAddress(email);
emailAddr.validate();

Java api表示符合RFC-822标准。 RFC 2821和822之间有很大差异吗?

以上api也未能在以下情况下验证电子邮件:

  1. var@yahoo - 验证返回true,但邮件无效
  2. var(comment)@yahoo.com - 验证返回false,但它是有效的电子邮件
  3. 你能告诉我任何解决这个问题的工作吗?

2 个答案:

答案 0 :(得分:1)

现代电子邮件地址的处理方式与原始标准中的电子邮件地址之间存在重大差异。

从我经历的设置dns& amp;绑定地址您可以指定没有句点的域名,但是当查询解析器时,它会将.添加到域名的末尾。您还可以在hosts文件中指定直接映射。大多数主机文件包含解析localhost,如下所示:

  

127.0.0.1 localhost loopback

如果您使用邮件服务器在服务器上,则可以发送有效的电子邮件至user@localhost

根据RFC 822

  

在正式注册的情况下,组织实施   (分布式)数据库,提供地址到路由映射   表格地址服务:

            person@registry.organization
     

请注意,“组织”是一个逻辑实体,与any分开   特定的通信网络。

     

获取“组织”的机制是普遍可用的   反过来,该机制寻求对登记处进行实例化;它的   地址指定中未指明位置。它是   假设以“组织”名义运作的系统   知道如何找到从属注册。然后注册表将   使用“person”字符串来确定发送邮件的位置   说明书

     

后者,面向网络的案例允许简单,直接,   与附件相关的地址规范,例如:

                 user@host.network

如果本地系统上的user@host.network只要电子邮件系统配置正确,您就可以向user@host发送电子邮件。虽然这不是我们现在习惯的FQDN - Fully Qualified Domain Name,但是这个标准要到很晚才会出现。然后,邮件系统使用别名将其发送到正确的本地网络,将电子邮件转换为user@host.network。电子邮件欺骗的问题直到ARPAnet上市后才出现。

关于地址中的注释,这不在RFC 822中。根据后面允许注释的电子邮件规范(RFC 2822 Section 3.4):

  

另外,因为一些遗留实现解释了评论,   注意一般不应该在地址字段中使用以避免   混淆这种实现。

意味着旧系统不允许在地址中发表评论。 RFC 822未在电子邮件地址中提及评论。

技术修复是不允许在电子邮件地址中发表评论,除非您使用自定义代码。您可以随时更新Javamail。 Newer implementations accommodate updated RFCs.

答案 1 :(得分:0)

在我看来,您要验证现在使用的电子邮件ID,而不是真正符合任何RFC。 对于我们的项目,我们制作了非常简单的电子邮件验证器。为什么? apache和java邮件一个使用正则表达式,有些情况(我不知道哪个,因为我们没有在日志中打印电子邮件)使正则表达式进入永久循环。这意味着客户端处理程序线程进入循环,用户看到一个空白屏幕!

所以我们所做的实际上是允许新的电子邮件ID,就像它们在google / yahoo等网站上看起来一样。

含义somecahrs@xyz.com

我们检查的是什么 最多1 @ 在@之前检查一个或多个字符 在@之后有一些字符+至少一个点+在点之后的chrs

过去两年没有得到任何投诉。此外,大多数情况下,您需要向该人发送电子邮件以确保该域存在等以及具有唯一令牌的链接(注册确认)以确保该人拥有该电子邮件ID(仅向真实所有者发送消息)点击,如果他们来到您的网站)

    /**
     * minimum email l@n.co
     * */
    public static boolean checkEmail(final String emlId, int dbgPrint) {
        // ex:ak@bv.gh
        if (emlId == null){
            return false;
        }
        final int lngth = emlId.length();
        if (lngth < 6) {
            if (dbgPrint > 1) {
                System.out.println(" lngth < 6");
            }
            return false;
        }
        final int locationAt = emlId.indexOf('@');
        if (locationAt < 1) {
            if (dbgPrint > 1) {
                System.out.println("locationAt < 1 : " + locationAt);
            }
            return false;//
        }
        final int postLastPeriod = emlId.lastIndexOf('.');
        if (postLastPeriod < 0) {
            if (dbgPrint > 1) {
                System.out.println("postLastPeriod < 0, locationAt " + locationAt);
            }
            return false;
        }
        if (dbgPrint > 1) {
            System.out.println(" locationAt " + locationAt + ", postLastPeriod :" + postLastPeriod + " lngth " + lngth);
        }
        if (lngth - postLastPeriod < 3) {
            if (dbgPrint > 1) {
                System.out.println(" lngth - postLastPeriod < 2");
            }
            return false;
        }
        if (postLastPeriod - locationAt < 1) {
            if (dbgPrint > 1) {
                System.out.println(" postLastPeriod - locationAt < 1");
            }
            return false;
        }
        return true;

    }