2014-09-19 84 views
3

许多人可能已经意识到,正确验证电子邮件地址可能有点噩梦。您可以整天搜索符合当前RFC标准的C#正则表达式,并且您会发现不同的正则表达式会给出不同的结果。System.Net.MailMessage允许一些无效的电子邮件地址格式

如果你看看http://en.wikipedia.org/wiki/Email_address#Local_part,你会发现在本地部分的开始或结尾处不允许有句点。连续两个时段也是不允许的。但是,以下NUnit测试证明System.Net.MailMessage允许您为一些无效的电子邮件地址格式实例化MailMessage对象。

[Test] 
[TestCase(@"[email protected]")] //technically valid from the wiki article 
[TestCase(@"[email protected][192.168.2.1]")] //technically valid from the wiki article 
[TestCase(@"[email protected]")] //vanilla email address 
[TestCase(@"[email protected]")] //also standard 
[TestCase(@"[email protected]")] //long with lots of periods 
[TestCase(@"[email protected]")] //disposable with the + symbol 
[TestCase(@"[email protected]")] //period and dash in local part 
[TestCase(@"[email protected]")] //lots of hyphens 
[TestCase(@"!#$%&'*+-/=?^_`{|}[email protected]")] //all these symbols are allowed in local part 
[TestCase(@"ër_%ل[email protected]كňil.com")] //characters outside the ascii range are permitted 
[TestCase(@"""abcdefghixyz""@example.com")] //technically valid 
//[TestCase(@"abc.""defghi""[email protected]")] //technically valid, but .NET throws exception 
public void CanCreateMailMessageObjectTest(string emailAddress) 
{ 
    var mailMessage = new System.Net.Mail.MailMessage("[email protected]", emailAddress); 
} 

以上所有测试用例除最后一个都通过。

[Test] 
[TestCase(@"[email protected]")] //leading period 
[TestCase(@"[email protected]")] //period at end of local part <---FAIL 
[TestCase(@"[email protected]")] //double period in local part <---FAIL 
[TestCase(@"[email protected]!#$%^&*()=server.com")] //special characters in domain part 
[TestCase(@"Abc.example.com")] //No @ separating local and domain part 
[TestCase(@"[email protected]@[email protected]")] //more than one @ symbol 
[TestCase(@"just""not""[email protected]")] //quoted strings must be dot separated 
[TestCase(@"a""b(c)d,e:f;g<h>i[j\k][email protected]")] //special symbols "(),:;<>@[\] not inside quotes 
[TestCase(@"[[email protected]")] //leading special symbol in local part 
[TestCase(@"this is""not\[email protected]")] //spaces not in quotes 
[TestCase(@"this\ still\""not\\[email protected]")] //backslashes not in quotes 
[ExpectedException(typeof (System.FormatException))] 
public void CannotCreateMailMessageObjectTest(string emailAddress) 
{ 
    var mailMessage = new System.Net.Mail.MailMessage("[email protected]", emailAddress); 
} 

为什么地球上做[email protected][email protected]未能抛出System.FormatException?这里谁错了,微软还是维基百科?是否有任何电子邮件地址可以追溯到期限或双倍期限?我的验证应该允许他们吗?我有适当的异常处理来允许我的电子邮件传送服务在发生异常时继续执行其日期,但是我想抛出无效或保证会引发异常的电子邮件地址。

回答

0

那么,由于RFC定义了标准,这将是微软的实施,这是不正确的。

如果您想要做更好的验证,请尝试使用validator I posted in this answer来回答问题C# Email Address validation

它应该适当(并严格)验证几乎所有本地部分@域格式的任何“正常”电子邮件地址,你可能会遇到,虽然它不会处理新的非ASCII风格的东西,这是允许。我不能保证自从它几年之后还没有开始有点腐烂,并且自从我编写它以来,电子邮件RFC已经更新。

本地部分必须不加引号:它不支持引用的本地部分或带引号的标签。

就域部分而言,我的验证器不支持IPv4或IPv6字面值(尽管添加它不会很困难)。

如果您想要允许任何/所有符合RFC的地址,它将变得更加困难。

+0

感谢您发布您的3年半的解决方案,但那不是我真正想要的。我可以从FluentValidation和微软获得正则表达式,或者写我自己的,但问题是它们都是不同的。这篇文章并没有要求提供正则表达式,但问题为何MailMessage不会引发FormatException。 “ – jreancsu 2014-09-19 17:58:53

3

有没有解释为什么,但MSDN's docs on System.Net.Mail.MailAddress召唤出这个地址的格式支持:

的MailAddress类支持以下邮件地址格式:

...

  • 用户名中的连续和尾部点。例如,user ... name .. @ host。

因此,这不是在MailAddress类的错误 - 明确支持这种形式。但我不知道支持他们的原因是什么。我假设也许有些系统实际上接受它们,MS觉得有必要支持这种情况。

另一方面,虽然我可以理解需要提供一些电子邮件地址的验证,但我个人认为在验证中几乎没有必要超级严格。无论如何,系统需要处理坏的,但语法上有效的地址。另一方面,似乎在本地部分末尾的翻倍时期或时期可能是一种常见的错字,所以我可以理解为什么您可能希望它们未通过验证。

+0

”可能是一个常见的错字“ - >正确。出于这个原因,我失败了。我主要是想要失败的地址是a)显然无效,或b)我知道不会被发送,因为MailAddress/MailMessage引发异常(我处理,但仍然...)。 – jreancsu 2014-10-07 20:42:09

相关问题