Outlook Redemption - проблемы с разрешениями при открытии MSG-файла из локальной папки (System.UnauthorizedAccessException) - PullRequest
0 голосов
/ 24 января 2020

У меня есть папка сообщений журнала в формате .EML.

Я пишу некоторый код, чтобы сохранить файл .EML как файл .MSG, а затем получить доступ к вложенному файлу .MSG в сохраненном файле. MSG файл. Когда я пытаюсь получить доступ к любому из полей с помощью прикрепленного файла .MSG, я получаю следующее исключение:

$ exception {"Ошибка в IMessage.OpenAttach: MAPI_E_NO_ACCESS"} System.UnauthorizedAccessException

I проверил права на созданный файл, и они выглядят нормально.

Код, который я использую:

RDOSession Session = new RDOSession();
        foreach (var file in System.IO.Directory.GetFiles(@"\\win2012r2-ns\UserProfiles\phil\Downloads\email Archive\Beth_1\"))
        {
            RDOMail mi = Session.CreateMessageFromMsgFile(@"C:\Temp\temp.msg", "IPM.Mail");
            mi.Import(file, 1024);
            mi.Save();
            Marshal.ReleaseComObject(mi);
            mi = Session.GetMessageFromMsgFile(@"C:\Temp\temp.msg");
            for (int i = mi.Attachments.Count; i >= 1; i--)
            {
                if (mi.Attachments[i].FileName.IndexOf(".msg") != -1)
                {
                    Create_Folders(mi.Attachments[i].EmbeddedMsg.ReceivedTime.Year.ToString(), mi.Attachments[i].EmbeddedMsg.ReceivedTime.Month.ToString(), mi.Attachments[i].EmbeddedMsg.ReceivedTime.Day.ToString());
                    mi.Attachments[i].SaveAsFile(@"\\win2012r2-ns\EmailArchive\" + mi.Attachments[i].EmbeddedMsg.ReceivedTime.Year.ToString() + @"\" + mi.Attachments[i].EmbeddedMsg.ReceivedTime.Month.ToString() + @"\" + mi.Attachments[i].EmbeddedMsg.ReceivedTime.Day.ToString() + @"\" + mi.EntryID.ToString() + ".msg");
                }
            }
            Marshal.ReleaseComObject(mi);
        }

1 Ответ

1 голос
/ 24 января 2020

Сообщения, открытые поверх файлов MSG, не позволят вам открыть вложения и таблицу вложений, пока не будут выпущены предыдущие экземпляры этого объекта. Вы используете многоточечную нотацию, в результате чего появляются неявные переменные, которые вы не можете явно разблокировать. Попробуйте изменить код на следующее:

RDOAttachments attachments = mi.Attachments;
for (int i = attachments.Count; i >= 1; i--)
{ 
  RDOAttachment attach = mi.Attachments[i];
  if (attach.Type == OlAttachmentType.olEmbeddeditem)
  { 
    RDOMail embeddedMsg = attach.EmbeddedMsg;
    Create_FoldersembeddedMsg.ReceivedTime.Year.ToString(), embeddedMsg.ReceivedTime.Month.ToString(), embeddedMsg.ReceivedTime.Day.ToString());
    attach.SaveAsFile(@"\\win2012r2-ns\EmailArchive\" + embeddedMsg.ReceivedTime.Year.ToString() + @"\" + embeddedMsg.ReceivedTime.Month.ToString() + @"\" + embeddedMsg.ReceivedTime.Day.ToString() + @"\" + mi.EntryID.ToString() + ".msg");
    Marshal.ReleaseComObject(embeddedMsg);                
  }   
  Marshal.ReleaseComObject(attach);
}
Marshal.ReleaseComObject(attachments);
...