Mimekit,IMapClient 获取附件信息而不下载整个消息

Mimekit, IMapClient get attachment information without downloading whole message

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

是否可以在不下载整封邮件的情况下知道电子邮件是否包含附件,或许更具体地说是 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);
}

是的,这是可能的。然而,为了做到这一点,您需要将 MessageSummaryItems.BodyStructure 标志传递给 Fetch() 方法。

这将填充 summary.Body 属性。

如果 Body 属性 已填充,您可以使用 BodyParts 属性 作为迭代 [=41 的扁平层次结构的快速且肮脏的方法=] 消息中的部分,检查它们是否是这样的附件:

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 层次结构或使用递归并使用您自己的逻辑来确定某个部分是否为您自己的自定义定义的附件的访问者模式(每个人似乎对 "attachment" 的构成都有自己独特的解释发送电子邮件)。

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

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

...可能还有其他地方。