تفاوت بین پیوستهای Inline و معمولی
Contents
[
Hide
]
پیامهای ایمیل ممکن است شامل تصاویر Inline همچنین پیوستها باشند. با استفاده از MailMessage، پیوستهای Inline میتوانند استخراج شوند از LinkedResourceCollection مجموعه بارگذاری میشود، در حالی که پیوستهای معمولی میتوانند با استفاده از یک پیام استخراج شوند AttachmentCollection مجموعه. با این حال، این متفاوت است زمانی که پیام با استفاده از MapiMessage، زیرا تمام تصاویر inline و پیوستهای معمولی در یک مکان برای کاربر قابل دسترسی هستند MapiAttachmentCollection. به همین دلیل، روشی که بتواند بین یک پیوست inline و یک پیوست معمولی تمایز قائل شود وقتی که MapiMessage در صورت نیاز استفاده میشود.
این مقاله توضیح میدهد چگونه پیوستهای 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");
}
}