Добавление в электронную почту динамического форматированного контента с помощью бизнес-процессов
Одним из ограничений бизнес-процессов в Microsoft Dynamics CRM 4.0 является невозможность добавления динамического HTML-контента, например, для сообщений электронной почты. Под динамическим подразумевается, что контент зависит от записи для которой в настоящий момент работает Бизнес-процес.
Всем наверное известен трюк с копированием готовой странички в тело письма. http://mmcrm.ru/?p=834 Но это статичное решение, не позволяющее динамически формировать содержимое. Например, вместо: http://yandex.ru Вы хотите вставить в письмо HTML-ссылку <a href=»http://yandex.ru»>Яндекс</a>, которая, соответственно, в сообщении электропочты будет отображаться как Яндекс.
Все что для этого нужно – вставить в тело письма html-тэги, которые и будет интерпретированы как токовые. Но даже если Вы вставите html-тэги с помощью визуального интерфейса, то они и будут в таком виде отправлены получателю, поскольку система при вставке перекодирует их в заменители. Поэтому вставку необходимо производить на более низком уровне – например кода.
Cлучай с читабельными сылками уже решен в Акселераторе Business Productivity Workflow Tools.
Рассмотрим более сложный пример: необходим бизнес-процесс, который, будучи примененным к записи Бизнес-партнера, отправит его владельцу электронное письмо содержащее перечень связанных Контактов в отформатированный таблице и ссылками на эти контакты в читабельном виде (в качестве текста ссылки будет использоваться ФИО Контакта).
- Создайте В Visual Studio проект нового кастомного Бизнес-процесса;
- Добавьте в него сборки из SDK и подпишите;
- Добавьте в него такой код:
using System; using System.Workflow.ComponentModel; using System.Workflow.Activities; using System.Web.Services.Protocols; using Microsoft.Crm.Sdk; using Microsoft.Crm.SdkTypeProxy; using Microsoft.Crm.Sdk.Query; using Microsoft.Crm.Workflow; using System.Collections; using System.Text; namespace ActivityLibrary5 { // Задаем имя шага [CrmWorkflowActivity("Связанные Контакты")] public partial class Activity1 : SequenceActivity { // Определяем строковый выходной параметр public static DependencyProperty formatteTableProperty = DependencyProperty.Register("formatteTable", typeof(string), typeof(Activity1)); [CrmOutput("Table")] public string formatteTable { get { return (string)base.GetValue(formatteTableProperty); } set { base.SetValue(formatteTableProperty, value); } } protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext) { // Получаем Crm Service из контекста выполнения Бизнес-процесса IContextService contextService = (IContextService)executionContext.GetService(typeof(IContextService)); IWorkflowContext context = contextService.Context; ICrmService service = context.CreateCrmService(); // Формируем запрос для получения всех Контактов связанных с текущей записью Бизнес-партнера QueryByAttribute query = new QueryByAttribute(); query.EntityName = "contact"; query.ColumnSet = new ColumnSet(new String[] { "contactid", "fullname", "telephone1", "emailaddress1" }); query.Attributes = new String[] { "parentcustomerid" }; query.Values = new Object[] { context.PrimaryEntityId }; query.Orders = new ArrayList(); query.Orders.Add(new OrderExpression("fullname", OrderType.Descending)); RetrieveMultipleRequest request = new RetrieveMultipleRequest(); request.Query = query; // Отправляем запрос в CRM RetrieveMultipleResponse returnedContacts = (RetrieveMultipleResponse)service.Execute(request); BusinessEntityCollection contacts = returnedContacts.BusinessEntityCollection; /* Формируем таблику связанных Контактов */ // Добавляем текстовый заголовок StringBuilder results = new StringBuilder(); results.Append("<b>Связанные контакты:</b><br><br>"); // Открывающий тег HTML-таблицы results.Append("<table border=1 cellspacing=0>"); // Заголовок HTML-таблицы results.Append("<tr><th>ФИО</th><th>Телефон</th><th>Электропочта</th></tr>"); // Просматриваем каждый из возвращенных запросом Контактов и... foreach (contact Contact in contacts.BusinessEntities) { // ...добавляем его поля в HTML-таблицу results.Append(string.Format("<tr><td><a href='http://win-n22hj23d1b1/superfirma/sfa/conts/edit.aspx?id={1}'>{0}</a></td>", Contact.fullname, Contact.contactid.Value.ToString())); results.Append(string.Format("<td>{0}</td>", Contact.telephone1)); results.Append(string.Format("<td><a href='mailto:{0}'>{0}</a></td></tr>", Contact.emailaddress1)); } // Закрывающий тег HTML-таблицы results.Append("</table>"); // Передаем результирующую строку в выходной параметр formatteTable = results.ToString(); return ActivityExecutionStatus.Closed; } } }
- Скомпилируйте проект и зарегистрируйте в Plug-in Registration Tool;
- Откройте MS CRM и создайте новый бизнес-процесс для Бизнес-партнера;
- Добавьте новый шаг Связанные контакты (кастомный, который мы только что создали);
- Добавьте шаг Отправить сообщение. В диалоговом окне настройки параметров электронного сообщения добавьте в тело сообщения (помимо самого сообщения) выходной параметр шага Связанные контакты (Table);
- Опубликуйте Бизнес-процесс и выполните его в отношении какой-либо записи Бизнес-партнера у которой есть связанные Контакты. Когда он выполнится откройте новый e-mail связанный с этой записью Бизнес-партнера 🙂