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()); } } } }
关键修改说明
- 查询创建者邮箱:在POS_Item__c的SOQL中加入
CreatedBy.Email,直接获取记录创建者的邮箱地址。 - 替换收件人指定方式:用
setToAddresses替代setTargetObjectId,传入创建者邮箱,避开User ID作为TargetObjectId时的WhatId限制。 - 保留WhatId:继续设置
WhatId为POS_Item__c的ID,确保模板中的{!POS_Item__c.XXX}合并字段能正确关联到目标记录。 - 优化模板查询:建议用
DeveloperName查询邮件模板,比Name更稳定(Name可修改,DeveloperName通常不会随意变更)。
验证要点
- 确认邮件模板的关联对象是POS_Item__c(经典模板设置中需指定正确的相关对象)。
- 测试时检查邮件内容中的合并字段(如Item_Name__c、Available_Stock__c)是否正确渲染。
内容的提问来源于stack exchange,提问作者Kavya
相关产品推荐
相关产品推荐

