拖放Outlook电子邮件和其他文件到Java应用程序



我创建了一个Java应用程序,用户可以在其中拖放文件以将其保存到指定的文件夹中。我使用的是FileDrop,不幸的是,它不能直接从Outlook中拖放电子邮件。当电子邮件先放到桌面上(创建一个. email文件),然后放到应用程序中时,它就可以工作了,但是我真的想绕过这一步。
你可以在下面看到我的代码:

new FileDrop(panel, new FileDrop.Listener() {
    public void filesDropped(java.io.File[] files) {
        for (int i=0; i<files.length; i++) {
            File newFile = files[i];
            byte[] myByteArray = null;
            try { //get the data of the file into a byte array
                myByteArray = org.apache.commons.io.FileUtils.readFileToByteArray(newFile);
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            String newFileName = newFile.getName();
            try { //create the file
                FileOutputStream file = new FileOutputStream("projects/"+ newFileName);
                file.write(myByteArray);
                file.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
});

我很想听听这个问题的任何可能的解决方案。
顺便说一下,这是我得到的错误消息的一部分,指出问题发生在public void filesDropped(java.io.File[] files) {行,因为被放入应用程序的电子邮件尚未被识别为文件(我猜)。

...
2015-06-04 12:10:50.860 java[718:71442] Couldn't get a copy of an HFS Promise from the pasteboard
2015-06-04 12:10:50.860 java[718:71442] Looked for HFSPromises on the pasteboard, but found none.
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: URI is not hierarchical
    at java.io.File.<init>(File.java:363)
    at net.iharder.dnd.FileDrop.createFileArray(FileDrop.java:453)
    ...

Outlook提供了一个包含以下信息的FileDescriptor:

  • 掉落物品数量
  • 对于每个项目:文件名(例如Test。msg + IDataObject),它指向一个存储
  • 每个拖拽项目有一个存储
  • 存储将是一个虚拟文件系统,根据MS复合文件规范(在MS Office中使用-例如。xls,。doc,也有。msg)。
  • IStorage类似于文件/文件夹结构,文件夹由IStorage对象表示,文件由IStreams
  • 表示。在IStream中,人们会发现电子邮件的实际内容,如:
      <
    • 主题/gh>接受者
    • 电子邮件正文
    • 附件

我也很纠结于Outlook通过拖放界面传递二进制文件的假设。由于与其他Office程序的互操作性,Outlook传递复合文件结构。所以我们需要把这些东西混在一起。如果将从Outlook接收到的元素保存到文件中,这将不是1:1,就像从Outlook导出到磁盘一样(二进制相同),而是具有相同内容的文件。

对于完整的解决方案,方法如下:

  • Get File Descriptor
  • 对于每个文件get
    • IDataObject指针
    • 从IDataObject获取根存储
      • 迭代存储的子元素
        • 如果子元素是IStream,则处理IStream
        • 如果子元素是一个存储,递归地返回到"迭代子元素"

使它变得复杂的是Win32 OLE的接口,它使用指针。此外,如果要进入错误,接口返回类型就不那么容易解释了。

更多细节,请在这篇文章中找到我的答案:我可以将项目从Outlook拖到SWT应用程序中吗?

我创建了一个小库,为Outlook项目提供SWT传输类型。你可以在GitHub上找到它:https://github.com/HendrikHoetker/OutlookItemTransfer

希望这对你有帮助,如果你有更多的问题,请在下面留言。

相关内容

  • 没有找到相关文章

最新更新