แยกแยะระหว่างไฟล์แนบแบบ Inline และแบบปกติ
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");
}
}