Интеграция с Outlook 2k7 (через P / Invoke) - блокировка небезопасных вложений - PullRequest
0 голосов
/ 01 марта 2011

В настоящее время мы разрабатываем плагин для части программного обеспечения на C #. Этот плагин извлекает содержимое файла PST и сохраняет все элементы в нем в виде текстовых файлов (за исключением вложений, которые хранятся в виде их типа в той же папке, что и электронная почта).

Он работал без проблем, пока мы не протестировали его на Windows 7 с Outlook 2K7. После выполнения того же предыдущего задания на компьютере с Outlook 2000 мы заметили, что пропало более 12 000 файлов. Эти файлы оказались вложениями (в основном URL)

Мы обнаружили, что проблема в том, что Outlook 2K7 блокирует вложения с определенными расширениями. Если вы откроете электронное письмо в самом Outlook, вверху вы увидите синюю полосу с надписью «Outlook заблокировал доступ к следующим потенциально небезопасным вложениям» и всем вложениям в письмах.

Есть ли способ программно получить эти вложения, не блокируя их в Outlook?

Код, который мы используем для сохранения вложений:

private void saveAttachment(ref object oEmail, StoreInfo currentStoreInfo, string sEmailID, string sExportPath)
{

   int iAttachCount = 0;
   object oAttach = null;
   oAttach = getNextAttachment(oEmail, ref iAttachCount);

   while (oAttach != null)
   {
      saveAttachment(sEmailID, sExportPath, oAttach);
      oAttach = getNextAttachment(oEmail, ref iAttachCount);
   }

} 

private object getNextAttachment(object oEmail, ref  int iAttachCount)
{
   object oAttach = null;

   try
   {
      iAttachCount++;
      oAttach = GetProperty(oEmail, "Attachments", new object[] { iAttachCount });
   }
   catch //(Exception ex)
   {
      // There was no attachment to be gotten
      oAttach = null;
   }
   return oAttach;
}

1 Ответ

0 голосов
/ 25 мая 2011

Просто поставьте это здесь на случай, если кто-то еще столкнется с той же проблемой.Outlook 2K7 имеет функцию типа файла Level1, которая блокирует доступ к вложениям с определенными расширениями.

Однако вы можете изменить реестр, чтобы разрешить доступ к этим файлам.Просто не забудьте вернуть его на прежнее состояние, прежде чем вносить изменения в целях безопасности.

private void SetLevel1RemoveValues()

    {
        // Get the base key for the current user HKEY_CURRENT_USER
        Microsoft.Win32.RegistryKey regKey = Microsoft.Win32.RegistryKey.OpenRemoteBaseKey(Microsoft.Win32.RegistryHive.CurrentUser, "");
        // Get the security key from the registry
        Microsoft.Win32.RegistryKey subKey = regKey.OpenSubKey("Software\\Microsoft\\Office\\" + sCurrentOutlookVersion + ".0\\Outlook\\Security", true);

        // If the Outlook\Security key doesn't exit, create one
        if (subKey == null)
            subKey = regKey.CreateSubKey("Software\\Microsoft\\Office\\" + sCurrentOutlookVersion + ".0\\Outlook\\Security");

        // Loop through each Value in the registry to see if the Level1Remove key already exists.
        string[] sValues = subKey.GetValueNames();

        bool bHasLevel1RemoveKey = false;
        foreach (string sValue in sValues)
            if (sValue == "Level1Remove")
                bHasLevel1RemoveKey = true;

        // If the key already exists, store the data so we can reset it later
        if (bHasLevel1RemoveKey)
            sPrevLevel1RemoveValues = subKey.GetValue("Level1Remove").ToString();
        else
            sPrevLevel1RemoveValues = "";

        // Create an array of all Level 1 Extensions
        string[] level1Extensions = new string[] { ".ade", ".adp", ".app", ".asp", ".bas", ".bat", 
            ".cer", ".chm", ".cmd", ".com", ".cpl", ".crt", ".csh", ".exe", ".fxp", ".gadget", 
            ".hlp", ".hta", ".inf", ".ins", ".isp", ".its", ".js", ".jse", ".ksh", ".lnk", 
            ".mad", ".maf", ".mag", ".mam", ".maq", ".mar", ".mas", ".mat", ".mau", ".mav", ".maw", 
            ".mda", ".mdb", ".mde", ".mdt", ".mdw", ".mdz", ".msc", ".msi", ".msp", ".mst", ".ops", 
            ".pcd", ".pif", ".pfr", ".prg", ".pst", ".reg", ".scf", ".scr", ".sct", ".shb", ".shs", 
            ".tmp", ".url", ".vb", ".vbe", ".vbs", ".vsmacros", ".vss", ".vst", ".vsw", 
            ".ws", ".wsc", ".wsf", ".wsh" };

        // Set the value in the registry to the list of all Level 1 extensions so we can extract them
        subKey.SetValue("Level1Remove", string.Join(";", level1Extensions));

        // Close (and save) the values
        subKey.Close();
        regKey.Close();
    }
...