【问题标题】:What is the format accepted by System.Net.Mail.MailAddress' parser?System.Net.Mail.MailAddress 的解析器接受的格式是什么?
【发布时间】:2010-10-06 09:34:27
【问题描述】:

我正在开发一个使用System.Net.Mail.MailAddress 和朋友发送电子邮件的应用程序。该解析器是否实现了完整的RFC5322 或子集或什么? MSDN 对这个话题的态度不是很好。

任何提示表示赞赏。

【问题讨论】:

  • 获取并安装 RedGate 的 Reflector,然后导航到 System.Net.Mail 命名空间并查看代码以了解它的作用。我会这样做,但我现在在家中使用我的 Mac。
  • 也许我很奇怪,但我宁愿看到一份文件(最好是 MS 或 ECMA 提供)说明该死的东西“接受 RFC 等地址,X、Y 和 Z 部分除外因为 IETF 对互联网一无所知”,而不是不得不拆解这个东西。
  • 同意,但没有这样的文档——甚至可能有它——查看代码可以明确地回答这个问题。
  • ...对于这个特定的实现。

标签: .net validation email


【解决方案1】:

我写了一个小sn-p来测试这个功能:

foreach (int i in Enumerable.Range(32,128-32))
{
    char c = (char)i;
    string addr = String.Format("par.t1{0}pa.r{0}t2@example.com", c);
    try
    {
        var mailAddr = new MailAddress(addr);
    }
    catch
    {
        Console.WriteLine("MailAddress failed '{0}' ({1}): {2}", c, i, addr);
    }
}

在 3.5 SP1 上有以下结果:

邮件地址失败 ' ' (32): par.t1 par.r t2@example.com 邮件地址失败 '"' (34): par.t1"pa.r"t2@example.com 邮件地址失败 '(' (40): par.t1(pa.r(t2@example.com 邮件地址失败 ')' (41): par.t1)pa.r)t2@example.com 邮件地址失败','(44):par.t1,pa.r,t2@example.com 邮件地址失败':'(58):par.t1:pa.r:t2@example.com 邮件地址失败';' (59): 部分.t1;pa.r;t2@example.com 邮件地址失败 ''(62):par.t1>pa.r>t2@example.com 邮件地址失败'@'(64):par.t1@pa.r@t2@example.com 邮件地址失败 '[' (91): par.t1[pa.r[t2@example.com 邮件地址失败 '\' (92): par.t1\pa.r\t2@example.com 邮件地址失败']'(93):par.t1]pa.r]t2@example.com 邮件地址失败“⌂”(127):par.t1⌂pa.r⌂t2@example.com

此外,它似乎不支持“引用字符串”本地部分,例如 "blah"@example.com

我认为验证器在变得不可用之前不能接受任何更少。

【讨论】:

    【解决方案2】:

    Dominic Sayers isemail article 的讨论帖中,Jerry O'Brien 说他阅读了 Dominic 针对System.Net.MailAddress 类的 RFC 合规性测试用例:

    System.Net.MailAddress 只有 59% 符合 RFC 规范。 后续 cmets 注意到具体 它产生错误的情况 阳性和假阴性。

    RFC 对有效电子邮件地址的构成极为薄弱。它们允许一系列不寻常和不受欢迎的格式。所以我想真正的问题是,System.Net.MailAddress 在大多数现实情况下是否足够好?

    【讨论】:

    • 感谢这个有趣的链接!另外,关于解析器“足够好”的一个好问题。我测试的具体实现对于我所做的应用程序来说已经足够好了。正如我试图在 cmets 中对这个问题解释的那样,对我来说更广泛的问题是,与 BCL 中的许多其他地方一样,这是非常不充分的文档;在实现细节上创建不必要的依赖项(参见反射器注释)。
    • 我完全同意你的看法。在存在标准的地方(例如日期格式、URI、电子邮件地址等),最好知道类的设计规范是什么——以及发布的单元测试!
    • 我使用这种方法,但是 test@test 通过了验证。无赖。
    猜你喜欢
    • 2014-05-26
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    相关资源
    最近更新 更多