mardi 3 avril 2012

Envoyer des emails en APEX

La classe Messaging fournie par APEX permet d'envoyer des emails facilement, qu'ils contiennent du texte brut, du contenu HTML ou qu'ils reposent sur des modèles de message.
Nous allons, dans cet article, montrer deux méthodes implémentant les fonctionnalités de la classe Messaging.

Envoi d'un email en texte brut ou HTML

La méthode ci-dessous permet d'envoyer un email en spécifiant l'objet du message, son contenu et les destinataires.

public static void sendEmailWithText(String the_Object, String the_Text, Boolean the_IsHtml, String[] the_Recipients) {
                       
   // Check the limit of sent emails is not passed
   if (Limits.getEmailInvocations() >= Limits.getLimitEmailInvocations()) {
      return;
   }
                       
   Messaging.SingleEmailMessage a_Mail = new Messaging.SingleEmailMessage();
           
   if (the_Recipients != null) {
      // Set the destinary adresses
      a_Mail.setToAddresses(the_Recipients);
   }
   else {
      // Find the email of the current user
      User a_User = [SELECT Email 
                     FROM User 
                     WHERE Id=:Userinfo.getUserId()];
        
      // Set the destinary adresses
      a_Mail.setToAddressesnew String[] {a_User.Email );
                        
      if ((the_Object == null) || (the_Object == '')) {
         a_Mail.setSubject('NaTwelve : Custom email sent');
      }
      else {
         a_Mail.setSubject(the_Object);
      }
                       
      // Set the destinary adresses
      if (the_IsHtml) {
         a_Mail.setHtmlBody(the_Text);
      }
      else {
         a_Mail.setPlainTextBody(the_Text);
      }
       
      // Do not create an email task for this email
      a_Mail.setSaveAsActivity(false);
           
      // Send the email
      Messaging.sendEmail(new Messaging.SingleEmailMessage[] { a_Mail });
   }
}


Comment utiliser notre méthode ?

Avec un texte brut
sendEmailWithText('Objet de mon email', 'Corps de mon email\nEmail au format texte brut.', false, System.Userinfo.getUserId());


Avec de l'HTML
sendEmailWithText('Objet de mon email', '<h1>Corps de mon email</h1><br/>Email au format HTML.', true, System.Userinfo.getUserId());

Cette méthode peut être utilisée aussi bien pour envoyer des alertes, que des notifications ou des traces.
J'utilise, moi-même, cette fonction dans de nombreux services de messagerie afin de recevoir des traces de debug au format texte par email.

Envoi d'un email avec modèle de message

public static void sendEmailWithTemplate(String the_Template, Id the_RecipientId, Id the_ObjectId) {

                       
   // Check the limit of sent emails is not passed
   if (Limits.getEmailInvocations() >= Limits.getLimitEmailInvocations()) {
      return;
   }
                    
   // Get the email template
   EmailTemplate a_Template = [SELECT Id 
                               FROM EmailTemplate 
                               WHERE DeveloperName =:the_Template];
    
   Messaging.SingleEmailMessage a_Mail = new Messaging.SingleEmailMessage();
                       
   if (the_RecipientId != null) {
      // Set the destinary adresses
      a_Mail.setTargetObjectId(the_RecipientId);
   }
   else {
      // Set the destinary adresses of the current user
      a_Mail.setTargetObjectId(Userinfo.getUserId());
   }
                                  
   // Do not create an email task for this email
   a_Mail.setSaveAsActivity(false);
                                  
   // Set template of email
   a_Mail.setTemplateId(a_Template.Id);
                                  
   if (the_ObjectId != null) {
      // Set the resource demand object for merging fields
      a_Mail.setWhatId(the_ObjectId);
   }
                                  
   // Send the email
   Messaging.sendEmail(new Messaging.SingleEmailMessage[] { a_Mail });
}

Comment utiliser notre méthode ?

Account aAccount = [SELECT Id FROM Account LIMIT 1];
sendEmailWithTemplate('modeleFicheClient', System.Userinfo.getUserId(), aAccount.Id);

En utilisant des modèles de message, on gagne en généricité et on facilite la gestion du contenu des messages qui peut être fait par l'interface du CRM sans avoir à manipuler du code APEX.


Remarques

L'envoi d'email et les limites

Comme on peut le voir en début de nos deux méthodes, on vérifie que la limite EmailInvocations n'est pas dépassée. Force.com limite le nombre d'emails envoyer via la fonction Messaging.sendEmail à 10. Si vous ne respectez pas cette limite, vous verrez ce beau message d'erreur « Too many Email Invocations ».

D'où l'intérêt de grouper les destinataires pour l'envoi d'un même email ou l'utilisation des emails en masse pour l'envoi de contenus différents.

Les emails en masse

Nous avons utilisé la classe SingleEmailMessage dans nos deux méthodes mais il existe aussi la classe MassEmailMessage qui est plus approprié pour l'envoi de messages différents à plusieurs destinataires.
Elle sera particulièrement utile pour les emails qui utilisent des modèles de message. Le modèle sera alors appliqué à chacun des utilisateurs passés à la méthode setTargetObjectIds.

Sachez que l'envoi d'emails est soumis à deux autres limites mais plus rares cette fois-ci. La première empêche l'envoi à plus de 250, 500 ou 1000 (en fonction de l'édition de Salesforce que vous possèdez) destinataires différents et externes pour un même email en masse. La seconde fixe un maximum de 1000 emails envoyés en utilisant la classe SingleEmailMessage ou la classe MassEmailMessage par jour.


source : Outbound Email, Understanding Execution Governors and Limits

Aucun commentaire:

Enregistrer un commentaire