.NET System.Net.Mail.SmtpClient类不会向SMTP事务发出QUIT命令

时间:2009-09-23 15:00:27

标签: .net smtp

有人有这个问题吗?如果是这样,你怎么绕过它呢?我们正在遭遇零星的超时问题,而这一点受到指责。

此处也报道了同样的问题:

  

http://www.vbforums.com/showthread.php?p=3609268

4 个答案:

答案 0 :(得分:10)

我不知道是否有更简单的方法来解决这个特定问题,但有一个选择是下载Mono的SmtpClient源并使用它(必要时进行修改)。他们的版本肯定会发送QUIT命令。

我工作的一个项目要求我们发送大量电子邮件。 .NET的实现效率太低,没有提供任何方法在同一个SMTP会话中发送多个不同的电子邮件。我们重新使用Mono的实现并对其进行修改以允许我们手动控制何时发送QUIT命令并关闭连接。我们必须将25个相关的Mono类合并到我们的项目中(主要是复制+粘贴和编辑命名空间)。

这似乎有点极端,但如果没有办法解决这个问题,它可能是你最好的第三方选择:它是免费的,它不是很多工作,它的API 几乎与原生SmtpClient相同。

答案 1 :(得分:4)

您的应用程序是否在具有IIS的计算机上运行?如果是这样,您可以通过设置SMTP客户端的传递方法来利用内置的SMTP服务,如下所示:

var client = new SmtpClient 
{ 
    DeliveryMethod = SmtpDeliveryMethod.PickupDirectoryFromIis 
};

我在一些应用程序中使用它,它非常可靠。

答案 2 :(得分:4)

它在.Net 4中解决。它们实现了IDispose,它发送QUIT命令并释放资源。

这是MSDN上相关文档的副本:

  

SmtpClient类没有Finalize   方法,所以应用程序必须调用   处理明确释放   资源。 Dispose方法   遍历所有已建立的   与SMTP服务器的连接   在Host属性中指定   发送QUIT消息后跟   优雅地结束TCP连接。   Dispose方法也释放了   Socket使用的非托管资源   并且可选地处理托管   资源。

     

完成后调用Dispose   使用SmtpClient。处理   方法将SmtpClient留在   无法使用的状态。在调用Dispose之后,   你必须释放所有引用   SmtpClient所以垃圾收集器   可以回收那个记忆   SmtpClient占据了。

答案 3 :(得分:0)

看起来我要找第三方产品来解决问题。单声道解决方案听起来很有趣,但我宁愿花几块钱购买商业解决方案。