You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 03:32:48