There are several ways to send the birthday email to the contacts in Salesforce.com. We shared the workflow way in the previous post. The workflow is a great no-code option, but it does not control the time the email to be sent out because there is no guarantee when the time-based workflow to be triggered. This post we guide you on how to send the birthday email to contacts using scheduled apex/batch. You can download the app from AppExchange https://appexchange.salesforce.com/appxListingDetail?listingId=a0N3A00000G12sQUAR&preview=%222020-05-19T13%3A08%3A50.000Z%22
- To be able to send an email message, we will use Messaging.SingleEmailMessage class to send to recipients/who/what.
public class EmailService {
//Send email class
public static Messaging.SingleEmailMessage getEmailTemplate( String TempName,Id contactId){
Messaging.SingleEmailMessage email = new Messaging.SingleEmailMessage();
Id tempID; // template ID
Try{
tempID = [select Id from EmailTemplate where developername =: TempName].id;
}catch(Exception e){
return null; // If there is no template existed return null as error
}
email.setTargetObjectId(contactId);
email.setTemplateId(tempID);
return email;
}
}
- Create an email email template to say happy birthday.


- Create a batch job to query which contacts have a birthday today. Batch Job is a great feature of Salesforce which allow you to process numerous data set with millions of records.
global class SendBirthdayEmailBatch implements Database.Batchable<sObject>{
global SendBirthdayEmailBatch(){
}
global Database.QueryLocator start(Database.BatchableContext BC){
//Get today by
string query = '';
Date tday = System.today();
Integer day = tday.day(); //get day of month
Integer month = tday.month(); // get month
//Query Contact ID to use to send email template
query = 'select id from Contact where CALENDAR_MONTH(Birthdate) = :month and DAY_IN_MONTH(Birthdate) = :day';
return Database.getQueryLocator(query);
}
global void execute(Database.BatchableContext BC, List<Contact> scope){
//Initilize list of emails need to be sent
list<Messaging.SingleEmailMessage> emails = new list<Messaging.SingleEmailMessage>();
//loop to every contact in scope
for(Contact c : scope){
//The email template Name - Use the Template Unique Name
Messaging.SingleEmailMessage email = EmailService.getEmailTemplate('Happy_Birthday',c.Id);
emails.add(email);
}
//If emails list not empty - send the emails
if(!emails.IsEmpty())
Messaging.sendEmail(emails);
}
global void finish(Database.BatchableContext BC){
}
}
- Create a schedule job; this will be used to schedule running at specific time everyday.
global class HappyBirthdaySchedule implements Schedulable {
global void execute(SchedulableContext sc) {
SendBirthdayEmailBatch b = new SendBirthdayEmailBatch();
Database.executeBatch(b);
}
}
- Set up schedule Job to run at specific time, 7 AM for example. Setup->Apex Classes->Schedule Apex

- The schedule runs at 7AM everyday; you will expect to see this as the result.
