使用C# Exchange Web Services添加邮件分类时如何保留原有分类?
问题:使用EWS添加邮件分类时丢失原有分类
我尝试使用Exchange Web Services(EWS)为邮件添加新分类,但运行代码后原有分类会消失,仅保留新增的分类。例如某邮件原有分类X和Y,添加分类Z后,X和Y消失,仅剩下Z。
注意:我在低代码/无代码软件Blue Prism中运行此代码,受公司审批流程限制,几乎无法引入第三方库。手动在Outlook 2019中操作可正常保留原有分类。
以下是我使用的方法,依赖的DLL为Microsoft.Exchange.WebServices.dll:
//Here I initialize exchange object and authenticate ExchangeService exchange = null; void ConnectEWS(string ewsURL, string _exchangeVersion, string username, string password) { ServicePointManager.ServerCertificateValidationCallback = delegate {return true;} ; try { exchange = new ExchangeService(); exchange.Url = new Uri(ewsURL); exchange.Credentials = new WebCredentials(username,password); } catch (Exception ex) { throw new Exception("failed to initialize exchange object!!="+ex.Message); } } //here is my void method that adds a new category to an email item void addCategoryToMail(string msgid, string category) { if(exchange==null) { throw new Exception("exchange object is null!!"); } EmailMessage message = EmailMessage.Bind(exchange,msgid, BasePropertySet.IdOnly ); if(message.Categories.Contains(category)==false) { message.Categories.Add(category); //message.Update(ConflictResolutionMode.AlwaysOverwrite); message.Update(ConflictResolutionMode.AutoResolve); } }
请问如何避免原有分类消失,实现添加新分类时保留原有分类?
解决方案
问题出在绑定邮件时使用的BasePropertySet.IdOnly属性集——它只会加载邮件的ID信息,不会获取原有分类数据。此时message.Categories是一个空集合,你添加新分类后执行更新,就会覆盖邮件上的原有分类。
要解决这个问题,需要在绑定邮件时明确加载Categories属性,这样才能获取并保留原有分类。有两种实现方式:
方式1:仅加载所需的Categories属性(推荐,更高效)
这种方式只请求邮件的ID和分类数据,减少不必要的数据传输:
void addCategoryToMail(string msgid, string category) { if(exchange==null) { throw new Exception("exchange object is null!!"); } // 创建属性集,指定加载ID和Categories属性 PropertySet propSet = new PropertySet(BasePropertySet.IdOnly); propSet.Add(ItemSchema.Categories); // 使用指定的属性集绑定邮件 EmailMessage message = EmailMessage.Bind(exchange, new ItemId(msgid), propSet); if(!message.Categories.Contains(category)) { message.Categories.Add(category); message.Update(ConflictResolutionMode.AutoResolve); } }
方式2:加载所有一级属性
如果后续可能需要操作邮件的其他属性,可以直接使用BasePropertySet.FirstClassProperties,它会加载邮件的所有常用属性(包括分类):
void addCategoryToMail(string msgid, string category) { if(exchange==null) { throw new Exception("exchange object is null!!"); } // 使用FirstClassProperties绑定邮件,包含所有常用属性 EmailMessage message = EmailMessage.Bind(exchange, new ItemId(msgid), BasePropertySet.FirstClassProperties); if(!message.Categories.Contains(category)) { message.Categories.Add(category); message.Update(ConflictResolutionMode.AutoResolve); } }
两种方式都能确保message.Categories包含邮件原有的分类,新增分类时是在原有集合基础上添加,不会覆盖原有数据。
内容的提问来源于stack exchange,提问作者Baristhenix
相关产品推荐
相关产品推荐

