Прикрепить файлы из веб-формы 1С-Битрикс к письму
На клиентском сайте, в разделе «Карьера», есть форма для откликов на вакансии. К этой форме есть возможность прикрепить файл с резюме и фотографию. Но…
По желанию клиента резюме и фотографии должны приходить в письме на email в виде вложения, а не в виде ссылки на скачивания файла, как это реализовано в стандартной форме Bitrix.
Почему в Битриксе не предусмотрели такую возможность по стандарту, не понятно.
Итак, как реализовать прикрепление файлов в виде вложения в письмо из веб-формы на Битрикс?
Гугление дало несколько вариантов решения задачи, мне понравился вариант на форуме 1С-Битрикс.
Зарегистрируем событие OnBeforeEventAdd которое вызывается в момент добавления почтового события в таблицу b_event
и с помощью него добавим в письмо наши вложения.
Для этого пройдемся циклом по всем полям веб-формы и с помощью регулярного выражения найдем все ссылки на скачивание файла.
Внимание! Чтобы была возможность прикрепить файл к письму, права доступа на форму нужно выбрать: Все пользователи — Полный доступ.
Далее разбираем ссылку и получаем rid
и hash
файла и прикрепляем файл к письму.
Следующий код нужно добавить в файл 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);
Иначе при наличии нескольких форм с файлами, у вас будет отправляться только один файл