我正在尝试使用 Apache POI 包编写代码来读取 Outlook .msg 邮件文件
我正在尝试获取目录中所有 .msg 文件的 messageIds。但是对于某些 .msg 文件,这些 messageId 为空。经过一番观察,我意识到这些是回复消息(那些以“回复”作为正文中第一个单词的消息)。对于其他 To 和 From 消息,我正确地获取了消息 ID。为什么会这样?
代码
private String getMsgIds(String srcDir) throws IOException
{
String cfile; //current files - temporary string to hold file name in for loop
String msgIds = ""; //message Ids for all messages
MAPIMessage msg = null; //temporary message variable to hold message while iterating
String msgId = "";
File folder = new File(srcDir);
File[] listOfFiles = folder.listFiles();
for (int i = 0; i < listOfFiles.length; i++)
{
if (listOfFiles[i].isFile())
{
cfile = listOfFiles[i].getName();
if (cfile.endsWith(".msg") || cfile.endsWith(".MSG"))
{
msg = new MAPIMessage(srcDir + "\\" + cfile);
}
try
{
Chunks chks = msg.getMainChunks();
StringChunk strMsgId = chks.messageId;
if(strMsgId != null)
{
msgId = strMsgId.getValue();
msgIds += cfile+": "+msgId+"\n";
}
else
msgIds += cfile+": \n";
}
catch(NullPointerException e)
{
//ignore
}
}
}
return msgIds;
}
输出
12.msg:
Brand ABC.msg: <093F1AED3DF94C4D878DBB625FC76805FFA809@xyz.abc.com>
RE Test sent mail rule sent on behalf 1.msg:
RE Test sent mail rule sent on behalf 2.msg:
Test mail to check sent rule on Ramprasad 2.msg: <2909CF96D97FDD43BC5EF34B2E2B8A317E5C3A@xyz.abc.com>
Test sent mail rule 1.msg: <B9EF3A9EC5BE2E4297FB08558016D9510F1B2A@xyz.abc.com>
Test sent mail rule 2.msg: <B9EF3A9EC5BE2E4297FB08558016D9510F1B3F@xyz.abc.com>
Test sent mail rule sent on behalf 1.msg: <B9EF3A9EC5BE2E4297FB08558016D9510F1B51@xyz.abc.com>
Test sent mail rule sent on behalf 2.msg: <B9EF3A9EC5BE2E4297FB08558016D9510F1B6D@xyz.abc.com>
Test wth CC.msg: <EE6C216DE13B484EB4D860361A19C1D7D47905@xyz.abc.com>
test.msg: <EE6C216DE13B484EB4D860361A19C1D7D4780F@xyz.abc.com>
请注意,上面没有获取第 1、3 和 4 条消息的 messageId。 我可以知道回复消息是否在他们的文件中没有 MessageIds 吗?或者如果 Apache POI 无法从回复消息中读取消息 ID?
更新
我尝试使用 BufferedReader 和 InputStream 获取原始字符流。在观察字符流时,显示这些文件没有 MessageId 而其他文件有。那么可能是什么问题?