【问题标题】:OpenSharedItem for opening .MSG files showing Error in Outlook C#OpenSharedItem 用于打开在 Outlook C# 中显示错误的 .MSG 文件
【发布时间】:2022-05-05 01:58:43
【问题描述】:

我正在使用以下代码打开已签名/未签名 Outlook 邮件和我在WebBrowser 控件中显示内容。

Microsoft.Office.Interop.Outlook.Application app = new Microsoft.Office.Interop.Outlook.Application();
var item = app.Session.OpenSharedItem(msgfile) as Microsoft.Office.Interop.Outlook.MailItem;
string message = item.HTMLBody;
app.Session.Logoff();     

第一次打开文件时它工作正常,但之后 关闭 Outlook 文件尝试重新打开它显示的文件 以下错误:

"无法打开文件:C:\tion.msg。该文件可能不存在,您可能不存在 有权限打开它,或者它可能在另一个程序中打开。 右键单击包含该文件的文件夹,然后单击 用于检查文件夹权限的属性。”

一段时间后,它可以正常打开。对于这种奇怪的行为 可能是什么原因以及如何纠正错误消息?

【问题讨论】:

    标签: c# outlook vsto outlook-addin


    【解决方案1】:

    Outlook manages its own cache of items 打开和关闭消息时。您最好的选择是在通过OpenSharedItem 打开时使用随机生成的文件名(Path.GetRandomFilename),这样您就不会遇到问题。我也会使用临时路径而不是 root c:\Path.GetTempPath)。

    您可以尝试free the MailItem reference即将其设置为 null),但不能保证 Outlook 何时会从其缓存中释放该项目。

    【讨论】:

      【解决方案2】:

      Quit[1]、Close[2] 或 ReleaseComObject[3] 方法的任何组合都适合您吗?我的代码在使用后效果更好,但并不完美。[4]

      using Outlook = Microsoft.Office.Interop.Outlook;
      
      .
      .
      .
      
      var app = new Outlook.Application();
      var item = app.Session.OpenSharedItem(msgfile) as Outlook.MailItem;
      
      //Do stuff with the mail.
      
      item.Close(OlInspectorClose.olDiscard);
      app.Quit();
      Marshal.ReleaseComObject(item);
      

      另一个解决方案,根据 Microsoft - 帮助和支持[5],是延迟打开文件。但是,这对我来说听起来不是一个好的解决方案,因为就像@SliverNinja 所说的那样,你永远不会知道 Outlook 何时释放文件的锁定。

      注释和参考

      1. http://msdn.microsoft.com/en-us/library/microsoft.office.interop.outlook._application.quit.aspx,阅读 2014-10-14,16:19。
      2. http://msdn.microsoft.com/en-us/library/microsoft.office.interop.outlook._mailitem.close%28v=office.15%29.aspx,阅读 2014-10-14,16:19。
      3. http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.releasecomobject.aspx,阅读 2014-10-14,16:19。
      4. 例如,如果我为某些常规工作打开 Outlook,Quit 方法也会关闭该窗口。
      5. http://support2.microsoft.com/kb/2633737,阅读 2014-10-08,16:19。

      【讨论】:

      • 感谢您提供的信息 - 如果它可以帮助任何人更快地找到解决方案,我只需检查我的插件代码并找到我处理 Microsoft.Office.Interop.Outlook 类型对象的每个位置。 MailItem,然后我确保通过该方法的每条路径都会调用这段代码 - 其中“currentMailItem”显然是 MailItem 对象:`Marshal.ReleaseComObject(currentMailItem); GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); `
      • 抱歉,如果我对该评论的格式很糟糕,希望它仍然有用。
      【解决方案3】:

      您好,您有两种选择。

      • 将只读属性设置为 msg 文件

      • 禁用用户或用户组对父文件夹的以下权限:

        • 写入属性
        • 编写扩展属性

      msg 文件现在可以多次打开,但被写保护

      【讨论】:

        【解决方案4】:

        我遇到了这个问题,在我的情况下是文件名中的空格

        import win32com.client
        import os
        path = 'C:/testes/mail'
        files = [f for f in os.listdir(path) if '.msg' in f]
        for file in files:
            outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
            msg = outlook.OpenSharedItem(os.path.join(path, file))
            att=msg.Attachments
            for i in att:
                i.SaveAsFile(os.path.join('C:/testes/email_download', i.FileName))
        

        我不知道在您的情况下 OpenSharedItem 方法是否可以提供帮助...

        【讨论】:

        【解决方案5】:

        首先,使用Marshal.ReleaseComObject() 尝试在完成消息后立即发布消息。这可能有帮助,也可能没有帮助,因为 Outlook 喜欢缓存其最后打开的项目。

        其次,您正在从 Outlook 注销,而它可能仍在运行并且对用户可见 - Outlook 是一个单例,因此如果现有实例已经在运行,您最终将得到它。要么根本不打电话给Logoff,要么检查没有开放的检查员和探索者(Application.Explorers.Count == 0 && Application.Inspectors.Count == 0)。

        第三,如果有嵌入的图像,单独阅读HTMLBody 将无法正常工作 - 它们被存储为常规附件。您可以使用 MailItem.SaveAs(..., olMHTML) 将消息保存为 MHTML 文件(大多数浏览器都乐于显示)。

        您也可以为此使用Redemption(我是它的作者) - 致电RDOSession.GetMessageFromMsgFile
        如果您需要在完成后立即发布消息,请致电Marshal.ReleaseComObject()
        在 Redemption 的情况下,您也可以将RDOMail 对象转换为IDisposable 接口并调用IDisposable.Dispose()。除了 MHTML 格式之外,Redemption 还可以将图像附件转换为嵌入图像的 HTML 格式保存 - 使用 RDOMail.SaveAs(..., olHTMLEmbeddedImages) (olHTMLEmbeddedImages == 1033)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-11-19
          • 1970-01-01
          • 2015-12-25
          • 1970-01-01
          • 1970-01-01
          • 2015-09-03
          • 2013-10-23
          相关资源
          最近更新 更多