【问题标题】:How to check if message has attachments (MailKit)如何检查邮件是否有附件(MailKit)
【发布时间】:2014-06-06 12:40:29
【问题描述】:

我正在使用名为 MailKit 的 IMAP4 客户端。

效果很好,但我不知道邮件是否有附件。

我试过了:

var summary = inbox.Fetch(MessageId,MessageSummaryItems.Body,cancel.Token).FirstOrDefault();  
var bodyMultiPart = summary.Body as BodyPartMultipart;
if (bodyMultiPart != null)
{
   foreach (var bodyPart in bodyMultiPart.BodyParts.Where(x => x is BodyPartBasic))
   {
        BodyPartBasic basicPart = bodyPart as BodyPartBasic;
        if (basicPart.ContentDisposition != null && basicPart.ContentDisposition.IsAttachment)
        {
           //add basic part as attachment
        }               
   }    
}

但对于某些消息(例如:以 PDF 作为附件的消息),内容处置为 null

【问题讨论】:

    标签: c# .net imap


    【解决方案1】:

    尝试使用 MessageSummaryItems.BodyStructure 而不是 MessageSummaryItems.Body。

    BODYSTRUCTURE 为每个身体部位检索比 BODY 更多的细节。我认为 Content-Disposition 标头是 BODYSTRUCTURE 通过普通 BODY 检索的额外内容之一。

    希望对您有所帮助。

    【讨论】:

    • 在什么情况下不起作用?是什么让您认为根据您上面粘贴的逻辑,应该将某些东西视为附件而不被视为附件?
    • 我的邮件附有 PDF 文件,有时仅被视为带有附件。 MessageSummaryItems.BodyStructure 的行为不一致。
    • 如果不一致,则说明服务器不一致或发送邮件客户端不一致。查看原始消息源 - pdf 附件是否有 Content-Disposition 标头?是不是说是附件?
    • 请记住,您用来确定 MIME 部分是否为附件的逻辑是基于现有的 Content-Disposition 标头 并且 的值为 "附件”(相对于“内联”或任何其他值)。这只是一个启发式。您可以使用任何您想要的启发式方法,但一般来说,这是邮件客户端使用的启发式方法(它们还会显示它们无法呈现为附件的 MIME 部分)。
    【解决方案2】:

    content disposition 为空时,可以使用内容类型作为提示:text/* 很少是附件,multipart/* 不是提示,其他类型一般提示附件。

    PDF 是 application/pdf,所以根据这个启发式,这是一个附件。

    【讨论】:

    • 感谢您的帮助:)
    • 通常不将某些内容视为附件,除非它具有值为“附件”的 Content-Disposition 标头和/或如果客户端本身不知道如何呈现部分内容。
    猜你喜欢
    • 1970-01-01
    • 2021-03-13
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2015-01-23
    相关资源
    最近更新 更多