Отправка прайс-листа из веб-формы

При отправке на сайт веб-формы автоматически высылается прайс-лист или другой файл на указанную в форме почту. Необходимо создать почтовое событие, прописав #DEFAULT_EMAIL_FROM# и #USER_EMAIL# в поля «От» и «Кому», и повесить скрипт на расписание cron.

Скрипт проверяет поступление новых форм со статусом $statusNew, отправляет письмо с прайс-листом и устанавливает форме статус $statusSended.

bitrix-mail-form-pricelist.php
<?php
 
// Отправка прайс-листа Bitrix пользователю
 
if(php_sapi_name() !== 'cli') die('Access denied'); // только по расписанию из CLI
 
$_SERVER['DOCUMENT_ROOT'] = dirname(__DIR__);
 
define('LANGUAGE_ID', 's1');
define('NO_KEEP_STATISTIC', true);
define('NOT_CHECK_PERMISSIONS', true);
require($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');
 
class FormMailer {
  public
    $formId = 15,         // ID формы, куда поступают запросы
    $statusNew = 18,      // ID статуса "новенькой" формы
    $statusSended = 19,   // ID статуса формы, по которой прайс уже отправлен
    $attachFile = '/var/www/site.ru/var/price.xlsx', // путь к файлу прайс-листа
    $mailAttachName = 'price.xlsx', // название файла, как оно будет в письме
    $formMailField = 'mail',        // название поля формы, в котором содержится Email
    $mailFrom = 'info@site.ru',     // поле "От"
    $attachDir = 'pricelist',       // название каталога, где будет храниться файл (временно)
    $eventName = 'MAIL_EVENT_NAME', // название почтового события
    $siteID = 's1',                 // название сайта
    $forms, $form, $fileId;
 
  public function __construct() {
    CModule::IncludeModule('form');
    if(!file_exists($this->attachFile)) throw new Exception('File not exists', 1);
  }
 
  public function run() {
    $this->getForms();
    if($this->forms->SelectedRowsCount() == 0) return;
    $this->uploadFileToDB();
    while($this->form = $this->forms->Fetch()) {
      try {
        $this->notify();
        $this->changeState();
      } catch (Exception $e) {}
    }
    $this->removeFileFromDB();
  }
 
  private function uploadFileToDB() {
    $this->fileId = CFile::SaveFile(
      array(
        'name' => $this->mailAttachName,    // имя файла, как оно будет в письме
        'tmp_name' => $this->attachFile,    // собственно файл
        'old_file' => '0',                  // ID 'старого' файла
        'del' => 'N',                       // удалять прошлый?
        'MODULE_ID' => '',                  // имя модуля, работает и так
        'description' => '',                // описание
      ),
      $this->attachDir, // относительный путь от upload, где будут храниться файлы
      false,
      false
    );
  }
 
  private function removeFileFromDB() {
    CFile::Delete($this->fileId);
  }
 
  private function getForms() {
    $this->forms = CFormResult::GetList($this->formId, $by = 's_timestamp', $order = 'desc',
      $filter = array('STATUS_ID' => $this->statusNew), $is_filtered, $check_rights = 'N', $limit = false);
  }
 
  private function notify() {
    $data = CFormResult::GetDataByID($this->form['ID'], $field = array($this->formMailField), $result, $answer);
    $email = $data[$this->formMailField][0]['USER_TEXT'];
    if(!$email) return;
    echo $email.PHP_EOL; // можно писать в лог
    $event = new CEvent;
    $arFields = array('USER_EMAIL' => $email, 'DEFAULT_EMAIL_FROM' => $this->mailFrom);
    $event->SendImmediate($this->eventName, $this->siteID, $arFields, 'N', '', array($this->fileId));
  }
 
  private function changeState() {
    CFormResult::SetStatus($this->form['ID'], $this->statusSended, $check_rights = 'N');
  }
}
 
$FormMailer = new FormMailer();
$FormMailer->run();
Печать/экспорт