MailMessage在Path.GetTempPath()中发送后删除附件

时间:2017-07-18 14:33:56

标签: c# .net dispose smtpclient mailmessage

请原谅我对MailMessage和SmtpClient类的新见解。我已经构建了基本上可以工作的东西,但是在准备发送附件时,我有时会将附件复制到临时文件位置(Path.GetTempPath() + @"\" + timestampWithFF),因为它们有时必须压缩才能发送。当发生这种情况时,我想确保在发送后删除那里的文件(特别是因为任何东西都会相对较大)。

双重问题: 1.我应该不打扰清理文件,因为操作系统(win7)会做得好吗? 2.如何在client.SendCompleted

中获取附件的硬盘位置
client.SendCompleted += (s, e) =>
{
    client.Dispose();
    foreach(Attachment a in msg.Attachments)
    {
        // want to actually delete the file from the HDD if it's in Path.GetTempPath();
    }
    msg.Dispose();
};

我看到我可以使用a.Dispose(),但我不知道它做了什么......我怀疑它正在处理对象(msg.Dispose接下来会做什么),但是将文件保留在硬盘上。

我必须单独发送附件的文件路径吗? client.SendCompleted()行位于: sendMailAsync(SmtpClient client, MailMessage msg)方法。我可以改成这个: sendMailAsync(SmtpClient client, MailMessage msg, List<string> attachments) 并将其添加到SendCompleted(),但感觉有点笨重:

string tempDir = Path.GetTempPath();
foreach(string f in attachments)
{
    if(f.Contains(tempDir))    // want to actually delete the file from the HDD if it's in Path.GetTempPath();
    {
        if (File.Exists(f)) { File.Delete(f); }
    }
}

1 个答案:

答案 0 :(得分:2)

  
      
  1. 我不应该为清理文件而烦恼,因为操作系统(win7)会做得很好吗?
  2.   

如果我是你,我仍会删除临时文件,虽然操作系统会在认为必要时清理它

  
      
  1. 如何在client.SendCompleted?
  2. 中获取附件的硬盘位置   

可以通过ContentStream检索附件中的文件。他们的类型是FileStream

client.SendCompleted += (s, e) =>
{
    client.Dispose();
    var fileattachments = msg.Attachments
                          .Select(x => x.ContentStream)
                          .OfType<FileStream>()
                          .Select(fs => fs.Name)
                          .ToArray();

    msg.Dispose();

    string tempPath = Path.GetTempPath();
    foreach (var attachment in fileattachments )
    {
        if(attachment.Contains(tempPath)
        {
            File.Delete(attachment);
        }

    }
};

注意:首先处理msg对象,然后执行删除