【问题标题】:Mimekit, IMapClient get attachment information without downloading whole messageMimekit、IMapClient 获取附件信息而不下载整个消息
【发布时间】:2016-04-27 06:28:37
【问题描述】:

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

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

【问题讨论】:

    标签: c# mailkit mimekit


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      • 2014-08-20
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多