我需要编写一个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所需的便捷方式?
答案 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>
标记引用的内容。