[SalesForce] Creating an invocable apex class sending email with optional send from

I am trying to set up an invocable apex class to send an email to a contact with merge fields from other record ID types with an optional variable to set the sender. I have looked at this question for guidance, however, am having trouble using variable sender.

Can someone have a look over what I have done and offer some suggestions?

global class Invocable_SendEmail {

    global class DataWrapper {

        @InvocableVariable(label='Record ID' required=true)
        public String recordID;
        @InvocableVariable(label='Email Template ID' required=true)
        public String emailTemplateID;
        @InvocableVariable(label='Contact ID' required = true)
        public String contactID;
        @InvocableVariable(label='Sender Email' required=false)
        public String sender;
    }

    @invocableMethod(label='Send Email to Applicant')
    global static void sendMailToLead (List<DataWrapper> passedData) {

        // Send the email:

        for (DataWrapper dw: passedData) {


            // Get the email template
            EmailTemplate selectedTemplate = [SELECT Id FROM EmailTemplate WHERE Id =: dw.emailTemplateId];

            // Get sender details
                // fetch Org Wide Email Address if sender is filled
                if (dw.sender != null) {
                    OrgWideEmailAddress[] owea = [select Id from OrgWideEmailAddress where Address = sender];
                    Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
                    if ( owea.size() > 0 ) {
                        mailToSend.setOrgWideEmailAddressId(owea.get(0).Id);
                    }
                }

            // Create SingleEmailMessage object and set the target and template.
            Messaging.SingleEmailMessage mailToSend = new Messaging.SingleEmailMessage();
            mailToSend.setTargetObjectId(dw.contactID);
            mailToSend.setWhatId(dw.recordID);
            mailToSend.setTemplateID(selectedTemplate.Id);


            // Send the email and debug results
            List<Messaging.SendEmailResult> sendResults = Messaging.sendEmail(new List<Messaging.Email> { mailToSend });
            System.debug(sendResults[0]);


        }

    }

}

Best Answer

Fixed the issues,

global class Invocable_SendEmail {

global class DataWrapper {

    @InvocableVariable(label='Record ID' required=true)
    public String recordID;
    @InvocableVariable(label='Email Template ID' required=true)
    public String emailTemplateID;
    @InvocableVariable(label='Contact ID' required = true)
    public String contactID;
    @InvocableVariable(label='Sender Email' required=false)
    public String sender;
}

@invocableMethod(label='Send Email to Applicant')
global static void sendMailToLead (List<DataWrapper> passedData) {

    // Send the email:

    for (DataWrapper dw: passedData) {


        // Get the relevant template based on the supplied ID.
        EmailTemplate selectedTemplate = [SELECT Id FROM EmailTemplate WHERE Id =: dw.emailTemplateId];

        // Create SingleEmailMessage object and set the target and template.
        Messaging.SingleEmailMessage mailToSend = new Messaging.SingleEmailMessage();
        mailToSend.setTargetObjectId(dw.contactID);
        mailToSend.setWhatId(dw.recordID);
        mailToSend.setTemplateID(selectedTemplate.Id);

        // Get sender details
            // fetch Org Wide Email Address if sender is filled
            if (dw.sender != null) {
                OrgWideEmailAddress[] owea = [select Id from OrgWideEmailAddress where Address =: dw.sender];
                Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
                if ( owea.size() > 0 ) {
                    mailToSend.setOrgWideEmailAddressId(owea.get(0).Id);
                }
            }


        // Send the email and debug results
        List<Messaging.SendEmailResult> sendResults = Messaging.sendEmail(new List<Messaging.Email> { mailToSend });
        System.debug(sendResults[0]);


    }

}

}

Fix includes updating line: OrgWideEmailAddress[] owea = [select Id from OrgWideEmailAddress where Address = sender]; to: OrgWideEmailAddress[] owea = [select Id from OrgWideEmailAddress where Address =: dw.sender];

And putting // Get sender details section after creation of SingleEmailMessage object

Related Topic