如何使用Apache POI-HSMF从outlook msg文件中检索Content-Type和Content-Disposition?

时间:2017-06-23 12:09:12

标签: java outlook apache-poi

我需要编写一个Java程序,以本机msg格式从Outlook 2016保存的邮件中提取所有附件。该程序应跳过内嵌图像。此外,一些邮件具有多部分/替代部分,其中程序应该检索“最佳”内容类型,例如, text / html over 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();
}

问题是,“mime标签”(即内容类型)仅针对某些附件返回,并且对于所有其他附件返回null。内容处理似乎完全缺失。

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

long file name = Vertretungsvollmacht Übersiedlung.pdf
content id = null
mime tag = null
embedded = false
long file name = image001.jpg
content id = image001.jpg@01D2E697.12EC9370
mime tag = image/jpeg
embedded = false

有没有办法从msg文件中获取这些属性,还是有更完整的&使用Apache POI-HSMF之外的其他库实现Java所需的便捷方式?

2 个答案:

答案 0 :(得分:1)

为了获得内容处理(内联或附件),我执行了以下操作:

    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类型列表可以从例如https://wiki.selfhtml.org/wiki/MIME-Type/%C3%9Cbersicht

当然,只有在AttachmentChunks.getAttachMimeTag()返回空字符串的情况下才会这样做。

答案 1 :(得分:0)

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