Extração de dados de objetos incorporados

Às vezes, os dados OLE incorporados são representados como um anexo “oleData.mso” pelo MapiAttachment e precisam ser extraídos manualmente. Esses arquivos oleData.mso são no formato Microsoft Computer Document File (MCDF) e o suporte para tais arquivos está além da ocupação do Aspose.Email. No entanto, o Aspose.Email pode ser usado em combinação com outras bibliotecas de código aberto, como o OpenMCDF, para ler o conteúdo desses arquivos para salvá-los em disco. O Aspose.Email fornece a classe InlineAttachmentExtractor para enumerar pacotes MSO dos dados binários de oledata.mso, que podem então ser usados para extração de conteúdos por bibliotecas de leitura de arquivos compostos.

Se o tipo do corpo da mensagem for HTML (não RTF), e houver objetos OLE em uma mensagem, a propriedade MapiPropertyTag.PR_ATTACH_DATA_OBJ está ausente. Nesse caso, as informações sobre objetos OLE estão contidas em oldedata.mso.

Extração de Objetos Incorporados

Este artigo mostra como extrair o conteúdo de tal arquivo usando Aspose.Email e OpenMCDF. Isso pode ser feito da seguinte maneira:

  • Enumerar pacotes MSO dos dados binários do anexo oledata.mso
  • Para cada dado OLE, ler o CompoundFile
  • Ler o fluxo com CONTEÚDOS
  • Salvar o conteúdo em FileStream
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// The path to the File directory
string dataDir = RunExamples.GetDataDir_Email();
MapiMessage msg = MapiMessage.FromFile(dataDir + "double.msg");
foreach (MapiAttachment mapiAttachment in msg.Attachments)
{
if (mapiAttachment.LongFileName == "oledata.mso")
{
IDictionary<string, byte[]> oledata = InlineAttachmentExtractor.EnumerateMsoPackage(new MemoryStream(mapiAttachment.BinaryData));
int index = 0;
foreach (var oleItem in oledata)
{
// Using OpenMCDF library
CompoundFile cf = new CompoundFile(new MemoryStream(oleItem.Value));
CFStream contents = cf.RootStorage.GetStream("CONTENTS");
using (FileStream fs = File.OpenWrite(index + ".pdf"))
{
byte[] data = contents.GetData();
fs.Write(data, 0, data.Length);
fs.Flush();
fs.Close();
}
index++;
}
}
}