Skip to main content
 首页 » 编程设计

c#之为什么 SMTP 邮件附件在客户端处理时不处理

2024年01月18日35jirigala

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

请您参考如下方法:

SmtpClient 的 Send() 方法不(也不应该)负责处理 MailMessage(及其相关 Assets )。 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); 
} 

如果消息的附件在第一次调用后已经处理完毕,则第二次调用将失败。

让 SmtpClient 假设您在第一次发送 MailMessage 后就完成了它是不正确的。 Send() 方法应该发送电子邮件,而不是发送并处理消息 Assets 。您的程序可能需要在程序的后面对附件流做进一步的工作。