After migration from CRM 4 to CRM 2011 my plugin written for custom email with PDF report won't work anymore so i rebuild my previous solution from CRM 4 with necessary changes for new CRM 2011:
using System;
using System.Activities;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Workflow;
using Microsoft.Xrm.Sdk.Messages;
using Microsoft.Crm.Sdk.Messages;
using SendReport.ReportService;
using Microsoft.Crm.Sdk;
using Microsoft.Xrm.Sdk.Query;
namespace SendReport
{
public class SendReport : CodeActivity
{
protected override void Execute(CodeActivityContext executionContext)
{
try
{
IWorkflowContext context = executionContext.GetExtension<IWorkflowContext>();
IOrganizationServiceFactory serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>();
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
Guid incidentId = context.PrimaryEntityId;
byte[] result = null;
ReportService.ReportExecutionService rs = new ReportExecutionService();
rs.Credentials = new System.Net.NetworkCredential("username", "password", "domain");
rs.Url = "http://crmserver/ReportServer/ReportExecution2005.asmx";
string reportPath = "/Reports/reportname";
string format = "PDF";
string historyID = null;
string devInfo = @"<DeviceInfo><Toolbar>False</Toolbar></DeviceInfo>";
ParameterValue[] parameters = new ParameterValue[1];
parameters[0] = new ParameterValue();
parameters[0].Name = "incidentid";
parameters[0].Value = incidentId.ToString();
DataSourceCredentials[] credentials = null;
string showHideToggle = null;
string encoding;
string mimeType;
string extension;
Warning[] warnings = null;
ParameterValue[] reportHistoryParameters = null;
string[] streamIDs = null;
ExecutionInfo execInfo = new ExecutionInfo();
ExecutionHeader execHeader = new ExecutionHeader();
rs.ExecutionHeaderValue = execHeader;
execInfo = rs.LoadReport(reportPath, historyID);
rs.SetExecutionParameters(parameters, "en-us");
String SessionId = rs.ExecutionHeaderValue.ExecutionID;
try
{
result = rs.Render(format, devInfo, out extension, out encoding, out mimeType, out warnings, out
streamIDs);
}
catch (Exception err)
{
throw new Exception(err.Message.ToString());
}
Entity email = new Entity();
email.LogicalName = "email";
EntityReference regardingObject = new EntityReference("incident", incidentId);
email.Attributes.Add("regardingobjectid", regardingObject);
Guid senderUserId = Sender.Get<EntityReference>(executionContext).Id;
Guid recieverUserId = Recipient.Get<EntityReference>(executionContext).Id;
Guid recieverCCUserId = RecipientCC.Get<EntityReference>(executionContext).Id;
EntityReference from = new EntityReference("systemuser", senderUserId);
EntityReference to = new EntityReference("contact", recieverUserId);
EntityReference cc = new EntityReference("contact", recieverCCUserId);
Entity fromParty = new Entity("activityparty");
fromParty.Attributes.Add("partyid", from);
Entity toParty = new Entity("activityparty");
toParty.Attributes.Add("partyid", to);
Entity ccParty = new Entity("activityparty");
ccParty.Attributes.Add("partyid", cc);
EntityCollection collFromParty = new EntityCollection();
collFromParty.EntityName = "systemuser";
collFromParty.Entities.Add(fromParty);
EntityCollection collToParty = new EntityCollection();
collToParty.EntityName = "systemuser";
collToParty.Entities.Add(toParty);
EntityCollection collccParty = new EntityCollection();
collccParty.EntityName = "systemuser";
collccParty.Entities.Add(ccParty);
var entity = service.Retrieve("incident", incidentId, new ColumnSet(new[] { "ticketnumber", "customerid", "title"}));
var ticket = entity.GetAttributeValue<string>("ticketnumber");
var customer = entity.GetAttributeValue<EntityReference>("customerid");
var customername = customer.Name;
var title = entity.GetAttributeValue<string>("title");
email.Attributes.Add("from", collFromParty);
email.Attributes.Add("to", collToParty);
email.Attributes.Add("cc", collccParty);
email.Attributes.Add("subject", "Here goes subject message.. : " + ticket);
email.Attributes.Add("description", "Here goes description text..");
Guid emailID = service.Create(email);
// Attaching Pdf report
CrmNumber crmNextActorID = new CrmNumber();
RetrieveEntityRequest request = new RetrieveEntityRequest();
request.LogicalName = "email";
RetrieveEntityResponse response = (RetrieveEntityResponse)service.Execute(request);
int objecttypecode = response.EntityMetadata.ObjectTypeCode.Value;
Entity attachment = new Entity("activitymimeattachment");
attachment.Attributes.Add("subject", "Report");
attachment.Attributes.Add("filename", "Report.pdf");
attachment.Attributes.Add("body", Convert.ToBase64String(result));
attachment.Attributes.Add("filesize", new CrmNumber(Convert.ToInt32(result.Length.ToString())));
attachment.Attributes.Add("mimetype", "text/plain");
attachment.Attributes.Add("attachmentnumber", crmNextActorID.Value);
attachment.Attributes.Add("objectid", new EntityReference("email", new Guid(email.Id.ToString())));
attachment.Attributes.Add("objecttypecode", objecttypecode);
service.Create(attachment);
SendEmailRequest reqSendEmail = new SendEmailRequest();
reqSendEmail.EmailId = emailID;
reqSendEmail.TrackingToken = "";
reqSendEmail.IssueSend = true;
SendEmailResponse res = (SendEmailResponse)service.Execute(reqSendEmail);
}
catch (Exception err)
{
throw new Exception(err.ToString());
}
}
[RequiredArgument]
[Input("Sender input")]
[ReferenceTarget("systemuser")]
public InArgument<EntityReference> Sender { get; set; }
[RequiredArgument]
[Input("Recipient input")]
[ReferenceTarget("contact")]
public InArgument<EntityReference> Recipient { get; set; }
[RequiredArgument]
[Input("RecipientCC input")]
[ReferenceTarget("contact")]
public InArgument<EntityReference> RecipientCC { get; set; }
}
}