تفاوت بین پیوست‌های Inline و معمولی

Contents
[ ]

این مقاله توضیح می‌دهد چگونه پیوست‌های inline را از پیوست‌های معمولی با استفاده از MapiMessage. هنگام تصمیم‌گیری، نوع بدنهٔ MapiMessage به شکل زیر در نظر گرفته می‌شود:

  • بدنه متن ساده: پیام‌های ایمیل با نوع بدنه متن ساده نیازی به بررسی ندارند، زیرا تمام پیوست‌های این پیام‌ها همیشه پیوست‌های معمولی هستند.
  • بدنه HTML: برای پیام‌هایی با بدنه HTML، پیوست فقط باید شامل ویژگی PR_ATTACH_FLAGS (0x37140003) باشد، اما مقدار آن باید برای پیوست‌های inline برابر 0x00000004 باشد. اگر این شرط برقرار باشد، سپس وابسته به برچسب‌های PR_ATTACH_CONTENT_LOCATION و PR_ATTACH_CONTENT_ID برای تعیین نوع پیوست است. با این حال، در صورت عدم وجود برچسب MAPI PR_ATTACH_FLAGS، پیوست با ویژگی PR_ATTACH_DISPOSITION (0x3716001F یا 0x3716001E) بررسی می‌شود تا نوع پیوست مشخص شود.
  • بدنه RTF: اگر بدنه RTF باشد، تمام پیوست‌های OLE به‌عنوان پیوست‌های Inline درنظر گرفته می‌شوند. مقدار PR_ATTACH_METHOD برای تمام پیوست‌های OLE برابر با 0x00000006 است.

نمونه کد زیر به‌صورت برنامه‌نویسی نشان می‌دهد چگونه بین پیوست‌های Inline و معمولی تفکیک کنید. تابع isInlineAttachment یک پیوست و یک MapiMessage را به‌عنوان پارامترهای ورودی دریافت می‌کند و در صورتی که پیوست یک پیوست Inline باشد مقدار 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() برای ارزیابی پیوست‌ها استفاده می‌کند.

جاوا

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