使用模板发送带有 apex 的电子邮件时,不会显示合并字段

Merge fields do not appear when sending an email with apex using a template

提问人:Michael 提问时间:7/5/2023 更新时间:11/1/2023 访问量:536

问:

我正在向某些用户发送模板电子邮件,该模板包含一个合并字段{{!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]。

电子邮件 Apex 电子邮件模板 Salesforce-社区

评论


答:

0赞 NedlaV 7/18/2023 #1

此错误是因为方法 notification.setTargetObjectId(usr.Id) 使用用户 ID,根据文档,仅当 setTargetObjectId 为 contact 时,您才需要使用 notification.setWhatId(updatedOpp.Id)。

请参阅下面的文档

http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_Messaging_SingleEmailMessage_setWhatId.htm

我认为如果不对消息进行自定义编码,就无法实现这一点。public Void setHtmlBody(String htmlBody) 我会尝试使用它而不是模板。

0赞 Happyp 11/1/2023 #2

根据您的使用情况,您似乎将 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 });

祝你好运