How to create Email activity with dynamically retreived data from Dynamics CRM through Plugin C#
In this blog, I am going to show how we can add dynamically retreived data from CRM in a table and show this data inside a table within the Email body. Apart from adding dynamic data in a table into Email body I have also added code for showing Image which we have saved in web resources inside CRM. In short this blog covers below point:
1. First of all below required namespaces in your code(Add required references)
using Microsoft.Crm.Sdk.Messages;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
2. Now Goto your CRM Settings, Add a web resource of type Image.
3. Now Add below codes in the Execute method of your plugin as it is:
public class Class1 : IPlugin
{
public void Execute(IServiceProvider serviceProvider)
{
IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = (IOrganizationService)serviceFactory.CreateOrganizationService(context.UserId);
if (context.MessageName == "Update" && context.Stage == 40)
{
if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity && (context.PrimaryEntityName == "lead"))
{
Entity entLead = (Entity)context.InputParameters["Target"];
Entity entLeadPreImage = context.PreEntityImages["preImageLead"] as Entity;
if (entLead != null && entLeadPreImage != null)
{
string sCompanyName = string.Empty;
string sLeadDataDescription = string.Empty;
string sLogoImg = string.Empty;
string sImageName = string.Empty;
string sName = string.Empty;
sName = entLead.GetAttributeValue<string>("fullname");
if (sName == null)
sName = entLeadPreImage.GetAttributeValue<string>("fullname");
sCompanyName = entLead.GetAttributeValue<string>("companyname");
if (sCompanyName == null)
sCompanyName = entLeadPreImage.GetAttributeValue<string>("companyname");
//From Current User
Entity from = new Entity("activityparty");
from["partyid"] = new EntityReference("systemuser", context.UserId);
// To the Newly Created Lead User
Entity to = new Entity("activityparty");
to["partyid"] = new EntityReference("lead", entLead.Id);
// Below I have used Dictionary for adding attribute schema name and column header name as a Key-Value pair for creating Table
Dictionary<string, string> LeadDataList = new Dictionary<string, string>();
LeadDataList.Add("Topic", "subject");
LeadDataList.Add("Company Name", "companyname");
LeadDataList.Add("Email Address", "emailaddress1");
LeadDataList.Add("Address", "address1_composite");
string[] sHeaderLeadData = LeadDataList.Keys.ToArray();
string[] sFieldsToQryLeadData = LeadDataList.Values.ToArray();
sImageName = "new_logo.png";
sLogoImg = "<img src='~/WebResources/" + sImageName + "' width='30' height='30'>";
DataTable dtLeadDataTable = GetData("lead", entLead.Id, true, sFieldsToQryLeadData, service);
sLeadDataDescription = getHtmlFormatCommon(dtLeadDataTable, sHeaderLeadData, sFieldsToQryLeadData);
//Create Email
Entity Email = new Entity("email");
Email["from"] = new Entity[] { from };
Email["to"] = new Entity[] { to };
Email["subject"] = "Welcome Mr./ Mrs " + sName;
//Setting Values in the variables below which I have to add in the Email Body Description
string sGeneralDisclaimer = "<h2>General Disclaimer</h2>" +
"<h5>The details shown below in the table are for demo purpose only</h5>";
sCompanyName = "<h5>Company Name: " + sCompanyName + "</h5>";
sLeadDataDescription = "<h2>" + sLogoImg + " Airport Policy & Charges</h2>" + sLeadDataDescription + "" + "<br/>";
//Description_Ends
Email["description"] = sCompanyName + sGeneralDisclaimer + sLeadDataDescription;
Email["regardingobjectid"] = new EntityReference("lead", entLead.Id);
Guid _emailId = service.Create(Email);
SendEmailRequest reqSendEmail = new SendEmailRequest();
reqSendEmail.EmailId = _emailId;
reqSendEmail.TrackingToken = "";
reqSendEmail.IssueSend = true;
SendEmailResponse res = (SendEmailResponse)service.Execute(reqSendEmail);
}
}
}
}
// This method is used to fetch Data from the Entity
private DataTable GetData(string sEntityName, Guid entLeadId, bool IsLeadData, string[] strFieldsToQrySuppliers, IOrganizationService service)
{
DataTable dtRecords = new DataTable();
string sFetchXml = @"<fetch version='1.0' output-format='xml-platform' mapping='logical' no-lock='true' distinct='true' >" +
"<entity name='" + sEntityName + @"'>";
foreach (string strAttribute in strFieldsToQrySuppliers)
{
sFetchXml += "<attribute name='" + strAttribute + "' />";
}
sFetchXml += "<filter type='and'>";
if (IsLeadData)
sFetchXml += "<condition attribute='leadid' operator='eq' value='" + entLeadId + @"' />";
else
sFetchXml += "<condition attribute='new_leadid' operator='eq' value='" + entLeadId + @"' />";
sFetchXml += "</filter></entity></fetch>";
EntityCollection ecContacts = service.RetrieveMultiple(new FetchExpression(sFetchXml));
dtRecords = GetDataTable(ecContacts);
return dtRecords;
}
// This method converts the EntityCollection into DataTable and returns Data Table
private DataTable GetDataTable(EntityCollection ecEntities)
{
DataTable dTable = new DataTable();
int iElement = 0;
if (ecEntities.Entities.Count <= 0)
{
return null;
}
//Defining the ColumnName for the datatable
for (iElement = 0; iElement <= ecEntities.Entities[0].Attributes.Count - 1; iElement++)
{
string columnName = ecEntities.Entities[0].Attributes.Keys.ElementAt(iElement);
dTable.Columns.Add(columnName);
}
foreach (Entity entity in ecEntities.Entities)
{
DataRow dRow = dTable.NewRow();
for (int i = 0; i <= entity.Attributes.Count - 1; i++)
{
string colName = entity.Attributes.Keys.ElementAt(i);
dRow[colName] = entity.Attributes.Values.ElementAt(i);
}
dTable.Rows.Add(dRow);
}
return dTable;
}
// This method creates HTML formatted Table for the Data table
private string getHtmlFormatCommon(DataTable dtTable, string[] HeaderCollection, string[] strAttributes)
{
string messageBody = string.Empty;
if (dtTable.Rows.Count == 0)
return messageBody;
foreach (DataRow Row in dtTable.Rows)
{
string htmlTableStart = "<table style='border-collapse:collapse;border-color:#5c87b2; border-style:solid;border-width:thin; text-align:left; width:100%' >";
string htmlTableEnd = "</table>";
string htmlTrStart = "<tr style ='color:#000000'>";
string htmlTrEnd = "</tr>";
string htmlHeaderTdStart = "<td style='width:60%; padding: 5px;'>";
string htmlTdStart = "<td style='width:40%; padding: 5px;'>";
string htmlTdEnd = "</td>";
messageBody += htmlTableStart;
for (int i = 0; i < HeaderCollection.Length; i++)
{
messageBody = messageBody + htmlTrStart;
messageBody = messageBody + htmlHeaderTdStart + HeaderCollection[i] + htmlTdEnd;
messageBody = messageBody + htmlTdStart + Row[strAttributes[i]] + htmlTdEnd;
messageBody = messageBody + htmlTrEnd;
}
messageBody = messageBody + htmlTableEnd;
}
return messageBody;
}
}
Output of Email record will be like this:
- Adding Image from Web Resources
- Creating HTML formatted table from DataTable
- Converting EntityCollection into DataTable
- Showing dynamic data in Email body description
1. First of all below required namespaces in your code(Add required references)
using Microsoft.Crm.Sdk.Messages;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
2. Now Goto your CRM Settings, Add a web resource of type Image.
3. Now Add below codes in the Execute method of your plugin as it is:
public class Class1 : IPlugin
{
public void Execute(IServiceProvider serviceProvider)
{
IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = (IOrganizationService)serviceFactory.CreateOrganizationService(context.UserId);
if (context.MessageName == "Update" && context.Stage == 40)
{
if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity && (context.PrimaryEntityName == "lead"))
{
Entity entLead = (Entity)context.InputParameters["Target"];
Entity entLeadPreImage = context.PreEntityImages["preImageLead"] as Entity;
if (entLead != null && entLeadPreImage != null)
{
string sCompanyName = string.Empty;
string sLeadDataDescription = string.Empty;
string sLogoImg = string.Empty;
string sImageName = string.Empty;
string sName = string.Empty;
sName = entLead.GetAttributeValue<string>("fullname");
if (sName == null)
sName = entLeadPreImage.GetAttributeValue<string>("fullname");
sCompanyName = entLead.GetAttributeValue<string>("companyname");
if (sCompanyName == null)
sCompanyName = entLeadPreImage.GetAttributeValue<string>("companyname");
//From Current User
Entity from = new Entity("activityparty");
from["partyid"] = new EntityReference("systemuser", context.UserId);
// To the Newly Created Lead User
Entity to = new Entity("activityparty");
to["partyid"] = new EntityReference("lead", entLead.Id);
// Below I have used Dictionary for adding attribute schema name and column header name as a Key-Value pair for creating Table
Dictionary<string, string> LeadDataList = new Dictionary<string, string>();
LeadDataList.Add("Topic", "subject");
LeadDataList.Add("Company Name", "companyname");
LeadDataList.Add("Email Address", "emailaddress1");
LeadDataList.Add("Address", "address1_composite");
string[] sHeaderLeadData = LeadDataList.Keys.ToArray();
string[] sFieldsToQryLeadData = LeadDataList.Values.ToArray();
sImageName = "new_logo.png";
sLogoImg = "<img src='~/WebResources/" + sImageName + "' width='30' height='30'>";
DataTable dtLeadDataTable = GetData("lead", entLead.Id, true, sFieldsToQryLeadData, service);
sLeadDataDescription = getHtmlFormatCommon(dtLeadDataTable, sHeaderLeadData, sFieldsToQryLeadData);
//Create Email
Entity Email = new Entity("email");
Email["from"] = new Entity[] { from };
Email["to"] = new Entity[] { to };
Email["subject"] = "Welcome Mr./ Mrs " + sName;
//Setting Values in the variables below which I have to add in the Email Body Description
string sGeneralDisclaimer = "<h2>General Disclaimer</h2>" +
"<h5>The details shown below in the table are for demo purpose only</h5>";
sCompanyName = "<h5>Company Name: " + sCompanyName + "</h5>";
sLeadDataDescription = "<h2>" + sLogoImg + " Airport Policy & Charges</h2>" + sLeadDataDescription + "" + "<br/>";
//Description_Ends
Email["description"] = sCompanyName + sGeneralDisclaimer + sLeadDataDescription;
Email["regardingobjectid"] = new EntityReference("lead", entLead.Id);
Guid _emailId = service.Create(Email);
SendEmailRequest reqSendEmail = new SendEmailRequest();
reqSendEmail.EmailId = _emailId;
reqSendEmail.TrackingToken = "";
reqSendEmail.IssueSend = true;
SendEmailResponse res = (SendEmailResponse)service.Execute(reqSendEmail);
}
}
}
}
// This method is used to fetch Data from the Entity
private DataTable GetData(string sEntityName, Guid entLeadId, bool IsLeadData, string[] strFieldsToQrySuppliers, IOrganizationService service)
{
DataTable dtRecords = new DataTable();
string sFetchXml = @"<fetch version='1.0' output-format='xml-platform' mapping='logical' no-lock='true' distinct='true' >" +
"<entity name='" + sEntityName + @"'>";
foreach (string strAttribute in strFieldsToQrySuppliers)
{
sFetchXml += "<attribute name='" + strAttribute + "' />";
}
sFetchXml += "<filter type='and'>";
if (IsLeadData)
sFetchXml += "<condition attribute='leadid' operator='eq' value='" + entLeadId + @"' />";
else
sFetchXml += "<condition attribute='new_leadid' operator='eq' value='" + entLeadId + @"' />";
sFetchXml += "</filter></entity></fetch>";
EntityCollection ecContacts = service.RetrieveMultiple(new FetchExpression(sFetchXml));
dtRecords = GetDataTable(ecContacts);
return dtRecords;
}
// This method converts the EntityCollection into DataTable and returns Data Table
private DataTable GetDataTable(EntityCollection ecEntities)
{
DataTable dTable = new DataTable();
int iElement = 0;
if (ecEntities.Entities.Count <= 0)
{
return null;
}
//Defining the ColumnName for the datatable
for (iElement = 0; iElement <= ecEntities.Entities[0].Attributes.Count - 1; iElement++)
{
string columnName = ecEntities.Entities[0].Attributes.Keys.ElementAt(iElement);
dTable.Columns.Add(columnName);
}
foreach (Entity entity in ecEntities.Entities)
{
DataRow dRow = dTable.NewRow();
for (int i = 0; i <= entity.Attributes.Count - 1; i++)
{
string colName = entity.Attributes.Keys.ElementAt(i);
dRow[colName] = entity.Attributes.Values.ElementAt(i);
}
dTable.Rows.Add(dRow);
}
return dTable;
}
// This method creates HTML formatted Table for the Data table
private string getHtmlFormatCommon(DataTable dtTable, string[] HeaderCollection, string[] strAttributes)
{
string messageBody = string.Empty;
if (dtTable.Rows.Count == 0)
return messageBody;
foreach (DataRow Row in dtTable.Rows)
{
string htmlTableStart = "<table style='border-collapse:collapse;border-color:#5c87b2; border-style:solid;border-width:thin; text-align:left; width:100%' >";
string htmlTableEnd = "</table>";
string htmlTrStart = "<tr style ='color:#000000'>";
string htmlTrEnd = "</tr>";
string htmlHeaderTdStart = "<td style='width:60%; padding: 5px;'>";
string htmlTdStart = "<td style='width:40%; padding: 5px;'>";
string htmlTdEnd = "</td>";
messageBody += htmlTableStart;
for (int i = 0; i < HeaderCollection.Length; i++)
{
messageBody = messageBody + htmlTrStart;
messageBody = messageBody + htmlHeaderTdStart + HeaderCollection[i] + htmlTdEnd;
messageBody = messageBody + htmlTdStart + Row[strAttributes[i]] + htmlTdEnd;
messageBody = messageBody + htmlTrEnd;
}
messageBody = messageBody + htmlTableEnd;
}
return messageBody;
}
}
Output of Email record will be like this:
ReplyDeleteI would definitely thank the admin of this blog for sharing this information with us. Waiting for more updates from this blog admin.
Tally Course in Chennai
ReactJS Training in Chennai
microsoft dynamics crm training in chennai
ui design course in chennai
microsoft dynamics training
gst training classes in chennai
You write this post very carefully I think, which is easily understand to me. Not only this, other post is also good. As a newbie this info is really helpful for me. Thanks to you.
ReplyDeletetally training
Tally Training in Chennai
Tally ERP 9 Training
Tally Course
tally classes
Tally institute in Chennai
Tally Training institute in Chennai
Tally course in Chennai
This content of information has
ReplyDeletehelped me a lot. It is very well explained and easy to understand.
seo training in chennai
seo training classes
seo training course
seo training institute in chennai
seo training institutes
seo course in chennai
seo courses in chennai
seo institute in chennai
seo institutes in chennai
seo training institute
seo classes in chennai
seo training center in chennai
seo courses
seo training
seo course
I am first time visiting your blog. Nice blog and informative. Keep up this work in your further blogs.
ReplyDeleteOnline UI Development Course in Hyderabad
Online RPA Training in Hyderabad
Online Python Training in Hyderabad
Online Mean Stack Developer Training in Hyderabad