2

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

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

Java api 表示其符合 RFC-822。RFC 2821 和 822 之间有很大区别吗?

在以下情况下,上述 api 也无法验证电子邮件:

  1. var@yahoo- 验证返回真,但它是无效的电子邮件
  2. var(comment)@yahoo.com- 验证返回 false,但它是有效的电子邮件

你能告诉我任何解决这个问题的方法来完成它。

4

2 回答 2

1

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

根据我设置 dns 和绑定地址的经验,您可以指定不带句点的域名,但是当查询解析器时,它将添加.到域名的末尾。您还可以在主机文件中指定直接映射。大多数主机文件包含这样的解析本地主机:

127.0.0.1 本地主机环回

这意味着如果您在带有邮件服务器的服务器上,您可以将有效的电子邮件发送到user@localhost.

根据RFC 822

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

            person@registry.organization

请注意,“组织”是一个逻辑实体,独立于任何特定的通信网络。

访问“组织”的机制是普遍可用的。
反过来,该机制寻求注册表的实例化;地址说明中未指明其位置。假设以“组织”名义运行的系统知道如何找到下属注册表。然后,注册中心将使用“person”字符串来确定将邮件规范发送到哪里。

后一种面向网络的情况允许简单、直接、与附件相关的地址规范,例如:

                 user@host.network

在本地系统的情况下,user@host.network只要电子邮件系统配置正确,您就可以将电子邮件发送到user@host. 尽管这不是我们现在习惯的FQDN - 完全合格的域名,但该标准直到很久以后才出现。然后,邮件系统使用别名将其发送到正确的本地网络,将电子邮件转换为user@host.network. 电子邮件欺骗的问题直到后来 ARPAnet 公开时才出现。

关于地址中的评论,这不在 RFC 822 中。根据后来允许评论的电子邮件规范(RFC 2822 第 3.4 节):

此外,由于某些遗留实现解释了注释,因此通常不应在地址字段中使用注释以避免混淆此类实现。

这意味着旧系统不允许地址中的评论。RFC 822没有在电子邮件地址中提及注释。

技术修复是不允许在电子邮件地址中添加评论,除非您使用自定义代码来容纳它们。您可以随时更新 Javamail。较新的实现适应更新的 RFC。

于 2013-05-09T08:47:59.527 回答
0

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

因此,我们所做的基本上是允许新的电子邮件 ID,就像它们在 google/yahoo 等网站上的样子。

含义 somecahrs@xyz.com

我们检查的内容 最多 1 个 @ 在 @ 之后检查 1 个或多个字符 @ 有一些字符 + 至少一个点 + 点后的字符

近两年没有收到任何投诉。此外,在大多数情况下,您需要向此人发送电子邮件以确保域存在等以及带有唯一令牌的链接(注册确认)以确保此人拥有电子邮件 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;

    }
于 2013-05-09T13:37:38.600 回答