Разработка
01
Май
6

Отправка электронной почты по нескольким адресам для одного получателя

Часто в жизни бывает так, что у одного Контакта, Бизнес-пртнера, Пользователя и т.д. бывает не один а несколько адресов электронной почты. И в CRM этот нюанс учтен и в стандартном функционале – у карточек есть несколько полей для вода электронной почты (хотя они по умолчанию и не вынесены на форму). Но к сожалению этот самый нюанс учтен не полностью! Если Вы отправите электронную почту для какого-либо Контакта, Бизнес-пртнера, Пользователя и т.д. то CRM никак не учтет их дополнительные е-mail’ы :)Надо поправить… 🙂

Решение заключается в том, чтобы с помощью плагина при создании записи электронной почты, скопировать дополнительные адреса e-mail Контакта (Бизнес-партнера, Пользователя и т.д.) в поле Копия карточки Электронная почта 🙂

  • Прежде чем начнем, Вы должны сделать кое-какие настройки CRM (если он у Вас конечно уже не сделаны). Перейдите Параметры – Администрирование — Системные Параметры – вкладка Электронная почта – поставьте галку Разрешить отправку сообщений по электронной почте нераспознанным получателям . Это необходимо по той простой причине, что подставив в Копию наши дополнительные адреса, система не сможет их никак связать с Контактом, Бизнес-пртнером, Пользователем и т.д., т.к. поиск происходит исключительно по основному e-mail! А раз система не смогла разрешить адрес электронной почты, то по дефолту она не отправит письма по этим адресам. Соответственно чтобы разрешить системе отправлять письма по таким адресам мы и поставили галочку 🙂
  • Далее вынесите на форму карточек Бизнес-партнер, Контакт и Интерес (E-mail еще можно отправлять Пользователям и Очередям, но пока обойдемся без них 🙂 ) поля emailaddress2 и emailaddress3;
  • Создайте новый плагин и поместите на него такой код:
    using System;
    using System.Web;
    using System.Web.Services.Protocols;
    using System.Collections.Generic;
    using Microsoft.Crm.Sdk;
    using Microsoft.Crm.SdkTypeProxy;
    using Microsoft.Crm.Sdk.Query;
    
    namespace ClassLibrary1
    {
        public class UnresolvedEmail : IPlugin
        {
            public void Execute(IPluginExecutionContext context)
            {
                // Конфигурируем CrmService
                ICrmService service = context.CreateCrmService(true);
    
                try
                {
                    // В случаи если отсутствуют входящие параметры или не заполнено поле Кому - прекращаем выполнение
                    if (!context.InputParameters.Properties.Contains("Target"))
                        return;
                    DynamicEntity emailInput = context.InputParameters.Properties["Target"] as DynamicEntity;
                    if (!emailInput.Properties.Contains("to"))
                        return;
    
                    // Получаем поля Кому и Копия
                    DynamicEntity[] to = emailInput.Properties["to"] as DynamicEntity[];
                    DynamicEntity[] cc = emailInput.Properties.Contains("cc") ? emailInput.Properties["cc"] as DynamicEntity[] : new DynamicEntity[] { };
                    List<DynamicEntity> partyList = new List<DynamicEntity>(cc);
    
                    // Просматриваем все записи из поля Кому
                    foreach (DynamicEntity ToPartyList in to)
                    {
                        // И по каждой записи отправляем запрос в CRM чтобы вернуть дополнительные поля электронной почты
                        Lookup ToPartyItem = (Lookup)ToPartyList.Properties["partyid"];
                        DynamicEntity PartyRecord = additionalEmails(ToPartyItem.Value, ToPartyItem.type.ToString(), service);
    
                        // Если в возвращенных полях есть значения помещаем их в переменные
                        string email1 = PartyRecord.Properties.Contains("emailaddress2") ? PartyRecord.Properties["emailaddress2"].ToString() : "";
                        string email2 = PartyRecord.Properties.Contains("emailaddress3") ? PartyRecord.Properties["emailaddress3"].ToString() : "";
    
                        // Если переменные не пустые и дополнительные e-mail'ы еще не содержатся в поле Кому - добавляем их туда
                        if (email1 != "" && !IsEmailAlreadyInCC(email1, partyList))
                        {
                            DynamicEntity party = new DynamicEntity();
                            party.Name = EntityName.activityparty.ToString();
                            party.Properties["addressused"] = email1;
                            partyList.Add(party);
                        }
    
                        if (email2 != "" && !IsEmailAlreadyInCC(email2, partyList))
                        {
                            DynamicEntity party = new DynamicEntity();
                            party.Name = EntityName.activityparty.ToString();
                            party.Properties["addressused"] = email2;
                            partyList.Add(party);
                        }
                    }
                    // Обновляем поле Копия
                    DynamicEntity entityInput = context.InputParameters.Properties["Target"] as DynamicEntity;
                    if (partyList.Count > 0)
                        entityInput.Properties["cc"] = partyList.ToArray();
                }
                catch (SoapException se)
                {
                    throw new Exception(se.Detail.InnerText);
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }
            // Функция сравнивает какой-либо адрес e-mail c уже существующими в списке
            private bool IsEmailAlreadyInCC(string email, List<DynamicEntity> activityPartyList)
            {
                bool bAlreadyExists = false;
                foreach (DynamicEntity existingParty in activityPartyList)
                {
                    if (existingParty.Properties.Contains("addressused") && (existingParty.Properties["addressused"].ToString() == email))
                    {
                        bAlreadyExists = true;
                        break;
                    }
                }
                return bAlreadyExists;
            }
            // Функция возвращает поля emailaddress2 и emailaddress3 записей Бизнес-партнера, Контакта и Интереса
            public DynamicEntity additionalEmails(Guid record, string entity, ICrmService service)
            {
                // Указываем имя объекта, который требуется вернуть и GUID записи
                TargetRetrieveDynamic target = new TargetRetrieveDynamic();
                target.EntityName = entity;
                target.EntityId = record;
    
                // Указываем параметры запроса
                RetrieveRequest retrieveRequest = new RetrieveRequest();
                ColumnSet Columns = new ColumnSet();
                Columns.AddColumn("emailaddress2");
                Columns.AddColumn("emailaddress3");
                retrieveRequest.ColumnSet = Columns;
                retrieveRequest.ReturnDynamicEntities = true;
                retrieveRequest.Target = target;
    
                // Собираем объект ответа
                RetrieveResponse retrieveResponse = (RetrieveResponse)service.Execute(retrieveRequest);
                
                // Отправляем запрос в web-сервис
                DynamicEntity oneRecord = (DynamicEntity)retrieveResponse.BusinessEntity;
    
                // Возвращаем полученную запись
                return oneRecord;
            }
        }
    }
    
  • Зарегистрируйте его с такими параметрами:
    • Событие: Create;
    • Объект: email;
    • Стадия: Pre Stage.
  • Тестируем: создайте по одной записи Бизнес-партнера, Контакта и Интереса с заполненными полями emailaddress2 и emailaddress3. Затем создайте новое электронное письмо и выберите в поле Кому созданные записи Бизнес-партнера, Контакта и Интереса. Сохраните – в поле Копия подставятся дополнительные адреса электронной почты 🙂




Комментарии (6)
  • Dmitry 01.05.2010

    Добрый день!

    прошу меня извинить за то, что вставляю вопрос не в топик «по теме»
    При отправке сообщения из срм, в теме письма добавляется уникальный номер.
    возможно ли при создании объекта (например действие сервиса) используя javascript программно получить подобный номер?

    За ранее благодарю за помощь,

    Дмитрий

  • slivka_83 01.05.2010

    Здасьте 🙂
    Если мне не изменяет память, то уникальный номер добавляется при отправке электропочты, а не при ее создании. Т.о. не отправив письмо нельзя получить его номер!

  • Алиса 01.05.2010

    А это не спам?

  • slivka_83 01.05.2010

    WIKI: Спам — массовая рассылка коммерческой, политической и иной рекламы (информации) или иного вида сообщений лицам, не выражавшим желания их получать 🙂

    Так что и без рассылки по нескольким адресам Вы можете рассылать спам 🙂 зависит от содержания и желания получателя его читать 🙂

  • demonf 01.05.2010

    Слав, привет!
    Скажи, а есть какое то решение по отправке на доп адреса в 2015 CRM?
    В последних версиях распознавание контактов происходит по любому имейлу с карточки контакта, и подставив его в поле копия, система найдет контакт, но отправит все равно по основному адресу.

  • slivka_83 01.05.2010

    Привет.
    Какого то промышленного решения не встречал. Тут только плагин запилить на событие send и подменить адрес отправки.

*

code