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

如何让客户回复邮件时生成带关联旧案例的新Salesforce案例

问题分析与触发器修正方案

核心问题排查

你的触发器存在几个关键问题,直接导致逻辑不生效:

  1. 语法错误:代码中/update cs;是无效语法,会导致触发器编译失败,根本无法运行。
  2. 逻辑方向错误:当前代码试图更新原案例的Reference_Case__c字段,但你的需求是创建新案例,并将原案例关联到新案例的reference_case_details__c字段,操作对象完全搞反。
  3. 批量处理违规:在for循环内执行SOQL查询,当批量插入EmailMessage时会触发Salesforce的SOQL查询次数限制。
  4. 令牌提取逻辑不稳定:仅用空格拆分邮件正文提取ReferenceID,若令牌前后存在换行、标点等情况,会导致提取失败。

修正后的触发器代码

trigger MI_EmailMessageTrigger on EmailMessage (after insert) {
    String fetchString = 'ReferenceID::';
    List<Case> newCasesToCreate = new List<Case>();
    Set<Id> originalCaseIds = new Set<Id>();
    Map<String, Id> caseNumToIdMap = new Map<String, Id>();

    // 第一步:收集原案例ID,优化令牌提取逻辑
    for(EmailMessage em : Trigger.New) {
        if(em.Incoming && em.ParentId != null && em.TextBody != null && em.TextBody.contains(fetchString)) {
            originalCaseIds.add(em.ParentId);
            // 按令牌拆分正文,提取后续有效内容
            String[] parts = em.TextBody.split(fetchString);
            if(parts.size() > 1) {
                String caseNumPart = parts[1].trim();
                // 提取第一个分隔符前的内容作为案例编号
                if(caseNumPart.contains(' ')) caseNumPart = caseNumPart.substringBefore(' ');
                else if(caseNumPart.contains('\n')) caseNumPart = caseNumPart.substringBefore('\n');
                caseNumToIdMap.put(caseNumPart, em.ParentId);
            }
        }
    }

    // 第二步:批量查询原案例信息(避免循环内SOQL)
    Map<Id, Case> originalCaseMap = new Map<Id, Case>([
        SELECT Id, Subject, Description 
        FROM Case 
        WHERE Id IN :originalCaseIds
    ]);

    // 第三步:创建新案例并关联原案例
    for(EmailMessage em : Trigger.New) {
        if(em.Incoming && em.ParentId != null && originalCaseMap.containsKey(em.ParentId)) {
            Case originalCase = originalCaseMap.get(em.ParentId);
            Case newCase = new Case();
            newCase.Subject = 'RE: ' + originalCase.Subject;
            newCase.Description = em.TextBody;
            // 关联原案例到新案例的查找字段
            newCase.reference_case_details__c = originalCase.Id;
            newCasesToCreate.add(newCase);
        }
    }

    // 批量插入新案例
    if(!newCasesToCreate.isEmpty()) {
        insert newCasesToCreate;
        
        // 可选:将回复邮件关联到新案例(替换原案例关联)
        List<EmailMessage> emailsToUpdate = new List<EmailMessage>();
        for(Integer i = 0; i < newCasesToCreate.size(); i++) {
            EmailMessage em = Trigger.New[i];
            em.ParentId = newCasesToCreate[i].Id;
            emailsToUpdate.add(em);
        }
        update emailsToUpdate;
    }
}

关键优化说明

  1. 修复语法错误:移除无效的/符号,确保代码正常编译运行。
  2. 调整核心逻辑:从更新原案例改为创建新案例,将原案例ID赋值给新案例的reference_case_details__c字段,匹配你的需求。
  3. 批量处理优化:将SOQL查询移到循环外,用集合和Map存储数据,符合Salesforce批量处理最佳实践。
  4. 增强令牌提取稳定性:通过拆分字符串并清理多余字符的方式提取案例编号,避免因格式问题导致提取失败。
  5. 可选邮件关联调整:如果需要把客户回复邮件归到新案例下,可执行后续的EmailMessage更新操作。

额外注意事项

  • 确认reference_case_details__c是Case对象的查找字段,且API名称完全匹配(注意大小写)。
  • 检查Email-to-Case路由设置,若存在“将回复关联到现有案例”的强制规则,需调整配置以允许生成新案例。
  • 测试时确保邮件正文中的ReferenceID::后面跟着有效的案例编号/ID,格式与触发器提取逻辑匹配。

内容的提问来源于stack exchange,提问作者manjula srinivas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 17:37:35