Java 销售人员:生日问题

Java 销售人员:生日问题,java,salesforce,apex-code,scheduler,Java,Salesforce,Apex Code,Scheduler,我写了一个Apex调度程序类,在离同事生日还有两天的时候发送电子邮件。我已经与两天后的生日建立了联系。联系人的生日是2012年7月29日。今天的日期是2012年7月27日 我卡住了。我没有收到任何错误消息或任何东西。我已安排今天12点上课。我没有收到电子邮件(要么告诉我是某人的生日(成功),要么从Salesforce收到错误消息,告诉我代码无法运行(失败) 为了排除故障,我还尝试了电子邮件方法的if(contact.Next_birth__c=:system.Today().addDays(2)

我写了一个Apex调度程序类,在离同事生日还有两天的时候发送电子邮件。我已经与两天后的生日建立了联系。联系人的生日是2012年7月29日。今天的日期是2012年7月27日

我卡住了。我没有收到任何错误消息或任何东西。我已安排今天12点上课。我没有收到电子邮件(要么告诉我是某人的生日(成功),要么从Salesforce收到错误消息,告诉我代码无法运行(失败)

为了排除故障,我还尝试了电子邮件方法的if(contact.Next_birth__c=:system.Today().addDays(2)),但得到了一个不兼容的类型错误。Next_birth___c是一个日期字段,因此我不确定为什么类型不兼容,或者为什么这个SOQL语句不起作用

任何建议都将不胜感激。这是我的代码

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

  public void sendBirthdayEmail()
  {
    for(Contact con : [SELECT Name FROM Contact WHERE Next_Birthday__c = : system.Today().addDays(2)])
    {
      Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
      mail.setTemplateId('00XJ0000000M31w');
      mail.setTargetObjectId('005J0000000');
      mail.setSaveAsActivity(false);
      Messaging.sendEmail(new Messaging.SingleEmailMessage[] {mail });
    }
  }    
}

我相信您希望将出站电子邮件的
targetObjectId
设置为生日的联系人,而不是硬编码…代码中的值
005J0000000
似乎也不是有效的ID,这可能会导致您未收到电子邮件。出于测试目的,您希望确保act record的电子邮件设置为您的电子邮件,因此您会收到通知。此外,每次执行时,您只会接到10个呼叫
Messaging.sendEmail()
,因此我为您对此进行了一些扩展。试一试:

global class BirthdayNameOptions implements Schedulable {
    global void execute (SchedulableContext ctx) {
        sendBirthdayEmail();
    }
    public void sendBirthdayEmail() {
        List<Messaging.SingleEmailMessage> mails = new List<Messaging.SingleEmailMessage>();
        for ( Contact con : [SELECT Id, Name FROM Contact WHERE Next_Birthday__c = : system.Today().addDays(2)] ) {
            Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
            mail.setTemplateId('00XJ0000000M31w');
            mail.setTargetObjectId(con.Id);
            mail.setSaveAsActivity(false);
            mails.add(mail);
        }
        if ( mails.size() > 0 )
            Messaging.sendEmail(mails, false);
    }
}
全局类BirthdayNameOptions实现可调度{
全局无效执行(SchedulableContext ctx){
sendBirthdayEmail();
}
公共无效sendBirthdayEmail(){
列表邮件=新列表();
对于(联系人con:[选择Id,下一个生日联系人的姓名=:system.Today().addDays(2)]){
Messaging.SingleEmailMessage mail=新建消息。SingleEmailMessage();
mail.setTemplateId('00XJ0000000M31w');
mail.setTargetObjectId(con.Id);
mail.setSaveAsActivity(false);
邮件。添加(邮件);
}
如果(mails.size()>0)
发送邮件(邮件,错误);
}
}

您是否访问过:SFDC->Setup->Administration Setup->Scheduled Jobs有您的类执行的记录吗?如果有,是否有任何错误或异常?此外,仅仅扩展可调度类并不一定意味着它将执行,您实际上通过创建
CronTrigger
sobject在组织中调度作业Jordan,该类位于计划作业中。您能告诉我有关此CronTrigger对象的更多信息吗?我将如何启动此对象?如果它位于计划作业页面中,则您已经创建了您感兴趣的CronTrigger记录。您很可能是通过
System.schedule()创建的
方法。这确实应该是一个基于时间的工作流,使用预定的类发送电子邮件看起来很严肃overkill@Ralph,生日电子邮件需要每年重复。基于时间的工作流只工作一次,然后终止