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

Validate email address against invalid characters

在验证电子邮件地址时,我尝试使用来自 System.ComponentModel.DataAnnotations:

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

MailAddress class 从 System.Net.Mail 通过做:

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.

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

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

Full use of electronic mail throughout the world requires that (subject to other constraints) people be able to use close variations on their own names (written correctly in their own languages and scripts) as mailbox names in email addresses.

- RFC 6530, 2012

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

  • 可以使用U+007F以上的国际字符,编码为UTF-8.

  • space"(),:;<>@[] 字符是允许的有限制(它们只允许在带引号的字符串中,反斜杠或双引号前面必须有反斜杠)

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

验证这个的正则表达式:Link

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