Битрикс, задача на основании письма. Прикрепляем к задаче письмо

ПРИКРЕПЛЕНИЕ ПЕРЕСТАЛО РАБОТАТЬ С СИСТЕМНЫМИ ЯЩИКАМИ!
Вот статься о работе с личными Битрикс, задача из письма (обработка личных почтовых ящиков)

Значит встала задача, получать задачи на основании входящих писем. (тавтология немного)
И как оказалось готовые решения ставят задачу, но парсят письмо и вставляют текст задачи, а нам необходимо чтобы в задаче было само письмо. Вот только засада, в документации не слова как прикреплять в задачу письмо, но есть как поставить задачу с помощью PHP скрипта и стандартной обработки почты.
Расписывать как подключить ящик к битриксу я не буду, это делается не сложно. Однако как обрабатывать письма, я сохраню.

Итак, обработка писем естественно будет производится в правилах обработки почты.
Заходим в админ панель битрикс, сервисы, почта. В разделе почтовые ящики добавляем нашу почту и переходим в правила.

Создаем новое правило с ручной настройкой. Выбираем в каком ящике обрабатывать письма. Задаем имя и ставим галочку «Применять при событиях: При получении почты». Можем добавить описание.

 class=

Далее переходим к настройке условий, если на основании всех писем, то ничего там не меняем.

 class=

Теперь собственно самое вкусное, настройка действий.
Галочки и основные действия ставите на свой вкус, а вот пример скрипта PHP следующий:

Новый вариант кода (тестовый, допиливается и додумывается)
if (CModule::IncludeModule("tasks") && CModule::IncludeModule("disk")) {
    $userId = 1; // пользователь в диске которого будут храниться все файлы
    $responsible_id = 1; //ответственный
    $accomplices = array(531,1); //соисполнители
    $date = new DateTime();
    $date->modify('+3 day');
    $deadline = $date->format('d.m.Y');
    $comment = "ЗАДАЧА ИЗ ПИСЬМА (Текстовая версия письма)
"; $txt_body = $arMessageFields['BODY']; // Удаление лишних переносов строк $txt_body = preg_replace("/(\r\n|\r|\n){2,}/", "\n", $txt_body); //массив для прикреаленных файлов, перебираю вложения и через временый файл сохраняю в диск владельца файла $attachmentFiles = array(); $dbr_attach = CMailAttachment::GetList(Array("NAME" => "ASC", "ID" => "ASC"), Array("MESSAGE_ID" => $arMessageFields['ID'])); while ($dbr_attach_arr = $dbr_attach->GetNext()) { if ($dbr_attach_arr["FILE_NAME"]=='1.tmp' || preg_match_all('/\\.(?:exe|html|phtml|pl|js|htm|py|php|php4|php3|phtml|shtml)$/i', $dbr_attach_arr["FILE_NAME"], $p_matches, PREG_PATTERN_ORDER)) continue; $attach_id = $dbr_attach_arr["ID"]; $dbr = CMailAttachment::GetByID($attach_id); if($dbr_arr = $dbr->Fetch()) { $fname = $_SERVER['DOCUMENT_ROOT']."/upload/".$dbr_attach_arr["FILE_NAME"]; $handle = fopen($fname, 'x+'); fwrite($handle, $dbr_arr["FILE_DATA"]); fclose($handle); $storage = Bitrix\Disk\Driver::getInstance()->getStorageByUserId($userId); $folder = $storage->getFolderForUploadedFiles(); $arFile = CFile::MakeFileArray($fname); $file = $folder->uploadFile($arFile, array('NAME' => $arFile["name"], 'CREATED_BY' => $userId), array(), true); $fileId = $file->getId(); $attachmentFiles[] = "n$fileId"; // Удаляем временный файл после его сохранения unlink($fname); } } //создаю новую задачу и заполняю нужные для себя поля, потом сохраняю $task['TITLE'] = $arMessageFields['SUBJECT']; $task['DESCRIPTION'] = $comment . $txt_body; $task['RESPONSIBLE_ID'] = $responsible_id; $task['DEADLINE'] = $deadline; $task['ACCOMPLICES'] = $accomplices; $task['ALLOW_CHANGE_DEADLINE'] = 'N'; $task['TAGS'] = array("Access"); $task['ADD_IN_REPORT'] = 'Y'; $task['TASK_CONTROL'] = 'Y'; $task['UF_TASK_WEBDAV_FILES'] = $attachmentFiles; $rsAdd = CTaskItem::add($task, $userId); }
Предыдущий вариант. На новой версии битрикс системные ящики недоступны из задач. Так же методы которые использовал, признаны устаревшими
if (CModule::IncludeModule("tasks"))
{
    $arFields = Array(
        "TITLE" => $arMessageFields['SUBJECT'],
        "DESCRIPTION" => "Задача поставлена на основе письма",
        "UF_MAIL_MESSAGE" => $arMessageFields['ID'],
        "RESPONSIBLE_ID" => 578,
        "ACCOMPLICES" => array(531,1),
        "GROUP_ID" => 0,
        "CREATED_BY" => 1,
        "AUDITORS" => array(1)
    );
    $obTask = new CTasks;
    $ID = $obTask->Add($arFields);
}

Альтернативный код с дедлайном и чисткой строк. В новом битрикс прикрепленные письма не доступны. будет минутка сделаю решение.

if (CModule::IncludeModule("tasks")) {
    $date = new DateTime();
    $date->modify('+3 day');
    $deadline = $date->format('d.m.Y');
    $comment = "ЗАДАЧА ИЗ ПИСЬМА";
    // Удаление лишних переносов строк
    $html_body = $arMessageFields['BODY'];
    $html_body = str_replace(array("\r\n", "\r", "\n"), '', $html_body);
    $html_body = preg_replace("/\s*/i", "", $html_body);
    $arFields = Array(
        "TITLE" => $arMessageFields['SUBJECT'],                              
        "DESCRIPTION" => $comment . $html_body,
        "RESPONSIBLE_ID" => 1,       
        "CREATED_BY" => 1,             
        "DEADLINE" => $deadline,
        "ALLOW_CHANGE_DEADLINE" => 'N',  
        "TAGS" => "Access",            
        "ADD_IN_REPORT" => 'Y',    
        "TASK_CONTROL" => 'Y',   
    );
    $obTask = new CTasks;
    $ID = $obTask->Add($arFields);
}

RESPONSIBLE_ID — ID ответственного
DESCRIPTION — это описание к задаче если необходимо
GROUP_ID — ID группы (проекта)
ACCOMPLICES — массив соисполнителей
CREATED_BY — ID постановщика
AUDITORS — массив наблюдателей
Поля которые вам не нужны можно убрать, они просто останутся пустыми.

UPD 13.11.2023: Тут используем метод Add класса СTasks, значит можем добавить в массив параметров задачи, все что нам надо https://dev.1c-bitrix.ru/api_help/tasks/classes/ctasks/add.php

Сохраняем. Вот и все, теперь письма входящие будут обрабатываться как нам надо

$arMessageFields — то массив значений письма, выделю важные части, так как в текущей документации нет описания
ID — Идентификатор письма в базе, по нему можно обратиться к письму для обработки
MAILBOX_ID — Идентификатор почтового ящика в системе
SUBJECT — тема письма
BODY — текстовый вариант тела письма
BODY_HTML — HTML версия письма (не всегда есть)
FIELD_TO — кому
FIELD_FROM — от кого
АТТАCHMENTS — количество вложений (int)
SPAM — резултат проверки на спам (bool)

 class=
Обновлено 05.11.2025
comments

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *