Выбор электронного адреса для отправки писем
И CRM 2011 всегда используют основной адрес электронной почты (emailaddress1) при отправке электронного письма. Хотя при получении электронных писем, CRM правильно сопоставит адрес отправителя электронной почты с любым адресом получателя электронной почты из CRM.
Допустим у каждого Контакта может быть до трех валидных адресов электронной почты и для каждого из них требуется указать, на какой из этих трех адресов следует слать электропочту.
Решение заключается в использовании плагина на шаге Pre для события Send электронной почты.
Рассмотрим подробнее как это сделать:
- Вынесите на форму все три стандартных поля e-mail’а;
- Добавьте к Контакту новый пиклист new_emailpreference (и также вынесите его на форму) со значениями:
- Электропочта 1: 100 000 000
- Электропочта 2: 100 000 001
- Электропочта 3: 100 000 002
- Создайте новый плагин с таким кодом:
using System; using System.Diagnostics; using System.Linq; using System.ServiceModel; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Query; using Microsoft.Xrm.Sdk.Messages; namespace preSend { public class MyPlugin : IPlugin { public void Execute(IServiceProvider serviceProvider) { IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)); IOrganizationService service = factory.CreateOrganizationService(context.UserId); // null for SYSTEM user, otherwise User Guid Guid emailId = (Guid)context.InputParameters["EmailId"]; try { // Возвращаем электропочту var email = service.Retrieve("email", emailId, new ColumnSet(true)); if (email.Contains("to")) { EntityCollection activityParties = (EntityCollection)email["to"]; // Просматриваем всех получателей электропочты foreach (var activtyParty in activityParties.Entities) { // Если оплучатель Контакт... if (activtyParty.Contains("partyid") && ((EntityReference)activtyParty["partyid"]).LogicalName == "contact") { // ... возвращаем его адреса электронной почты var contact = service.Retrieve("contact", ((EntityReference)activtyParty["partyid"]).Id, new ColumnSet( new string[] { "emailaddress1", "emailaddress2", "emailaddress3", "new_emailpreference" })); if (contact.Contains("new_emailpreference") && contact["new_emailpreference"] != null) { // Если выбран второй или третий предпочитаемы адрес электронной почты - заменяем его в получаетелях if (((OptionSetValue)contact["new_emailpreference"]).Value == 100000001) { if (contact.Contains("emailaddress2") && ((string)contact["emailaddress2"]) != null) { activtyParty["addressused"] = (string)contact["emailaddress2"]; } } else if (((OptionSetValue)contact["new_emailpreference"]).Value == 100000002) { if (contact.Contains("emailaddress3") && ((string)contact["emailaddress3"]) != null) { activtyParty["addressused"] = (string)contact["emailaddress3"]; } } } } } // Обновляем отправляемую электропочту service.Update(email); } } catch (Exception ex) { throw new InvalidPluginExecutionException(String.Format("Ошибка: {0}{1}{2}", ex.Message, Environment.NewLine, ex.StackTrace)); } } } }
Этот код делает следующее:
- Из входящих параметров получает email;
- Просматривает в цикле всех получателей письма (по полю Кому);
- Для каждого Контакта, который найден среди получателей, запрашиваем его адреса электронной почты и предпочитаем адрес отправки;
- Если для Контакта предпочитаем адрес отличается от первого, подставляет в поле.
- Зарегистрируйте плагин в CRM для объекта email на стадии Pre и событии Send.
Зетс олл… создаем письмо и отправляем…