Activity Forums Salesforce® Discussions Salesforce Batch Apex - send Leads and opportunity records in one email along with two different tables.

  • Salesforce Batch Apex - send Leads and opportunity records in one email along with two different tables.

    Posted by Muhammad Jawwad on March 26, 2019 at 1:30 pm

    Actually, I write a batch class to send an email last month leads to the loan officer lookup relation with a contact object at the beginning of the new month in a table format. Now I wanna send lead and opportunity both in one email along with two different tables. I have tried too many time but I could not succeed. Help me how to send two objects data in an email. Here is my existing code

    global class testoppty implements Database.Batchable<sObject> {
        public String query = 'SELECT Loan_Officer_1a__c,Loan_Officer_1a__r.Email, Name, Phone, Starting_Credit_Score__c, ' 
                              +  'Status, Enrolled_On__c, Est_Re_Pull_Date__c, Realtor_Name__c ' 
                              +   ' FROM Lead';
        query = 'SELECT Loan_Officer_1__c,Loan_Officer_1__r.Email, Name, Starting_Credit_Score__c, ' 
                              +  ' StageName, Enrolled_On__c, Est_Re_Pull_Date__c, Realtor_ID__r.Name ' 
                              +   ' FROM Opportunity';
        public EmailTemplate templateId = [Select Id,HtmlValue,Subject from EmailTemplate where name = 'LoanOfficerRecord' LIMIT 1];
        global Database.QueryLocator start(Database.BatchableContext bc) {
            query += ' WHERE CreatedDate >= LAST_MONTH AND CreatedDate <= THIS_MONTH AND Loan_Officer_1a__c != null';
            return Database.getQueryLocator(query);
        global void execute(Database.BatchableContext BC, list<Lead> allLeads) {
            Map<Id,List<Lead>> leadMap = new Map<Id,List<Lead>>();
            List<Messaging.SingleEmailMessage> mails = new List<Messaging.SingleEmailMEssage>();
            if(allLeads != null && allLeads.size() > 0){
                for(Lead l: allLeads){
                        leadMap.put(l.Loan_Officer_1a__c, new List<lead>());
            if(leadMap.keySet().size() > 0){
                Map<Id,Contact> officers = new Map<Id,Contact>([SELECT Id,Email,Name FROM Contact WHERE Id IN: leadMap.keySet()]);
                for(Id i: leadMap.keySet()){
                    Contact con = officers.get(i);
                        Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
                        mail.setToAddresses(new String[]{con.EMail});
                        String html = templateId.HtmlValue;
                        html = html.replace('||OfficerName||',con.Name);
                        String leadsTable = '<table cellpadding="3" cellspacing="3" width="100%" align="center" border="1" style="border-collapse:collapse;">'+
                            '<tr style="font-weight:bold;"><td>Name</td><td>Phone</td><td>Starting Credit Score</td><td>Status</td><td>Enrolled On</td><td>Est. Re Pull Date</td><td>Realtor Name</td></tr>';
                        for(Lead l: leadMap.get(i)){
                            leadsTable += '<tr><td>'+l.Name+'</td>'+
                        leadsTable += '</table>';
                        html = html.replace('||Leads||',leadsTable);
                        html = html.replace('null',' ');
            if(mails.size() > 0){
        global void finish(Database.BatchableContext BC) {


    • This discussion was modified 5 years ago by  Muhammad Jawwad.
    • This discussion was modified 5 years ago by  Forcetalks.
    • This discussion was modified 4 years, 10 months ago by  Forcetalks.
    • This discussion was modified 4 years, 10 months ago by  Forcetalks.
    Avnish Yadav replied 4 years, 11 months ago 2 Members · 1 Reply
  • 1 Reply
  • Avnish Yadav

    April 29, 2019 at 12:50 pm

    Hello Muhammad,

    I go through your code and find errors on implementation of the batch class:-

    You are querying two objects in Database.query() which not possible in salesforce.

    Solution -You can create an internal query if your Lead object and Opportunity object are related. (use carefully)


Log In to reply.

Popular Salesforce Blogs

Popular Salesforce Videos