使用模板通过 apex 发送电子邮件时不会出现合并字段

问题描述 投票:0回答:2

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

email salesforce apex email-templates salesforce-communities
2个回答
0
投票

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

请参阅下面的文档

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

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


0
投票

根据您的使用情况,您似乎将 User 用于 setTargetObjectId。 对于经典模板,如果您使用 Lead、Contact 等,这很好,但如果您将 User 作为目标,则只能使用 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。 收件人类型指定收件人相关对象,相关对象类型指定目标对象。

您可以创建如下所示的模板,然后访问包含收件人、相关者的记录中的字段。

<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 });

祝你好运

© www.soinside.com 2019 - 2024. All rights reserved.