Mimekit,IMapClient无需下载整封邮件即可获取附件信息

本文关键字:获取 信息 IMapClient 下载 Mimekit | 更新日期: 2024-12-05 19:11:05

我使用以下代码获取主题信息。

是否可以知道电子邮件是否包含附件,也许更具体地说是 excel 电子表格 (xls/xlsx),而无需下载整封邮件?

client.Connect("imap.gmail.com", 993);
client.Authenticate("spyperson", "secret-word");
var inbox = client.Inbox;
inbox.Open(FolderAccess.ReadOnly);
Console.WriteLine("Total messages: {0}", inbox.Count);
Console.WriteLine("Recent messages: {0}", inbox.Recent);
var uids = inbox.Search(SearchQuery.NotSeen);
foreach (var summary in inbox.Fetch(uids, MessageSummaryItems.Full | MessageSummaryItems.UniqueId | MessageSummaryItems.Flags))
{
    Console.WriteLine("[summary] {0:D2}: {1}:{2}", summary.Index, summary.Envelope.Subject, summary.Flags);
}

Mimekit,IMapClient无需下载整封邮件即可获取附件信息

是的,这是可能的。但是,为此,您需要将 MessageSummaryItems.BodyStructure 标志传递给 Fetch() 方法。

这将填充summary.Body属性。

如果填充了 Body 属性,则可以使用 BodyParts 属性作为快速和脏兮兮的方式,遍历邮件中扁平化的正文部分层次结构,检查其中是否有任何附件,如下所示:

var hasAttachments = summary.BodyParts.Any (x => x.IsAttachment);

检查 xls/xlsx 附件的一种方法可能是:

var hasAttachments = summary.BodyParts.Any (x => x.IsAttachment &&
    x.FileName != null && (x.FileName.EndsWith (".xls") ||
    x.FileName.EndsWith (".xslsx")));

但是,这些检查非常简单,并且很可能您对附件是什么或不是附件的解释将与IsAttachment属性告诉您的内容冲突,因此我可能会建议使用访问者模式来遍历MIME层次结构,或者使用递归并使用您自己的逻辑来确定部分是否是您自己的自定义定义中的附件(每个人似乎对构成"附件",当涉及到电子邮件时)。

我在以下位置有关于常见 MIME 层次结构的文档:

  1. http://www.mimekit.net/docs/html/WorkingWithMessages.htm#MessageStructure
  2. http://www.mimekit.net/docs/html/FrequentlyAskedQuestions.htm#MessageBody

。可能还有其他地方。