Tuesday, February 7, 2012

Create an Email Activity in Microsoft Dyanamics CRM 2011 Using C# or Jscript

This illustration shows how to create an email activity in Microsoft Dynamics CRM 2011 with CreateRequest.  This example will be given in Jscript (SOAP) and in C# (.NET).

Ok, here is what the code looks like!
First in C#:

CreateRequest reqCreate = new CreateRequest();
Entity emailCreate = new Entity("email");
emailCreate["subject"] = "test subject";
emailCreate["description"] = " test description";

//specify the owner for the mail (if necessary)
//emailCreate["ownerid"] = new EntityReference("systemuser", new Guid(OwnerId));

Entity ap = new Entity();
Entity ap2 = new Entity();

//You can comment out the line for addressused and use the partid instead to use an entity reference for an activity party
//I just wanted to show how you can specify an email address for an email as an activity party without an entity to go with it.
ap = new Entity("activityparty");
//ap["partyid"] = new EntityReference("systemuser", new Guid("CE08EE7F-4F36-E111-B6F6-0050569838D6"));
ap["addressused"] = "mileyja@gmail.com";
Entity[] aryTo = { ap };
emailCreate["to"] = aryTo;
    
//I am assigning a systemuser entity to the From attribute for the email acitivity 
ap2 = new Entity("activityparty");
ap2["partyid"] = new EntityReference("systemuser", new Guid("CE08EE7F-4F36-E111-B6F6-0050569838D6"));
Entity[] aryFrom = { ap2 };
emailCreate["from"] = aryFrom;

// This is how you assign an a reguarding object
emailCreate["regardingobjectid"] = new EntityReference("account", new Guid("AC946D36-3E41-E111-9D05-0050569838D6"));

reqCreate.Target = emailCreate;
CreateResponse resp = (CreateResponse)slos.Execute(reqCreate);

If you need help instantiating a service object in .NET within a plugin check out this post:
http://mileyja.blogspot.com/2011/04/instantiating-service-object-within.html


Now here is the Jscript nicely formatted by the CRM 2011 SOAP formatter. Available at: http://crm2011soap.codeplex.com/

Now in Jscript


Note:  This request library for jscript is written as CreateEntityRequest, but the underlying call is just a CreateRequest to create an email entity.  Please review the tags of the underlying jscript call's XML for more info.

This example is asynchronous, if you want to learn how to make JScript SOAP calls synchronously please visit this posthttp://mileyja.blogspot.com/2011/07/using-jscript-to-access-soap-web.html


