Разработка
08
Окт
2

Отправка электропочты из шаблона с помощью C#

Рассмотрим пример, как с помощью C# кода отправить электронное письмо на основе Шаблона электронной почты. Но не просто отправить (это было бы слишком банально), но и модифицировать контент шаблона перед вставкой его в письмо. Для этого мы будем использовать в шаблоне специальные символы (вроде [subject] и [url]), которые будем заменять на нужные нам значения. Получится неплохая альтернатива Бизнес-процессам и вставке динамических значений в шаблонах, поскольку с помощью кода мы можем сделать гораздо больше, чем с помощью стандартных визуальных средств.

Вот этот код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using System.Text;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Messages;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Sdk.Client;
using Microsoft.Crm.Sdk.Messages;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.Runtime.Serialization;

namespace SendMail
{
    class Program
    {
        static void Main(string[] args)
        {
            // Подключаемся к CRM
            ClientCredentials credentials = new ClientCredentials();
            credentials.Windows.ClientCredential = new System.Net.NetworkCredential("Administrator", "1qaz@WSX", "D2011");
            Uri uri = new Uri("http://crm2011:5555/superfirma/XRMServices/2011/Organization.svc");
            OrganizationServiceProxy proxy = new OrganizationServiceProxy(uri, null, credentials, null);
            proxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
            IOrganizationService orgService = (IOrganizationService)proxy;

            // Формируем запрос для возвращения глобального шаблона
            QueryExpression query = new QueryExpression();
            query.EntityName = "template";
            query.ColumnSet.AllColumns = true;
            query.Criteria = new FilterExpression();
            query.Criteria.FilterOperator = LogicalOperator.And;
            ConditionExpression condition = new ConditionExpression();
            condition.AttributeName = "title";
            condition.Operator = ConditionOperator.Equal;
            condition.Values.Add("Супер шаблон"); // Название шаблона
            query.Criteria.Conditions.Add(condition);

            // Execute the query and return the result
            EntityCollection retrievedTemplates = orgService.RetrieveMultiple(query);
            Entity emailTemplate = retrievedTemplates.Entities[0];

            Entity email = new Entity("email");

            // Получаем Subject из шаблона, заменяем в нем ключевое слово [subject] на "Супер тема" и помещаем в поле Subject электропочты
            string subject = GetDataFromXml(emailTemplate["subject"].ToString(), "match");
            email["subject"] = subject.Replace("[subject]", "Супер тема");

            // Получаем Body из шаблона, заменяем в нем ключевое слово [url] на нужный URL и помещаем в поле Description электропочты
            string body = GetDataFromXml(emailTemplate["body"].ToString(), "match");
            string urlToReplace = "<a href='http://www.bing.com'>Бинга</a>";
            email["description"] = body.Replace("[url]", urlToReplace);

            // Формируем и создаем в CRM E-mail
            List<Entity> fromtoEntities = new List<Entity>();
            Entity activityParty = new Entity();
            activityParty.LogicalName = "activityparty";
            activityParty["partyid"] = new EntityReference("systemuser", new Guid("8990174E-9881-E011-8FD5-000C29CDB72E"));
            fromtoEntities.Add(activityParty);
            email["from"] = fromtoEntities.ToArray(); // От
            email["to"] = fromtoEntities.ToArray(); // Кому
            email["regardingobjectid"] = new EntityReference("contact", new Guid("82E25FE5-73E2-E111-B2D5-000C29CDB72E"));
            Guid emailCreated = orgService.Create(email); // В отношении
            
            // Отправляем письмо
            SendEmailRequest req = new SendEmailRequest();
            req.EmailId = emailCreated;
            req.TrackingToken = "";
            req.IssueSend = true;
            SendEmailResponse res = (SendEmailResponse)orgService.Execute(req);
        }

        // Функция вытаскивает из XML содержимое тэга
        private static string GetDataFromXml(string value, string attributeName)
        {
            if (string.IsNullOrEmpty(value)) return string.Empty;

            XDocument document = XDocument.Parse(value);
            XElement element = document.Descendants().Where(ele => ele.Attributes().Any(attr => attr.Name == attributeName)).FirstOrDefault();
            return element == null ? string.Empty : element.Value;
        }
    }
}

Здесь мы делаем следующее:

  • Подключаемся к CRM;
  • Запрашиваем из CRM глобальный Шаблон электронной почты по его имени;
  • Создаем новую электропочту. В поля Subject и Description помещаем соответствующие значения полей из Шаблона. При этом вызываем функцию GetDataFromXml, чтобы вытащить значения из полей Subject и Body, поскольку они хранятся в формате XML;
  • Заполняем остальные поля электропочты т отправляем ее.

З.Ы. Если задать такие параметры для письма:

TrackingToken = "";
IssueSend = false;

То CRM отметит письмо как отправленное, но не будет отправлять его на самом деле.


Комментарии (2)
  • Альбина 08.10.2012

    Добрый день, можно ли в срм настроить или доработать ворк-флоу на запрет отправки емейлов по выходным дням (суббота-воскресенье)?или как то привязать к ворквлоу расписание из SLA?

  • slivka_83 08.10.2012

    Добрый день.
    Не совсем понимаю сценарий. Почему БП у вас срабатывает в выходные? БП событийные, а значит кто то работает в выходные и поэтому происходит отправка.
    А вообще в сети много примеров решений вычисления рабочих часов и в зависимости от этого выполнение (или не выполнение) каких-либо действий.

*

code