的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
答
IMAP4是最差的一个 - 每一次尝试触摸任何存储对象的,它试图同步时间。您可以尝试绕过IMAP4图层并直接转到用作底层本地存储的PST提供程序。在扩展MAPI(C++或Delphi)中,您可以使用IProxyStoreObject界面来完成此操作。在比的Ç+或者Delphi其他语言话,你用能Redemption及其RDOSession。 Stores。 UnwrapStore
方法 - 可以使用RDOStore从未包装的商店打开该信息。 GetMessageFromID
。
是,一个Exchange邮箱?有时,更改会同步到远程邮箱服务器,服务器会自行更改,并将更改上载到本地OST文件。这可能会导致冲突。代码运行时是否选择了消息? –
这是一个IMAP帐户。该消息被选中或在检查员窗口中打开。 –