[SalesForce] SingleMessage with TemplateId in Apex: need to add more recipients

I am writing code to send emails to contacts via Apex using templates. My issue is that I need to be able to copy these emails to various other users that are going to be determined at run time. This is not currently allowed: (see here) http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_classes_email_outbound_single.htm

setBccAddresses(String[])
Optional. A list of blind carbon copy (BCC) addresses. The maximum allowed is 25.
This argument is allowed only when a template is not used.

setCcAddresses(String[])
Optional. A list of carbon copy (CC) addresses. The maximum allowed is 25.
This argument is allowed only when a template is not used.

Does anyone have any ideas for a workaround?

Thank you!

Best Answer

I use templates and can easily set additional to: addresses using email.setToAddresses(toRecipients); even though the doc says it is not supported.

Have you actually tried to set cc: adddresses and additional to: addresses with a template and seen it fail? I'm not 100% convinced the doc is accurate .

I just tried using anonymous APEX and V.30 using this code and it works fine in both to: and cc: lists with a call such as this:

Util.sendTemplatedEmail(new List<String> {'crop1645@foo.com'},
     new List<String>{'crop1645@bar.com'},
     'fooTemplate',UserInfo.getUserId(),
      [select id from Foo__c limit 1][0].id,null,false);

This really makes me think the doc is wrong.

//  -------------------------------------------------------------------------
//  sendTemplatedEmail
//  -------------------------------------------------------------------------
public static void sendTemplatedEmail(String[] toRecipients, String[] ccRecipients, String templateParmName, ID targetObjId, Id whatId, ID orgWideEmailId, Boolean saveAsActivity ) {
    //  templateId  must be ID of an Email template
    //  targetObjId must be a Contact Id -- also used in merge fields of template recipient.xxxx
    //  whatId      must be an SObject that is used in the merge fields of the template relatedTo.xxxx
    //  fromId      if non null, use current user, otherwise, use this ID (most likely an org wide no reply id)

    Messaging.SingleEmailMessage email = new Messaging.SingleEmailMessage();
    String templateApiName = EnvironmentVariable.getString(templateParmName);
    Id templateId;  
    try {templateId = [select id, name from EmailTemplate where developername = : templateApiName].id;}
    catch (Exception e) {
        throw new MyException ('[UTIL-06] Unable to locate EmailTemplate using name: ' + templateApiName + 
                                    ' as indicated in Custom Settings ' + templateParmName);
    }


    email.setToAddresses(toRecipients);
    email.setCcAddresses(ccRecipients);
    email.setTargetObjectId(targetObjId);
    email.setWhatId(whatId);
    email.setorgWideEmailAddressId(orgWideEmailId);
    email.setTemplateId(templateId);
    email.setSaveAsActivity(saveAsActivity);            // save email as activity on the targetObjId (i.e. Contact)
    try {
        Messaging.sendEmail(new Messaging.SingleEmailMessage[] {email});
        return;
    }
    catch (EmailException e) {throw new MyException('[UTIL-07] sendTemplatedEmail error. ' + e.getMessage());}

}
Related Topic