使用协议“从java在outlook中打开邮件”;mapi:/“;

使用协议“从java在outlook中打开邮件”;mapi:/“;,java,encoding,utf-16,wds,Java,Encoding,Utf 16,Wds,我使用Windows桌面搜索开发了一个Java应用程序,从中可以检索有关计算机上文件的一些信息,如URL()。这种url的一个例子是 file://c:/users/ausername/documents/aninterestingfile.txt 对于“普通”文件。此字段还提供从Outlook或Thunderbird索引的邮件项目的URL。Thunderbird的项目(仅适用于vista和seven)也是文件(.wdseml)。但outlook的项目URL以“mapi://”开头,如: 我遇

我使用Windows桌面搜索开发了一个Java应用程序,从中可以检索有关计算机上文件的一些信息,如URL()。这种url的一个例子是

file://c:/users/ausername/documents/aninterestingfile.txt
对于“普通”文件。此字段还提供从Outlook或Thunderbird索引的邮件项目的URL。Thunderbird的项目(仅适用于vista和seven)也是文件(.wdseml)。但outlook的项目URL以“mapi://”开头,如:

我遇到的问题是使用此url从Outlook中的Java打开真正的项目。如果我在Windows的“运行”对话框中复制/粘贴它,它会工作;如果在命令行中使用“开始”后跟复制/粘贴的url,它也可以工作

url似乎是用UTF-16编码的。我希望能够编写这样的代码:

String url = "mapi://{S-1-5-21-1626573300-1364474481-487586288-1001}/toto@mycompany.com($b423dcd5)/0/Inbox/가가가가곕갘객겒갨겑곓걌게겻겨곹곒갓곅갩갤가갠가";

Runtime.getRuntime().exec("cmd.exe /C start " + url);
我不工作,我尝试过其他解决方案,如:

String start = "start";
String url = "mapi://{S-1-5-21-1626573300-1364474481-487586288-1001}/toto@mycompany.com($b423dcd5)/0/Inbox/가가가가곕갘객겒갨겑곓걌게겻겨곹곒갓곅갩갤가갠가";

FileOutputStream fos = new FileOutputStream(new File("test.bat");
fos.write(start.getBytes("UTF16");
fos.write(url.getBytes("UTF16"));
fos.close();

Runtime.getRuntime().exec("cmd.exe /C test.bat");
没有任何成功。使用上述解决方案,文件“test.bat”包含正确的url和“start”命令,但运行“test.bat”会导致众所周知的错误消息:

'■' is not recognized as an internal or external command, operable program or batch file.

有人想从Java打开“mapi://”项目吗?

嗯,我的问题有点棘手。但我终于找到了答案,并将在这里分享

我怀疑的是真的:Windows使用UTF-16(little-endian)URL。当我们只使用图像、文本等文件的路径时,在UTF-8中工作没有区别。但是为了能够访问Outlook项目,我们必须使用UTF-16LE。如果我用C#编写代码,就不会有任何问题。但在Java中,您必须更具创造性

从Windows桌面搜索中,我检索到以下内容:

mapi://{S-1-5-21-1626573300-1364474481-487586288-1001}/toto@mycompany.com($b423dcd5)/0/Inbox/가가가가곕갘객겒갨겑곓걌게겻겨곹곒갓곅갩갤가갠가
我所做的是创建一个临时VB脚本,并按如下方式运行它:

/**
 * Opens a set of items using the given set of paths.
 */
public static void openItems(List<String> urls) {
  try {

    // Create VB script
    String script =
      "Sub Run(ByVal sFile)\n" +
      "Dim shell\n" +
      "Set shell = CreateObject(\"WScript.Shell\")\n" +
      "shell.Run Chr(34) & sFile & Chr(34), 1, False\n" +
      "Set shell = Nothing\n" +
      "End Sub\n";

    File file = new File("openitems.vbs");

    // Format all urls before writing and add a line for each given url
    String urlsString = "";
    for (String url : urls) {
      if (url.startsWith("file:")) {
        url = url.substring(5);
      }
      urlsString += "Run \"" + url + "\"\n";
    }

    // Write UTF-16LE bytes in openitems.vbs
    FileOutputStream fos = new FileOutputStream(file);
    fos.write(script.getBytes("UTF-16LE"));
    fos.write(urlsString.getBytes("UTF-16LE"));
    fos.close();

    // Run vbs file
    Runtime.getRuntime().exec("cmd.exe /C openitems.vbs");

  } catch(Exception e){}
}
/**
*使用给定的路径集打开一组项。
*/
公共静态void openItems(列出URL){
试一试{
//创建VB脚本
字符串脚本=
“子运行(ByVal sFile)\n”+
“暗壳\n”+
“Set shell=CreateObject(\“WScript.shell\”)\n”+
shell.Run Chr(34)&sFile&Chr(34),1,False\n+
“设置shell=Nothing\n”+
“结束子节点\n”;
File File=新文件(“openitems.vbs”);
//在写入之前格式化所有url,并为每个给定url添加一行
字符串urlsString=“”;
for(字符串url:url){
if(url.startsWith(“文件:”){
url=url.substring(5);
}
urlsString+=“运行\”+url+“\\n”;
}
//在openitems.vbs中写入UTF-16LE字节
FileOutputStream fos=新的FileOutputStream(文件);
fos.write(脚本.getBytes(“UTF-16LE”);
fos.write(urlsString.getBytes(“UTF-16LE”);
fos.close();
//运行vbs文件
Runtime.getRuntime().exec(“cmd.exe/C openitems.vbs”);
}捕获(例外e){}
}
多绕道啊!为什么是执行官(cmd)?Java有办法调用COM对象吗?然后,您应该能够导入
WScript.Shell
(全名为
Windows脚本主机对象模型)的类型库,并直接调用Run。
/**
 * Opens a set of items using the given set of paths.
 */
public static void openItems(List<String> urls) {
  try {

    // Create VB script
    String script =
      "Sub Run(ByVal sFile)\n" +
      "Dim shell\n" +
      "Set shell = CreateObject(\"WScript.Shell\")\n" +
      "shell.Run Chr(34) & sFile & Chr(34), 1, False\n" +
      "Set shell = Nothing\n" +
      "End Sub\n";

    File file = new File("openitems.vbs");

    // Format all urls before writing and add a line for each given url
    String urlsString = "";
    for (String url : urls) {
      if (url.startsWith("file:")) {
        url = url.substring(5);
      }
      urlsString += "Run \"" + url + "\"\n";
    }

    // Write UTF-16LE bytes in openitems.vbs
    FileOutputStream fos = new FileOutputStream(file);
    fos.write(script.getBytes("UTF-16LE"));
    fos.write(urlsString.getBytes("UTF-16LE"));
    fos.close();

    // Run vbs file
    Runtime.getRuntime().exec("cmd.exe /C openitems.vbs");

  } catch(Exception e){}
}