Разработка
11
Окт
0

Выбор электронного адреса для отправки писем

И 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.

Зетс олл… создаем письмо и отправляем…



Комментарии (0)

*

code