Разграничаване между вградените и обикновените прикачени файлове
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");
}
}