Скрипт правила обработки входящей почты

Описание скрипта

Скрипт задает правило обработки входящей почты и условия его выполнения.

Место настройки скрипта

Форма добавления правила обработки почты, вызванная на странице "Правила обработки", см. Создание правила обработки входящей почты

Скрипт выбирается при добавлении задачи планировщика "Обработка входящей почты" (Задача планировщика "Обработка входящей почты").

Когда выполняется скрипт

Скрипт выполняется планово, по расписанию задачи планировщика "Обработка входящей почты".

Результат выполнения скрипта

Возвращаемого значения нет.

Переменные и их значения

Переменные контекста:

  • message — содержит обрабатываемое почтовое сообщение.
  • result — позволяет получить или назначить результат обработки входящего сообщения. Получение результата может быть полезно, например если письмо было отклонено еще до запуска скрипта.
  • incomingServer — код подключения к серверу входящей почты, с которым связан обработчик почты.

Особенности скрипта

  • Для корректной работы стандартного механизма обработки почты необходимо при настройке задачи планировщика "Обработка входящей почты" установить флажок "Сохранять исходное письмо после обработки".

Пример скрипта

Copy
*
//ПАРАМЕТРЫ----------------------------------------------------------------
// переменная нужна для передачи перечисленных ниже свойств (не удалять)
def m = modules.mail.init(binding);
// Префикс номера для поиска запроса в теме письма. Может быть пустым.
m.SEARCH_PREFIX = "";
// Параметры: уровень влияния, срочность, типы запроса, указанные ниже, должны быть настроены в системе!
// Код элемента справочника 'Уровни влияния'
m.IMPACT_CODE = "out";
// Код уровня срочности
m.URGENCY_CODE = "U1";
// Соответствие email-адресов отправителей кодам типов запросов
// ([<адрес отправителя> : <fqn типа запроса>])
// ['user@company.com' : 'classCode$typeCode']
m.SENDER_2_TYPE_CODE = ['' : '', '' : ''];
// fqn дефолтного типа запроса
m.DEFAULT_SC_FQN = 'serviceCall$call';
// Уникальный номер соглашения по умолчанию
m.AGREEMENT_INVENTORY_NUMBER = "33";
// и/или идентификатор соглашения
m.AGREEMENT_UUID = 'agreement$2001';
// Уникальный номер услуги по умолчанию
m.SERVICE_INVENTORY_NUMBER = "33";
// и/или идентификатор услуги
m.SERVICE_UUID = 'slmService$1902';
// Идентификаторы типов сотрудников, на которых можно регистрировать запрос. Если пусто, то на любых.типы записываются в кавычках через запятую.            
def employeeTypes = []; 
// Код атрибута типа RichText, значение которого заполняется HTML содержимым письма при регистрации, если указан
def richDescrAttrCode = null;
// Фамилия служебного сотрудника, используется если не был найден клиент по адресу отправителя
m.DEFAULT_EMPLOYEE_NAME = "qq";
// Код целевого состояния, в которое будет переведен запрос
m.NEW_STATE = "resolved";
// Ответственный за запрос(сотрудник) (уникальный идентификатор сотрудника в виде 'employee$12345')
m.RESPONSIBLE_EMPLOYEE_UUID = '';
// Ответственный за запрос(команда) (уникальный идентификатор команды в виде 'team$10000')
m.RESPONSIBLE_TEAM_UUID = '';
// Дополнительные свойства запроса (в виде 'attr1' : 'value1', 'attr2' : 'value', ...) будут устанавливаться для найденного или созданного запроса (в зависимости от значения def addProps) 
в конце выполнения скрипта
def additionalProperties = [:];
// Дополнительные свойства запроса (записывать в виде 'attr1' : 'value1', 'attr2' : 'value', ...) будут устанавливаться при создании запроса
def additionalCreateProperties = [:];

 // Логические переменные:
