First off, let me start by saying I am new to writing workflows and in C#.
I'm currently trying to send emails from a ribbon button. I'm able to add the button and command, and the workflow is triggered. However,
no matter what I do, it won't send an email... Not sure what I'm doing wrong here.
using System; using System.Collections.Generic; using System.Text; using System.Linq; using System.Xml.Linq; using System.ServiceModel; using System.Activities; using Microsoft.Xrm.Sdk.Client; using Microsoft.Crm.Sdk.Messages; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Query; using Microsoft.Xrm.Sdk.Workflow; namespace SendNotificationsForWeeklyReport { using System; using System.Activities; using System.ServiceModel; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Workflow; public sealed class SendNotificationsForWeeklyReport : CodeActivity { [Input("Email")] [ReferenceTarget("email")] public InArgument<EntityReference> Email { get; set; } [Input("Account")] [ReferenceTarget("account")] public InArgument<EntityReference> Account { get; set; } protected override void Execute(CodeActivityContext executionContext) { ITracingService tracingService = executionContext.GetExtension<ITracingService>(); if (tracingService == null) { throw new InvalidPluginExecutionException("Failed to retrieve tracing service."); } tracingService.Trace("Entered SendNotificationsForWeeklyReport.Execute(), Activity Instance Id: {0}, Workflow Instance Id: {1}", executionContext.ActivityInstanceId, executionContext.WorkflowInstanceId); IWorkflowContext context = executionContext.GetExtension<IWorkflowContext>(); if (context == null) throw new InvalidPluginExecutionException("Failed to retrieve workflow context."); tracingService.Trace("SendNotificationsForWeeklyReport.Execute(), Correlation Id: {0}, Initiating User: {1}", context.CorrelationId, context.InitiatingUserId); IOrganizationServiceFactory serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>(); IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId); try { if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity) { Entity entity = (Entity)context.InputParameters["Target"]; tracingService.Trace("Target Entity is {0} id {1}", entity.LogicalName, entity.Id); Entity email = new Entity("email"); //Entity email = service.Retrieve("email", Email.Get(executionContext).Id, new ColumnSet(true)); Entity WREntity = service.Retrieve(entity.LogicalName, entity.Id, new ColumnSet(new string[] { "createdby", "am_dwterritory"})); List<Entity> fromList = new List<Entity>(); List<Entity> toList = new List<Entity>(); if (WREntity.Attributes.Contains("createdby")) { Entity createdby = (Entity) WREntity.Attributes["createdby"]; tracingService.Trace("createdby: " + createdby); Entity fromP = new Entity("activityparty"); fromP["partyid"] = new EntityReference("systemuser", createdby.Id); fromList.Add(fromP); email.Attributes["from"] = fromList.ToArray(); service.Update(email); } QueryExpression teamQuery = new QueryExpression() { EntityName = "weeklyreport_team", ColumnSet = new ColumnSet(true), LinkEntities = { new LinkEntity { LinkFromEntityName = "weeklyreport", LinkFromAttributeName = "weeklyreportid", LinkToEntityName = "team", LinkToAttributeName = "teamid", } } }; teamQuery.Criteria = new FilterExpression(); teamQuery.Criteria.AddCondition("weeklyreportid", ConditionOperator.Equal, entity.Id); EntityCollection teams = service.RetrieveMultiple(teamQuery); // getting people in product line team(s) for (int i = 0; i < teams.Entities.Count; i++) { Entity team = teams.Entities[i]; tracingService.Trace("Query Expression Retrieved: {0}", team); QueryExpression qe = new QueryExpression(); qe.EntityName = "teammembership"; qe.ColumnSet = new ColumnSet(); qe.ColumnSet.Columns.Add("systemuser"); qe.LinkEntities.Add(new LinkEntity("team", "systemuser", "teamid", "accountid", JoinOperator.Inner)); qe.Criteria = new FilterExpression(); qe.Criteria.AddCondition("teamid", ConditionOperator.Equal, team.Id); EntityCollection ec = service.RetrieveMultiple(qe); foreach (Entity user in ec.Entities) { if (user.Attributes.Contains("internalemailaddress")) { tracingService.Trace("Get Email " + user.Attributes["internalemailaddress"].ToString()); Entity toParty = new Entity("activityparty"); toParty["partyid"] = new EntityReference("systemuser", user.Id); toList.Add(toParty); } } } // retrieving additional recipients QueryExpression userQuery = new QueryExpression() { EntityName = "issi_issi_weeklyreport_systemuser", ColumnSet = new ColumnSet(true), LinkEntities = { new LinkEntity { LinkFromEntityName = "weeklyreport", LinkFromAttributeName = "weeklyreportid", LinkToEntityName = "systemuser", LinkToAttributeName = "systemuserid", } } }; userQuery.Criteria = new FilterExpression(); userQuery.Criteria.AddCondition("weeklyreportid", ConditionOperator.Equal, entity.Id); EntityCollection users = service.RetrieveMultiple(userQuery); foreach (Entity user in users.Entities) { Entity toParty = new Entity("activityparty"); toParty["partyid"] = new EntityReference("systemuser", user.Id); toList.Add(toParty); } email.Attributes["to"] = toList.ToArray(); service.Update(email); Guid emailid = service.Create(email); tracingService.Trace("Sending Mail"); SendEmailRequest SendEmail = new SendEmailRequest(); SendEmail.EmailId = emailid; SendEmail.TrackingToken = ""; SendEmail.IssueSend = true; tracingService.Trace("Sending Mail"); SendEmailResponse res = (SendEmailResponse)service.Execute(SendEmail); } } catch (FaultException<OrganizationServiceFault> e) { tracingService.Trace("Exception: {0}", e.ToString()); // Handle the exception. throw; } tracingService.Trace("Exiting SendNotificationsForWeeklyReport.Execute(), Correlation Id: {0}", context.CorrelationId); } } }