OpenSharedItem用于打开在Outlook C#中显示错误的.MSG文件

我使用以下代码打开签名/未签名的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。该文件可能不存在,您可能没有权限打开它,或者它可能在另一个程序中打开。右键单击包含该文件的文件夹,然后单击”属性“。检查你对该文件夹的权限。“

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

在打开和关闭邮件时, Outlook会管理自己的项目缓存 。 您最好的选择是在通过OpenSharedItem打开时使用随机生成的文件名( Path.GetRandomFilename ),这样您就不会遇到问题。 我也会使用临时路径而不是root c:\Path.GetTempPath )。

您可以尝试释放MailItem引用 ( 即将其设置为null ),但无法保证Outlook将从其缓存中释放该项。

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); 

根据微软的帮助和支持 [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. 例如,如果我为som常规工作打开了Outlook,Quit-method也将关闭该窗口。
  5. http://support2.microsoft.com/kb/2633737 ,阅读2014-10-08,16:19。

您可以使用Redemption – 调用RDOSession .GetMessageFromMsgFile。
如果您需要在完成后立即释放消息,请使用Marshal.ReleaseComObject()
在Redemption的情况下,您还可以将RDOMail对象转换为IDisposable接口并调用IDisposable.Dispose()。

你好,你有两个选择。

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

要么

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

    • 写属性
    • 写扩展属性

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