gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:47:58 25 4
gpt4 key购买 nike

我创建了一个 Java 应用程序,用户可以在其中拖放文件以将其保存到指定文件夹中。我正在使用 FileDrop,不幸的是它不适用于直接从 Outlook 拖放的电子邮件。当电子邮件首先拖放到桌面(创建 .eml 文件)然后拖放到应用程序中时,它会起作用,但我真的想绕过此步骤。
您可以在下面看到我的代码:

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:

  • 掉落的元素数量
  • 对于每个项目:指向 IStorage 的文件名(例如 Test.msg + IDataObject)
  • 每个拖动的项目有一个 IStorage
  • IStorage 将是一个符合 MS 复合文件规范的虚拟文件系统(用于 MS Office - 例如 .xls、.doc,也包括 .msg)。
  • IStorage 类似于文件/文件夹结构,其中文件夹由 IStorage 对象表示,文件由 IStream 表示
  • 在 IStream 中,我们可以找到电子邮件的实际内容,例如:
    • 主题
    • 收件人
    • 电子邮件正文
    • 附件

我还为 Outlook 通过拖放界面传递二进制文件的假设而苦苦挣扎。由于与其他 Office 程序的互操作性,Outlook 采用复合文件结构。因此,人们需要将这些事情放在一起。如果将接收到的 Outlook 元素保存到文件中,则这不会是从 Outlook 导出到磁盘时的 1:1(二进制相同),而是具有相同内容的文件。

对于完整的解决方案,该方法的工作原理如下:

  • 获取文件描述符
  • 对于每个文件获取
    • 文件名
    • 指向 IDataObject 的指针
    • 从 IDataObject 获取根 IStorage
      • 迭代 IStorage 的子元素
        • 如果子元素是IStream,则处理IStream
        • 如果子元素是 IStorage,则递归返回“迭代子元素”

使事情变得复杂的是使用指针的 Win32 OLE 接口(interface)。此外,如果您遇到错误,接口(interface)返回类型并不那么容易解释。

有关更多详细信息,请在这篇文章中找到我的答案: Can I drag items from Outlook into my SWT application?

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

希望这对您有所帮助,如果您有更多问题,请在下面发表评论。

关于java - 将 Outlook 电子邮件和其他文件拖放到 Java 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30640496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com