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