4

Apache POI - HSMF を使用して、Outlook のメッセージ ファイルから添付ファイルを抽出しています。ネストされたメッセージを除いて、正常に機能します。メッセージが別のメッセージに添付されている場合、ファイルを取得できます。メッセージがネストされている場合、情報は取得できますが、ファイルが必要です。

MAPIMessage msg = new MAPIMessage(fileName)
for(AttachmentChunks attachment : msg.getAttachmentFiles()) {
    if(attachment.attachmentDirectory!=null){
        MAPIMessage nestedMsg attachment.attachmentDirectory.getAsEmbededMessage();
        // now save nestedMsg as a msg-file
    }
}

ネストされたメッセージ ファイルを通常のメッセージ ファイルとして保存することは可能ですか?

4

3 に答える 3

4

コメントを回答に昇格させる。埋め込まれた Outlook メッセージを新しいファイルに抽出する方法を説明できます。このファイルは、Apache POI で問題なく開くことができます。あまり確信が持てないのは、埋め込みメッセージに、Outlook がスタンドアロン メッセージで検出することを期待するすべてのものが含まれているかどうかです。したがって、結果のファイルが問題なく Outlook で開くとは約束できません...

まず、Outlook に埋め込まれたリソースです。その種類に応じて、通常のバイト チャンク、他の種類の特別なチャンク (圧縮 RTF など) に格納されるか、ファイル内の自己完結型サブディレクトリに格納される場合があります。埋め込みメッセージは後者の方法で保存されます。

埋め込まれたメッセージを抽出する場合は、新しい OLE2 ファイル コンテナーを作成し、次を使用しPOIFSFileSystemます (すべての Outlook メッセージは OLE2 コンテナーに格納されます)。次に、ソース OLE2 コンテナー内の埋め込みメッセージのディレクトリの内容を、新しいコンテナーのルートにコピーします。最後に、その POIFSFileSystem を新しいファイルに書き出すと、抽出が完了します。

あなたはおそらく次のようなことをしたいと思うでしょう:

 MAPIMessage msg = new MAPIMessage(new NPOIFSFileSytem(new File("test.msg")));
 if (msg.attachmentChunks != null) {
    int number = 0;
    for (AttachmentChunk att : msg.attachmentChunks) {
        if (att.attachmentDirectory != null) {
           number++;
           POIFSFileSystem newMsg = new POIFSFileSystem();
           EntryUtils.copyNodes( att.attachmentDirectory, newMsg.getRoot() );
           FileOutputStream out = new FileOutputStream("embedded-" + number + ".msg");
           newMsg.write(out);
           out.close();
        }
    }
 }

Outlook で不機嫌な場合は、Outlook でソース ファイルを開き、埋め込まれたメッセージを新しいファイルに保存してから、 と のようなものを使用してorg.apache.poi.poifs.dev.POIFSListerorg.apache.poi.poifs.dev.POIFSDumpoutlook で抽出されたファイルと POI で抽出されたファイルを比較し、変更を見つけられるかどうかを確認してください。その見通しは....

于 2012-11-25T19:43:48.177 に答える