Identifizieren und Extrahieren eingebetteter Anhänge aus MSG, formatiert als RTF
Contents
[
Hide
]
E‑Mail‑Nachrichten mit einem RTF‑formatierten Body können Inline‑Anhänge enthalten, die entweder als komplettes Objekt oder als Symbol eingebettet sind. Um zwischen diesen beiden Anhangstypen zu unterscheiden, müssen zunächst bestimmte Eigenschaften des Anhangs untersucht werden. Nach Erfüllung bestimmter Kriterien, die auf den Anhangseigenschaften basieren, kann der Anhang gespeichert werden, indem er aus seinen ObjectData extrahiert wird.
Dieser Artikel erkennt und extrahiert eingebettete Anhänge aus einer MSG‑Datei, die im RTF‑Format vorliegt.
Java
static void ExtractInlineAttachments()
{
MapiMessage message = MapiMessage.fromFile("Test.msg");
MapiAttachmentCollection attachments = message.getAttachments();
for (Object untypedAttachment : attachments)
{
MapiAttachment attachment = (MapiAttachment) untypedAttachment;
if(IsAttachmentInline(attachment))
{
try
{
SaveAttachment(attachment, UUID.randomUUID().toString());
}
catch (IOException | FileNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
static boolean IsAttachmentInline(MapiAttachment attachment)
{
MapiObjectProperty objectData = attachment.getObjectData();
if (objectData == null)
return false;
for (Object prop : attachment.getObjectData().getProperties().getValues())
{
MapiProperty property = (MapiProperty)prop;
if ("\u0003ObjInfo".equals(property.getName()))
{
byte[] data = property.getData();
int odtPersist1 = data[1] << 8 | data[0];
return (odtPersist1 & 0x40) == 0;
}
}
return false;
}
static void SaveAttachment(MapiAttachment attachment, String fileName) throws IOException, FileNotFoundException
{
for (Object prop : attachment.getObjectData().getProperties().getValues())
{
MapiProperty property = (MapiProperty)prop;
if ("Package".equals(property.getName()))
{
FileOutputStream fs;
try
{
fs = new FileOutputStream(fileName);
fs.write(property.getData(), 0, property.getData().length);
}
catch (java.io.IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}