if (typeof (SDK) == "undefined")
   { SDK = { __namespace: true }; }
       //This will establish a more unique namespace for functions in this library. This will reduce the 
       // potential for functions to be overwritten due to a duplicate name when the library is loaded.
       SDK.SAMPLES = {
           _getServerUrl: function () {
               ///<summary>
               /// Returns the URL for the SOAP endpoint using the context information available in the form
               /// or HTML Web resource.
               ///</summary>
               var ServicePath = "/XRMServices/2011/Organization.svc/web";
               var serverUrl = "";
               if (typeof GetGlobalContext == "function") {
                   var context = GetGlobalContext();
                   serverUrl = context.getServerUrl();
               }
               else {
                   if (typeof Xrm.Page.context == "object") {
                         serverUrl = Xrm.Page.context.getServerUrl();
                   }
                   else
                   { throw new Error("Unable to access the server URL"); }
                   }
                  if (serverUrl.match(/\/$/)) {
                       serverUrl = serverUrl.substring(0, serverUrl.length - 1);
                   } 
                   return serverUrl + ServicePath;
               }, 
           CreateEntityRequest: function () {
               var requestMain = ""
               requestMain += "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">";
               requestMain += "  <s:Body>";
               requestMain += "    <Execute xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">";
               requestMain += "      <request i:type=\"a:CreateRequest\" xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\">";
               requestMain += "        <a:Parameters xmlns:b=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\">";
               requestMain += "          <a:KeyValuePairOfstringanyType>";
               requestMain += "            <b:key>Target</b:key>";
               requestMain += "            <b:value i:type=\"a:Entity\">";
               requestMain += "              <a:Attributes>";
               requestMain += "                <a:KeyValuePairOfstringanyType>";
               requestMain += "                  <b:key>subject</b:key>";
               requestMain += "                  <b:value i:type=\"c:string\" xmlns:c=\"http://www.w3.org/2001/XMLSchema\">test subject</b:value>";
               requestMain += "                </a:KeyValuePairOfstringanyType>";
               requestMain += "                <a:KeyValuePairOfstringanyType>";
               requestMain += "                  <b:key>description</b:key>";
               requestMain += "                  <b:value i:type=\"c:string\" xmlns:c=\"http://www.w3.org/2001/XMLSchema\"> test description</b:value>";
               requestMain += "                </a:KeyValuePairOfstringanyType>";
               requestMain += "                <a:KeyValuePairOfstringanyType>";
               requestMain += "                  <b:key>to</b:key>";
               requestMain += "                  <b:value i:type=\"a:ArrayOfEntity\">";
               requestMain += "                    <a:Entity>";
               requestMain += "                      <a:Attributes>";
               requestMain += "                        <a:KeyValuePairOfstringanyType>";
               requestMain += "                          <b:key>addressused</b:key>";
               requestMain += "                          <b:value i:type=\"c:string\" xmlns:c=\"http://www.w3.org/2001/XMLSchema\">mileyja@gmail.com</b:value>";
               requestMain += "                        </a:KeyValuePairOfstringanyType>";
               requestMain += "                      </a:Attributes>";
               requestMain += "                      <a:EntityState i:nil=\"true\" />";
               requestMain += "                      <a:FormattedValues />";
               requestMain += "                      <a:Id>00000000-0000-0000-0000-000000000000</a:Id>";
               requestMain += "                      <a:LogicalName>activityparty</a:LogicalName>";
               requestMain += "                      <a:RelatedEntities />";
               requestMain += "                    </a:Entity>";
               requestMain += "                  </b:value>";
               requestMain += "                </a:KeyValuePairOfstringanyType>";
               requestMain += "                <a:KeyValuePairOfstringanyType>";
               requestMain += "                  <b:key>from</b:key>";
               requestMain += "                  <b:value i:type=\"a:ArrayOfEntity\">";
               requestMain += "                    <a:Entity>";
               requestMain += "                      <a:Attributes>";
               requestMain += "                        <a:KeyValuePairOfstringanyType>";
               requestMain += "                          <b:key>partyid</b:key>";
               requestMain += "                          <b:value i:type=\"a:EntityReference\">";
               requestMain += "                            <a:Id>ce08ee7f-4f36-e111-b6f6-0050569838d6</a:Id>";
               requestMain += "                            <a:LogicalName>systemuser</a:LogicalName>";
               requestMain += "                            <a:Name i:nil=\"true\" />";
               requestMain += "                          </b:value>";
               requestMain += "                        </a:KeyValuePairOfstringanyType>";
               requestMain += "                      </a:Attributes>";
               requestMain += "                      <a:EntityState i:nil=\"true\" />";
               requestMain += "                      <a:FormattedValues />";
               requestMain += "                      <a:Id>00000000-0000-0000-0000-000000000000</a:Id>";
               requestMain += "                      <a:LogicalName>activityparty</a:LogicalName>";
               requestMain += "                      <a:RelatedEntities />";
               requestMain += "                    </a:Entity>";
               requestMain += "                  </b:value>";
               requestMain += "                </a:KeyValuePairOfstringanyType>";
               requestMain += "                <a:KeyValuePairOfstringanyType>";
               requestMain += "                  <b:key>regardingobjectid</b:key>";
               requestMain += "                  <b:value i:type=\"a:EntityReference\">";
               requestMain += "                    <a:Id>ac946d36-3e41-e111-9d05-0050569838d6</a:Id>";
               requestMain += "                    <a:LogicalName>account</a:LogicalName>";
               requestMain += "                    <a:Name i:nil=\"true\" />";
               requestMain += "                  </b:value>";
               requestMain += "                </a:KeyValuePairOfstringanyType>";
               requestMain += "              </a:Attributes>";
               requestMain += "              <a:EntityState i:nil=\"true\" />";
               requestMain += "              <a:FormattedValues />";
               requestMain += "              <a:Id>00000000-0000-0000-0000-000000000000</a:Id>";
               requestMain += "              <a:LogicalName>email</a:LogicalName>";
               requestMain += "              <a:RelatedEntities />";
               requestMain += "            </b:value>";
               requestMain += "          </a:KeyValuePairOfstringanyType>";
               requestMain += "        </a:Parameters>";
               requestMain += "        <a:RequestId i:nil=\"true\" />";
               requestMain += "        <a:RequestName>Create</a:RequestName>";
               requestMain += "      </request>";
               requestMain += "    </Execute>";
               requestMain += "  </s:Body>";
               requestMain += "</s:Envelope>";
               var req = new XMLHttpRequest();
               req.open("POST", SDK.SAMPLES._getServerUrl(), true)
               req.setRequestHeader("Accept", "application/xml, text/xml, */*");
               req.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
               req.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute");
               var successCallback = null;
               var errorCallback = null;
               req.onreadystatechange = function () { SDK.SAMPLES.CreateEntityResponse(req, successCallback, errorCallback); };
               req.send(requestMain);
           },
       CreateEntityResponse: function (req, successCallback, errorCallback) {
               ///<summary>
               /// Recieves the assign response
               ///</summary>
               ///<param name="req" Type="XMLHttpRequest">
               /// The XMLHttpRequest response
               ///</param>
               ///<param name="successCallback" Type="Function">
               /// The function to perform when an successfult response is returned.
               /// For this message no data is returned so a success callback is not really necessary.
               ///</param>
               ///<param name="errorCallback" Type="Function">
               /// The function to perform when an error is returned.
               /// This function accepts a JScript error returned by the _getError function
               ///</param>
               if (req.readyState == 4) {
               if (req.status == 200) {
               if (successCallback != null)
               { successCallback(); }
               }
               else {
                   errorCallback(SDK.SAMPLES._getError(req.responseXML));
               }
           }
       },
       _getError: function (faultXml) {
           ///<summary>
           /// Parses the WCF fault returned in the event of an error.
           ///</summary>
           ///<param name="faultXml" Type="XML">
           /// The responseXML property of the XMLHttpRequest response.
           ///</param>
           var errorMessage = "Unknown Error (Unable to parse the fault)";
           if (typeof faultXml == "object") {
               try {
                   var bodyNode = faultXml.firstChild.firstChild;
                   //Retrieve the fault node
                   for (var i = 0; i < bodyNode.childNodes.length; i++) {
                       var node = bodyNode.childNodes[i];
                       //NOTE: This comparison does not handle the case where the XML namespace changes
                       if ("s:Fault" == node.nodeName) {
                       for (var j = 0; j < node.childNodes.length; j++) {
                           var faultStringNode = node.childNodes[j];
                           if ("faultstring" == faultStringNode.nodeName) {
                               errorMessage = faultStringNode.text;
                               break;
                           }
                       }
                       break;
                   }
               }
           }
           catch (e) { };
        }
        return new Error(errorMessage);
     },
 __namespace: true
};




To understand how to parse the response please review my post on using the DOM parser.
Now you can call the SDK.SAMPLES.CreateEntityRequest function from your form jscript handler.

Thats all there is to it!
-

5 comments:

  1. Thank for this Jamie, exactly what I was searching high and low for.

    One thing, is there a way to apply and email template with this?

    Thanks Pierre

    ReplyDelete
  2. Last line is not working:

    CreateResponse resp = (CreateResponse)slos.Execute(reqCreate);

    ReplyDelete
    Replies
    1. If that last line isn't working it means that something is wrong with the rest of your request code. You should post it to the CRM forums and then send me the link since posting code on here doesn't work well and them more people will see it.

      Delete
  3. hello

    I am a CRM 2011 noob, I have to however send an email using javascript. I have my entity in CRM 2011 , and my email would be sent when the entity is saved

    I can access the event OnSave , is that where all this code should be pasted?

    ReplyDelete