Java 如何使用Apache POI-HSMF从outlook msg文件检索内容类型和内容处置?

Java 如何使用Apache POI-HSMF从outlook msg文件检索内容类型和内容处置?,java,outlook,apache-poi,Java,Outlook,Apache Poi,我需要编写一个Java程序,从Outlook 2016以本机msg格式保存的邮件中提取所有附件。程序应该跳过内联图像。此外,一些邮件具有多部分/可选部分,程序应在其中检索“最佳”内容类型,例如text/html而不是text/plain 为了做到这一点,我需要找出消息的所有部分和附件的内容类型和内容配置 我尝试了以下方法: public static void main(String[] args) throws IOException { String mfile = "test/te

我需要编写一个Java程序,从Outlook 2016以本机msg格式保存的邮件中提取所有附件。程序应该跳过内联图像。此外,一些邮件具有多部分/可选部分,程序应在其中检索“最佳”内容类型,例如text/html而不是text/plain

为了做到这一点,我需要找出消息的所有部分和附件的内容类型和内容配置

我尝试了以下方法:

public static void main(String[] args) throws IOException {
    String mfile = "test/test2.msg";
    MAPIMessage msg = new MAPIMessage(mfile);

    AttachmentChunks[] attachments = msg.getAttachmentFiles();
    if (attachments.length > 0) {
        for (AttachmentChunks attachment : attachments) {
            System.out.println("long file name = " + attachment.getAttachLongFileName());
            System.out.println("content id = " + attachment.getAttachContentId());
            System.out.println("mime tag = " + attachment.getAttachMimeTag());
            System.out.println("embedded = " + attachment.isEmbeddedMessage());
        }
    }
    msg.close();
}
    String disposition = "attachment";
    if (contentId != "")
        if (body.contains(contentId.toString()))
            disposition = "inline";
问题是,“mime标记”(即内容类型)只为某些附件返回,而为所有其他附件返回null。内容配置似乎完全缺失

例如,我在OL2016保存的邮件上获得以下输出(该邮件包含PDF附件和内嵌徽标图像):


有没有一种方法可以从msg文件中获取这些属性,或者有没有一种更完整、更方便的方法可以使用Apache POI-HSMF以外的其他库在Java中实现我想要的功能?

为了获得内容配置(内联或附件),我做了以下操作:

public static void main(String[] args) throws IOException {
    String mfile = "test/test2.msg";
    MAPIMessage msg = new MAPIMessage(mfile);

    AttachmentChunks[] attachments = msg.getAttachmentFiles();
    if (attachments.length > 0) {
        for (AttachmentChunks attachment : attachments) {
            System.out.println("long file name = " + attachment.getAttachLongFileName());
            System.out.println("content id = " + attachment.getAttachContentId());
            System.out.println("mime tag = " + attachment.getAttachMimeTag());
            System.out.println("embedded = " + attachment.isEmbeddedMessage());
        }
    }
    msg.close();
}
    String disposition = "attachment";
    if (contentId != "")
        if (body.contains(contentId.toString()))
            disposition = "inline";
为了获得内容类型,我从附件的文件扩展名中派生了它,例如:

        String ext = fileNameOri.substring(fileNameOri.lastIndexOf(".") + 1);
        switch (ext.toLowerCase()) {
        case "xlsx": 
            ct = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            break;
        }
mime类型列表可从以下网站获得:


当然,这只应该在AttachmentChunks.getAttachimetag()返回空字符串的情况下执行。

附件具有内容id标记并不意味着它是嵌入的图像-Lotus Notes将内容id添加到所有附件中。唯一有效的检查是加载HTML正文并找出
标记所指的内容

这是真的。事实上,我确实检查了内容id是否出现在HTML正文中,但当然这个检查可能更复杂。