Открыть почту в Outlook с Java с использованием протокола «mapi: //»
Вопрос
Я разрабатываю приложение Java, используя поиск на рабочем столе Windows, из которого я могу получить некоторую информацию о файлах на моем компьютере, таких как URL -адреса (System.itemurl) Примером такого URL является
file://c:/users/ausername/documents/aninterestingfile.txt
Для «нормальных» файлов. Это поле дают также URL -адреса почтовых товаров, индексированных из Outlook или Thunderbird. Элементы Thunderbird (доступны только с использованием Vista и Seven) также являются файлами (.wdseml). Но URL -адреса Outlook начинаются с «mapi: //», как:
mapi://{S-1-5-21-1626573300-1364474481-487586288-1001}/toto@mycompany.com($b423dcd5)/0/Inbox/가가가가곕갘객겒갨겑곓걌게겻겨곹곒갓곅갩갤가갠가
Проблема, которую я столкнулся, заключается в том, чтобы открыть настоящий предмет из Java в Outlook, используя этот URL. Если я скопирую/вставлю его в диалог run of 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.
Есть ли у кого -нибудь идея открыть предметы "mapi: //" из Java?
Решение
Ну, мой вопрос был немного сложным. Но я наконец нашел ответ и поделюсь им здесь.
То, что я подозревал, было правдой: Windows использует URL-адреса UTF-16 (Little Endian). Это не делает различий, работающих в 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){}
}