【问题标题】:How to retrieve the Content-Type and the Content-Disposition from an outlook msg file using Apache POI-HSMF?如何使用 Apache POI-HSMF 从 Outlook msg 文件中检索 Content-Type 和 Content-Disposition?
【发布时间】:2017-11-27 00:21:50
【问题描述】:

我需要编写一个 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();
}

问题是,“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 中实现我想要的?

【问题讨论】:

    标签: java outlook apache-poi


    【解决方案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() 返回空字符串的情况下才应该这样做。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这是真的。实际上我确实检查了 content-id 是否出现在 HTML 正文中,但当然这个检查可能更复杂。
      猜你喜欢
      • 2011-06-18
      • 1970-01-01
      • 1970-01-01
      • 2015-07-17
      • 2018-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多