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

时间:2013-01-21 13:26:32

标签: c# outlook vsto outlook-addin

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

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

5 个答案:

答案 0 :(得分:3)

当您打开和关闭消息时,

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

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

答案 1 :(得分:3)

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. 例如,如果我为som常规工作打开了Outlook,Quit-method也会关闭该窗口。
  5. http://support2.microsoft.com/kb/2633737,阅读2014-10-08,16:19。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您好,您有两种选择。

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

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

    • 写属性
    • 编写扩展属性

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

答案 4 :(得分:0)

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

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方法是否可以帮助您...