【问题标题】:Why Doesn't SMTP Mail Attachment Dispose When Client Does?为什么 SMTP 邮件附件在客户端处理时不处理?
【发布时间】:2014-07-10 13:54:41
【问题描述】:

这是我最近解决的一个问题,但我想知道是否有人可以帮我解决这个问题,因为我不完全了解到底发生了什么。我创建了一个简单的 smtp 电子邮件客户端,并将其包装在 using 语句中以处理它。在电子邮件中,我添加了一个我即时生成的 PDF 文件附件。发送电子邮件后,我想销毁 PDF,因为它暂时保存在机器本地以便发送电子邮件。当 File.Delete() 方法运行时,我会收到 IIS 工作进程正在锁定文件的错误。我不明白为什么,因为在我尝试删除文件之前我的客户已经被处理掉了。最后我发现在删除文件之前我也必须处理附件。所以,我的问题是为什么不处理客户也处理附件?不是客户的附件部分,因此一旦客户被处置,它应该被处置吗?示例代码如下:

try
    {
        using (SmtpClient SmtpMail = new SmtpClient(""))
        {
            MailMessage message = new MailMessage(From, To, Subject, Body);
            message.IsBodyHtml = false;
            message.Priority = MailPriority.Normal;
            Attachment attachment = new Attachment(pdfString);
            message.Attachments.Add(attachment);
            SmtpMail.Send(message);
            attachment.Dispose(); //Why is this needed?
        }
    }

【问题讨论】:

  • 这样的问题最好在 StackOverflow 上提出。
  • 您能解释一下原因吗?我问的不是代码问题的答案,而是代码背后的理论。

标签: c#


【解决方案1】:

SmtpClient 的Send() 方法不(也不应该)负责处理MailMessage(及其相关资产)。 SmtpClient 无法假设您在 MailMessage 发送后的预期用途。您可能希望继续使用 MailMessage 或附件流来做其他事情。

让我们考虑一个 MailMessage 实例将被多个 SmtpClient 重用的情况。

var message = new MailMessage();

using(var client1 = new SmtpClient())
{
    client1.Send(message);
}

...

using(var client2 = new SmtpClient())
{
    client2.Send(message);
}

如果message的附件在第一次调用后已经被释放,第二次调用会失败。

如果 SmtpClient 仅假设您在第一次发送 MailMessage 后就完成了它,那将是不正确的。 Send() 方法应该发送一封电子邮件,而不是发送并处理消息资产。您的程序可能需要在程序的后面对附件流进行进一步的处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    相关资源
    最近更新 更多