Thursday, 19 February 2015

Send Email using Apex and vf page by using email templates.





Hi friends,


Previously in this post I showed you how we can send emails using Messaging class, but many times we need to send email using email templates in apex code.

So in this post I am using email templates to an send email from apex code:

I am using 2 vf pages and 2 controller in this example:-

  • SendEmailByTemplateVFPage - This is the page from where we are sending Email from template.
  • ClsSendEmailByTemplate - This is controller class of "SendEmailByTemplateVFPage".
  •  SelectTemplate - This is another vf page which is calling from "SendEmailByTemplateVFPage", in this page we are querying all the Email Templates.
  • ClsSelectTemplate - This is controller class of "SelectTemplate".

Here the code:-
public with sharing class clsSelectTemplate
{
private Map<Id, Folder> folderMap{get;set;}
//List of string to store Alphabets character for Alphabetically searching
public List<EmailingTemplate> emailingTemplates {get; set;}
//This is map to fetch all ids of email folders.
private Set<Id> folderListIds = new Set<Id>();
//List of all folders's ids
private Set<Id> folderOtherIds = new Set<Id>();
//To get Template's value
public String folderId {get; set;}
//constructor
public clsSelectTemplate()
{
emailingTemplates = new List<EmailingTemplate>();
folderMap = new Map<Id, Folder>( [Select id , Name from Folder where Type = 'Email']);
this.ETData();
}
public void ETData() //Method to get Name TemplateType Description FolderId from EmailTemplate
{
for(EmailTemplate e : [select Name, TemplateType, Description, FolderId from EmailTemplate where IsActive=true Order by Name])
{
if(!folderListIds.contains(e.FolderId))
folderListIds.add(e.FolderId);
EmailingTemplate tempE = new EmailingTemplate();
tempE.templateId = e.Id;
tempE.Name = e.Name;
tempE.isSelected = false;
tempE.TemplateType = e.TemplateType;
tempE.Description = e.Description;
emailingTemplates.add(tempE);
}
for(Folder f : folderMap.values())
if(!folderListIds.contains(f.id))
folderListIds.add(f.Id);
}
public void createTempList() //Method to get all folder and email template in eamil setting
{
emailingTemplates = new List<EmailingTemplate>();
List<EmailTemplate> etList = new List<EmailTemplate>();
if('All' == folderId)
etList = [select Name, TemplateType, Description, FolderId from EmailTemplate where FolderId IN :folderListIds AND IsActive=true Order by Name];
else if('Others' == folderId)
etList = [select Name, TemplateType, Description, FolderId from EmailTemplate where FolderId IN :folderOtherIds AND IsActive=true Order by Name];
else
etList = [select Name, TemplateType, Description, FolderId from EmailTemplate where FolderId = :folderId AND IsActive=true Order by Name];
for(EmailTemplate e : etList)
{
EmailingTemplate tempE = new EmailingTemplate();
tempE.templateId = e.Id;
tempE.Name = e.Name;
tempE.isSelected = false;
tempE.TemplateType = e.TemplateType;
tempE.Description = e.Description;
emailingTemplates.add(tempE);
}
}
public List<SelectOption> getItems() // show email template according to selaeted email template folder
{
List<SelectOption> options = new List<SelectOption>();
folderOtherIds = new Set<Id>();
options.add(new SelectOption('All', 'All'));
for(String f : folderListIds)
{
if(folderMap.get(f) == null)
{
folderOtherIds.add(f);
system.debug('----------------folderOtherIds-------------'+folderOtherIds);
}
else
options.add(new SelectOption(folderMap.get(f).id, folderMap.get(f).Name));
}
if(folderMap.size() > 0)
options.add(new SelectOption('Others', 'Others'));
return options;
}
class EmailingTemplate // inner class to get emailTemplates Properties
{
public Boolean isSelected {get; set;}
public String templateId {get; set;}
public String Name {get; set;}
public String TemplateType {get; set;}
public String Description {get; set;}
}
}
public class ClsSendEmailByTemplate{
public string EmailTempateId{get;set;}
public EmailTemplate ET{get;set;}
public string emailVal{get;set;}
public string cc{get;set;}
public string emailSubject{get;set;}
public string body{get;set;}
public User usr{get;set;}
public ClsSendEmailByTemplate(){
usr = new User();
}
public void getTemplate(){
try{
if(EmailTempateId == null || EmailTempateId == ''){
ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR,'Please Select Email Template'));
}
else{
ET = [Select Id,Subject,Body from EmailTemplate where Id =: EmailTempateId];
}
}
catch(Exception ex){
ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR,ex.getMessage()));
}
}
public void sendMail( ){
try{
Messaging.SingleEmailMessage email = new Messaging.SingleEmailMessage();
email.setTemplateId(ET.Id);
email.setTargetObjectId(usr.ContactId);
Messaging.SendEmailResult[] sendResult;
Messaging.SendEmailResult [] r =Messaging.sendEmail(new Messaging.SingleEmailMessage[] {email});
ApexPages.Message myMsg = new ApexPages.Message(ApexPages.Severity.INFO,'Email Has Been Sent');
ApexPages.addMessage(myMsg);
}
catch(Exception ex){
ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR,ex.getMessage()));
}
}
}
<apex:page controller="clsSelectTemplate" showHeader="false" sidebar="false" id="page">
<style>
.popup_div_content_div .select_folder select { margin:5px 5px 0 5px; padding:2px; min-width:200px; }
.popup_div_content_div .n_t_d_box { width:auto; height:auto; border:#ccc 1px solid; border-top:3px #666666 solid; padding:0px; margin:15px 0 0 0; }
.popup_div_content_div .n_t_d_box .tr { width:atuo; height:34px; border-bottom:#e5e5e5 1px solid; }
.popup_div_content_div .n_t_d_box .tr .bg { background:#eee; }
.popup_div_content_div .n_t_d_box .tr .td1 { width:200px; float:left; }
.popup_div_content_div .n_t_d_box .tr .td2 { width:40px; float:left; padding:0 4px; }
.popup_div_content_div .n_t_d_box .tr .td2.border_left_right { border-left:#ddd 1px solid; border-right:#ddd 1px solid; margin:0 0 0 -2px; display:inline; height: 34px; }
.popup_div_content_div .n_t_d_box .tr .td3 { width:auto; float:left; padding:0 0 0 3px; }
</style>
<apex:form id="frm">
<apex:actionFunction name="createTempList" action="{!createTempList}" rerender="eFD2OP" oncomplete="selectcheckboxonpre_temp();" status="myRecSav"/>
<div class="popup_div_content_div height_400px" style="height:auto !important;">
<apex:outputPanel id="eFD2OP">
<div class="select_folder" style="margin-left: 2px;">
<strong>&nbsp;Folder</strong>
<apex:selectList value="{!folderId}" size="1" style="width:150px;" onchange="javascript: createTempList();" > <!-- Email folders ak1 -->
<apex:selectOptions value="{!items}"/>
</apex:selectList>
</div>
<div class="n_t_d_box" style="display:{!IF(emailingTemplates.size==0,'none','block')}">
<div class="tr bg" >
<div class="td1 td_bg" style="width: 18%;"><strong>Name</strong></div>
<div class="td2 td_bg border_left_right" style="width:12%;"><strong>Type</strong></div>
<div class="td3 td_bg" style="width: 68%;"><strong>Description</strong></div>
<div class="cl"></div>
</div>
<apex:repeat value="{!emailingTemplates}" var="e" id="table">
<!-- Start TR Data -->
<div class="tr">
<div class="td1" style="width: 18%;">
<a href="#" id="{!e.TemplateID}" onclick="javascript : templatechosen(this.id); return false;" style="color:#015ba7;text-Decoration='none !important'" onmouseover="this.style.color='#E27216'" onMouseout="this.style.color='#015ba7';">{!e.Name}</a>
</div> <div class="td2" style="width:12%;">{!e.TemplateType}</div>
<div class="td3" style="width: 68%;">{!e.Description}</div>
<div class="cl"></div>
</div>
<!-- End TR Data -->
</apex:repeat>
</div>
<apex:outputPanel id="blnkPanel" rendered="{!IF(emailingTemplates.size==0,true,false)}">
<div class="n_t_d_box">
<div class="tr">No records found.</div>
<div class="tr bg">
<div class="td1 td_bg"><strong>No Templates Available</strong></div>
<div class="cl"></div>
</div>
</div>
</apex:outputPanel>
<script>
function templatechosen(id)
{
parent.window.opener.calldisplaytemplate(id);
window.parent.close();
}
</script>
</apex:outputPanel>
</div>
</apex:form>
</apex:page>
view raw SelectTemplate hosted with ❤ by GitHub
<apex:page controller="ClsSendEmailByTemplate">
<apex:form >
<apex:pageMessages ></apex:pageMessages>
<apex:pageBlock title="Email" id="PB">
<apex:pageBlockSection columns="1">
<apex:pageBlockSectionItem >
<apex:outputLabel value="Contact"/>
<apex:inputField value="{!usr.ContactId}" required="true"/>
</apex:pageBlockSectionItem>
<apex:pageBlockSectionItem >
<apex:outputLabel value="Email Template" />
<apex:outputPanel >
<apex:outputLabel value="Click Lookup to Select Email Template" />
<img onclick="OpenSelectTempatePOPUP();" class="lookupIcon"/>
</apex:outputPanel>
</apex:pageBlockSectionItem>
<apex:pageBlockSectionItem >
<apex:outputLabel value="Subject" />
<apex:outputField value="{!ET.Subject}" style="width: 500px;"/>
</apex:pageBlockSectionItem>
<apex:pageBlockSectionItem >
<apex:outputLabel value="Body" />
<apex:inputTextarea style="height:300px; width:1020px" value="{!ET.Body}"/>
</apex:pageBlockSectionItem>
<apex:pageBlockSectionItem >
<apex:outputLabel />
<apex:commandButton value="Send" action="{!sendMail}"/>
</apex:pageBlockSectionItem>
</apex:pageBlockSection>
</apex:pageBlock>
<apex:actionfunction name="getTemplate" action="{!getTemplate}" reRender="PB">
<apex:param value="" assignTo="{!EmailTempateId}" name="val"/>
</apex:actionfunction>
</apex:form>
<script>
function OpenSelectTempatePOPUP(){
window.open('/apex/SelectTemplate','Ratting','width=1200,height=620,toolbar=0,menubar=0,status=1,resizable=0');
return false;
}
function calldisplaytemplate(id){
getTemplate(id);
}
</script>
</apex:page>

Screen Shots:-






Happy Coding...:)

Thanks
Anurag Jain