Прикрепить файлы из веб-формы 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);

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

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