我正在挖掘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属性。
答案 0 :(得分:0)
首先,如果您没有关注Apache POI Dev List,请稍微警惕使用非常低级别的HSMF课程。最近对HSMF进行了一些更新,开始添加对固定长度属性的支持,还需要更多。通常,高级类将具有非常稳定的API(即使使用暂存器警告),较低级别的API可以(有时会)随着新支持的添加而更改。如果你不在开发名单上,这可能是一个震惊...
接下来 - 弄清楚什么是东西。这就是HSMF Dev Tools的用武之地。简单的TypesLister会让你检查POI知道的所有类型(略多于它支持的),而HSMFDump会做到最好解码给你的文件。如果你的块是任何类型的已知类型,那么在这两者之间你可以想象它是什么以及它包含什么
最后 - 获取所有属性。如上所述,Apache POI过去只支持.msg文件中的可变长度属性。这部分得到了纠正,在那里也有一些固定长度的支持,但还需要做更多的工作。志愿者对Dev List表示欢迎! MAPIMessage将为您提供所有常用位,但也可以访问不同的块组。 (给定的消息将分布在几个不同的块上,例如主要的,接收者,附件等)。从那里,您可以获得所有属性,以及PropertiesChunk,可以访问固定长度的属性。