ПРИКРЕПЛЕНИЕ ПЕРЕСТАЛО РАБОТАТЬ С СИСТЕМНЫМИ ЯЩИКАМИ!
Вот статься о работе с личными Битрикс, задача из письма (обработка личных почтовых ящиков)
Значит встала задача, получать задачи на основании входящих писем. (тавтология немного)
И как оказалось готовые решения ставят задачу, но парсят письмо и вставляют текст задачи, а нам необходимо чтобы в задаче было само письмо. Вот только засада, в документации не слова как прикреплять в задачу письмо, но есть как поставить задачу с помощью PHP скрипта и стандартной обработки почты.
Расписывать как подключить ящик к битриксу я не буду, это делается не сложно. Однако как обрабатывать письма, я сохраню.
Итак, обработка писем естественно будет производится в правилах обработки почты.
Заходим в админ панель битрикс, сервисы, почта. В разделе почтовые ящики добавляем нашу почту и переходим в правила.
Создаем новое правило с ручной настройкой. Выбираем в каком ящике обрабатывать письма. Задаем имя и ставим галочку "Применять при событиях: При получении почты". Можем добавить описание.
Далее переходим к настройке условий, если на основании всех писем, то ничего там не меняем.
Теперь собственно самое вкусное, настройка действий.
Галочки и основные действия ставите на свой вкус, а вот пример скрипта 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 = "<b>ЗАДАЧА ИЗ ПИСЬМА (Текстовая версия письма)</b><br>";
$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)
Задачу создает! но не добавляет текст письма и вложения....
да, действительно там где получаю ID сообщения для прикрепления не хватает апострофов, чтобы код работал.
"UF_MAIL_MESSAGE" => $arMessageFields['ID']
По какой то причине отрабатывает DEADLINE , не могу понять в чем проблема
Добрый день. Если вам не нужно чтобы устанавливался дедлайн, то просто удалите строки формирования даты дедлайна
$date = new DateTime();
$date->modify('+3 day');
$deadline = $date->format('d.m.Y');
и строку даты дедлайна в задаче
$task['DEADLINE'] = $deadline;
Владимир извините, я за был приставку НЕ вставить, у меня не устанавливается крайний срок, и еще один вопрос , как сделать что бы авторизованный на портале пользователь который отправляет письмо был автоматом назначен наблюдателем в новую задачу, у меня все задачи состоят на том что при создании я ставлю наблюдателя того кто отправил мне письмо. Я буду Вам очень благодарен если у вас есть данное решение
дату дедлайна надо писать как строку в формате 'd.m.Y h:m' пример: "03.12.2023 12:12"
можно просто d.m.Y тогда будет на начало дня.
Вопрос с наблюдателями думаю можно решить так:
//объявляем массив наблюдателей
$auditors = array();
//достаем чистую почту из отправителя
preg_match('/<([^>]+)>/', $arMessageFields['FIELD_FROM'], $matches);
//проверяем, есть ли кто-то на портале с этой почтой
$rsUsers = CUser::GetList(($by="id"), ($order="desc"), array("EMAIL" => $matches[1]));
if($rsUsers->NavNext(true, "f_"))
{
$auditors = $f_ID;
}
Ко мне приходит в виде заявки
Дата - 29.11.2023 17:23:10
Заявка №12938. Обслуживание оргтехники
Пользователь - [502] Иванов Иван Иванович
ниже тело письма ........
тобишь они заранее создают задачу которая отправляется мне письмом от системной почты .
Что касаемо дедлайна я в вашем коде ничего не менял кроме ID пользователей, но крайний срок так и не назначается на 3 дня вперед от текущей даты создания задачи.
Получается у вас есть бизнес-процесс в котором создают заявку и она падает вам или у вас заявка падает из CRM формы на сайте?
Если у вас все это один битрикс, то логичнее в бизнес-процессе сразу создавать задачу, параллельно письму, в противном случае надо парсить тело письма в поисках адреса.
Если разные битриксы, то можно посмотреть в строну веб-хуков