Differentiera mellan inbäddade och vanliga bilagor

Contents
[ ]

Denna artikel förklarar hur man differentierar inbäddade bilagor från vanliga med hjälp av MapiMessage. Vid beslutsfattande, meddelandets kroppstyp MapiMessage tas i beaktande enligt följande:

  • Vanlig text‑kropp: E‑postmeddelanden med vanlig text‑kropp behöver inte kontrolleras, eftersom alla bilagor i sådana meddelanden alltid är vanliga bilagor.
  • HTML‑kropp: För meddelanden med en HTML‑kropp bör bilagan inte bara innehålla PR_ATTACH_FLAGS (0x37140003), utan dess värde ska vara 0x00000004 för inbäddade bilagor. Om detta villkor uppfylls beror det vidare på taggarna PR_ATTACH_CONTENT_LOCATION och PR_ATTACH_CONTENT_ID för att bestämma bilagans natur. Om PR_ATTACH_FLAGS‑MAPI‑taggen saknas kontrolleras bilagan för PR_ATTACH_DISPOSITION (0x3716001F eller 0x3716001E) för att fastställa bilagans typ.
  • RTF‑kropp: Om kroppen är RTF, då är alla OLE‑bilagor inbäddade bilagor. Värdet för PR_ATTACH_METHOD för alla OLE‑bilagor är 0x00000006.

Följande kodexempel visar hur man programatiskt differentierar mellan inbäddade och vanliga bilagor. Funktionen isInlineAttachment tar en bilaga och ett MapiMessage som inparametrar och returnerar true om bilagan är en inbäddad bilaga.

public static boolean isInlineAttachment(MapiAttachment att, MapiMessage msg) {
    if (msg.getBodyType() == BodyContentType.PlainText)
        // ignore indications for plain text messages
        return false;
    else if (msg.getBodyType() == BodyContentType.Html) {
        // check the PidTagAttachFlags property
        Long attachFlagsValue = att.getPropertyLong(MapiPropertyTag.PR_ATTACH_FLAGS);
        if (attachFlagsValue != null && (attachFlagsValue > 3 || attachFlagsValue < 1)) {
            // check PidTagAttachContentId property
            String contentId = att.getProperties().containsKey(MapiPropertyTag.PR_ATTACH_CONTENT_ID)
                    ? att.getPropertyString(MapiPropertyTag.PR_ATTACH_CONTENT_ID)
                    : att.getPropertyString(MapiPropertyTag.PR_ATTACH_CONTENT_ID_W);
            if (contentId != null && !contentId.isEmpty() && msg.getBodyHtml().contains("cid:" + contentId)) {
                return true;
            }
            // check PidTagAttachContentLocation property
            String contentLocation = att.getProperties().containsKey(MapiPropertyTag.PR_ATTACH_CONTENT_LOCATION)
                    ? att.getPropertyString(MapiPropertyTag.PR_ATTACH_CONTENT_LOCATION)
                    : att.getPropertyString(MapiPropertyTag.PR_ATTACH_CONTENT_LOCATION_W);
            if (contentLocation != null && !contentLocation.isEmpty() && msg.getBodyHtml().contains(contentLocation)) {
                return true;
            }
        }
        return "inline".equals(att.getPropertyString(0x3716001F)) || "inline".equals(att.getPropertyString(0x3716001E));
    } else if (msg.getBodyType() == BodyContentType.Rtf) {
        // If the body is RTF, then all OLE attachments are inline attachments.
        // OLE attachments have 0x00000006 for the value of the PidTagAttachMethod property
        Long attachMethod = att.getPropertyLong(MapiPropertyTag.PR_ATTACH_METHOD);
        return attachMethod != null && attachMethod == 0x00000006;
    } else {
        throw new ArgumentOutOfRangeException();
    }
}

Detta kodsnutt använder funktionen isInlineAttachment() för att utvärdera bilagor.

Java

String fileName = ("Sample.msg");
MapiMessage message = MapiMessage.fromFile(fileName);
MapiAttachmentCollection attachments = message.getAttachments();
for (int i = 0; i < attachments.size(); i++) {
    MapiAttachment attachment = (MapiAttachment) attachments.get(i);
    if (isInlineAttachment(attachment, message)) {
        System.out.println(attachment.getLongFileName() + " is inline attachment");
    } else {
        System.out.println(attachment.getLongFileName() + " is regular attachment");
    }
}