Phân biệt giữa Tệp đính kèm Inline và Thông thường
Contents
[
Hide
]
Các tin nhắn email có thể chứa hình ảnh inline cũng như tệp đính kèm. Sử dụng MailMessage, các tệp đính kèm inline có thể được trích xuất từ LinkedResourceCollection bộ sưu tập, trong khi các tệp đính kèm thông thường có thể được truy cập và trích xuất với một tin nhắn có AttachmentCollection bộ sưu tập. Tuy nhiên, điều này khác khi tin nhắn được tải bằng MapiMessage, vì tất cả các hình ảnh inline và tệp đính kèm thông thường đều có thể truy cập cho người dùng trong cùng một MapiAttachmentCollection. Do đó, một phương pháp có thể phân biệt giữa tệp đính kèm inline và tệp đính kèm thông thường khi MapiMessage được sử dụng nếu cần.
Bài viết này giải thích cách phân biệt tệp đính kèm inline và thông thường bằng cách sử dụng MapiMessage. Khi quyết định, loại thân của MapiMessage được tính đến như sau:
- Thân plain text: Các tin nhắn email có loại thân plain text không cần kiểm tra, vì tất cả các tệp đính kèm trong các tin nhắn như vậy luôn là tệp đính kèm thông thường.
- Thân HTML: Đối với các tin nhắn có thân HTML, tệp đính kèm không chỉ cần chứa thuộc tính PR_ATTACH_FLAGS (0x37140003), mà giá trị của nó phải bằng 0x00000004 cho các tệp đính kèm inline. Nếu điều kiện này được đáp ứng, thì còn phụ thuộc vào các thẻ PR_ATTACH_CONTENT_LOCATION và PR_ATTACH_CONTENT_ID để xác định tính chất của tệp đính kèm. Tuy nhiên, khi không có thẻ MAPI PR_ATTACH_FLAGS, tệp đính kèm sẽ được kiểm tra thuộc tính PR_ATTACH_DISPOSITION (0x3716001F hoặc 0x3716001E) để xác định loại tệp đính kèm.
- Thân RTF: Nếu thân là RTF, thì tất cả các tệp đính kèm OLE đều là tệp đính kèm inline. Giá trị của PR_ATTACH_METHOD cho tất cả các tệp đính kèm OLE bằng 0x00000006.
Mẫu mã sau minh họa cách phân biệt programmatically giữa tệp đính kèm inline và thông thường. Hàm isInlineAttachment nhận một tệp đính kèm và MapiMessage làm tham số đầu vào và trả về true nếu tệp đính kèm là inline.
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();
}
}
Đoạn mã này sử dụng hàm isInlineAttachment() để đánh giá các tệp đính kèm.
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");
}
}