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

Salesforce Apex发送邮件报错:WhatId对UserIds不可用问题求助

问题解决:发送库存提醒邮件时的WhatId错误

错误原因

Salesforce邮件发送机制存在明确限制:当使用setTargetObjectId指定User类型ID作为收件人时,不允许同时设置WhatId,这就是触发INVALID_ID_FIELD错误的核心原因。

解决方案

要保留模板中POS_Item__c字段的绑定,同时给记录创建者和CC列表发送邮件,可调整收件人指定逻辑:放弃用setTargetObjectId关联User ID,改为通过setToAddresses直接指定创建者的邮箱地址,同时保留WhatId来绑定模板的合并字段。

修改后的Apex代码

@future(callout=true)
public static void sendEmailForLowLevelInventoryReached(Id recordId) {
    // 查询POS Item详情及创建者邮箱
    POS_Item__c posItemDetails = [
        SELECT Id, Item_Name__c, CreatedBy.Email, Low_Inventory_Level__c 
        FROM POS_Item__c 
        WHERE Id = :recordId 
        LIMIT 1
    ];
    
    // 查询邮件模板(建议用DeveloperName而非Name,避免名称变更影响)
    EmailTemplate emailTemplate = [
        SELECT Id, Body, Subject 
        FROM EmailTemplate 
        WHERE DeveloperName = 'Low_inventory_level' 
        LIMIT 1
    ];
    
    Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
    mail.setTemplateId(emailTemplate.Id);
    mail.setSaveAsActivity(false);
    
    // 用创建者邮箱作为主收件人
    mail.setToAddresses(new List<String>{posItemDetails.CreatedBy.Email});
    // 设置CC列表
    mail.setCcAddresses(new List<String>{'kavya@gmail.com','tulasi@gmail.com'});
    // 绑定POS Item记录,确保模板字段正常合并
    mail.setWhatId(posItemDetails.Id);
    
    // 发送邮件并处理结果
    Messaging.SendEmailResult[] results = Messaging.sendEmail(new Messaging.SingleEmailMessage[]{mail});
    for(Messaging.SendEmailResult result : results) {
        if(!result.isSuccess()) {
            for(Messaging.SendEmailError error : result.getErrors()) {
                System.debug('邮件发送失败:' + error.getMessage());
            }
        }
    }
}

关键修改说明

  1. 查询创建者邮箱:在POS_Item__c的SOQL中加入CreatedBy.Email,直接获取记录创建者的邮箱地址。
  2. 替换收件人指定方式:用setToAddresses替代setTargetObjectId,传入创建者邮箱,避开User ID作为TargetObjectId时的WhatId限制。
  3. 保留WhatId:继续设置WhatId为POS_Item__c的ID,确保模板中的{!POS_Item__c.XXX}合并字段能正确关联到目标记录。
  4. 优化模板查询:建议用DeveloperName查询邮件模板,比Name更稳定(Name可修改,DeveloperName通常不会随意变更)。

验证要点

  • 确认邮件模板的关联对象是POS_Item__c(经典模板设置中需指定正确的相关对象)。
  • 测试时检查邮件内容中的合并字段(如Item_Name__c、Available_Stock__c)是否正确渲染。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 11:43:29