验证字符串是否为有效电子邮件地址的最优雅的代码是什么?
那这个呢?
bool IsValidEmail(string email) { var trimmedEmail = email.Trim(); if (trimmedEmail.EndsWith(".")) { return false; // suggested by @TK-421 } try { var addr = new System.Net.Mail.MailAddress(email); return addr.Address == trimmedEmail; } catch { return false; } }
根据 Stuart 的评论,这会将最终地址与原始字符串进行比较,而不是始终返回 true。MailAddress 尝试将带有空格的字符串解析为“显示名称”和“地址”部分,因此原始版本返回误报。
为了澄清,问题是询问特定字符串是否是电子邮件地址的有效表示,而不是电子邮件地址是否是发送消息的有效目的地。为此,唯一真正的方法是发送消息进行确认。
请注意,电子邮件地址比您最初想象的要宽容。这些都是完全有效的形式:
对于大多数用例,虚假的“无效”比虚假的“有效”对您的用户和未来的证明更糟糕。这是一篇曾经是该问题的公认答案的文章(该答案已被删除)。它有更多的细节和如何解决问题的其他一些想法。
提供健全性检查对于用户体验来说仍然是一个好主意。假设电子邮件地址有效,您可以查找已知的顶级域,检查域中的 MX 记录,检查常见域名 (gmail.cmo) 中的拼写错误等。然后向用户发出警告有机会说“是的,我的邮件服务器确实允许馃尞馃嵆馃巵作为电子邮件地址。”
至于对业务逻辑使用异常处理,我同意这是要避免的事情。但这是方便和清晰可能超过教条的情况之一。
此外,如果您对电子邮件地址进行任何其他操作,则可能需要将其转换为 MailAddress。即使您不使用这个确切的功能,您也可能希望使用相同的模式。您还可以通过捕获不同的异常来检查特定类型的故障:空、空或无效格式。
-– 延伸阅读 —
System.Net.Mail.MailAddress 的文档
解释构成有效电子邮件地址的内容