的Outlook互操作代码抛出“的消息已被更改”当代码试图保存邮件项目

的Outlook互操作代码抛出“的消息已被更改”当代码试图保存邮件项目

问题描述:

首先误差的第二次,这个问题只发生在少数客户端机器,我不能复制它在我的任何测试机器。的Outlook互操作代码抛出“的消息已被更改”当代码试图保存邮件项目

所以我有以下的测试代码在LINQPad:

var application = new Application(); 
var session = application.Session; 
const string entryId = "arbitrary entry ID"; 
const string propertyName = "http://schemas.microsoft.com/mapi/string/{31A9B8DA-D4A0-4B96-87AE-01D6E9BCFCCE}/Test/0x0000001F"; 

// Save test property for the first time. 
var mail = (MailItem)session.GetItemFromID(entryId); 
var propertyAccessor = mail.PropertyAccessor; 
propertyAccessor.SetProperty(propertyName, 1); 
mail.Save(); 

Marshal.ReleaseComObject(propertyAccessor); 
Marshal.ReleaseComObject(mail); 

// Save test property for the second time. 
mail = (MailItem)session.GetItemFromID(entryId); 
var propertyAccessor = mail.PropertyAccessor; 
propertyAccessor.SetProperty(propertyName, 2); 
mail.Save(); 

Marshal.ReleaseComObject(propertyAccessor); 
Marshal.ReleaseComObject(mail); 
Marshal.ReleaseComObject(session); 
Marshal.ReleaseComObject(application); 

第二mail.Save()呼吁对这些少数的客户端机器100%的速度抛出异常:System.Runtime.InteropServices.COMException (0x80040109): The operation cannot be performed because the message has been changed.

由于上面的代码正确释放第一个mail对象并再次使用条目ID检索第二个mail对象。有一些改变对象的第二检索的mail对象,并调用其Save()方法的几率是非常低的,更何况100%可重复率。

我只能认为它看起来像在Outlook中的错误,它可能会永久标记邮件对象只要任何调用Save()方法修改一次。

任何一个人知道,如果有一个变通?

这些机器使用的是最新版本的Office 2016

+0

是,一个Exchange邮箱?有时,更改会同步到远程邮箱服务器,服务器会自行更改,并将更改上载到本地OST文件。这可能会导致冲突。代码运行时是否选择了消息? –

+0

这是一个IMAP帐户。该消息被选中或在检查员窗口中打开。 –

IMAP4是最差的一个 - 每一次尝试触摸任何存储对象的,它试图同步时间。您可以尝试绕过IMAP4图层并直接转到用作底层本地存储的PST提供程序。在扩展MAPI(C++或Delphi)中,您可以使用IProxyStoreObject界面来完成此操作。在比的Ç+或者Delphi其他语言话,你用能Redemption及其RDOSessionStoresUnwrapStore方法 - 可以使用RDOStore从未包装的商店打开该信息。 GetMessageFromID