التمييز بين المرفقات المضمّنة والعامة
Contents
[
Hide
]
قد تحتوي رسائل البريد الإلكتروني على صور مضمّنة بالإضافة إلى مرفقات. باستخدام MailMessage، يمكن استخراج المرفقات المضمّنة من LinkedResourceCollection المجموعة، بينما يمكن الوصول إلى المرفقات العادية واستخراجها باستخدام رسالة AttachmentCollection المجموعة. ومع ذلك، يختلف الأمر عندما يتم تحميل الرسالة باستخدام MapiMessage، حيث يمكن للمستخدم الوصول إلى جميع الصور المضمّنة والمرفقات العادية في نفس MapiAttachmentCollection. لذلك، طريقة يمكنها التمييز بين مرفق مضمّن وعادي عندما MapiMessage يُستخدم إذا لزم الأمر.
تشرح هذه المقالة كيفية التمييز بين المرفقات المضمّنة والعادية باستخدام 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");
}
}