2017-09-28 11 views
0

まず、この問題は一部のクライアントマシンでのみ発生し、マシン。まず、コードがメールアイテムを保存しようとすると、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の最新バージョン

+0

それはExchangeメールボックスですか?変更がリモートメールボックスサーバーに同期され、サーバーが独自の変更を加え、変更がローカルのOSTファイルにアップロードされることがあります。それは紛争を引き起こす可能性があります。コードの実行時にメッセージが選択されていますか? –

+0

IMAPアカウントです。メッセージがインスペクタウィンドウで選択または開かれました。 –

答えて

1

を使用しているIMAP4は、最悪の一つである - あなたが店のオブジェクトのいずれかに触れしようとするたびに、それが同期しようとします。 IMAP4レイヤーをバイパスし、基盤となるローカルストレージとして使用されるPSTプロバイダーに直接アクセスすることができます。拡張MAPI(C++またはDelphi)では、IProxyStoreObjectインターフェイスを使用して拡張MAPIを実行できます。 C++やDelphi以外の言語の場合は、RedemptionとそのRDOSessionを使用できます。 StoresUnwrapStoreメソッド - メッセージは、RDOStoreを使用してアンラップされたストアから開くことができます。 GetMessageFromID

関連する問題