Java 如何使用Apache POI HSMF读取公共属性

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

我试图使用POI hsmf从Outlook.msg文件中提取字段BillingInformation,但每次都会收到ChunkNotFoundException。我已经在Outlook中验证了该字段中是否有内容

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字段的内容。