EWS でメッセージ クラスを変更する

EWS でメッセージ クラス (ItemClass プロパティ) を変更して Update を行うと、一部を除いてたいていの場合は ObjectTypeChangedException が発生して失敗します。例えばこれは、IPM.Note を IPM.Post.MySubClass に変更をしようとしたときの EWS ログです。

2016-05-24T09:44:41.693Z,34817ede-9d8a-4b81-9b92-2d9c0e2cfe49,15,0,995,12,,Negotiate,True,Administrator@rykoma01.lab,rykoma01.lab,ExchangeServicesClient/15.00.0913.015,Target=None;Req=Exchange2013_SP1/Exchange2013_SP1;,192.168.2.57,MBX06,CAS02.RYKOMA01.LAB,UpdateItem,200,1176,,ErrorObjectTypeChanged,Administrator@rykoma01.lab,,,875d7a5c1a5748a7a01e5e9fdf16ad82,398198df-1779-4d99-a4eb-b36c1565176b,PrimaryServer,LocalTask,0,1,0,1,0,0,1,0,0,,,,,,,,,0 Max,0 Max,,,,GlobalThrottlingPolicy_c45e8665-b871-4c5e-996c-0c55b290bca7,0.0332,[C],0,0,2,0,,,0,0,,0,31.2442,3,31.2442,,MessageId_0=98f6111e-7124-424c-80b8-3e0b13149cde;ResponseTime_0=63;SoapAction_0=CopyItem;,BackEndAuthenticator=WindowsAuthenticator;TotalBERehydrationModuleLatency=0;MailboxTypeCacheSize=2;S:ServiceTaskMetadata.ADCount=0;S:WLM.Cl=InternalMaintenance;S:CUI.MD=SaveOnly;S:ServiceTaskMetadata.ADLatency=0;S:CUI.TNR=0;S:WLM.Type=Ews;S:ServiceTaskMetadata.RpcCount=2;S:CUI.TBS=0;S:WLM.Int=True;S:ServiceTaskMetadata.RpcLatency=1;S:CUI.TNM=1;S:WLM.SvcA=False;S:WLM.Bal=299976.6;S:ServiceTaskMetadata.WatsonReportCount=0;S:ServiceTaskMetadata.ServiceCommandBegin=28;S:ServiceTaskMetadata.ServiceCommandEnd=32;S:ActivityStandardMetadata.Component=Ews;S:WLM.BT=Ews;S:BudgetMetadata.MaxConn=27;S:BudgetMetadata.MaxBurst=300000;S:BudgetMetadata.BeginBalance=300000;S:BudgetMetadata.Cutoff=3000000;S:BudgetMetadata.RechargeRate=900000;S:BudgetMetadata.IsServiceAct=False;S:BudgetMetadata.LiveTime=00:00:01.5625137;S:BudgetMetadata.EndBalance=299976.6;Dbl:WLM.TS=31.2442;Dbl:CCpu.T[CMD]=0;I32:MAPI.C[MBX06.1842792c-e0d8-4fe3-89ae-205802e39ccf]=10;Dbl:BudgUse.T[]=31.2441997528076;I32:ROP.C[MBX06.1842792c-e0d8-4fe3-89ae-205802e39ccf]=850206;Dbl:RPC.T[MBX06.1842792c-e0d8-4fe3-89ae-205802e39ccf]=1;I32:RPC.C[MBX06.1842792c-e0d8-4fe3-89ae-205802e39ccf]=3;Dbl:MAPI.T[MBX06.1842792c-e0d8-4fe3-89ae-205802e39ccf]=1;I32:MB.C[MBX06.1842792c-e0d8-4fe3-89ae-205802e39ccf]=3;F:MB.AL[MBX06.1842792c-e0d8-4fe3-89ae-205802e39ccf]=0.3333333;Dbl:ST.T[MBX06.1842792c-e0d8-4fe3-89ae-205802e39ccf]=1,,ObjectTypeChanged=Message:Post IPM.Note:IPM.Post.MySubClass;ExceptionHandler_Execute=Microsoft.Exchange.Services.Core.Types.ObjectTypeChangedException: 操作によってオブジェクトの種類が変更される可能性がありますが、オブジェクトの種類は変更できません。    場所 Microsoft.Exchange.Services.Core.ServiceCommandBase.ValidateClassChange(StoreObject storeObject  String preUpdateClassName)    場所 Microsoft.Exchange.Services.Core.ServiceCommandBase.UpdateProperties(StoreObject storeObject  PropertyUpdate[] propertyUpdates  Boolean suppressReadReceipts)    場所 Microsoft.Exchange.Services.Core.UpdateItem.ApplyUpdateAndExecuteOperation(Item storeItem  ItemChange itemChange  StoreSession session)    場所 Microsoft.Exchange.Services.Core.UpdateItem.UpdateItemFromItemChange(IdAndSession idAndSession  ItemChange itemChange  ServiceError& warning)    場所 Microsoft.Exchange.Services.Core.UpdateItem.Execute()    場所 Microsoft.Exchange.Services.Core.ExceptionHandler`1.Execute(CreateServiceResult createServiceResult  Int32 index  GenerateMessageXmlForServiceError generateErrorXml);

ログに記載されている通り Exchange サーバーが許可してくれないので仕方がありません。対処策はいくつか考えられますが、今のところ最も簡単にできそうな内容としては、新しくアイテムを作成して MimeContent を丸ごとコピーしてしまう方法です。以下のようにします。

EmailMessage item = EmailMessage.Bind(service, "AQIARgAAA9ZVE4FZhSBIuzkFaoLYl/EHAIq2pcEIG7VNm0wFZ43yza0AAAMUAAAAiralwQgbtU2bTAVnjfLNrQAAANGaNJgAAAAuAAAD1lUTgVmFIEi7OQVqgtiX8QEAiralwQgbtU2bTAVnjfLNrQAAAxQAAAA=");

item.Load(new PropertySet(ItemSchema.MimeContent));

PostItem newPostItem = new PostItem(service);
newPostItem.MimeContent = item.MimeContent;
newPostItem.ItemClass = "IPM.Post.MySubClass";

newPostItem.Save(new FolderId("AQEuAAAD1lUTgVmFIEi7OQVqgtiX8QEAiralwQgbtU2bTAVnjfLNrQAAAxQAAAA="));

アイテム自体は別のものになりますが、これで添付ファイル含め同じ内容のアイテムが別のメッセージ クラスで作成できます。
厳密には、アイテム自体や添付ファイルの表示上のサイズが変わったりと、まったく同じではないですが、回避策としては十分であると言えそうです。