当客户端处理SMTP邮件附件时,为什么不处理?

本文关键字:处理 为什么不 SMTP 客户端 | 更新日期: 2023-09-27 18:12:16

这是我最近解决的一个问题,但我想知道是否有人可以帮助我澄清这一点,因为我不完全理解到底发生了什么。我创建了一个简单的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?
        }
    }

当客户端处理SMTP邮件附件时,为什么不处理?

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只是假设在第一次发送邮件后就完成了对邮件的处理,那将是不正确的。Send()方法应该发送电子邮件,而不是发送并处理消息资产。您的程序可能需要在稍后的程序中对附件流做进一步的工作。