Отправка прайс-листа из веб-формы
При отправке на сайт веб-формы автоматически высылается прайс-лист или другой файл на указанную в форме почту. Необходимо создать почтовое событие, прописав #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();