Отправка уведомлений в рамках задания рабочего процесса SharePoint

Очевидно, для нормальной работы с заданиями необходимо предусмотреть возможность рассылки уведомлений об изменениях статуса заданий. Как пример, отсылать письмо при создании задания, редактировании, удалении и т.д.

Меня интересовала больше отправка уведомления о назначении задания пользователю. При настройке параметров задания можно установить свойство endEmailNotification в true и задать тело письма в EmailBody. Тогда при назначении задания письмо будет отправлено пользователю. Но есть тут ограничение — нельзя узнать ID (именно ID, а не GuID) этого заданий в рамках библиотеки. Но вы должны были заметить, что прямая ссылка на задание имеет вид http://сайт/_Layouts/listform.aspx?PageType=4&ListId={ID_Библиотеки}&ID=ID_задания, где ID — уникальный идентификатор в рамках этой библиотеки. Так что, учитывая, что рантайм мы не может получить этот ID для отправки письма стандартными средствами, то таким образом невозможно в письмо приложить ссылку прямую на задание.

К счастью, можно отправлять письма и другим методом. Есть специальное Workflow SendEmail Activity. Если использовать его после создания задания, то в тело письма можно приложить прямую ссылку на задание. Но есть одна проблема.

Correlation value specified does not match the already initialized correlation

На подобии этой будет ошибка при выполнении этого активити, если вы назначите ему в корреляции OwnerActivityName, которое не совпадает с рабочим процессом. В моём случае задание со всеми другими активити, которые необходимы для нормального функционирования, я запихнул в собственный класс — контейнер, унаследовав его от CompositeActivity. Так что, в рамках этого Activity, нам ничего неизвестно о CorrelationToken самого рабочего процесса. Если же вы пихаете все Activity напрямую в рабочий процесс, то можете спокойно использовать SendEmail activity.

SPUtility.SendEmail

Альтернатива для SendEmail activity. Позволяет отправляет письма ото всюду. Уведомление удобно отправлять сразу из OnTaskCreated Activity, которое срабатывает сразу после создания задания. Как-то так:

private void onAssignmentTaskCreated_Invoked(object sender, ExternalDataEventArgs e)
{
           
    try
    {
        if (SPUtility.IsEmailServerSet( _WorkflowProperties.Web))
        {
            StringDictionary headers = new StringDictionary();
            headers.Add("to", "адрес, кому отправляем письмо");
            headers.Add("from", "адрес, от чьего имени");
            headers.Add("subject", "заголовок письма");
            headers.Add("content-type", "text/html");
                   
            string body = "Тело письма";
            bool success = SPUtility.SendEmail(_WorkflowProperties.Web, headers,  body, false);
        }
    }
    catch (Exception ex)
    {
        // handle exception
    }      
                                 
}

Вообще можно отправлять и без явного указания хэдеров:

bool success = SPUtility.SendEmail(thisWeb,true, true, toField, subject, body);
Так как тип письма text/html должен стоять по умолчанию. Но, когда я так пробовал, то часть тегов не интерпретировались и остались в виде текста. Так что, лучше самому явно хэдеры прописать, чтоб уж наверняка)