提问人:Michael 提问时间:7/5/2023 更新时间:11/1/2023 访问量:536
使用模板发送带有 apex 的电子邮件时,不会显示合并字段
Merge fields do not appear when sending an email with apex using a template
问:
我正在向某些用户发送模板电子邮件,该模板包含一个合并字段{{!Opportunity.custom__c}}。发送时,不显示字段的值。
Messaging.SingleEmailMessage email = new Messaging.SingleEmailMessage();
email.setTemplateId(et.Id); // Email Template ID
email.setTargetObjectId(user.Id); // User ID to send
//email.setWhatId(opp.Id); !Error!
email.setSaveAsActivity(false);
emails.add(email);
所以我想知道是否有任何方法可以将有关机会的信息传递给模板? 我不应该使用模板吗?
我已经搜索过了,他们说要添加email.setWhatId(opportunity。Id),添加它时,它给了我以下错误:INVALID_ID_FIELD,WhatId不可用于向UserIds发送电子邮件:[whatId,XXXXXXXXXXX]。
答:
此错误是因为方法 notification.setTargetObjectId(usr.Id) 使用用户 ID,根据文档,仅当 setTargetObjectId 为 contact 时,您才需要使用 notification.setWhatId(updatedOpp.Id)。
请参阅下面的文档
我认为如果不对消息进行自定义编码,就无法实现这一点。public Void setHtmlBody(String htmlBody) 我会尝试使用它而不是模板。
根据您的使用情况,您似乎将 User 用于 setTargetObjectId。 对于经典模板,如果您使用 Lead、Contact 等,这很好,但如果将 User 作为 Target,则只能使用 WhatId。
早在15年前,就已经有各种尝试来解决这个问题。 Salesforce自己没有修复它,所以只有两种解决方案:解决它或使用其他功能。
首先,经典的内部解决方法是使用联系人 ID 来解决问题。 解决方案是创建一个具有相同电子邮件地址的联系人,发送它,然后立即删除它,如下所示。
Contact ct = new Contact(Email = user.Email, LastName = "Name");
insert ct;
mail.setTargetObjectId(ct.Id);
Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });
delete ct;
第二种方法是使用 Visualforce 创建模板。 Visualforce 模板,即使是经典模板,内部也有 recipientType 和 relatedToType。 recipientType 指定与收件人相关的对象,relatedToType 指定目标对象。
您可以创建如下所示的模板,然后使用收件人 relatedTo 访问记录中的字段。
<messaging:emailTemplate subject="any subject" recipientType="User" relatedToType="ObjectName">
<messaging:htmlEmailBody >
<html>
<body>
Dear {!recipient.Name}
Target Name : {!relatedTo.Name}
</body>
</html>
</messaging:htmlEmailBody>
</messaging:emailTemplate>
-------------------------------------------
Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
mail.setSaveAsActivity(false);
mail.setBccSender(false);
mail.setUseSignature(false);
mail.setTemplateId(template.Id);
mail.setWhatId (targetObject.Id);
mail.setTargetObjectId(targetObject.Owner.Id);
Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });
祝你好运
评论