1

我为生日制作了 Apex Scheduler 课程。距离生日还有 2 天,班级工作并成功地向我们的主管发送了一封电子邮件。

但是,距离生日还有两天时发送的电子邮件模板需要包含联系人的名字、姓氏和出生日期。(电子邮件模板如下所示:这是调度程序生成的电子邮件,用于通知您 First Name: {!Contact.FirstName}, Last Name:的生日{!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}); 
        }
    }
}
4

1 回答 1

5

快速回答

邮件对象有两个您可以设置的 ID,第一个是您所做的目标对象,第二个是“什么”对象,即电子邮件所指的对象。

因此,您需要的只是下面的行,您应该进行设置。

mail.setWhatId(con.Id);

更多注意事项

像您在此处所做的那样使用硬编码 ID 被认为是不好的做法,主要是因为生产组织中的 ID 与沙盒或其他组织中的 ID 不太可能相同。您应该通过其 API/开发人员名称获取电子邮件模板本身:

EmailTemplate template = [Select id, Body from EmailTemplate
                          where DeveloperName = 'BirthdayReminder'];

还可以通过姓名或电子邮件地址获取导演的 ID:

User theDirector = [select Id from User where Email = 'md@somecompany.com'];

然后像以前一样使用 ID:

mail.setTemplateId(template.Id); 
mail.setTargetObjectId(theDirector.Id); 

显然我不是在这里检查错误,这是您可能想要添加的内容,并且您应该对电子邮件发送限制保持警惕,但鉴于这种情况,除非您正在处理,否则它们不是您可能会遇到的问题与一家非常大的公司合作!

于 2012-07-31T00:58:58.743 回答