まず、この問題は一部のクライアントマシンでのみ発生し、マシン。まず、コードがメールアイテムを保存しようとすると、Outlook Interopコードが「メッセージが変更されました」というエラーが表示されます。
だから私は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を使用して2番目のmail
オブジェクトを再度取得します。 mail
オブジェクトをオブジェクトの2回目の取得とそのSave()
メソッドの呼び出しの間で変更する可能性は非常に低く、100%再現可能なレートはもちろんです。
Outlookのバグのように思えるのは、何かが一度だけSave()
メソッドを呼び出した直後に変更されたメールオブジェクトを永久にマークする可能性があるということです。
回避策があるかどうかは知っていますか?
これらのマシンには、Office 2016の最新バージョン
それはExchangeメールボックスですか?変更がリモートメールボックスサーバーに同期され、サーバーが独自の変更を加え、変更がローカルのOSTファイルにアップロードされることがあります。それは紛争を引き起こす可能性があります。コードの実行時にメッセージが選択されていますか? –
IMAPアカウントです。メッセージがインスペクタウィンドウで選択または開かれました。 –