代码之家  ›  专栏  ›  技术社区  ›  Jim

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

  •  0
  • Jim  · 技术社区  · 9 年前

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

    在不下载整个邮件的情况下,有可能知道电子邮件是否包含附件,或者更具体地说,是否包含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);
    }
    
    1 回复  |  直到 9 年前
        1
  •  3
  •   jstedfast    9 年前

    是的,这是可能的。然而,为了做到这一点,您需要通过 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属性告诉您的内容相冲突,因此,我可能建议使用Visitor模式来遍历MIME层次结构,或者使用递归并使用您自己的逻辑来确定一个部分是否是您自己的自定义定义的附件(每个人似乎都有自己独特的解释,当谈到电子邮件时,什么是“附件”)。

    我在以下位置获得了常见MIME层次结构的文档:

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

    …可能还有其他地方。