Differentiera mellan inbäddade och vanliga bilagor
Contents
[
Hide
]
E‑postmeddelanden kan innehålla inbäddade bilder samt bilagor. Användning av MailMessage, kan de inbäddade bilagorna extraheras från LinkedResourceCollection samling, medan de vanliga bilagorna kan nås och extraheras med ett meddelandes AttachmentCollection samling. Detta är dock annorlunda när meddelandet laddas med MapiMessage, eftersom alla inbäddade bilder och vanliga bilagor är tillgängliga för användaren i samma MapiAttachmentCollection. Därför en metod som kan differentiera mellan en inbäddad och en vanlig bilaga när MapiMessage används om det behövs.
Denna artikel förklarar hur man differentierar inbäddade bilagor från vanliga med hjälp av MapiMessage. Vid beslutsfattande, meddelandets kroppstyp MapiMessage tas i beaktande enligt följande:
- Vanlig text‑kropp: E‑postmeddelanden med vanlig text‑kropp behöver inte kontrolleras, eftersom alla bilagor i sådana meddelanden alltid är vanliga bilagor.
- HTML‑kropp: För meddelanden med en HTML‑kropp bör bilagan inte bara innehålla PR_ATTACH_FLAGS (0x37140003), utan dess värde ska vara 0x00000004 för inbäddade bilagor. Om detta villkor uppfylls beror det vidare på taggarna PR_ATTACH_CONTENT_LOCATION och PR_ATTACH_CONTENT_ID för att bestämma bilagans natur. Om PR_ATTACH_FLAGS‑MAPI‑taggen saknas kontrolleras bilagan för PR_ATTACH_DISPOSITION (0x3716001F eller 0x3716001E) för att fastställa bilagans typ.
- RTF‑kropp: Om kroppen är RTF, då är alla OLE‑bilagor inbäddade bilagor. Värdet för PR_ATTACH_METHOD för alla OLE‑bilagor är 0x00000006.
Följande kodexempel visar hur man programatiskt differentierar mellan inbäddade och vanliga bilagor. Funktionen isInlineAttachment tar en bilaga och ett MapiMessage som inparametrar och returnerar true om bilagan är en inbäddad bilaga.
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();
}
}
Detta kodsnutt använder funktionen isInlineAttachment() för att utvärdera bilagor.
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");
}
}