From 4a3e656be2b8d34c92cbba3b5e9125074b1fbdf9 Mon Sep 17 00:00:00 2001 From: Jannis <57483606+JnsMT@users.noreply.github.com> Date: Fri, 12 Jul 2024 16:25:30 +0200 Subject: [PATCH 1/4] Update SendBetterEmailUtil.cls Added renderTemplate method --- .../default/classes/SendBetterEmailUtil.cls | 47 ++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/flow_action_components/SendBetterEmail/force-app/main/default/classes/SendBetterEmailUtil.cls b/flow_action_components/SendBetterEmail/force-app/main/default/classes/SendBetterEmailUtil.cls index 81dd28d51..854602942 100644 --- a/flow_action_components/SendBetterEmail/force-app/main/default/classes/SendBetterEmailUtil.cls +++ b/flow_action_components/SendBetterEmail/force-app/main/default/classes/SendBetterEmailUtil.cls @@ -306,4 +306,49 @@ public inherited sharing class SendBetterEmailUtil { return mapRecordIdByName; } -} \ No newline at end of file + + public static String renderTemplate( + String templateId, + String targetObjectId, + String whatId + ){ + Messaging.SingleEmailMessage tempMail = new Messaging.SingleEmailMessage(); + + tempMail = Messaging.renderStoredEmailTemplate(templateID, targetObjectId, whatId); + + Pattern pattern = Pattern.compile('###(.*?)###'); + Matcher matcher = pattern.matcher(tempMail.htmlBody); + List sObjectFields = new List(); + while (matcher.find()) { + sObjectFields.add(matcher.group(1)); + } + + String relatedEntityType = [SELECT RelatedEntityType FROM EmailTemplate WHERE Id = :templateID].RelatedEntityType; + + Schema.SObjectType sObjectType = Schema.getGlobalDescribe().get(relatedEntityType); + if(sObjectFields.size() > 0 && whatId != null && sObjectType != null){ + String query = 'SELECT ' + String.join(sObjectFields, ', ') + ' FROM ' + sObjectType + ' WHERE Id = \'' + whatId + '\''; + SObject sObjectRecord = Database.query(query); + + matcher.reset(); + while (matcher.find()) { + String field = matcher.group(1); + String[] fieldParts = field.split('\\.'); + String fieldValue; + + SObject obj = sObjectRecord; + for(Integer i = 0; i < fieldParts.size(); i++){ + if(i + 1 != fieldParts.size()){ + obj = sObjectRecord.getSObject(fieldParts[i]); + } else { + fieldValue = (String) obj.get(fieldParts[i]); + } + } + + tempMail.htmlBody = tempMail.htmlBody.replace(matcher.group(), fieldValue); + } + } + + return tempMail.htmlBody; + } +} From fae523ea8112c5ee2a7050b962e9bb87dd61b2c2 Mon Sep 17 00:00:00 2001 From: Jannis <57483606+JnsMT@users.noreply.github.com> Date: Fri, 12 Jul 2024 16:27:52 +0200 Subject: [PATCH 2/4] Update SendBetterEmail.cls Added renderTemplate method in utils. Used to inject cross-object merge fields via Apex --- .../force-app/main/default/classes/SendBetterEmail.cls | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/flow_action_components/SendBetterEmail/force-app/main/default/classes/SendBetterEmail.cls b/flow_action_components/SendBetterEmail/force-app/main/default/classes/SendBetterEmail.cls index 78977ca4a..58e71bd87 100644 --- a/flow_action_components/SendBetterEmail/force-app/main/default/classes/SendBetterEmail.cls +++ b/flow_action_components/SendBetterEmail/force-app/main/default/classes/SendBetterEmail.cls @@ -445,7 +445,10 @@ public without sharing class SendBetterEmail { if (templateID != null && templateID.length() > 0) { try { - mail.setTemplateID(templateID); + mail.setHtmlBody(SendBetterEmailUtil.renderTemplate(templateID, mail.targetObjectId, mail.whatId)); + mail.setTreatTargetObjectAsRecipient( + setTreatTargetObjectAsRecipient + ); mail.setTreatTargetObjectAsRecipient(setTreatTargetObjectAsRecipient); thisResponse.templateUsed = templateID; } catch (Exception e) { @@ -606,4 +609,4 @@ public without sharing class SendBetterEmail { public class InvocableActionException extends Exception { } -} \ No newline at end of file +} From 998d8abcf143f836a0a82f1c63d3a043051554e2 Mon Sep 17 00:00:00 2001 From: Jannis <57483606+JnsMT@users.noreply.github.com> Date: Fri, 12 Jul 2024 16:28:51 +0200 Subject: [PATCH 3/4] Update SendBetterEmail.cls Removed double setTreatTargetObjectAsRecipient --- .../force-app/main/default/classes/SendBetterEmail.cls | 3 --- 1 file changed, 3 deletions(-) diff --git a/flow_action_components/SendBetterEmail/force-app/main/default/classes/SendBetterEmail.cls b/flow_action_components/SendBetterEmail/force-app/main/default/classes/SendBetterEmail.cls index 58e71bd87..63b3a7c6b 100644 --- a/flow_action_components/SendBetterEmail/force-app/main/default/classes/SendBetterEmail.cls +++ b/flow_action_components/SendBetterEmail/force-app/main/default/classes/SendBetterEmail.cls @@ -446,9 +446,6 @@ public without sharing class SendBetterEmail { if (templateID != null && templateID.length() > 0) { try { mail.setHtmlBody(SendBetterEmailUtil.renderTemplate(templateID, mail.targetObjectId, mail.whatId)); - mail.setTreatTargetObjectAsRecipient( - setTreatTargetObjectAsRecipient - ); mail.setTreatTargetObjectAsRecipient(setTreatTargetObjectAsRecipient); thisResponse.templateUsed = templateID; } catch (Exception e) { From 79e9864f563adc1ae88e5a60e97be0d8369d1aeb Mon Sep 17 00:00:00 2001 From: Jannis <57483606+JnsMT@users.noreply.github.com> Date: Mon, 2 Sep 2024 11:04:33 +0200 Subject: [PATCH 4/4] Update SendBetterEmailUtil.cls added safety checks --- .../default/classes/SendBetterEmailUtil.cls | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/flow_action_components/SendBetterEmail/force-app/main/default/classes/SendBetterEmailUtil.cls b/flow_action_components/SendBetterEmail/force-app/main/default/classes/SendBetterEmailUtil.cls index 854602942..787db3923 100644 --- a/flow_action_components/SendBetterEmail/force-app/main/default/classes/SendBetterEmailUtil.cls +++ b/flow_action_components/SendBetterEmail/force-app/main/default/classes/SendBetterEmailUtil.cls @@ -308,9 +308,9 @@ public inherited sharing class SendBetterEmailUtil { } public static String renderTemplate( - String templateId, - String targetObjectId, - String whatId + String templateId, + String targetObjectId, + String whatId ){ Messaging.SingleEmailMessage tempMail = new Messaging.SingleEmailMessage(); @@ -339,16 +339,30 @@ public inherited sharing class SendBetterEmailUtil { SObject obj = sObjectRecord; for(Integer i = 0; i < fieldParts.size(); i++){ if(i + 1 != fieldParts.size()){ - obj = sObjectRecord.getSObject(fieldParts[i]); + obj = obj.getSObject(fieldParts[i]); + + if(obj == null){ + break; + } } else { - fieldValue = (String) obj.get(fieldParts[i]); + try{ + fieldValue = (String) obj.get(fieldParts[i]); + } catch (TypeException e){ + if (obj.get(fieldParts[i]) instanceof Date){ + fieldValue = ((Date) obj.get(fieldParts[i])).format(); + } else if(obj.get(fieldParts[i]) instanceof Datetime){ + fieldValue = ((Datetime) obj.get(fieldParts[i])).format(); + } else { + fieldValue = obj.get(fieldParts[i]).toString(); + } + } } } + fieldValue = fieldValue == null ? '' : fieldValue; tempMail.htmlBody = tempMail.htmlBody.replace(matcher.group(), fieldValue); } } - return tempMail.htmlBody; } }