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

C# 从邮件附件中获取文件名,c#,email,filenames,attachment,system.net.mail,C#,Email,Filenames,Attachment,System.net.mail,我有一个简单的C#应用程序,可以发送SMTP电子邮件(使用System.Net.Mail类)。发送(通过电子邮件发送)MailMessage对象后,我希望遍历附件列表并删除与这些附件关联的原始文件。。。但是我很难找到与每个附件相关联的完整文件路径,因为我没有保存自己的附件文件路径集合。必须有一种很好的方法从附件对象提取完整的文件路径 我知道这一定很简单,但我在这方面花了很多时间。有时间问别人。通常最容易采取稍微不同的策略,并通过memorystream而不是文件进行附加。这样,您就避免了将文件保

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


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

通常最容易采取稍微不同的策略,并通过memorystream而不是文件进行附加。这样,您就避免了将文件保存到磁盘并在以后清理这些文件的所有问题

你可以

  • 阅读
  • 如果您现在有StreamReader或类似工具,请使用该属性尝试查找内部文件流
  • 阅读

但请记住,邮件消息(以及附件及其流)可能不会立即被收集或清理,因此您可能无法立即删除该文件。如果确实需要这样做,您可以更好地对附件进行子类化,并记录文件名和子类Dispose(在基本Dispose之后执行)以执行删除操作。

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

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

您如何将文件作为附件传递进来?我看不到直接接受文件名的。你在传递文件流吗?为什么您认为Attachement对象仍然具有源文件名?@Rup构造函数描述如下:。但是我不认为
附件
对象保留了文件名。@Joel啊,好吧-我认为只是设置了MIME文件名而不是读取文件。在这种情况下,我下面的答案会起作用:这不会将文件名保存在attachment类中,但会使用文件流初始化附件,以便您可以从流中读取名称。如果是您自己生成的临时文件,则可以设置FileOptions.DeleteOnClose并保留操作系统来清理它。您的链接
Attachment.ContentStream
结尾缺少一个“x”。(应该是.aspx文件。)我会为你编辑它,但是还没有足够的代表。因为代码示例,你的回答是最有帮助的,但是Rup有同样的想法,他是第一个,所以我给了他正确的回答…但是你得到了投票。
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);
}