Открывайте почту в outlook из java, используя протокол "mapi: //" - PullRequest
2 голосов
/ 08 марта 2010

Я разработал приложение Java с помощью Windows Desktop Search, из которого я могу получить некоторую информацию о файлах на моем компьютере, например URL-адреса ( System.ItemUrl ). Примером такого URL является

file://c:/users/ausername/documents/aninterestingfile.txt

для "нормальных" файлов. В этом поле указываются также URL почтовых элементов, проиндексированных в Outlook или Thunderbird. Элементы Thunderbird (доступны только с использованием vista и seven) также являются файлами (.wdseml). Но URL-адреса элементов внешнего вида начинаются с "mapi: //", например:

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

У меня проблема с открытием реального элемента из Java в Outlook с использованием этого URL. Если я копирую / вставляю его в диалог запуска Windows, он работает; это также работает, если я использую «start», за которым следует скопированный / вставленный 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.

У кого-нибудь есть идея открыть элементы "mapi: //" из Java?

1 Ответ

1 голос
/ 30 марта 2010

Ну, мой вопрос был немного сложным. Но я наконец нашел ответ и поделюсь им здесь.

То, что я подозревал, было правдой: Windows использует URL UTF-16 (little-endian). В UTF-8 нет разницы, когда мы используем только пути к файлам, таким как изображения, текст и т. Д. Но чтобы получить доступ к элементам Outlook, мы должны использовать UTF-16LE. Если бы я программировал на C #, не было бы никаких проблем. Но в Java нужно быть более изобретательным.

Из Windows Desktop Search я получаю следующее:

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){}
}
...