Различие между встроенными и обычными вложениями
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");
}
}