正确处理 SmtpClient 使用的资源

Posted

技术标签:

【中文标题】正确处理 SmtpClient 使用的资源【英文标题】:Properly disposing resources used by SmtpClient 【发布时间】:2010-11-10 19:59:57 【问题描述】:

我有一个 C# 服务,它使用用户凭据连续运行(即不是本地系统 - 虽然我想更改但无法更改)。在大多数情况下,该服务似乎运行良好,但它经常出现故障并无缘无故地重新启动(服务管理器设置为在崩溃时重新启动服务)。

我正在做大量的事件记录,并且我有一个分层方法异常处理,我认为这至少在某种意义上是有意义的:

基本上我得到了***通用异常、空异常和启动异常处理程序。 然后我在“命令级别”(即服务运行的特定操作)获得了各种处理程序 最后我处理了一些在类级别处理的异常

我一直在查看是否有任何资源没有正确释放,并且我开始怀疑我的邮件代码(发送电子邮件)。我注意到我没有为 MailMessage 对象 调用 Dispose,我现在重写了 SendMail 代码,如下所示。

基本问题是:

此代码是否会正确释放用于发送邮件的所有资源? 我没有看到处置 SmtpClient 对象的方法? (记录:我没有使用对象初始化器来使示例更易于阅读)
    private static void SendMail(string subject, string html)
    
        try
        
            using ( var m = new MailMessage() )
            
                m.From = new MailAddress("service@company.com");
                m.To.Add("user@company.com");
                m.Priority = MailPriority.Normal;
                m.IsBodyHtml = true;
                m.Subject = subject;
                m.Body = html;
                var smtp = new SmtpClient("mailhost");
                smtp.Send(m);
            
        
        catch (Exception ex)
        
            throw new MyMailException("Mail error.", ex);
        
    

【问题讨论】:

【参考方案1】:

我知道这个问题是 .Net 4 之前的问题,但版本 4 现在支持 Dispose 方法,该方法可以正确地将退出发送到 smpt 服务器。请参阅msdn reference 和a newer *** question。

【讨论】:

【参考方案2】:

SmtpClient 类有documented issues。我建议购买第三方控件,因为它们不太贵。 Chilkat 做得不错。

【讨论】:

感谢您的信息 - 我可能需要看看。奇怪的是MailMessage对象实现了IDisposable,而SmtpClient却没有。 是的。该链接上似乎有一个解决方法。可能想检查一下。

以上是关于正确处理 SmtpClient 使用的资源的主要内容,如果未能解决你的问题,请参考以下文章

为啥 MailKit SmtpClient.Send() 失败时我没有收到异常?

C# 使用 SmtpClient 发送内联图像的邮件

C# 使用 SmtpClient 发送带有内联图像的邮件

使用 SmtpClient 发送邮件时图像中断

让 SmtpClient 使用自签名 SSL 证书

SmtpClient - 发送到不同的域