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

问题描述 投票:2回答:5

我正在使用以下代码打开已签名/未签名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
5个回答
4
投票

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,则退出方法也会关闭该窗口。
  5. http://support2.microsoft.com/kb/2633737,阅读2014-10-08,16:19。

3
投票

Outlook manages its own cache of items,当您打开和关闭消息时。最好的选择是在通过Path.GetRandomFilename打开文件时使用随机生成的文件名(Path.GetRandomFilename),这样就不会出现问题。我还将使用临时路径而不是根OpenSharedItemc:\)。

您可以尝试使用Path.GetTempPath即,将其设置为null,但不能保证Outlook何时从其缓存中释放该项目。


0
投票

您好,您有两个选择。

  • 将只读属性设置为味精文件

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

    • 写入属性
    • 写扩展属性

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


0
投票

我有这个问题,就我而言,这是文件名中的空格

Path.GetTempPath

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


0
投票

您可以使用free the MailItem reference-呼叫MailItemimport 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)) 。如果需要在完成后立即释放消息,请致电Redemption如果需要赎回,还可以将RDOSession对象投射到GetMessageFromMsgFile接口并调用Marshal.ReleaseComObject()

© www.soinside.com 2019 - 2024. All rights reserved.