// искать запрос по данным из письма
m.SEARCH_SC = true; 
// регистрировать новый запрос если запрос не найден или искать не требуется)
m.CREATE_SC = true; 
// добавить комментарий с текстом письма к найденному запросу
m.ADD_COMMENT = true; 
// прикреплять к запросу само письмо как файл
m.ADD_ORIGINAL_MAIL = true; 
// прикреплять к запросу вложенные в письмо файлы
m.ADD_ATTACHMENTS_FILES = true; 
// оповещать отправителя о результате обработки письма
m.NOTIFY_AFTER_PROCESS = true; 
// Статусы запроса в скрипте (их исправлять не надо!).
// Найден
SEARCHED = 'scIsSearched'; 
// Создан
CREATED = 'scIsCreated'; 
// В зависимости от статуса запроса в скрипте (Найден или Создан) можно раздельно указать дополнительные действия с запросом.
// Для этого в квадратные скобки нужно вставить соответствующее значение статуса (SEARCHED или CREATED)
//Перевод запроса в новый статус. Если опция требуется в любом случае, то [SEARCHED,CREATED];
def chngState = [CREATED]; 
// установка ответственного
def setResp = [CREATED]; 
// дополнительные действия
def addProps = [SEARCHED];

// Параметры для заполнения атрибута "Способ обращения"
m.FILL_REQUEST_WAY = false;
// Код атрибута "Способ обращения" типа "Элемент справочника"
m.REQUEST_WAY_ATTR = "wayAddressing"; 
// Код справочника, в котором хранятся коды обращения
m.REQUEST_WAY_CATALOG_CODE = "wayAddressing"; 
// Код элемента "По почте"
m.REQUEST_WAY_ELEMENT_CODE = "sd"; 

// Разделитель между новым текстом сообщения и цитатой предыдущей переписки
m.COMMENT_DELIMITER = '---↑ При ответе добавьте комментарий выше этой строки ↑---';

//Параметр def logLevel отвечает за логирование:
//Возможные значения:
//debug - уровень логирования DEBUG, 
//info - уровень логирования INFO, 
//любое другое значение - без логирования.
 m.LOG_LEVEL = 'debug';

 //ОСНОВНОЙ БЛОК--------------------------------------------------------
// Для упрощенной проверки состояния запроса (создан или найден) 
на основе коллекции, содержащей методы (создан и/или найден)
def condition = { collection ->
for (element in collection) if (m."$element"()) return true;
}
// Реализация условия смены состояния в зависимости от того создан запрос или найден
m.changeStateCondition = { sc -> return condition(chngState) }
// Аналогично для методов установки ответственного
m.setResponsibleCondition = { sc -> return condition(setResp) }
// и заполнения дополнительных свойств
m.additionalActionsCondition = { sc -> return condition(addProps) }
m.additionalActions = { sc -> utils.edit(sc, additionalProperties) }

// если у сотрудника только одно соглашение, то берем единственное соглашение (игнорируя старую проверку)
def oldApplicableAgreement = m.getApplicableAgreement;
m.getApplicableAgreement = { employee ->
def agreements = employee.recipientAgreements;
if (agreements?.size() == 1) return agreements.first();
else return oldApplicableAgreement(employee);
};

// Заполнение описания в зависимости от значения richDescrAttrCode
if (richDescrAttrCode)
{
def oldScDescription = m.scDescription;
m.scDescription = {
api.mail.helper.replaceReferencesToAttachments(message);
def result = oldScDescription();
result.putAll([(richDescrAttrCode) : message.htmlBody]);
return result;
}
}

// реализация метода заполнения дополнительных свойств при создании запроса
m.additionalCreateProperties = { return additionalCreateProperties }
// подходящий клиент
m.applicableEmployee = { employee ->
return employeeTypes.isEmpty() || employeeTypes.contains(employee.getMetainfo().getCase())
};
 
// Вызов основного метода модуля обработки почты
 m.process();