0
// Original Code
    for(Account obj :updateAsDuplicate){
        obj.Duplicate__c  = true;
        for(String oldStr : hasExternalIdOldSet){
            if(obj.Id.equals(duplicateMap.get(oldStr))){
                obj.Duplicate_Account__c = oldStr;
            }
        }    
        
        for(String email : emailList){
            SendMail(email,obj.Id);
        }
        
    }

    public static void SendMail(String email,String accId){
       Map<string,DomainURL__c> urlMap= DomainURL__c.getAll();
       Account acc = [Select Id,Name,Owner.Name FROM Account WHERE Id =: accId] ;
       String HtmlBody= 'Attention, <br><br>';
       HtmlBody+='Some text blalala : '  + acc.Name+  '<br><br>';
       
       Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
       
       String[] toAddresses = new String[]{email};
       mail.setToAddresses(toAddresses);
       mail.setSubject('Something');
       mail.setHTMLBody(HtmlBody);
       mail.setSaveAsActivity(false);
       mail.setWhatId(acc.Id); //
       Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });

    }

Below is my attempt to rectify the error. Can someone please tell me if i am correct **

    List<Messaging.SingleEmailMessage> allMails = new List<Messaging.SingleEmailMessage>();


    for(Account obj :updateAsDuplicate){
        obj.Duplicate__c  = true;
        for(String oldStr : hasExternalIdOldSet){
            if(obj.Id.equals(duplicateMap.get(oldStr))){
                obj.Duplicate_Account__c = oldStr;
            }
        }    
        
        for(String email : emailList){
            SendMail(email,obj.Id);
        }
        
    }

    public static void SendMail(String email,String accId){
       Map<string,DomainURL__c> urlMap= DomainURL__c.getAll();
       Account acc = [Select Id,Name,Owner.Name FROM Account WHERE Id =: accId] ;
       String HtmlBody= 'Attention, <br><br>';
       HtmlBody+='Some text blalala : '  + acc.Name+  '<br><br>';
       
       Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
       
       String[] toAddresses = new String[]{email};
       mail.setToAddresses(toAddresses);
       mail.setSubject('Something');
       mail.setHTMLBody(HtmlBody);
       mail.setSaveAsActivity(false);
       mail.setWhatId(acc.Id); //
       
       allMails.add(mail);
       
       Messaging.sendEmail(allMails);   

     }

2 Answers 2

1

I would do something like this:

{
    List<Messaging.SingleEmailMessage> allMails = new List<Messaging.SingleEmailMessage>();
    Set<Id> accountIdSet = new Set<Id>();

    for(Account obj : updateAsDuplicate){
        obj.Duplicate__c  = true;
        accountIdSet.add(obj.Id);
        for(String oldStr : hasExternalIdOldSet){
            if(obj.Id.equals(duplicateMap.get(oldStr))){
                obj.Duplicate_Account__c = oldStr;
            }
        }
    }

    List<Account> accountList = [SELECT Id, Name, Owner.Name FROM Account WHERE Id =: accountIdSet];

    for(Account eachAccount : accountList)) {
        for(String email : emailList){
            allMails.add(prepareEmail(email, eachAccount));
        }
    }
    Messaging.SendEmailResult[] results = Messaging.sendEmail(allMails, false);
}

public static Messaging.SingleEmailMessage prepareEmail(String email, Account accountObject){
    String HtmlBody = 'Attention, <br><br>';
    HtmlBody += 'Some text blalala : '  + accountObject.Name+  '<br><br>';

    Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();

    String[] toAddresses = new String[]{email};
    mail.setToAddresses(toAddresses);
    mail.setSubject('Something');
    mail.setHTMLBody(HtmlBody);
    mail.setSaveAsActivity(false);
    mail.setWhatId(accountObject.Id);

    return mail;
}
0

sendEmail in a loop is a sin.

//Prepare a list of all your emails and invoke sendEmail once

List<Messaging.SingleEmailMessage> messages= new List<Messaging.SingleEmailMessage>();
for(...) {
  Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
  // Set mail parameters
  messages.add(mail);
}
Messaging.sendEmail(messages);

I have enclosed your initial code into a dummy function for clarity Consider this as a pseudo code that conveys the correction/placement of logic/calls (sendEmail once) to fix your code:

// Global

 List<Messaging.SingleEmailMessage> allMails = new List<Messaging.SingleEmailMessage>();

 public void dummyrename()
  {
  
    for(Account obj :updateAsDuplicate){
        obj.Duplicate__c  = true;
        for(String oldStr : hasExternalIdOldSet){
            if(obj.Id.equals(duplicateMap.get(oldStr))){
                obj.Duplicate_Account__c = oldStr;
            }
        }    
        
        for(String email : emailList){
            SendMail(email,obj.Id);
        }
        
    }
    // Here we are sure allMails are populated
    Messaging.sendEmail(allMails);   
   }

    public static void SendMail(String email,String accId){
       Map<string,DomainURL__c> urlMap= DomainURL__c.getAll();
       Account acc = [Select Id,Name,Owner.Name FROM Account WHERE Id =: accId] ;
       String HtmlBody= 'Attention, <br><br>';
       HtmlBody+='Some text blalala : '  + acc.Name+  '<br><br>';
       
       Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
       
       String[] toAddresses = new String[]{email};
       mail.setToAddresses(toAddresses);
       mail.setSubject('Something');
       mail.setHTMLBody(HtmlBody);
       mail.setSaveAsActivity(false);
       mail.setWhatId(acc.Id); //
       
       allMails.add(mail);
 
     

     }
7
  • What you are suggesting is exactly what i have attempted to do based on a code sample. However I am not sure if, in my code I have Messaging.sendEmail(allMails); where it is supposed to be. Jun 19, 2020 at 20:37
  • You have sendEmail in a loop . Note my sendemail is outside the loop. Edited my answer to reflect the next step
    – user40322
    Jun 19, 2020 at 20:43
  • Yes as per the pseudo code.sendEmail once after the loop (allMails is populated)
    – user40322
    Jun 19, 2020 at 20:53
  • Thanks for the clear explanation! Apologies, i did not read your edited answer Jun 19, 2020 at 20:54
  • Please let us know if this solved your problem !
    – user40322
    Jun 19, 2020 at 21:08

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .