Envoyer un mail avec template sans contact

Envoyer un mail avec template sans contact

Envoyer un mail avec template sans contact

Nous allons voir ici comment envoyer un mail avec template sans contact.

Salesforce offre plusieurs possibilités pour y arriver. Afin d’uniformiser ces emails, des modèles (templates) peuvent être créés et utilisés pour ces envois :

Paramétrage des templates mails

Template Classic vs Template Lightning

Ces modèles permettent d’incorporer des champs de fusion en provenance d’objets Salesforce (Compte, Opportunité, Contact, Objet personnalisé, …). Les templates Classic se créent via le menu Setup | Email | Classic Email Templates alors que les templates Lightning se créent depuis l’onglet Email Templates.

Avec Lightning, on peut classer les modèles de mails dans plusieurs niveaux de dossiers alors que sous Classic, on ne peut avoir qu’un seul niveau de dossier. Par ailleurs, l’interface de création diffère :

Différences entre template Classic et Lightning

Envoi de mail avec template

On peut faire appel à un template Classic aussi bien que Lightning dans une alerte mail.

Création d'une alerte mail

Celle-ci pourra être utilisée dans :

  • une règle de workflow (obsolète),
  • un processus d’approbation
  • un flux

Le flux offre le plus de variantes pour envoyer un email comme on va le voir. Nous allons évoquer également des solutions avec du code Apex. Nous verrons ainsi les possibilités de chaque solution et pourrons décider de celle(s) à privilégier.

Flux Salesforce – Action « Send Email »

L’action standard Send Email permet l’envoi sans forcément indiquer un contact. Malheureusement, on ne peut pas faire appel à un template mail.

Action Send Mail d'un flux

Le contournement consiste alors à utiliser une des nouveautés de la Spring 21. Il s’agit d’une ressource de flux de type Modèle de texte (text template) pour envoyer des emails avec du contenu enrichi.

Il faut au préalable créer une ressource text template (remplaçant le template mail) :

Modifier un Text Template

A noter qu’il y a un mode de visualisation en plein texte et un affichant le texte enrichi. En basculant en plein texte, on va voir le code HTML :

Afficher un template text en texte plein

Il faut penser à renseigner les propriétés comme ci-dessous, notamment Rich Text-Formatted Body avec {!$GlobalConstant.True}.

Paramètres de l'action flux Send Mail

Comme on le voit, en omettant de mettre la propriété à True, le message reçu affichera toutes les balises HTML :

Mail avec HTML pas et bien interprété

Flux Salesforce – Action « Send Email Alert »

L’action standard Send Email Alert fait appel à une alerte mail et donc à un template mail.

ajout de composant Send Email Alert dans un flux

La limitation ici est qu’il faut absolument préciser un contact ou un utilisateur pour le destinataire (l’alerte email permet une saisie libre pour les personnes en copie du mail mais pas pour le destinataire) :

Limitations d'un Template Email Alert

Flux Salesforce – Action Apex

Pour gérer les cas plus complexes, on peut utiliser une action apex. On est donc dans une solution hybride mêlant point and click et Apex.

Une fois la classe Apex créée, le flux peut l’invoquer. Voici un exemple de code servant à envoyer un mail via flux (tout en sauvegardant le mail dans les activités) : https://github.com/danhowellnz/SendEmail

La page suivante détaille comment installer et utiliser ce code : https://gravitylab.nz/send-email-alerts-and-log-the-email/

En bas de la page, on retrouve les limitations, notamment : You cannot use Email Templates without a Lead or Contact Id

Focus sur l'action apex Send Email d'un flux

On peut appliquer le même contournement que pour l’action Send Mail appelée par un flux (text template).

Apex – Envoi de mail

La documentation officielle de Salesforce explique comment envoyer un email avec les différents paramètres possibles. Si l’on renseigne le templateId, il devient obligatoire de renseigner le targetObjectId, à savoir ici le contact :

Code apex pour envoyer un email avec template sans contact

