Apache POI返回的未识别的MAPI属性

时间:2014-05-06 13:14:43

标签: java email apache-poi msg

我正在挖掘Apache POI API,尝试从MSG文件中获取所有属性。

我使用POIFSChunkParser解析了MSG文件。

以下是代码:

try
{
    InputStream is = new     FileInputStream("C:\\path\\email.msg");
    POIFSFileSystem poifs = new POIFSFileSystem(is);
    POIFSChunkParser poifscprsr = new POIFSChunkParser();
    ChunkGroup[] chkgrps = poifscprsr.parse(poifs);
    for(ChunkGroup chunkgrp : chkgrps )
    {
        for(Chunk chunk : chunkgrp.getChunks())
        {
            System.out.println(chunk.getEntryName() + " ("
                    + chunk.getChunkId() + ") " + chunk);
        }
    }           
}
catch(FileNotFoundException fnfe)
{
    System.out.println(fnfe.getMessage());
}
catch(IOException ioe)
{
    System.out.println(ioe.getMessage());
}

在输出中,它列出了MSG的所有可访问属性。其中一个看起来像这样:

  
    

__ substg1.0_800A001F(32778)04

  

我试图通过HEX 800A here找到该属性的重要性。 (本主题的子节点列出了属性。)

Q1。但是我没有找到与HEX 800A对应的属性。那么我应该推断出什么呢?

另外,我还有一些其他但有些相关的问题:

Q2。 Apache POI是否通过MAPIMessage公开所有属性(我尝试过探索MAPIMessage的所有方法并开始认为它没有)?

Q3。如果没有,是否有其他方法可以使用或不使用Apache POI访问Java中的所有MAPI属性。

1 个答案:

答案 0 :(得分:0)

首先,如果您没有关注Apache POI Dev List,请稍微警惕使用非常低级别的HSMF课程。最近对HSMF进行了一些更新,开始添加对固定长度属性的支持,还需要更多。通常,高级类将具有非常稳定的API(即使使用暂存器警告),较低级别的API可以(有时会)随着新支持的添加而更改。如果你不在开发名单上,这可能是一个震惊...

接下来 - 弄清楚什么是东西。这就是HSMF Dev Tools的用武之地。简单的TypesLister会让你检查POI知道的所有类型(略多于它支持的),而HSMFDump会做到最好解码给你的文件。如果你的块是任何类型的已知类型,那么在这两者之间你可以想象它是什么以及它包含什么

最后 - 获取所有属性。如上所述,Apache POI过去只支持.msg文件中的可变长度属性。这部分得到了纠正,在那里也有一些固定长度的支持,但还需要做更多的工作。志愿者对Dev List表示欢迎! MAPIMessage将为您提供所有常用位,但也可以访问不同的块组。 (给定的消息将分布在几个不同的块上,例如主要的,接收者,附件等)。从那里,您可以获得所有属性,以及PropertiesChunk,可以访问固定长度的属性。