Java 如何使用Apache POI-HSMF从outlook msg文件检索内容类型和内容处置?
我需要编写一个Java程序,从Outlook 2016以本机msg格式保存的邮件中提取所有附件。程序应该跳过内联图像。此外,一些邮件具有多部分/可选部分,程序应在其中检索“最佳”内容类型,例如text/html而不是text/plain 为了做到这一点,我需要找出消息的所有部分和附件的内容类型和内容配置 我尝试了以下方法: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
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正文中,但当然这个检查可能更复杂。