mails abiertas en perspectiva de Java utilizando el protocolo “mapi: //”
Pregunta
Me developp una aplicación Java usando búsqueda en el escritorio de la que puede recuperar algo de información acerca de los archivos en mi computadora, como URL ( System.ItemUrl ). Un ejemplo de tal url es
file://c:/users/ausername/documents/aninterestingfile.txt
para archivos "normales". Este campo también se dan las direcciones URL de los elementos de correo indexado desde Outlook o Thunderbird. artículos de Thunderbird (sólo disponible utilizando Vista y siete) son también archivos (.wdseml). Sin embargo, las direcciones URL de artículos perspectivas comienzan con "mapi: //" como:
mapi://{S-1-5-21-1626573300-1364474481-487586288-1001}/toto@mycompany.com($b423dcd5)/0/Inbox/가가가가곕갘객겒갨겑곓걌게겻겨곹곒갓곅갩갤가갠가
El problema que tengo está abriendo el elemento real a partir de Java en Outlook utilizando esta URL. Si copiar / pegar en el diálogo de ejecución de Windows, funciona; también funciona si uso "Inicio" seguido por la URL copiado / pegado en la línea de comandos.
La url parece estar codificado en UTF-16. Quiero ser capaz de escribir dicho código:
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);
Yo no funciona y he intentado otras soluciones como:
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");
sin ningún éxito. El uso de la solución anterior, el archivo "test.bat" contiene la dirección URL correcta y el "inicio" de comandos, pero la racha de resultados "test.bat" en el mensaje de error conocido:
'■' is not recognized as an internal or external command, operable program or batch file.
Alguien ha una idea para poder abrir "MAPI: //"? Artículos de Java
Solución
Bueno, mi pregunta era un poco complicado. Pero finalmente encontré una respuesta y voy a compartir aquí.
Lo que sospechaba era cierto: Windows utiliza UTF-16 URL (Little Endian). Hace que no hay diferencias que trabajan en UTF-8 cuando sólo utilizamos rutas a los archivos como imágenes, texto, etc. Pero para poder acceder a los elementos de Outlook, debemos usar UTF-16LE. Si estuviera de codificación en C #, no habría habido ningún problema. Pero en Java, usted tiene que ser más inventiva.
A partir de búsqueda en el escritorio, recupero la siguiente:
mapi://{S-1-5-21-1626573300-1364474481-487586288-1001}/toto@mycompany.com($b423dcd5)/0/Inbox/가가가가곕갘객겒갨겑곓걌게겻겨곹곒갓곅갩갤가갠가
Y lo que he hecho es crear un script VB temporal y ejecutarlo como esto:
/**
* 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){}
}