function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
suji srinivasansuji srinivasan 

Hi, I am unable to send mail in batch Apex

I got error  like First error: SendEmail failed. First exception on row 0; first error: INVALID_ID_FIELD, ID is invalid or you do not have access to the record.: [toAddresses, rid.Owner.Email]

public class AccountRatingBatchClass implements  Database.Batchable<sObject> {
    public List<Account> start(Database.BatchableContext bc){
        Integer year = Date.today().year() - 1;
        
       List<Account> aq = [SELECT Id,Rating,CreatedDate FROM Account 
                        WHERE CALENDAR_YEAR(CreatedDate) =:year AND CreatedDate < LAST_N_DAYS:365 AND Rating = 'Client' AND OpportunityCount__c=0];
        return aq;
    }
    public void execute(Database.BatchableContext bc,List<Account> accList){
        for(Account acc : accList){
            acc.Rating='Prospect';
        }
        
        
        List<Messaging.SingleEmailMessage> atm = new List<Messaging.SingleEmailMessage>();  
            EmailTemplate et=[Select id from EmailTemplate where Name='AccountProspectGetOpp'];
                for(Account al : accList){
        
                    Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();       
                        List<AccountTeamMember> recips = new List<AccountTeamMember>(
                                [SELECT UserId,User.isActive,User.Email FROM AccountTeamMember 
                                    WHERE AccountId =: al.Id AND User.isActive=true]);
            
            for(AccountTeamMember rid : recips){
                mail.settoAddresses(new string[]{'rid.Owner.Email'});
                mail.setTargetObjectId(rid.UserId);
                mail.setSenderDisplayName('Salesforce System');
                mail.setUseSignature(false);
                mail.setBccSender(false);
                mail.setSaveAsActivity(false);
                mail.setTemplateId(et.Id);
            }
                
        atm.add(mail);
    } 
        for(Account acl : accList){
        
                    Messaging.SingleEmailMessage mails = new Messaging.SingleEmailMessage();       
                        List<Account> recip = new List<Account>(
                                [SELECT ownerId,owner.Email FROM Account WHERE Id =: acl.Id]);
            
            for(Account rrid : recip){
                mails.settoAddresses(new string[]{'rid.Owner.Email'});
                mails.setTargetObjectId(rrid.ownerid);
                mails.setSenderDisplayName('Salesforce System');
                mails.setUseSignature(false);
                mails.setBccSender(false);
                mails.setSaveAsActivity(false);
                mails.setTemplateId(et.Id);
            }
                
        atm.add(mails);
            
    } 
     update accList;  
        System.debug(accList);
    Messaging.sendEmail(atm);
    }
public void finish(Database.BatchableContext bc){
     
}
}

thanks in advance
Best Answer chosen by suji srinivasan
AnkaiahAnkaiah (Salesforce Developers) 
Hi Suji,

try with below code.
public class AccountRatingBatchClass implements  Database.Batchable<sObject> { 
    public  Database.QueryLocator start(Database.BatchableContext bc) {
        Integer year = Date.today().year() - 1;
        string rating = 'Client';
        
       string query = 'SELECT Id,Rating,CreatedDate FROM Account WHERE CALENDAR_YEAR(CreatedDate) =:year AND CreatedDate < LAST_N_DAYS:365 AND Rating =:rating';
        return Database.getQueryLocator(query);
    }
    public void execute(Database.BatchableContext bc,List<Account> accList){
        for(Account acc : accList){
            acc.Rating='Prospect';
        }
        
        
        List<Messaging.SingleEmailMessage> atm = new List<Messaging.SingleEmailMessage>();  
            EmailTemplate et=[Select id from EmailTemplate where Name='AccountProspectGetOpp'];
                for(Account al : accList){
        
                    Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();       
                        List<AccountTeamMember> recips = new List<AccountTeamMember>(
                                [SELECT UserId,User.isActive,User.Email FROM AccountTeamMember 
                                    WHERE AccountId =: al.Id AND User.isActive=true]);
            
            for(AccountTeamMember rid : recips){
                mail.settoAddresses(new string[]{'rid.Owner.Email'});
                mail.setTargetObjectId(rid.UserId);
                mail.setSenderDisplayName('Salesforce System');
                mail.setUseSignature(false);
                mail.setBccSender(false);
                mail.setSaveAsActivity(false);
                mail.setTemplateId(et.Id);
            }
                
        atm.add(mail);
    } 
        for(Account acl : accList){
        
                    Messaging.SingleEmailMessage mails = new Messaging.SingleEmailMessage();       
                        List<Account> recip = new List<Account>(
                                [SELECT ownerId,owner.Email FROM Account WHERE Id =: acl.Id]);
            
            for(Account rrid : recip){
                mails.settoAddresses(new string[]{'rid.Owner.Email'});
                mails.setTargetObjectId(rrid.ownerid);
                mails.setSenderDisplayName('Salesforce System');
                mails.setUseSignature(false);
                mails.setBccSender(false);
                mails.setSaveAsActivity(false);
                mails.setTemplateId(et.Id);
            }
                
        atm.add(mails);
            
    } 
     update accList;  
        System.debug(accList);
    Messaging.sendEmail(atm);
    }
public void finish(Database.BatchableContext bc){
     
}
}

If this helps, Please mark it as best answer.

Thanks!!