function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
mw6mw6 

Email to a custom object record

We have a custom object called Staff__c and Staff_Leave__c.  I need to sent an email to a record in Staff__c when his leave record in Staff_Leave__c is approved by changing the Leave_Status__c to 'Approvved'.  Is there a way to do this please advice
Best Answer chosen by mw6
Banwari kevat1Banwari kevat1
Hi,
     You can not use workflow because of accesing cross object email field is not available in workflow rules.
it will be done using apex trigger....please following trigger on leave
trigger leave on Leave__c (after update) {
    Set<ID> setOfStaffID = new Set<ID>();
    for(Leave__c leave : Trigger.new){
        if(leave.Staff__c != null )
            setOfStaffID.add(leave.Staff__c);
    }
    System.debug(setOfStaffID);
    Map<id,Staff__c> staffMap = new  Map<id,Staff__c>([SELECT Name,Email__c FROM Staff__c WHERE id in :setOfStaffID]);
    for(Leave__c leave : Trigger.new){
        if(leave.Status__c != Trigger.oldMap.get(leave.id).Status__c)
        {
            Messaging.SingleEmailMessage message = new Messaging.SingleEmailMessage();
            message.toAddresses = new String[] { staffMap.get(leave.Staff__c).Email__c };
            message.subject = 'Levae status';
            message.plainTextBody = 'Hi '+staffMap.get(leave.Staff__c).Name+' Your leave status is changed to '+leave.Status__c;
            Messaging.SingleEmailMessage[] messages =   new List<Messaging.SingleEmailMessage> {message};
                Messaging.SendEmailResult[] results = Messaging.sendEmail(messages);
            
            if (results[0].success) 
            {
                System.debug('The email was sent successfully.');
            } else 
            {
                System.debug('The email failed to send: ' + results[0].errors[0].message);
            }
        }
    }
    
}

Thanks
Banwari

All Answers

Arvind KumarArvind Kumar
Hi,

You can use workflow & process Builder for achieve your requirement.

Thanks,
Arvind Kumar
Banwari kevat1Banwari kevat1
Hi,
     You can not use workflow because of accesing cross object email field is not available in workflow rules.
it will be done using apex trigger....please following trigger on leave
trigger leave on Leave__c (after update) {
    Set<ID> setOfStaffID = new Set<ID>();
    for(Leave__c leave : Trigger.new){
        if(leave.Staff__c != null )
            setOfStaffID.add(leave.Staff__c);
    }
    System.debug(setOfStaffID);
    Map<id,Staff__c> staffMap = new  Map<id,Staff__c>([SELECT Name,Email__c FROM Staff__c WHERE id in :setOfStaffID]);
    for(Leave__c leave : Trigger.new){
        if(leave.Status__c != Trigger.oldMap.get(leave.id).Status__c)
        {
            Messaging.SingleEmailMessage message = new Messaging.SingleEmailMessage();
            message.toAddresses = new String[] { staffMap.get(leave.Staff__c).Email__c };
            message.subject = 'Levae status';
            message.plainTextBody = 'Hi '+staffMap.get(leave.Staff__c).Name+' Your leave status is changed to '+leave.Status__c;
            Messaging.SingleEmailMessage[] messages =   new List<Messaging.SingleEmailMessage> {message};
                Messaging.SendEmailResult[] results = Messaging.sendEmail(messages);
            
            if (results[0].success) 
            {
                System.debug('The email was sent successfully.');
            } else 
            {
                System.debug('The email failed to send: ' + results[0].errors[0].message);
            }
        }
    }
    
}

Thanks
Banwari
This was selected as the best answer
mw6mw6
Hi Guys,

I found a way to use workflow to sent out email from the custom object.  Get the email from the master object and store it as an emailf ield.  use this field to create workflow and sent out email using email Field

Thanks you guys