为何System.Net.Mail.MailAddress构造函数允许解析含斜杠的域名邮箱?
为什么MailAddress允许包含斜杠的域名而不抛出FormatException?
这个问题的核心在于.NET的MailAddress类的校验定位:它仅负责校验邮件地址的格式是否符合邮件地址的通用规范(RFC 5322),并不会去验证域名是否符合DNS的严格规则。
具体拆解一下原因:
- 你的代码里的地址
username@domain/domain.com,MailAddress会把@后的domain/domain.com完整识别为主机部分。RFC 5322定义的邮件地址格式,并没有强制要求主机部分必须是合法的DNS域名——毕竟早期邮件系统还存在非DNS的寻址方式(比如X.400地址),所以规范留了灵活性。 MailAddress的构造函数只做语法结构校验:比如检查地址是否有且仅有一个@分隔符,本地部分和主机部分的基本字符语法是否合规,但不会去校验主机名是否符合DNS的字符限制(比如DNS明确禁止斜杠/这类字符)。- 真正的域名有效性校验,是在你尝试通过SMTP服务器发送邮件的时候才会发生——SMTP服务器会去解析这个主机名是否存在、是否可达,但
MailAddress本身只负责解析和存储地址的格式,不做实际的可用性校验。
甚至你还可以创建带方括号的「域字面量」格式地址,比如new MailAddress("test@[domain/domain.com]"),这在RFC 5322里是明确允许的格式,而不带方括号的宽松解析,也是.NET为了兼容一些历史场景或非标准实现所做的设计。
内容的提问来源于stack exchange,提问作者Martin Obrátil
相关产品推荐
相关产品推荐

