2
votes

I'm building a subscription for pages at a website. So a to-be subscriber post via a form and get added to a marketing list in Dynamics 365 Online.

From a scheduled job at the website i then make a request of the contacts in a marketing list.

Then i need to send them an email that a new page have been created with this properties and a link to that page.

So i would like to make that responsibility Dynamics 365 Online.

So im using the Web API and the action: SendEmailFromTemplate Not sure if i can use this action or if i need to create a custom action.

I would need to pass data such as URL of the page, title and Text. Or just one string - the body of the e-mail message that contains all of this.

So i have created an email template at the CRM and it semse like the code finds it!

This is the action i think i'm after: https://msdn.microsoft.com/en-us/library/mt607523.aspx

If i check the documentation at the SOAP Service there is actually examples: https://msdn.microsoft.com/en-us/library/microsoft.crm.sdk.messages.sendemailfromtemplaterequest.aspx?cs-save-lang=1&amp

But i'm going with the Web API.

So i tried this:

dynamic regarding = new ExpandoObject();
var oppIndexer = regarding as IDictionary<string, Object>;
oppIndexer["contactid"] = contact.ContactId; //contact that will recive the 
email.
oppIndexer["@odata.type"] = "Microsoft.Dynamics.CRM.contact";

dynamic target = new ExpandoObject();
var targetIndexer = target as IDictionary<string, Object>;
targetIndexer["torecipients"] = "[email protected]";
targetIndexer["sender"] = "[email protected]";
targetIndexer["inreplyto"] = "[email protected]";
targetIndexer["subject"] = "This is the subject";
targetIndexer["description"] = "This should be the body of the email";
targetIndexer["directioncode"] = true; //outgoing
targetIndexer["@odata.type"] = "Microsoft.Dynamics.CRM.email";

dynamic sendEmailFromTemplate = new ExpandoObject();
sendEmailFromTemplate.TemplateId = Guid.Parse("my-email-template-guid-inserted-here");
sendEmailFromTemplate.Regarding = regarding;
sendEmailFromTemplate.Target = target;

api.ExecuteAction("SendEmailFromTemplate", sendEmailFromTemplate);

But i get exception: "The e-mail must have at least one recipient before it can be sent" when i post it.

What might be the problem?

I think the documentation at: https://msdn.microsoft.com/en-us/library/mt607523.aspx

Just declare that the type for target and regarding should be of type "crmbaseentity". A base class...

Anyone know what might cause this?

This is the Email Entity: https://msdn.microsoft.com/en-us/library/mt608007.aspx

For the field "torecipients" one could read: "Shows the email addresses corresponding to the recipients". So i'm not sure this is the field i should use. If the text would be "The recipients with "," separator that will recive the message" i would be more certain that i would have to use this field.

Update: Okey, so this is what you posted:

{
 "email_activity_parties": [ 
    { "[email protected]": "/systemusers(852a441c-b544-e611-80e3-c4346bc5e750)", "participationtypemask": 1 }, 
    { "[email protected]": "/systemusers(852a441c-b544-e611-80e3-c4346bc5e750)", "participationtypemask": 2 }
  ],
 "description": "description lorem ipsum",
 "subject": "rubrik",
 "[email protected]": "/opportunities(e9e6eb64-9c4c-e611-80e4-c4346bc58294)"
}

If i would to change this so it suits my need. I dont think im going to be using opportunities. Or must i? There are three parameters for SendEmailFromTemplate Action: https://msdn.microsoft.com/en-us/library/mt607523.aspx TemplateId, Regarding and Target. I changed this code a bit below (untested)

{
 "TemplateId": "id-for-email-template",
 "Regarding": [ { "[email protected]": "/contacts(contact-guid-X)" } ],
 "Target": {
     "email_activity_parties": [ 
        { "[email protected]": "/systemusers(systemuser-guid-Y)", "participationtypemask": 1 }, //1 is "sender"
        { "[email protected]": "/contacts(contact-guid-X)", "participationtypemask": 2 } // 2 is "to"
      ],
     "description": "description lorem ipsum",
     "subject": "rubrik",
     "[email protected]": "/contacts(contact-guid-X)"
    }
}

I will try out something like this..

1
I need to set @odata.type i think...Johan Pettersson

1 Answers

0
votes

Email is an activity, all activities will be split into Activity Pointer + Activity Party. What you have to do is put the same contact you are using for regardingobject into toParty as well.

//create activityparty
 Entity Fromparty = new Entity("activityparty");
 Entity Toparty = new Entity("activityparty");

//To set to Contact
Toparty["partyid"]= new EntityReference("contact", _ contactid));

//From set to User
Fromparty["partyid"]= new EntityReference("systemuser", _From));

//create email Object and set attributes
Entity email = new Entity("email");

email["from"] = new Entity[] { Fromparty };
email["to"] = new Entity[] { Toparty };
email["directioncode"] = true;

//setting the Regarding as Contact
email["regardingobjectid"] = new EntityReference("contact", _contactid);

Ignore torecipients field, use to only.

Error The e-mail must have at least one recipient before it can be sent will go away.

Update:

We have to use navigation property in terms of web api.

//Create email
var email = new JObject(
           new JProperty("email_activity_parties",
             new JArray(
                  new JObject(
                          new JProperty("[email protected]", "/systemusers (<guid>)"),
          new JProperty("participationtypemask", 1)),
                     new JObject(
                           new JProperty("[email protected]", "/systemusers(<guid>)"),
                   new JProperty("participationtypemask", 2)))),
                  new JProperty("description", txtEmail.Text.Replace("\r\n","<br>")),
                  new JProperty("subject", "Test Subject"),
                  new JProperty("[email protected]", "/opportunities(<guid>)"));