2

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

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

4

5 回答 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 进行一些常规工作,Quit 方法也会关闭该窗口。
  5. http://support2.microsoft.com/kb/2633737,阅读 2014-10-08,16:19。
于 2014-10-08T14:44:57.887 回答
3

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

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

于 2013-01-21T20:50:27.223 回答
0

Firstly, try to release the message as soon as you are done with it using Marshal.ReleaseComObject(). This may or may not help since Outlook likes to cache its last opened item.
Secondly, you are logging off from Outlook while it might still be running and visible to the user - Outlook is a singleton, so you will end up with the existing instance if it was already running. Either don't call Logoff at all, or check that there are no open inspectors and explorers.

You can also use Redemption for that - call RDOSession.GetMessageFromMsgFile.
If you need to release the message immediately after you are done, call Marshal.ReleaseComObject()
In case of Redemption, you can also cast RDOMail object to the IDisposable interface and call IDisposable.Dispose().

于 2013-01-28T18:46:05.770 回答
0

您好,您有两种选择。

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

或者

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

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

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

于 2013-03-04T12:42:43.060 回答
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 方法是否可以帮助......

于 2020-02-22T17:18:06.653 回答