How to generate Email-to-Case thread id inside template:
Generate the thread Id
public static String getThreadId(String caseId){ public static String getThreadId(String caseId){ return '[ ref:_' + UserInfo.getOrganizationId().left(5) + UserInfo.getOrganizationId().mid(11,4) + '._' + caseId.left(5) + caseId.mid(10,5) + ':ref ]'; }
Send customEmail and Add ThreadId
public void sendCustomEmail(User selectedUser, Contact selectedContact, String templateName, Map<String, String> customVariables){ EmailTemplate emailTemplate = [select Id, Subject, HtmlValue, Body from EmailTemplate where DeveloperName=:templateName]; if (selectedContact==null){ selectedContact = selectedUser.Contact; } String customSubject = emailTemplate.Subject; if (customVariables.containsKey('joinContactName')){ customSubject = customSubject.replace('{!JointContactName}', customVariables.get('joinContactName')); } //Add ThreadId to the Subject if (customVariables.containsKey('ThreadId')) { customSubject = customSubject.replace('{!ThreadId}', customVariables.get('ThreadId')); } String htmlBody = emailTemplate.HtmlValue; htmlBody = htmlBody.replace('{!Contact.FirstName}',selectedContact.FirstName); htmlBody = htmlBody.replace('{!Contact.Email}', selectedContact.Email); if (customVariables.containsKey('Link')){ htmlBody = htmlBody.replace('{!CustomUrl}', customVariables.get('Link')); } else if (customVariables.containsKey('link')){ htmlBody = htmlBody.replace('{!CustomUrl}', customVariables.get('link')); } else if (customVariables.containsKey('joinContactName')){ htmlBody = htmlBody.replace('{!JointContactName}', customVariables.get('joinContactName')); } //Add ThreadId to the htmlBody if (customVariables.containsKey('ThreadId')){ htmlBody = htmlBody.replace('{!ThreadId}', customVariables.get('ThreadId')); } String plainBody = emailTemplate.Body; plainBody = plainBody.replace('{!Contact.FirstName}',selectedContact.FirstName); plainBody = plainBody.replace('{!Contact.Email}', selectedContact.Email); if (customVariables.containsKey('Link')){ plainBody = plainBody.replace('{!CustomUrl}', customVariables.get('Link')); } else if (customVariables.containsKey('link')){ plainBody = plainBody.replace('{!CustomUrl}', customVariables.get('link')); } else if (customVariables.containsKey('joinContactName')){ plainBody = plainBody.replace('{!JointContactName}', customVariables.get('joinContactName')); } //Add the threadId to the plainBody if (customVariables.containsKey('ThreadId')){ plainBody = plainBody.replace('{!ThreadId}', customVariables.get('ThreadId')); } Messaging.Singleemailmessage email = new Messaging.Singleemailmessage(); List<OrgWideEmailAddress> orgWideEmailAddress = [Select Id, Address from OrgWideEmailAddress where DisplayName=:ORGWIDEEMAILADDRESSNAME]; //Set ReplyTo as the Email-to-Case email address if (customVariables.containsKey('ThreadId')){ List<EmailServicesAddress> emailServicesAddress = [SELECT Id,AuthorizedSenders,EmailDomainName,IsActive,LocalPart FROM EmailServicesAddress where IsActive=true and (LocalPart like '%service%' or LocalPart like '%support%')]; if (!emailServicesAddress.isEmpty()){ EmailServicesAddress emailToCase = emailServicesAddress.get(0); email.setReplyTo(emailToCase.LocalPart +'@'+ emailToCase.EmailDomainName); email.setSenderDisplayName('Client Support'); } else { email.setReplyTo('customer-service@gmail.com'); email.setSenderDisplayName('Client Support'); } } email.setTargetObjectId(selectedContact.Id); email.setSaveAsActivity(true); email.setSubject(customSubject); email.setHtmlBody(htmlBody); email.setPlainTextBody(plainBody); if (customVariables.containsKey('WhatId')){ email.setWhatId(customVariables.get('WhatId')); } Messaging.sendEmail(new Messaging.SingleEmailmessage[] {email}); }
Putting it all together
Map<String, String> mappingOfCaseFields = new Map<String, String>(); mappingOfCaseFields.put('ThreadId', App_Service.getThreadId(paymentCaseId)); App_Service.instance.sendCustomEmail(null, contact, 'App_Support_Template', mappingOfCaseFields);
Hi Michel,
This Generate the thread Id will not work as expected for an org where the 5th character is non-zero.
++Prakash.
Yes, I am having the same scenario and the 5th character is non zero. Its not working for me. The better solution is to use formual field.