Mimekit,IMapClient获取附件信息而无需下载整个消息
问题描述:
我正在使用以下代码获取主题信息。Mimekit,IMapClient获取附件信息而无需下载整个消息
是否有可能知道电子邮件是否包含附件,或许更具体地说是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
财产迭代的消息中的身体部位扁平层次的快速&肮脏的方式,检查其中是否有附件这样的:
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层次文档:
- http://www.mimekit.net/docs/html/WorkingWithMessages.htm#MessageStructure
- http://www.mimekit.net/docs/html/FrequentlyAskedQuestions.htm#MessageBody
...,可能其他地方。