Отправка письма со вложением через веб-формы Битрикс

Ниже рассматривается процесс создания и настройки формы на сайте для отправки писем со вложениями на почту администратора сайта. Решается данная задача через модуль «Веб-формы» от битрикса.

 

Идея для данной заметки возникла из следующей практической ситуации: Автору достался сайт на битриксе с самописной формой, задача которой была в том, чтобы отправлять вложенные документы на почту ответственному сотруднику. К сожалению, форма работала нестабильно, вместо вложения в письме была ссылка на это вложение, загруженное в одну из папок на сайте. Собственно, требовалось решить указанные проблемы с формой. Автором было предложено «пересобрать» данную форму средствами модуля «Веб-формы», так как данный подход, в данном случае, закрывал все описанные проблемы.

Весь процесс можно разделить на 3 условных блока:

  1. Создание формы в админке
  2. Вывод формы на соответствующей странице в публичной части
  3. Добавление обработчика в init.php

Создание веб-формы в админке

Для создания веб-формы в битриксе нужно перейти в Сервисы > Веб-формы > Настройка форм и кликнуть кнопку «создать».

Основной интерес, на данном этапе, представляют вкладки «Свойства» и «Шаблон формы».

На вкладке «свойства» требуется ввести название, отметить привязку к сайту и отправку результатов по email, ввести название кнопки для отправки формы, капчу (опционально):

На вкладке «Шаблон формы» происходит настройка, собственно, шаблона. Можно использовать как визуальный редактор, так и отображение в виде кода. Для данной задачи нужна была форма всего из двух полей:

Эта же форма, но в виде кода:

<?=$FORM->ShowInput('new_field_11963', 'typefile')?><?=$FORM->ShowSubmitButton("","reg-send-doc dw-btn")?>

Обратите внимание, что у полям также заданы классы. В визуальном редакторе их можно добавить в «свойствах», кликнув на необходимый элемент формы:

Сохранив изменения, в целом, процесс настройки формы в админке можно считать законченным. Конечно, стоит отдельно заметить, что в настоящем примере процесс представлен в очень упрощенном виде, т.к. задействованы всего 2 кнопки: Прикрепление файла и кнопка «Отправить». Но, с другой стороны, алгоритм создания веб-форм в битриксе один и тот же. Основные сложности с данным модулем возникают при попытке добавить ajax-отправку к данной форме. Впрочем, это не является темой настоящей статьи.

Вывод формы на соответствующей странице в публичной части

Далее следует вывести компонент с данной формой в публичной части сайта. В целом, здесь все предельно просто: На нужной странице (Для наглядности, предполагается, что это статичная страница), нужно вывести требуемую форму. Выглядеть это должно примерно следующим образом:

<?$APPLICATION->IncludeComponent(
"bitrix:form.result.new",
".default",
Array(
"CACHE_TIME" => "3600",
"CACHE_TYPE" => "A",
"CHAIN_ITEM_LINK" => "",
"CHAIN_ITEM_TEXT" => "",
"COMPONENT_TEMPLATE" => "ajax",
"EDIT_URL" => "result_edit.php",
"IGNORE_CUSTOM_TEMPLATE" => "N",
"LIST_URL" => "result_list.php",
"SEF_MODE" => "N",
"SUCCESS_URL" => "success.php",
"USE_EXTENDED_ERRORS" => "N",
"VARIABLE_ALIASES" => array("WEB_FORM_ID"=>"WEB_FORM_ID","RESULT_ID"=>"RESULT_ID",),
"WEB_FORM_ID" => "4"
),
false,
Array(
'ACTIVE_COMPONENT' => 'Y'
)
);?>

result_list.php в данном случае — это страница, куда попадает пользователь после заполнения формы. Если нет иных требований, то можно сделать что-то такое:

<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->SetTitle("Форма успешно отправлена!");
?>
<p>Поздравляем!</p>
<p>Документы успешно отправлены.</p>
<p><a href="/personal/">Вернуться в личный кабинет</a></p>
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>

Вывод формы в публичной части закончен, можно переходить к самому важному — отправки содержимого формы, как вложения.

Добавление обработчика в init.php

Для того, чтобы в письме с результатами формы приходила не только ссылка на прикрепленный к форме файл, но данный файл пересылался бы в письме как вложение, требуется добавить обработчик события для отправки данной формы. Для этого, в файле init.php, который расположен по адресу /bitrix/php_interface/ нужно добавить следующий код:

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

class MailEventHandler
{
static function onBeforeEventAddHandler(&$event, &$lid, &$arFields, &$message_id, &$files)
{

if ($event === 'FORM_FILLING_SIMPLE_FORM_4' && $message_id === '119') {

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"]);
}

}
?>

Обратите внимание, что в «if ($event === ‘FORM_FILLING_SIMPLE_FORM_4’ && $message_id === ‘119’)» нужно задать код формы и ID почтового шаблона для данного события.

После добавления данного события следует протестировать форму. Если все было настроено корректно, то после отправки формы:

  1. Придет письмо со вложением на почту (что и требовалось).
  2. В «Ответах» соответствующей формы в «веб-формах» также будут результаты заполнения.

Если же возникли сложности, то нужно проверить настройки доступа и привязки к сайту — т.к. это наиболее вероятная причина, почему форма может не отрабатывать корректно.