Різниця між вбудованими та звичайними вкладеннями
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. Однак за відсутності тегу PR_ATTACH_FLAGS MAPI, вкладення перевіряється за властивістю 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");
}
}