プロトコル「:// MAPI」を使用してJavaからの見通しで開くメール

StackOverflow https://stackoverflow.com/questions/2400223

  •  18-09-2019
  •  | 
  •  

質問

私は<私はURLなど自分のコンピュータ上のファイル(約いくつかの情報を取得することができ、そこからWindowsデスクトップサーチを使用してJavaアプリケーションをdeveloppのhref = "http://msdn.microsoft.com/en-us/library/bb760785 (VS.85)は」REL = "nofollowをnoreferrer"> System.ItemUrl に).aspxの。そのようなURLの例です。

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

"通常の" ファイルのため。このフィールドは、また、OutlookやThunderbirdのインデックス化からメールアイテムのURLを与えます。 (Vistaを使用し、7のみ利用可能)サンダーバードのアイテムもファイル(.wdseml)です。しかし、OutlookのアイテムのURLで始まる "MAPI://" のように:

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

私が持っている問題は、この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が含まれていますし、コマンドを「開始」が、よく知られているエラーメッセージに「TEST.BAT」結果の走行ます:

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

誰のアイデアは、 "MAPI://" 開くことができるようにしていますか?、Javaから項目を

役に立ちましたか?

解決

さて、私の質問は少しトリッキーでした。しかし、私は最終的に答えを発見し、ここでそれを共有することになります。

私が疑われることは本当だった:Windowsは、UTF-16(リトルエンディアン)のURLを使用しています。 Outlookアイテムにアクセスできるようにするが、我々は唯一などの画像、テキスト、などのファイルへのパスを使用する場合には、我々はUTF-16LEを使用しなければなりませんUTF-8で作業違いを行いません。私は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){}
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top