Прикрепить файлы из веб-формы 1С-Битрикс к письму

На клиентском сайте, в разделе «Карьера», есть форма для откликов на вакансии. К этой форме есть возможность прикрепить файл с резюме и фотографию. Но…

По желанию клиента резюме и фотографии должны приходить в письме на email в виде вложения, а не в виде ссылки на скачивания файла, как это реализовано в стандартной форме Bitrix.

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

Итак, как реализовать прикрепление файлов в виде вложения в письмо из веб-формы на Битрикс?

Гугление дало несколько вариантов решения задачи, мне понравился вариант на форуме 1С-Битрикс.

Зарегистрируем событие OnBeforeEventAdd которое вызывается в момент добавления почтового события в таблицу b_event и с помощью него добавим в письмо наши вложения.

Для этого пройдемся циклом по всем полям веб-формы и с помощью регулярного выражения найдем все ссылки на скачивание файла.

Внимание! Чтобы была возможность прикрепить файл к письму, права доступа на форму нужно выбрать:  Все пользователи — Полный доступ.

Далее разбираем ссылку и получаем rid и hash файла и прикрепляем файл к письму.

Прикрепить файлы из веб-формы 1С-Битрикс к письму

Следующий код нужно добавить в файл init.php:

AddEventHandler("main", "OnBeforeEventAdd", array("MailEventHandler", "onBeforeEventAddHandler"));

class MailEventHandler
{
    static function onBeforeEventAddHandler(&$event, &$lid, &$arFields, &$message_id, &$files)
    {
        // Меняем тип почтового события и ID почтового шаблона на свои
        if ($event === 'FORM_FILLING_SIMPLE_FORM_1' && $message_id === '30') {

            if (!is_array($files)) $files = [];

            foreach ($arFields as $key => $field) {

                if ($link = self::getLinkFromField($field)) {

                    if ($arFile = self::getFileFromLink($link)) {

                        $files[] = $arFile['FILE_ID'];

                    }

                }

            }
        }
    }

    // Ищем ссылки на скачивания файлов в письме
    static function getLinkFromField($field)
    {
        // Укажите https или http, в зависимости от того, как работает ваш сайт
        preg_match("/(https\:.*form_show_file.*action\=download)/", $field, $out);
        return ($out[1] ?: false);
    }


    static function getFileFromLink($link)
    {
        $uri = new \Bitrix\Main\Web\Uri($link);
        parse_str($uri->getQuery(), $query);
        return CFormResult::GetFileByHash($query["rid"], $query["hash"]);
    }

}

Готово.

Если у вас в форме несколько полей с файлами, к письму прикрепиться тоже несколько файлов.

P.s. Если письмо отправляется в формате HTML, сделайте регулярное выражение таким:

preg_match("/(https\:.*form_show_file.*)/", $field, $out);

Иначе при наличии нескольких форм с файлами, у вас будет отправляться только один файл

Хостинг для ваших проектов

Возможно, вас заинтересует

Получить ID элемента инфоблока вне шаблона компонента

На клиентском сайте использующем Битрикс, появилась задача получить ID текущего элемента инфоблока …