Java 8/11+ 验证没有模式的电子邮件地址语法? [复制]

Posted

技术标签:

【中文标题】Java 8/11+ 验证没有模式的电子邮件地址语法? [复制]【英文标题】:Java 8/11+ validate email address syntax w/o Pattern? [duplicate] 【发布时间】:2021-03-02 08:07:11 【问题描述】:

编辑:显然,我在这里所做的是禁忌。 ???生活吧。

我知道 SO 上的答案至少与电子邮件的 RFC 一样多,而且我对这个问题有自己的答案,我想将其公之于众以获取反馈。我的应用程序应如何确保任意字符串包含一个有效的电子邮件地址?

为了避免愚蠢的辩论,假设要扫描的文本必须少于 1KB。 库 X 与 vanilla Java 8/11+ 的拥护者应该解释哪个以及为什么。 我认为有效的电子邮件地址示例:äöüëèéê@xkcd.com
// "valid" means worth attempting to send welcome message
static boolean isValidEmailAddress(String notNull);

【问题讨论】:

发帖前一定要彻底搜索 Stack Overflow。 Java 使用真假,而不是真假。 嘿,伙计们。我确实搜索了堆栈;在我诚实的意见中,与此相关的问题并没有很好地提出或回答。而且,@NomadMaker:Boolean.TRUE 和 Boolean.FALSE 是 Java 中的绝对常量,可以取消装箱为真/假位。感谢您的澄清。 【参考方案1】:

简单的问题,复杂的答案;搜索 Stack Overflow 会产生很多争论和实践知识。

但是,我有一个精辟的反驳:您是否考虑过发送消息,看看谁回信?其他:

    首先,施加任何长度限制以及您喜欢的任何明确的允许/阻止列表。 接下来,只要您使用的是 Java 8 或更高版本,请考虑使用 jakarta.mail。 完全避免使用正则表达式,但如果必须,这样做:
    private static final String NLP = Pattern.compile("[\\pAlnum\\pPunct&&[^@]]+").pattern();
    private static final Pattern VALID_ENOUGH_EMAIL_ADDRESS =
                Pattern.compile(String.join("@", NLP, NLP), Pattern.UNICODE_CHARACTER_CLASS);

用简单的英语:在一个文字 @ 的任一侧,“除文字 @ 之外的任何数字或字母或标点符号,至少一次”。

脚注:

该库声称实现了已被取代的 RFC822。两次。而且,它可能会一次又一次。

https://eclipse-ee4j.github.io/mail/

public static void boolean isValidEmailAddress(String notNull) 
    // impose whatever extra pre-flight check you like on ^^^
    try 
        new InternetAddress(notNull, true); // v2.0.0 works w/ Unicode
        return true;
     catch (AddressException e) 
        // log or recover however you want
        return false;
    

注意,这可能会接受不是大多数系统识别的单个有效电子邮件地址的邮件;如果您的系统有独特的要求,请参阅那些。 如果没有,您可能可以使用适当的模式为@Email 使用 Java/Spring 验证注释,而不是编写与表情符号和变音符号有关的自己的实现,谁知道 2020 年还有什么?超越。

https://en.wikipedia.org/wiki/International_email

【讨论】:

以上是关于Java 8/11+ 验证没有模式的电子邮件地址语法? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用java验证电子邮件地址?

Java / Spring MVC 3 验证电子邮件地址

Java中电子邮件验证的正则表达式

编辑电子邮件的文本字段不验证电子邮件地址?

验证电子邮件地址是贝宝用户

验证没有模型的电子邮件蛋糕 1.2 [重复]