הבחנה בין קבצים מצורפים משולבים (Inline) לרגילים
Contents
[
Hide
]
הודעות דוא"ל עשויות להכיל תמונות משולבות (inline) וכן קבצים מצורפים. באמצעות MailMessage, הקבצים המצורפים המשולבים ניתנים לחילוץ מתוך ה‑ LinkedResourceCollection אוסף, בעוד שהקבצים המצורפים הרגילים נגישים וניתנים לחילוץ עם ה‑ AttachmentCollection אוסף. עם זאת, זה שונה כאשר ההודעה נטענת באמצעות MapiMessage, שכן כל התמונות המשולבות והקבצים המצורפים הרגילים נגישים למשתמש באותו MapiAttachmentCollection. ולכן, שיטה שיכולה להבדיל בין קובץ מצורף משולב (inline) לקובץ רגיל כאשר 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");
}
}