System.Net.MailMessage 允许某些无效的电子邮件地址格式

2024-01-07

许多人可能已经意识到,正确验证电子邮件地址可能有点像一场噩梦。您可以整天搜索与当前 RFC 标准匹配的 C# 正则表达式,您会发现不同的正则表达式会给出不同的结果。

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

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

除最后一个之外,上述所有测试用例均通过。

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

到底为什么要这样做[email protected] /cdn-cgi/l/email-protection and [email protected] /cdn-cgi/l/email-protection无法抛出 System.FormatException?微软还是维基百科,谁错了?是否有任何电子邮件地址可以允许尾随句点或双句点?我的验证应该允许他们吗?我有适当的异常处理,以便在发生异常时允许我的电子邮件传送服务继续正常运行,但我想丢弃无效或肯定会引发异常的电子邮件地址。


没有解释为什么,但是MSDN 的文档System.Net.Mail.MailAddress http://msdn.microsoft.com/en-us/library/System.Net.Mail.MailAddress.aspx指出支持此地址格式:

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

...

  • 用户名中的连续点和尾随点。例如,用户...名称..@主机。

所以这不是一个错误MailAddress类 - 明确支持该形式。但我不知道支持他们的理由是什么。我认为也许有些系统实际上接受它们,并且微软认为有必要支持这种情况。

另一方面,虽然我可以理解需要对电子邮件地址进行一些验证,但我个人的观点是,在验证方面几乎没有必要非常严格。无论如何,系统需要处理错误但语法有效的地址。另一方面,本地部分末尾的双句点或句点似乎是常见的拼写错误,所以我可以理解为什么您可能希望它们验证失败。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

System.Net.MailMessage 允许某些无效的电子邮件地址格式 的相关文章

  • 捕获 foreach 条件中抛出的异常

    我有一个foreach在 foreach 本身的条件下循环期间中断的循环 有没有办法try catch抛出异常然后继续循环的项 这将运行几次 直到异常发生然后结束 try foreach b in bees exception is in
  • ruby 正则表达式匹配模式的多次出现

    我正在寻找构建一个 ruby 正则表达式来匹配模式的多次出现并将它们返回到数组中 模式很简单 即 两个左括号 一个或多个字符 后跟两个右括号 这就是我所做的 str Some random text lead first name and
  • Linux TUN/TAP:无法从 TAP 设备读回数据

    问题是关于如何正确配置想要使用 Tun Tap 模块的 Linux 主机 My Goal 利用现有的路由软件 以下为APP1和APP2 但拦截并修改其发送和接收的所有消息 由Mediator完成 我的场景 Ubuntu 10 04 Mach
  • 为什么 BOOST_FOREACH 不完全等同于手工编码的?

    From 增强文档 http www boost org doc libs 1 48 0 doc html foreach html foreach introduction what is literal boost foreach li
  • 在 C# 中将位从 ulong 复制到 long

    所以看来 NET 性能计数器类型 http msdn microsoft com en us library system diagnostics performancecounter aspx有一个恼人的问题 它暴露了long对于计数器
  • 转到 C# WPF 中的第一页

    我正在 WPF 中使用导航服务 为了导航到页面 我使用 this NavigationService Navigate new MyPage 为了返回我使用 this NavigationService GoBack 但是如何在不使用的情况
  • 禁用 LINQ 上下文的所有延迟加载或强制预先加载

    我有一个文档生成器 目前包含约 200 个项目的查询 但完成后可能会超过 500 个 我最近注意到一些映射表示延迟加载 这给文档生成器带来了一个问题 因为它需要根据生成的文档来访问所有这些属性 虽然我知道DataLoadOptions可以指
  • 为什么 FTPWebRequest 或 WebRequest 通常不接受 /../ 路径?

    我正在尝试从 ftp Web 服务器自动执行一些上传 下载任务 当我通过客户端甚至通过 Firefox 连接到服务器时 为了访问我的目录 我必须指定如下路径 ftp ftpserver com AB00000 incoming files
  • 组合框项目为空但数据源已满

    将列表绑定到组合框后 其 dataSource Count 为 5 但组合框项目计数为 0 怎么会这样 我习惯了 Web 编程 而且这是在 Windows 窗体中进行的 所以不行combo DataBind 方法存在 这里的问题是 我试图以
  • 通过等待任务或访问其 Exception 属性都没有观察到任务的异常

    这些是我的任务 我应该如何修改它们以防止出现此错误 我检查了其他类似的线程 但我正在使用等待并继续 那么这个错误是怎么发生的呢 通过等待任务或访问其 Exception 属性都没有观察到任务的异常 结果 未观察到的异常被终结器线程重新抛出
  • C# 搜索目录中包含字符串的所有文件,然后返回该字符串

    使用用户在文本框中输入的内容 我想搜索目录中的哪个文件包含该文本 然后我想解析出信息 但我似乎找不到该字符串或至少返回信息 任何帮助将不胜感激 我当前的代码 private void btnSearchSerial Click object
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • 如何检测 C# 中该字典键是否存在?

    我正在使用 Exchange Web 服务托管 API 和联系人数据 我有以下代码 即功能性的 但并不理想 foreach Contact c in contactList string openItemUrl https service
  • 为什么我使用google'smtp'无法发送电子邮件?

    我有以下程序使用 smtp gmail com 587 发送电子邮件 namespace TestMailServer class Program static void Main string args MailMessage mail
  • Fluent NHibernate 日期时间 UTC

    我想创建一个流畅的 nhibernate 映射来通过以下方式映射 DateTime 字段 保存时 保存 UTC 值 读取时 调整为本地时区值 实现此映射的最佳方法是什么 就我个人而言 我会将日期存储在 UTC 格式的对象中 然后在读 写时在
  • 如何打开 Windows 资源管理器窗口并选择特定文件夹

    我有一个 winform 应用程序 这个 winform 应用程序创建了几个文件 我想在我的应用程序中实现 查找目标 功能来显示这些文件 这些文件位于同一文件夹中 看图片 假设我创建了几个文件 C Test 文件夹 该文件夹包含以下文件 C
  • Pure Bash 替换捕获组

    我有这个示例字符串 test string 13A6 该字符 数字可以是从 0 到 9 以及从 A 到 F 我想要这个输出 1 3 A 6 我有这个工作 result echo test string sed s g 我想在没有 sed 的
  • Swagger 为 ASP.CORE 3 中的字典生成错误的 URL

    当从查询字符串中提取的模型将字典作为其属性之一时 Swagger 会生成不正确的 URL 如何告诉 Swagger 更改 URL 中字典的格式或手动定义输入参数模式而不自动生成 尝试使用 Swashbuckle 和 NSwag 控制器 pu
  • Azure函数版本2.0-应用程序blobTrigger不工作

    我有一个工作功能应用程序 它有一个 blob 输入和一个事件中心输出 在测试版中工作 随着最新的更改 我的功能不再起作用 我尝试根据发行说明更新 host json 文件 但它没有引用 blob 触发器 version 2 0 extens
  • 如何确定母版页中正在显示哪个子页?

    我正在母版页上编写代码 我需要知道正在显示哪个子 内容 页面 我怎样才能以编程方式做到这一点 我用这个 string pageName this ContentPlaceHolder1 Page GetType FullName 它以 AS

