التمييز بين المرفقات المضمّنة والعامة

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