Unterscheiden zwischen Inline‑ und regulären Anhängen
Contents
[
Hide
]
E‑Mail‑Nachrichten können Inline‑Bilder sowie Anhänge enthalten. Mit MailMessage, können Inline‑Anhänge aus der LinkedResourceCollection Sammlung, während reguläre Anhänge über die Nachrichten‑ AttachmentCollection Sammlung zur Verfügung stehen. Dies ist jedoch anders, wenn die Nachricht geladen wird mit MapiMessage, da alle Inline‑Bilder und regulären Anhänge dem Benutzer im selben MapiAttachmentCollection. Daher eine Methode, die zwischen einem Inline‑ und einem regulären Anhang unterscheiden kann, wenn MapiMessage wird bei Bedarf verwendet.
Dieser Artikel erklärt, wie man Inline‑Anhänge von regulären Anhängen unterscheidet, indem man MapiMessage. Bei der Entscheidung wird der Body‑Typ von MapiMessage wird wie folgt berücksichtigt:
- Plain‑Text‑Body: E‑Mail‑Nachrichten mit reinem Text‑Body müssen nicht geprüft werden, da alle Anhänge in solchen Nachrichten stets reguläre Anhänge sind.
- HTML‑Body: Bei Nachrichten mit einem HTML‑Body sollte der Anhang nicht nur die Eigenschaft PR_ATTACH_FLAGS (0x37140003) enthalten, sondern deren Wert muss für Inline‑Anhänge 0x00000004 sein. Wenn diese Bedingung erfüllt ist, hängt die Bestimmung der Anhangsart weiter von den Tags PR_ATTACH_CONTENT_LOCATION und PR_ATTACH_CONTENT_ID ab. Fehlt jedoch das MAPI‑Tag PR_ATTACH_FLAGS, wird der Anhang anhand der Eigenschaft PR_ATTACH_DISPOSITION (0x3716001F oder 0x3716001E) überprüft, um den Anhangstyp zu bestimmen.
- RTF‑Body: Wenn der Body RTF ist, dann sind alle OLE‑Anhänge Inline‑Anhänge. Der Wert von PR_ATTACH_METHOD für alle OLE‑Anhänge ist 0x00000006.
Das folgende Code‑Beispiel demonstriert, wie man programmgesteuert zwischen Inline‑ und regulären Anhängen unterscheidet. Die Funktion isInlineAttachment nimmt einen Anhang und ein MapiMessage-Objekt als Eingabeparameter und gibt true zurück, wenn der Anhang ein Inline‑Anhang ist.
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();
}
}
Dieses Code‑Snippet verwendet die Funktion isInlineAttachment(), um Anhänge zu prüfen.
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");
}
}