A Neat thing I found on Microsoft CRM Customization -- programming Closed Email Activity
Source : http://www.articlecity.com/One of the roles of our Exchange Event Handler/Sink is creation MS CRM Closed Activity in handling incoming and outgoing email messages. The interaction with Microsoft CRM uses two approached – using MS CRM SDK (handling inbound and outbound XML messages) and via direct access to MS CRM Database. Let’s first look at the Closed Activity creation algorithm:
1.First we need to understand the entity we need to create activity for: Account, Lead or Contact. The selection should use specific criteria – in our case this is email address:if ((crmAccount = crmConnector.GetAccount(mailboxFrom)) != null) {}else if ((crmContact = crmConnector.GetContact(mailboxFrom)) != null) {}else if ((crmLead = crmConnector.GetLead(mailboxFrom)) != null) {}
2.Then we have to get GUID of MS CRM user, who owns this entity, C# code like this:crmUser = crmConnector.GetUser(crmAccount.GetOwnerId());
3.Next step is closed Activity creation:emailId = crmConnector.CreateEmailActivity(crmUser.GetId(), Microsoft.Crm.Platform.Types.ObjectType.otAccount, crmAccount.GetId(), Microsoft.Crm.Platform.Types.ObjectType.otSystemUser, crmUser.GetId(), crmAccount.GetEmailAddress(), crmUser.GetEmailAddress(), sSubject, sBody);
4.The method to create closed activity:public Guid CreateEmailActivity(Guid userId, int fromObjectType, Guid fromObjectId, int toObjectType, Guid toObjectId, string mailFrom, string mailTo, string subject, string body) {try{log.Debug("Prepare for Mail Activity Creating");// BizUser proxy objectMicrosoft.Crm.Platform.Proxy.BizUser bizUser = new Microsoft.Crm.Platform.Proxy.BizUser();ICredentials credentials = new NetworkCredential(sysUserId, sysPassword, sysDomain);bizUser.Url = crmDir + "BizUser.srf";bizUser.Credentials = credentials;Microsoft.Crm.Platform.Proxy.CUserAuth userAuth = bizUser.WhoAmI();// CRMEmail proxy objectMicrosoft.Crm.Platform.Proxy.CRMEmail email = new Microsoft.Crm.Platform.Proxy.CRMEmail();email.Credentials = credentials;email.Url = crmDir + "CRMEmail.srf";// Set up the XML string for the activitystring strActivityXml = ";strActivityXml += ";strActivityXml += ") + "]]>";strActivityXml += ";strActivityXml += userId.ToString("B") + ";strActivityXml += ";// Set up the XML string for the activity partiesstring strPartiesXml = ";strPartiesXml += ";strPartiesXml += " + mailTo + ";if (toObjectType == Microsoft.Crm.Platform.Types.ObjectType.otSystemUser) {strPartiesXml += " + Microsoft.Crm.Platform.Types.ObjectType.otSystemUser.ToString() + ";}else if (toObjectType == Microsoft.Crm.Platform.Types.ObjectType.otAccount) {strPartiesXml += " + Microsoft.Crm.Platform.Types.ObjectType.otAccount.ToString() + ";}else if (toObjectType == Microsoft.Crm.Platform.Types.ObjectType.otContact) {strPartiesXml += " + Microsoft.Crm.Platform.Types.ObjectType.otContact.ToString() + ";}else if (toObjectType == Microsoft.Crm.Platform.Types.ObjectType.otLead) {strPartiesXml += " + Microsoft.Crm.Platform.Types.ObjectType.otLead.ToString() + ";}strPartiesXml += "+ toObjectId.ToString("B") + ";strPartiesXml += ";strPartiesXml += Microsoft.Crm.Platform.Types.ACTIVITY_PARTY_TYPE.ACTIVITY_PARTY_TO_RECIPIENT.ToString();strPartiesXml += ";strPartiesXml += ";strPartiesXml += ";strPartiesXml += " + mailFrom + ";if (fromObjectType == Microsoft.Crm.Platform.Types.ObjectType.otSystemUser) {strPartiesXml += " + Microsoft.Crm.Platform.Types.ObjectType.otSystemUser.ToString() + ";}else if (fromObjectType == Microsoft.Crm.Platform.Types.ObjectType.otAccount) {strPartiesXml += " + Microsoft.Crm.Platform.Types.ObjectType.otAccount.ToString() + ";}else if (fromObjectType == Microsoft.Crm.Platform.Types.ObjectType.otContact) {strPartiesXml += " + Microsoft.Crm.Platform.Types.ObjectType.otContact.ToString() + ";}else if (fromObjectType == Microsoft.Crm.Platform.Types.ObjectType.otLead) {strPartiesXml += " + Microsoft.Crm.Platform.Types.ObjectType.otLead.ToString() + ";}strPartiesXml += "+ fromObjectId.ToString("B") + ";strPartiesXml += ";strPartiesXml += Microsoft.Crm.Platform.Types.ACTIVITY_PARTY_TYPE.ACTIVITY_PARTY_SENDER.ToString();strPartiesXml += ";strPartiesXml += ";strPartiesXml += ";log.Debug(strPartiesXml);// Create the e-mail objectGuid emailId = new Guid(email.Create(userAuth, strActivityXml, strPartiesXml));return emailId;}catch (System.Web.Services.Protocols.SoapException e){log.Debug("ErrorMessage: " + e.Message + " " + e.Detail.OuterXml + " Source: " + e.Source);}catch (Exception e) {log.Debug(e.Message + "\r\n" + e.StackTrace);}return new Guid();}
5.To make the activity just created be shown correctly you need to setup it’s flags according to MS CRM standards:public void UpdateActivityCodes(Guid emailId) {try {OleDbCommand command = conn.CreateCommand();command.CommandText = "UPDATE ActivityBase SET DirectionCode = (?), StateCode = (?), PriorityCode = (?) WHERE ActivityId = (?)";command.Prepare();command.Parameters.Add(new OleDbParameter("DirectionCode", Microsoft.Crm.Platform.Types.EVENT_DIRECTION.ED_INCOMING));command.Parameters.Add(new OleDbParameter("StateCode", Microsoft.Crm.Platform.Types.ACTIVITY_STATE.ACTS_CLOSED));command.Parameters.Add(new OleDbParameter("PriorityCode", Microsoft.Crm.Platform.Types.PRIORITY_CODE.PC_MEDIUM));command.Parameters.Add(new OleDbParameter("ActivityId", emailId));log.Debug("Prepare to update activity code " + emailId.ToString("B") + " in ActivityBase");command.ExecuteNonQuery();}catch(Exception e) {log.Debug(e.Message + "\r\n" + e.StackTrace);}}public void UpdateActivityQueueCodes(Guid emailId, Guid queueId) {try {OleDbCommand command = conn.CreateCommand();command.CommandText = "UPDATE QueueItemBase SET Priority = (?), State = (?), QueueId = (?) WHERE ObjectId = (?)";command.Prepare();command.Parameters.Add(new OleDbParameter("Priority", Microsoft.Crm.Platform.Types.PRIORITY_CODE.PC_MEDIUM));command.Parameters.Add(new OleDbParameter("State", Microsoft.Crm.Platform.Types.ACTIVITY_STATE.ACTS_CLOSED));command.Parameters.Add(new OleDbParameter("QueueId", queueId));command.Parameters.Add(new OleDbParameter("ObjectId", emailId));log.Debug("Prepare to update activity queue code " + emailId.ToString("B") + " in QueueItemBase");command.ExecuteNonQuery();}catch(Exception e) {log.Debug(e.Message + "\r\n" + e.StackTrace);}}