Java 如何使用Apache POI HSMF读取公共属性
我试图使用POI hsmf从Outlook.msg文件中提取字段BillingInformation,但每次都会收到ChunkNotFoundException。我已经在Outlook中验证了该字段中是否有内容Java 如何使用Apache POI HSMF读取公共属性,java,outlook,apache-poi,Java,Outlook,Apache Poi,我试图使用POI hsmf从Outlook.msg文件中提取字段BillingInformation,但每次都会收到ChunkNotFoundException。我已经在Outlook中验证了该字段中是否有内容 public class MessageReader { private static final int SUBJECT_CHUNK = 0x0037; private static final int BILLING_INFORMATION_CHUNK = 0x000
public class MessageReader {
private static final int SUBJECT_CHUNK = 0x0037;
private static final int BILLING_INFORMATION_CHUNK = 0x00008535;
public static void main(String[] argv) {
try {
MAPIMessage mapiMessage = new MAPIMessage("MessageWithBillingInformation.msg");
System.out.println(mapiMessage.getStringFromChunk(new StringChunk(SUBJECT_CHUNK, true)));
System.out.println(mapiMessage.getStringFromChunk(new StringChunk(BILLING_INFORMATION_CHUNK, true)));
} catch (IOException e) {
e.printStackTrace();
} catch (ChunkNotFoundException e) {
e.printStackTrace();
}
}
}
我找到的所有文档都将0x00008535列为计费信息的正确ID:
谢谢您使用chunkID 0x800A可以读取账单信息字段,因此代码如下所示:
public class MessageReader {
private static final int SUBJECT_CHUNK = 0x0037;
private static final int BILLING_INFORMATION_CHUNK = 0x800A;
public static void main(String[] argv) {
try {
MAPIMessage mapiMessage = new MAPIMessage("MessageWithBillingInformation.msg");
System.out.println(mapiMessage.getStringFromChunk(new StringChunk(SUBJECT_CHUNK, true)));
System.out.println(mapiMessage.getStringFromChunk(new StringChunk(BILLING_INFORMATION_CHUNK, true)));
} catch (IOException e) {
e.printStackTrace();
} catch (ChunkNotFoundException e) {
e.printStackTrace();
}
}
}您确定区块在根目录中吗?它很可能存储在其他部分的下面,这可以解释为什么找不到块。我建议您尝试使用org.apache.poi.poifs.dev.POIFSLister和org.apache.poi.hsmf.dev.HSMFDump来检查它在“Chunks”部分下的确切位置,而不使用任何其他名称。但是idName基于与MAPIProperty.unknown相等而列为“(未知)”。您能在POIFLister中看到它吗?(名称中应包含区块id和类型)啊,非常感谢!将HSMFDump的十进制格式chunkId转换为十六进制0x800A,将在PoifLister的块列表中显示。在上面的代码中使用它,我可以看到Billing Information字段的内容。