0

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

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

1 回答 1

3

是的,这是可能的。但是,为了做到这一点,您需要将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

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

于 2016-05-06T15:59:12.300 回答