Salesforce.com:获取SOQL语句以返回要在电子邮件模板中使用的字符串?

use*_*039 1 salesforce soql apex-code

我为生日做了一个Apex Scheduler Class.当生日为2天时,该课程可以成功发送电子邮件给我们的导演.

但是,两天后生日时发送的电子邮件模板需要包含联系人的姓氏和生日.(电子邮件模板看起来是这样的:这是一个调度程序生成的电子邮件通知您名字的生日:{!Contact.FirstName},姓氏:{!Contact.LastName}是的{!Contact.Next_Birthday__c}.

在我的调度程序中,我使用SOQl语句在数据库中查询联系人的id和名字.

在我调用查询后,如何将我刚查询的信息转换为在电子邮件模板中使用的字符串/方法?

我的猜测是将查询结果作为字符串返回?任何建议表示赞赏!

这是我的代码:

global class BirthdayName implements Schedulable
{
    global void execute (SchedulableContext ctx) 
    { 
        sendBirthdayEmail(); 
    }

    public void sendBirthdayEmail()
    {
        for(Contact con : [SELECT Contact.name, Id FROM Contact WHERE Next_Birthday__c = : system.Today().addDays(2)])
        {
            Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage(); 
            mail.setTemplateId('00XJ0000000M31w'); 
            mail.setTargetObjectId('005J0000000JWYx'); 
            mail.setSaveAsActivity(false);
            Messaging.sendEmail(new Messaging.SingleEmailMessage[] {mail}); 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*cey 5

快速回答

邮件对象有两个可以设置的ID,第一个是你已经完成的目标对象,第二个是'what'对象,它是电子邮件引用的对象.

因此,您需要的是下面的行,您应该设置.

mail.setWhatId(con.Id);
Run Code Online (Sandbox Code Playgroud)

更多笔记

在这里使用硬编码ID被认为是不好的做法,主要是因为生产组织中的ID可能与沙箱或其他组织中的ID不同.您应该通过它的API /开发者名称获取电子邮件模板:

EmailTemplate template = [Select id, Body from EmailTemplate
                          where DeveloperName = 'BirthdayReminder'];
Run Code Online (Sandbox Code Playgroud)

并通过姓名或电子邮件地址获取Director的ID:

User theDirector = [select Id from User where Email = 'md@somecompany.com'];
Run Code Online (Sandbox Code Playgroud)

然后就像以前一样使用ID:

mail.setTemplateId(template.Id); 
mail.setTargetObjectId(theDirector.Id); 
Run Code Online (Sandbox Code Playgroud)

显然我不是在这里检查你可能想要添加的错误,你应该对电子邮件发送限制保持警惕,但鉴于这种情况他们不是一些你可能会遇到的,除非你正在处理有一个认真的大公司!