|
public with sharing class SendEmailTemplate { |
|
@InvocableMethod( |
|
Label='Send Email Template' |
|
Description='Send an email to a set of recipients using a Lightning Email Template' |
|
Category='Email' |
|
// A Lightning Web Component can be used to provide a custom Flow editor experience |
|
// ConfigurationEditor='c:SendEmailTemplateLwc' |
|
) |
|
public static void sendEmails(List<Request> requests) { |
|
for (Request request : requests) { |
|
sendEmails(request.emailTemplateId, request.orgWideEmailAddressId, request.relatedRecords); |
|
} |
|
} |
|
|
|
public class Request { |
|
@InvocableVariable( |
|
Label='Email Template ID' |
|
Description='The ID of the Email Template to use.' |
|
Required=true |
|
) |
|
public Id emailTemplateId; |
|
|
|
@InvocableVariable( |
|
Label='Org-Wide Address ID' |
|
Description='The ID of the organization-wide email address associated with the outgoing email.' |
|
Required=true |
|
) |
|
public Id orgWideEmailAddressId; |
|
|
|
@InvocableVariable( |
|
Label='Related Records' |
|
Description='Records that are of the Email Template\'s related entity type' |
|
Required=true |
|
) |
|
public List<SObject> relatedRecords; |
|
} |
|
|
|
public class Response { |
|
@InvocableVariable( |
|
Label='Successful Records' |
|
Description='Records that were successfully sent the Email Template' |
|
Required=true |
|
) |
|
public List<SObject> successes; |
|
|
|
@InvocableVariable( |
|
Label='Failed Records' |
|
Description='Records that failed to be sent the Email Template' |
|
Required=true |
|
) |
|
public List<SObject> failures; |
|
} |
|
|
|
private static void sendEmails(Id emailTemplateId, Id orgWideEmailAddressId, List<SObject> relatedRecords) { |
|
for (SObject relatedRecord : relatedRecords) { |
|
sendEmail(emailTemplateId, orgWideEmailAddressId, relatedRecord); |
|
} |
|
} |
|
|
|
private static void sendEmail(Id emailTemplateId, Id orgWideEmailAddressId, SObject relatedRecord) { |
|
Messaging.SingleEmailMessage message = new Messaging.SingleEmailMessage(); |
|
message.setTargetObjectId(getTargetObjectId(relatedRecord)); |
|
if (getClassName(relatedRecord).endsWith('__c')) { |
|
message.setWhatId(relatedRecord.Id); |
|
} |
|
message.setTemplateId(emailTemplateId); |
|
message.setOrgWideEmailAddressId(orgWideEmailAddressId); |
|
message.setOptOutPolicy('FILTER'); |
|
message.setUseSignature(false); |
|
message.setBccSender(false); |
|
message.setSaveAsActivity(isSaveAsActivity(relatedRecord)); |
|
message.setToAddresses(new List<String>{ |
|
getToAddress(relatedRecord) |
|
}); |
|
Messaging.SingleEmailMessage[] messages = new List<Messaging.SingleEmailMessage>{ |
|
message |
|
}; |
|
Messaging.SendEmailResult sendEmailResult = Messaging.sendEmail(messages)[0]; |
|
if (!sendEmailResult.isSuccess()) { |
|
System.debug(String.format( |
|
'ERROR: SendLightningEmail: failed to send templateId={0} orgWideEmailAddressId={1} relatedRecord.Id={2} error="{3}', |
|
new List<Object> {emailTemplateId, orgWideEmailAddressId, relatedRecord.Id, sendEmailResult.errors[0].message} |
|
)); |
|
} |
|
} |
|
|
|
private static Id getTargetObjectId(SObject relatedRecord) { |
|
// There is *definitely* an Enterprise programming pattern to make this pluggable |
|
if (relatedRecord instanceof Example__c) { |
|
return ((Example__c) relatedRecord).Email__c; |
|
} else { |
|
return relatedRecord.Id; |
|
} |
|
} |
|
|
|
private static String getToAddress(SObject relatedRecord) { |
|
// There is *definitely* an Enterprise programming pattern to make this pluggable |
|
if (relatedRecord instanceof Example__c) { |
|
return ((Example__c) relatedRecord).ExampleEmail__c; |
|
} else if (relatedRecord instanceof Contact) { |
|
return ((Contact) relatedRecord).Email; |
|
} else if (relatedRecord instanceof User) { |
|
return ((User) relatedRecord).Email; |
|
} else if (relatedRecord instanceof Lead) { |
|
return ((Lead) relatedRecord).Email; |
|
} else { |
|
throw new IllegalArgumentException('Unsupported related record of type: ' + getClassName(relatedRecord)); |
|
} |
|
} |
|
|
|
private static String getClassName(Object theObject) { |
|
return String.valueOf(theObject).split(':')[0]; |
|
} |
|
|
|
private static Boolean isSaveAsActivity(Object theObject) { |
|
return !getClassName(theObject).equals('User'); |
|
} |
|
} |