针对无效字符验证电子邮件地址

Posted

技术标签:

【中文标题】针对无效字符验证电子邮件地址【英文标题】:Validate email address against invalid characters 【发布时间】:2016-09-22 21:24:30 【问题描述】:

在验证电子邮件地址时,我尝试使用 System.ComponentModel.DataAnnotations 中的 EmailAddressAttribute 类:

[EmailAddress(ErrorMessage = "Invalid Email Address")]
public string Email  get; set; 

以及来自System.Net.MailMailAddress 类:

bool IsValidEmail(string email)

    try 
        var addr = new System.Net.Mail.MailAddress(email);
        return addr.Address == email;
    
    catch 
        return false;
    

如C# code to validate email address 中所建议的那样。这两种方法原则上都有效,它们捕获无效的电子邮件地址,例如user@,不符合格式user@host

我的问题是这两种方法都没有检测到用户字段中的无效字符,例如æ, ø, or å (e.g. åge@gmail.com)。这些字符没有返回验证错误有什么原因吗?是否有人对如何在用户字段中合并无效字符的验证有一个优雅的解决方案?

【问题讨论】:

@Think 不,不要提出这样的可怕做法。 @Think2ceCode1ce 不,请不!不要用正则表达式来解析邮件地址,都是错的,都是错的! @Think 是的,人们多年来一直在做错事。使用正则表达式验证电子邮件地址是没有意义的。您将挫败并排除合法用户。已经有很多关于这个主题的讨论,例如this one。 @Think 另请参阅How to Find or Validate an Email Address: “不要过分尝试使用正则表达式消除无效的电子邮件地址。原因是您并不真正知道地址是否在您尝试向其发送电子邮件之前有效。[...] 如果您确实需要确保电子邮件地址有效,则需要向其发送电子邮件“ @CodeCaster 太好了。今天学到了一些东西。 【参考方案1】:

您提到的字符 (ø, å or åge@gmail.com) 不是无效的。考虑一个例子:当某人使用外语作为他们的电子邮件 ID(法语、德语等)时,一些 unicode 字符是可能的。然而EmailAddressAttribute 屏蔽了一些不寻常的字符。

您可以在U+007F上方使用国际字符,编码为UTF-8

space"(),:;@[] 字符是允许的,但有限制(它们只允许在带引号的字符串、反斜杠内或双引号前必须加反斜杠)

特殊字符!#$%&'*+-/=?^_`|~

正则表达式验证这一点:Link

^(([^()[].,;:\s@\"]+(.[^()[].,;:\s@\"]+)*)| (\".+\"))@(([^()[].,;:\s@\"]+.)+[^()[].,;:\s@\ "]2,)

【讨论】:

我们不需要网络上另一个无效的电子邮件验证正则表达式。 检查上述工作正则表达式的链接。希望你会知道它有效。 好吧,例如Email Address test cases,这个正则表达式会给出误报和误报的情况(尽管忽略Unicode)。话虽如此,这不是也不会成为“转储您最喜欢的电子邮件验证正则表达式”的问题。 We already have a couple of those that address all issues with regex email validation,这不是这个问题的意义所在。它还有助于链接到您找到此正则表达式的位置。 它简要介绍了问题的具体问题,我给出了一个正则表达式,它可以通过问题中提到的所需测试用例。我没有提到这是所有电子邮件验证的“完美正则表达式”。它还显示了您指向(尽管错误地)您认为我“复制”的链接的过时程度。 继续努力保持建设性,而你真的没有做到这一点。如果您这么说(带有上述评论),那么 [所有可能的] 电子邮件地址是什么意思?我希望您通过删除以前的 cmets 来确保给出抽象的答案,而不是试图热衷于这个问题的过时行为。【参考方案2】:

这些字符不是无效的。不寻常,但并非无效。您链接的问题甚至包含您不应该关心的解释。

在全球范围内充分使用电子邮件需要 (受其他限制)人们能够使用紧密的变化 写在他们自己的名字上(用他们自己的语言正确书写,并且 脚本)作为电子邮件地址中的邮箱名称。

- RFC 6530, 2012

【讨论】:

“那些字符不是无效的” - 需要引用。 ;) 见tools.ietf.org/html/rfc6531

以上是关于针对无效字符验证电子邮件地址的主要内容,如果未能解决你的问题,请参考以下文章

在进行第二个活动之前验证电子邮件地址

单元测试的模拟有效/无效电子邮件地址列表

JQuery.validate() 将无效域格式的电子邮件地址作为有效地址传递

如何验证包含两个句点的电子邮件地址(Python)

Grails:验证包含分隔的电子邮件地址列表的字符串

ASP.NET 的电子邮件地址验证