为何EmailAddressAttribute.IsValid与MailAddress判定含ª的邮箱有效
问题复现代码
void Main() { // method 1 - using MailAddress var email = "fooªbar@cander.com"; Console.WriteLine(IsValidEmail(email)); // method 2 - using EmailAddressAttribute var validator = new System.ComponentModel.DataAnnotations.EmailAddressAttribute(); Console.WriteLine(validator.IsValid(email)); } bool IsValidEmail(string email) { try { var addr = new System.Net.Mail.MailAddress(email); return addr.Address == email; } catch { return false; } }
出现该现象的核心原因
- RFC标准兼容差异:常规认知中「邮箱不能包含特殊字符」的结论,来自旧版RFC 5322规范对ASCII-only邮箱的限制。但.NET内置的两类邮箱验证工具,默认遵循支持国际化邮箱的RFC 6530/6531标准,允许邮箱本地部分(@之前的内容)使用合法的Unicode字符,
ª属于拉丁语系合法扩展字母,因此被判定为符合规范。 - 两类验证逻辑底层对齐:
System.ComponentModel.DataAnnotations.EmailAddressAttribute的内部验证逻辑直接复用了System.Net.Mail.MailAddress的判断规则,两者没有校验规则差异,所以都会返回验证通过的结果。MailAddress构造时仅校验邮箱基础格式,不会额外限制仅使用ASCII字符,只要Unicode字符合法、无格式错误就不会抛出异常,因此验证通过。
严格限制ASCII邮箱的解决方案
如果业务要求邮箱仅能使用ASCII字符,可以在原有验证逻辑基础上新增ASCII字符校验,示例实现如下:
bool IsValidAsciiOnlyEmail(string email) { // 先校验所有字符均为ASCII if (email.Any(c => c > 0x7F)) return false; try { var addr = new System.Net.Mail.MailAddress(email); return addr.Address == email; } catch { return false; } }
内容的提问来源于stack exchange,提问作者rasputino
相关产品推荐
相关产品推荐