随机推荐

  • WPF 动画持续时间

    我有一个如下所示的故事板 持续时间 0 0 1 已完成 DeviceExplorer Completed gt 由于某种原因 动画似乎不是线性工作的 如果我将持续时间更改为 Duration 0 0 0 8 并将故事板分配给按钮的 Mous
  • 如何在不造成内存泄漏的情况下删除 DOM 元素?

    我的 JavaScript 代码构建了一个列表LI元素 当我更新列表时 内存使用量会增加并且永远不会下降 我在 sIEve 中进行了测试 它表明浏览器保留了所有应该被删除的元素 remove or emptyjQuery 命令 我应该怎么做
  • 我需要帮助来使用 R 解决 SQL 任务(基本函数、dplyr 和 data.table 函数)[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我需要写出一个已经在 SQL 中的 R 查询 任务是将查询从 SQL 转录 为 R 我还导入了 Posts 库 我需要通过三种方式完成任务
  • 以中间元素为基准的快速排序

    我对快速排序的理解是 选择一个枢轴元素 在本例中我选择中间元素作为 枢 在极值处初始化左指针和右指针 找到枢轴左侧第一个大于枢轴的元素 同样找到枢轴右侧第一个小于枢轴的元素 交换 3 和 4 中的元素 重复 3 4 5 除非左 gt 右 对
  • RecyclerView:notify* 和scrollToPostion 之间的竞争条件?

    之间可能存在竞争条件notify 的方法RecyclerView Adapter and scrollToPosition and smoothScrollToPosition 的RecyclerView本身 如果是这样 我该如何强制scr
  • jQuery UI Datepicker 仅启用数组中的特定日期

    我试图禁用日期选择器中的所有日期 并仅启用数组中的日期 这是我到目前为止的代码http jsfiddle net peter yXMKC http jsfiddle net peter yXMKC 问题是只有 5 月 14 日才显示为已启用
  • Spring 3 AJAX POST请求与@RequestBody和@ModelAttribute和@SessionAttribute一起使用?

    有一个 Java spring MVC Web 应用程序 并且正在发出 jquery ajax post 请求 我的控制器设置为接收和发送 json 数据 一切正常 JSON 字符串格式良好 控制器可以创建并填充 Command 对象 并使
  • Chrome 控制台中展开视图与折叠视图中的按键顺序

    在工作的同时另一个问题 https stackoverflow com questions 70847891 promises keep track of matching input output identifiers 我被 Chrom
  • 如何使用指定的字符集在 Java 8 中将文本附加到文件

    我正在寻找一种简单且保存的解决方案 使用指定的方法将文本附加到 Java 8 中的现有文件中Charset cs 我找到的解决方案here https stackoverflow com questions 1625234 how to a
  • 测试 Spring @MVC 注释

    前几天我遇到了一个问题 Valid 注释被意外地从控制器类中删除 不幸的是 它没有破坏我们的任何测试 我们的单元测试都没有真正运用 SpringAnnotationMethodHandlerAdapter途径 我们只是直接测试我们的控制器类
  • 这就是你构建 CSS 样式表的方式吗?

    抛开是否应该提供单个或多个样式表的问题 假设您只发送一个样式表 您认为这是一个基本结构吗 结构 任何模板布局内容都应该放入此处 例如页眉 页脚 正文等 结构体结束 常用组件 重复的元素 例如注册表单 列表等 公共组件结束 具体第1页 有些页
  • 如何将鼠标事件委托给 JavaFX 中所有底层重叠窗格?

    我有一些顶部装饰窗格 我想处理 预处理鼠标事件 但不应该消耗它们 即所有重叠的窗格都应该像它们没有被装饰窗格重叠一样工作 这个怎么做 我尝试了几次都失败了 下面是包含 3 个窗格的代码 绿色的是 装饰 任务是使其对鼠标事件透明 黄色和蓝色窗
  • Haskell 中的非整体数组

    我已经接受了下面问题的答案 但我似乎误解了 haskell 中的数组是如何工作的 我以为他们只是加强了清单 阅读下面的问题时请记住这一点 我发现当将 Haskell 中的整体数组用于较大的数组时 它们的效率非常低 我还没能在 haskell
  • R - ggplot 中奇怪的饼图行为

    我正在尝试从一个小数据框中生成一个饼图 起初一切顺利 library ggplot2 library data table c1 lt c 2 3 c2 lt c second third c2 lt factor c2 levels c
  • 获取Python字典中最大嵌套键的键

    我有一本像这样的字典 my dictionary key1 a 1 b 1 c 10 key2 a 1 b 1 c 11 key3 a 1 b 1 c 12 如何比较该字典的 c 子键 找到最大的子键 并返回该字典的相应父键 在本例中我想输
  • 骨干.marionette + i18n + 车把

    有人可以发布一个将这些库组合在一起的示例吗 包括 i18n 和 marionette 的处理程序 Thanks 指向backbone marionette 模板来编译hendlebars 这可以在你的 main js 上完成 Backbon
  • 如何使回收器视图开始从中心添加项目?

    我有一个以 水平线性布局 作为布局管理器的 recyclerView Recycler View 采用框架布局 layout gravity center layout width wrap content 我希望回收器视图开始从中心添加项
  • 如何判断 MouseDown 事件中是否按下了 Shift?

    我正在抓一个MouseDown控件上的事件 这给了我一个MouseEventArgs签名中的对象 现在我希望能够判断用户在单击时是否按住了 Shift 或 Control 键 但是MouseEventArgs对象不包含任何键盘信息 What
  • 页面内锚链接的 jQuery this.hash 行为

    我有一个关于 this hash 如何在 jQuery 中的页面锚链接工作的问题 每次用户单击该链接时 我都需要处理哈希属性 a href foo class inpageLink Click Me lt a gt a a h3 Targe
  • System.Net.MailMessage 允许某些无效的电子邮件地址格式

    许多人可能已经意识到 正确验证电子邮件地址可能有点像一场噩梦 您可以整天搜索与当前 RFC 标准匹配的 C 正则表达式 您会发现不同的正则表达式会给出不同的结果 如果你看http en wikipedia org wiki Email ad