Comme on le voit avec l’erreur REQUIRED_FIELD_MISSING, Missing targetObjectId with template, on ne peut pas utiliser de template sans renseigner le contact.

Apex – Envoi de mail avec template sans contact

En exécutant le code ci-dessus, on constate qu’un mail est bien envoyé au destinataire désiré (ici, article14blog@yopmail.com) mais également au mail associé au contact :

Envoi d'un mail à deux destinataires dont le contact

Dans notre cas d’utilisation, nous souhaitons envoyer à un destinataire sans envoyer de mail à un contact.

Nous allons creuser une solution fournie sur un forum salesforce. Celle-ci consiste à effectuer un rollback avant d’envoyer le mail. Si l’on remplace la dernière ligne de notre code par le bloc suivant :

Savepoint sp = Database.setSavepoint();
Messaging.sendEmail(msgList); // Dummy email send
Database.rollback(sp); // Email will not send as it is rolled Back

Aucun email n’est envoyé.

En rajoutant le bloc de code suivant après le rollback, on atteint le résultat désiré :

// Send Actual email
List<Messaging.SingleEmailMessage> msgListToBeSend = new List<Messaging.SingleEmailMessage>();
for (Messaging.SingleEmailMessage email : msgList) {
    Messaging.SingleEmailMessage emailToSend = new Messaging.SingleEmailMessage();
    emailToSend.setToAddresses(email.getToAddresses());
    emailToSend.setPlainTextBody(email.getPlainTextBody());
    emailToSend.setHTMLBody(email.getHTMLBody());
    emailToSend.setSubject(email.getSubject());
    msgListToBeSend.add(emailToSend);
}
Messaging.sendEmail(msgListToBeSend);

On constate qu’il n’y a qu’un seul email envoyé cette fois !

Envoi d'un seul mail avec template (sans le contact)

Voici le code final (à adapter avec les bons Ids de votre org / email) :

// Prérequis : une boite mail simulant un destinataire + récupérer les Id 
// d'un contact (avec une adresse mail), un autre objet (opportunité) et d'un template mail
Id whatID = '0067Q00000CgfvxQAB';
Id contactId = '0037Q00000MB8gXQAT';
Id templateID = '00X7Q000001ob4v';
String mailDestinataire = 'article14blog@yopmail.com';

// Préparation du mail à envoyer
List<Messaging.SingleEmailMessage> msgList= new List<Messaging.SingleEmailMessage>();
Messaging.SingleEmailMessage msg = new Messaging.SingleEmailMessage();
msg.setTemplateId(templateID);
msg.setWhatId(whatID);
// TargetObjectId obligatoire si templateId renseigné. Si TargetObjectId manquant, erreur suivante :
// REQUIRED_FIELD_MISSING, Missing targetObjectId with template: []
msg.setTargetObjectId(contactId);		
msg.setToAddresses(new List<String>{mailDestinataire});
msgList.add(msg);

Savepoint sp = Database.setSavepoint();
Messaging.sendEmail(msgList); // Dummy email send
Database.rollback(sp); // Email will not send as it is rolled Back

// Send Actual email
List<Messaging.SingleEmailMessage> msgListToBeSend = new List<Messaging.SingleEmailMessage>();
for (Messaging.SingleEmailMessage email : msgList) {
    Messaging.SingleEmailMessage emailToSend = new Messaging.SingleEmailMessage();
    emailToSend.setToAddresses(email.getToAddresses());
    emailToSend.setPlainTextBody(email.getPlainTextBody());
    emailToSend.setHTMLBody(email.getHTMLBody());
    emailToSend.setSubject(email.getSubject());
    msgListToBeSend.add(emailToSend);
}
Messaging.sendEmail(msgListToBeSend);

Contournement Apex ou flux Salesforce pour l’envoi de mail avec template

L’action Send Mail (ou une action Apex) avec un template text couplée à un flux reste acceptable puisque l’on utilise du standard.

Si l’on souhaite absolument utiliser un template mail, le contournement Apex proposé répond au besoin. En attendant de nouvelles évolutions de Salesforce, faites votre choix !