使用 SmtpClient 和 MailMessage 时如何禁止电子邮件验证

Posted

技术标签:

【中文标题】使用 SmtpClient 和 MailMessage 时如何禁止电子邮件验证【英文标题】:How to suppress email validation when using SmtpClient and MailMessage 【发布时间】:2011-03-01 12:52:57 【问题描述】:

使用 SmtpClient 和 MailMessage (.net 3.5) 发送电子邮件时,“收件人”电子邮件地址会在发送前得到验证。我有一大堆电子邮件地址,在 at 符号前有一个点 (.),当您尝试使用 SmtpClient 发送消息时会导致 FormatException。这实际上是一件好事,因为根据规范,at 符号前的点是无效的。不幸的是,这些电子邮件存在于现实世界中,并且如果您使用首选电子邮件客户端发送它们,它们就会被传递。

我的问题是,是否可以禁止通过 SmtpClient/MailMessage 进行电子邮件验证?

【问题讨论】:

看来您可能需要升级到 2010,在那里工作正常,但我在 2005 年遇到了异常(现在无法访问 2008)。 是的,这种情况在 .NET 4 中已修复。VS 2008 使用与 2005 相同的 System.dll,并且具有相同的行为。 我在 dot net 4 和 2010 上有这个 【参考方案1】:

这可能是在尝试发送电子邮件后出错。

您能否提供一些 CallStack,以便我们查看异常的确切位置


更新: 根据reflector的反汇编代码,这个问题只能升级到VS2010和.NET 4.0才能解决

System.Net 程序集的低版本没有办法解决这个问题

【讨论】:

对不起。尝试使用电子邮件地址(例如“test.@example.com”)构造 MailMessage 对象时引发异常。 @Matthias:能否请您发布您正在使用的实际代码,正如我在回复 Barry 上面的评论中所说的那样,我可以使用该格式的地址构建一封电子邮件。我将修改我的答案以包含我使用的示例代码。 @ho1:我的代码和你的差不多。但是我使用 C#,比如 Barry,并且在使用“test.test.@test.com”构造 MailAddress 对象时出现格式异常。 @ho1: 如果你把 MailAddress 写成 = new MailAddress("test.test.@test.com");在 VS 2005 或 2008 中,你应该得到异常。 @Belousov Pavel:是的,正如我在修改后的答案中所写的那样,我也发现了这一点。【参考方案2】:

编辑:在 VB2005 中尝试了示例代码,我也遇到了异常。下面的代码在 VB2010 Express 中运行良好,但似乎是一个现已修复的错误。 MSDN 引用来自 4.0 文档,sn-p 不在 MSDN 页面的早期版本中。

我现在无法尝试,但您的电子邮件地址究竟是如何格式化的? MailAddress 类的文档声明它支持用户名中的连续点和尾随点。例如,用户...名称..@host。(引用自here)。

编辑:添加示例。

Try
    Dim smtpClient As New SmtpClient()
    smtpClient.Host = "mailserver"
    Dim fromAddress As New MailAddress("from@test.com")
    Dim toAddresses As New MailAddress("test.test.@test.com")
    Using message As New MailMessage()
         message.From = fromAddress
         message.To.Add(toAddresses)

         message.IsBodyhtml = False
         message.Subject = "test"
         smtpClient.Send(message)
    End Using
    TextBox1.Text = "OK"
Catch ex As SmtpException
    TextBox1.Text = ex.ToString()
End Try

【讨论】:

这可能是文档说明的内容,但我刚刚对其进行了测试,它不允许test.test.@test.com @Barry:我现在设法尝试了,SmtpClient 对我来说这种格式的地址没有问题。但是,实际的 SMTP 客户端拒绝该地址,因此引发异常,但这与 SmtpClient 无关,它只是传递错误。所以你确定这对你来说不一样吗? 创建新邮件地址时出现 FormatException 错误。我已经在 C# 和 VB (Visual Studio 2008) 中对此进行了测试 和@Barry:同样的情况。我使用 C# 并得到一个 FormatException。

以上是关于使用 SmtpClient 和 MailMessage 时如何禁止电子邮件验证的主要内容,如果未能解决你的问题,请参考以下文章

.NET 使用 SmtpClient 和 Mandrill SMTP 发送失败

SmtpClient - 发送到不同的域

SmtpClient/MailMessage 上的主题编码

如何使用 POP3 和 SmtpClient 转发多部分 MIME 电子邮件?

是否可以捕获使用 SmtpClient 发送的电子邮件的“消息 ID”?

ASP.NET 系列:单元测试之SmtpClient