C# 获取邮件附件文件名

8
我有一个简单的C#应用程序,用System.Net.Mail类发送SMTP电子邮件。在发送(电子邮件)MailMessage对象之后,我想遍历附件列表并删除与这些附件相关联的原始文件...但是我很难找到与每个附件关联的完整文件路径-而不保留自己的附件文件路径集合。一定有一种好方法可以从附件对象中提取完整的文件路径。
我知道这一定很简单,但我花了太多时间在这上面了...是时候向其他人寻求帮助了。

你是如何将文件作为附件传递的?我没有看到一个直接接受文件名的Attachment constructor。你是在传递FileStream吗?你认为Attachement对象仍然会有源文件名吗? - Rup
@Rup 这里描述了构造函数:http://msdn.microsoft.com/en-us/library/ms144614.aspx。但我认为“Attachment”对象不会保留文件名。 - Joel Lee
@Joel,好的 - 我以为只是设置MIME文件名而不是读取文件。在这种情况下,我的下面的答案将有效:它不会在附件类中保存文件名,而是使用FileStream初始化附件,因此您可以从流中读取名称。 - Rup
3个回答

8
如果您使用filePath参数通过Attachment构造函数添加附件,则可以通过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);
}

因为你提供了代码示例,所以你的回答是最有帮助的,但Rup也有同样的想法,并且他先回答了,所以我给了他正确的答案......但你得到了一票。 - Clinemi

3

您可以:

但请注意,邮件消息(包括附件和其流)可能不会立即被收集或清理,因此您可能无法立即删除文件。如果您确实需要以这种方式处理事情,那么更好的方法是子类化Attachment并记录文件名,同时子类化Dispose(以在基础Dispose之后执行)以执行删除。


1
你的 Attachment.ContentStream 链接缺少结尾的 "x" (应该是 .aspx 文件)。我可以为你编辑,但是我的声望还不够。 - Joel Lee

1

如果这是您自己生成的临时文件,那么您可以设置FileOptions.DeleteOnClose并让操作系统在关闭文件时清理它。 - Rup

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接