إرسال رسائل البريد الإلكتروني في Outlook من Java باستخدام البروتوكول "MAPI: //"

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

  •  18-09-2019
  •  | 
  •  

سؤال

أقوم بتطوير تطبيق Java باستخدام بحث Windows Desktop الذي يمكنني استرداد بعض المعلومات حول الملفات الموجودة على جهاز الكمبيوتر الخاص بي مثل عناوين 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 هذا. إذا قمت بنسخ / لصقها في مربع حوار تشغيل 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: //" من جافا؟

هل كانت مفيدة؟

المحلول

حسنا، كان سؤالي صعبة بعض الشيء. لكنني وجدت أخيرا إجابة وسأشاركتها هنا.

ما اشتبهت أنه صحيح: يستخدم Windows URL URL URL UTF-16 (Little Endian). لا يقدم أي اختلافات تعمل في UTF-8 عندما نستخدم المسارات فقط إلى الملفات مثل الصور والنصوص وما إلى ذلك ولكن لتتمكن من الوصول إلى عناصر Outlook، يجب علينا استخدام UTF-16LE. إذا كنت ترميز في C #، فلن تكون هناك أي مشكلة. ولكن في جافا، يجب أن تكون أكثر ابتكارية.

من 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){}
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top