This bit of code will allow you to specify Team members as e-mail recipients in a workflow in Microsoft CRM 2011. Make sure to visit Creating a Custom Workflow Activity in MS CRM 2011 to understand how to create custom workflow activities!
This bit of code will allow you to specify Team members as e-mail recipients in a workflow in Microsoft CRM 2011. Make sure to visit Creating a Custom Workflow Activity in MS CRM 2011 to understand how to create custom workflow activities!
To implement:
- Register your compiled custom workflow activity DLL using the Plugin Registration Tool (see Creating a Custom Workflow Activity in MS CRM 2011).
- Create a new workflow process.
- Create an e-mail record.
- Add the send e-mail to team custom workflow step (I called mine “Send Team Email”):

- Click on the step’s Set Properties.
- For each send to field (e.g. TO:, CC:, BCC:, etc.), select the appropriate team. Note that setting any of these send to fields won’t overwrite what you currently set in the e-mail, the code will simply append to that field. Also note that you’ll only be able to select one team at a time:

- Set the e-mail reference to the e-mail record you created in step #3.
- Activate your workflow process.
When your workflow triggers based on the parameters you specified for the workflow process, it will fire off an e-mail to the appropriate team members!
namespace MyWorkflow
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Activities;
using System.Web.Services.Protocols;
using System.Diagnostics;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Messages;
using Microsoft.Xrm.Sdk.Workflow;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Crm.Sdk.Messages;
using WorkflowActivities.RSWebReference; // This is the web reference to your CRM web service (e.g. http://<SERVER_NAME>/ReportServer/ReportExecution2005.asmx)
using Xrm;
/****************************************************************************************************
* SendTeamEmail Class implements CodeActivity class
* This class creates a custom workflow activity for CRM 2011. It accepts a Team entity and Email
* entity. It pulls the members of the team and adds them as the recipients to the email and then
* sends the email.
****************************************************************************************************/
public class SendTeamEmail : CodeActivity
{
[Input("TO: Team")]
[ReferenceTarget(Team.EntityLogicalName)]
public InArgument<EntityReference> LookupToTeam { get; set; }
[Input("CC: Team")]
[ReferenceTarget(Team.EntityLogicalName)]
public InArgument<EntityReference> LookupCcTeam { get; set; }
[Input("BCC: Team")]
[ReferenceTarget(Team.EntityLogicalName)]
public InArgument<EntityReference> LookupBccTeam { get; set; }
[Input("E-mail Reference")]
[ReferenceTarget(Email.EntityLogicalName)]
public InArgument<EntityReference> LookupEmail { get; set; }
protected override void Execute(CodeActivityContext executionContext)
{
try
{
// Create the tracing service
ITracingService tracingService = executionContext.GetExtension<ITracingService>();
// Create the context
IWorkflowContext context = executionContext.GetExtension<IWorkflowContext>();
IOrganizationServiceFactory serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>();
// Create the Organization service
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
// Get the target entity from the context
Entity target = (Entity)service.Retrieve(Quote.EntityLogicalName, context.PrimaryEntityId, new ColumnSet(true));
// Set TO:, CC:, BCC: team members
dynamic[] sendFields = {
new { type = "TO", teamMembers = GetTeamMembers(service, LookupToTeam.Get<EntityReference>(executionContext)) },
new { type = "CC", teamMembers = GetTeamMembers(service, LookupCcTeam.Get<EntityReference>(executionContext)) },
new { type = "BCC", teamMembers = GetTeamMembers(service, LookupBccTeam.Get<EntityReference>(executionContext)) },
};
// Send email to members of the team
CreateEmail(service, sendFields, target, context.InitiatingUserId, LookupEmail.Get<EntityReference>(executionContext)/*, LookupAttachQuote.Get<Boolean>(executionContext)*/);
}
catch (SoapException ex)
{
// Add the SoapException message in event log
EventLog.WriteEntry("code error", "Error occured in " + ex.Detail.InnerText.ToString(), EventLogEntryType.Error);
}
catch (Exception exe)
{
// Add the GeneralException message in event log
EventLog.WriteEntry("code error", "Error occured in " + exe.InnerException.ToString(), EventLogEntryType.Error);
}
}
public static List<TeamMembership> GetTeamMembers(IOrganizationService service, EntityReference teamRef)
{
if (teamRef == null) return null;
// Prepare DataContext by using AutoGenerated cs file:
// CrmSvcUtil.exe /out:Xrm.cs /url:http<s>://<CRMSERVER>/XRMServices/2011/Organization.svc /domain:<DOMAIN> /username:<USERNAME> /password:<PASSWORD> /namespace:Xrm /serviceContextName:XrmDataContext
XrmDataContext datacontext = new XrmDataContext(service);
// Get the Team Name from the Workflow input parameter
Entity teamEntity = service.Retrieve(Team.EntityLogicalName, teamRef.Id, new ColumnSet(true));
// Get the Team Id from the Team Name
var team = (from t in datacontext.TeamSet
where t.Name == teamEntity.Attributes["name"]
select new { t.TeamId }).First();
// Get all the members of the team to send email
return (from t in datacontext.TeamMembershipSet
where t.TeamId == team.TeamId
select t).ToList();
}
public static void CreateEmail(IOrganizationService service, dynamic[] sendFields, Entity quoteEntity, Guid loggedinUser, EntityReference emailRef/*, Boolean attachQuote*/)
{
// Create Email
Email emailInstance = new Email();
Entity emailEntity = service.Retrieve(Email.EntityLogicalName, emailRef.Id, new ColumnSet(true));
emailInstance.ActivityId = emailEntity.Id;
for (int i = 0; i < sendFields.Length; i++)
{
if (sendFields[i].teamMembers == null) continue;
List<ActivityParty> toPartyList = new List<ActivityParty>();
EntityCollection recipients;
// Add the Activity party for each member in the team
foreach (TeamMembership user in sendFields[i].teamMembers)
{
ActivityParty toParty = new ActivityParty();
toParty.PartyId = new EntityReference(SystemUser.EntityLogicalName, user.SystemUserId.Value);
toPartyList.Add(toParty);
}
switch ((string)sendFields[i].type)
{
case "TO":
recipients = emailEntity.GetAttributeValue<EntityCollection>("to");
foreach (ActivityParty party in recipients.Entities)
{
toPartyList.Add(party);
}
// Add To and From users to emailInstance
emailInstance.To = toPartyList.ToArray();
break;
case "CC":
recipients = emailEntity.GetAttributeValue<EntityCollection>("cc");
foreach (ActivityParty party in recipients.Entities)
{
toPartyList.Add(party);
}
// Add To and From users to emailInstance
emailInstance.Cc = toPartyList.ToArray();
break;
case "BCC":
recipients = emailEntity.GetAttributeValue<EntityCollection>("bcc");
foreach (ActivityParty party in recipients.Entities)
{
toPartyList.Add(party);
}
// Add To and From users to emailInstance
emailInstance.Bcc = toPartyList.ToArray();
break;
}
}
// Set the case regarding
emailInstance.RegardingObjectId = new EntityReference(Quote.EntityLogicalName, quoteEntity.Id);
// Send email
service.Update(emailInstance);
SendEmailRequest sendRequest = new SendEmailRequest();
sendRequest.EmailId = emailEntity.Id;
sendRequest.TrackingToken = string.Empty;
sendRequest.IssueSend = true;
// Send the email message.
service.Execute(sendRequest);
}
}
}