C#从邮件附件中获取文件名

时间:2011-05-06 14:11:41

标签: c# email filenames attachment system.net.mail

我有一个发送SMTP电子邮件的简单C#应用程序(使用System.Net.Mail类)。发送(通过电子邮件发送)MailMessage对象后,我想遍历附件列表并删除与这些附件相关联的原始文件...但我很难找到与每个附件关联的完整文件路径 - 而不保留我的自己的附件文件路径集合。必须有一种从附件对象中提取完整文件路径的好方法。

我知道这一定很简单,但我花了很多时间在这个时间来问别人。

3 个答案:

答案 0 :(得分:8)

如果您通过带有Attachment参数的filePath构造函数添加附件,则可以通过ContentStream属性检索这些附件,其类型为FileStream。以下是如何获取所附文件的文件名:

var fileNames = message.Attachments
    .Select(a => a.ContentStream)
    .OfType<FileStream>()
    .Select(fs => fs.Name);

但请不要忘记先处理MailMessage个对象,否则您将无法删除这些附件:

IEnumerable<string> attachments = null;
using (var message = new MailMessage())
{
    ...
    attachments = message.Attachments
        .Select(a => a.ContentStream)
        .OfType<FileStream>()
        .Select(fs => fs.Name);
}

foreach (var attachment in attachments )
{
    File.Delete(attachment);
}

答案 1 :(得分:3)

你可以

但请记住,邮件消息(以及附件及其流)可能无法立即收集或清理,因此您可能无法立即删除该文件。您可以做更好的子类化附件,并记录文件名和子类Dispose(在基本配置后执行)进行删除,如果你真的需要这样做的话。

答案 2 :(得分:1)

通常最容易采用稍微不同的方法并通过内存流而不是文件附加。这样就可以避免将文件保存到磁盘并在之后清理它们的所有问题。

Short article here on that.