我为生日做了一个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});
}
}
}
答案 0 :(得分:5)
邮件对象有两个你可以设置的ID,第一个是你做的目标对象,第二个是'what'对象,它是电子邮件所指的对象。
因此,您在此处需要的只是以下行,您应该设置。
mail.setWhatId(con.Id);
在此处使用硬编码ID被认为是不好的做法,主要是因为生产组织中的ID可能与沙箱或其他组织中的ID不同。您应该通过它的API /开发者名称获取电子邮件模板:
EmailTemplate template = [Select id, Body from EmailTemplate
where DeveloperName = 'BirthdayReminder'];
还可以通过姓名或电子邮件地址获取Director的ID:
User theDirector = [select Id from User where Email = 'md@somecompany.com'];
然后只需使用以前的ID:
mail.setTemplateId(template.Id);
mail.setTargetObjectId(theDirector.Id);
显然我不是在这里检查你可能想要添加的错误,你应该对电子邮件发送限制保持警惕,但鉴于这种情况他们不是一些你可能会遇到的事情,除非你正在与一家规模很大的公司打交道!