הבחנה בין קבצים מצורפים משולבים (Inline) לרגילים

Contents
[ ]

מאמר זה מסביר כיצד להבדיל קבצים מצורפים משולבים מאלו הרגילים באמצעות MapiMessage. כאשר מחליטים, סוג הגוף של MapiMessage נלקח בחשבון כדלקמן:

  • גוף טקסט פשוט: הודעות דוא"ל עם גוף טקסט פשוט אינן דורשות בדיקה, מאחר שכל הקבצים המצורפים באותן הודעות הם תמיד קבצים רגילים.
  • גוף HTML: עבור הודעות עם גוף HTML, הקובץ המצורף צריך להכיל לא רק את המאפיין PR_ATTACH_FLAGS (0x37140003), אלא ערכו צריך להיות שווה ל‑0x00000004 עבור קבצים מצורפים משולבים. אם תנאי זה מתקיים, הוא תלוי בנוסף בתגים PR_ATTACH_CONTENT_LOCATION ו‑PR_ATTACH_CONTENT_ID כדי לקבוע את טבע הקובץ המצורף. עם זאת, בהעדר תג MAPI PR_ATTACH_FLAGS, הקובץ נבדק עבור המאפיין PR_ATTACH_DISPOSITION (0x3716001F או 0x3716001E) כדי לקבוע את סוג הקובץ המצורף.
  • גוף RTF: אם הגוף הוא RTF, אז כל קבצי ה‑OLE הם קבצים מצורפים משולבים. ערך PR_ATTACH_METHOD לכל קבצי ה‑OLE שווה ל‑0x00000006.

דוגמת הקוד הבאה מציגה כיצד להבדיל באופן תכנותי בין קבצים מצורפים משולבים וקבצים רגילים. הפונקציה isInlineAttachment מקבלת קובץ מצורף ו‑MapiMessage כפרמטרי קלט ומחזירה true אם הקובץ המצורף הוא משולב.

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();
    }
}

קטע קוד זה משתמש בפונקציה isInlineAttachment() להערכת קבצים מצורפים.

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");
    }
}