Пользователь 329042
Постоянный посетитель
Сообщений: 126
Баллов: 20
Авторитет:
1
Рейтинг пользователя:
3
Регистрация: 13.04.2015
Всем привет!
Есть страница:
https://digit.nsd.ru/
На ней внизу есть кнопка «Связаться с нами». При клике по кнопке всплывает форма обратной связи. Так вот, при отправке формы срабатывает ajax-запрос к скрипту.
Код самого скрипта:
Код |
---|
<? include($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php"); ?> <? CModule::IncludeModule("iblock"); $el = new CIBlockElement; $PROP = array(); $PROP['MESSAGE'] = $_POST['msg']; $PROP['NAME'] = $_POST['name']; $PROP['EMAIL'] = $_POST['email']; echo 'Прибыли данные:'; var_dump($PROP); $arLoadProductArray = Array( "MODIFIED_BY" => $USER->GetID(), // элемент изменен текущим пользователем "IBLOCK_SECTION_ID" => false, // элемент лежит в корне раздела "IBLOCK_ID" => 5, "PROPERTY_VALUES"=> $PROP, "NAME" => $PROP['EMAIL'], "ACTIVE" => "Y", // активен //"PREVIEW_TEXT" => "текст для списка элементов", //"DETAIL_TEXT" => "текст для детального просмотра", //"DETAIL_PICTURE" => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"]."/image.gif") ); //Добавляем новый элемент инфоблока в админку if($ELEMENT_ID = $el->Add($arLoadProductArray)){ echo "New ID: ".$ELEMENT_ID; }else{ echo "Error: ".$el->LAST_ERROR; } //Отправляем почту $arEventFields = array( "MSG" => $_POST['msg'], "NAME" => $_POST['name'], "EMAIL" => $_POST['email'] ); CEvent::Send("CONNECT_US_FORM", "s1", $arEventFields, "N", "", array(), "ru"); //CEvent::Send("CONNECT_US_FORM", "s1", array(), "N", "", array(), "ru"); ?> <? include($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php"); ?> |
Этот скрипт добавляет новый элекмент в инфоблок + должен отправлять письмо на почту, с использованием функции CEvent::Send. Тип почтового события CONNECT_US_FORM в админке есть. Почтовый шаблон в админке тоже есть, и там указана моя почта для получения, но, письмо почему то не приходит.
В таблицу b_event запись добавляется, но в поле SUCCESS_EXEC стоит N, что означает, что письмо не отправлено.
Если в админке зайти в «Сервисы» — «Рассылки» — «Выпуски» — сделать там тестовое письмо, и отправить — то письмо отправляется, а вот с использованием функции CEvent::Send — почему то нет.
Подскажите, кто-нибудь с таким сталкивался? Как это лечится?
Пробовал отправлять собственные шаблоны писем из кода компонента в CMS 1С Битрикс.
Сразу встретился с возможными проблемами отправки.
Использую функцию CEvent->Send().
Проверка и еще раз проверка
Для начала нужно проверить правильно ли настроено событие и шаблон вашего сообщения в административной панели Битрикс Настройки > Почтовые события.
- Почтовое событие существует и в вашу функцию CEvent->Send() передается верное значение идентификатора типа события.
- Событию назначен хотя бы один почтовый шаблон.
- Шаблон события активен и в обязательных полях стоят правильные значения или шаблоны значений.
На хостинге проблема с функцией mail
Банальная проблема. Делаем тестовый файл, проверяем отправку, если действительно есть проблема, обращаемся к хостеру.
Пример кода:
<?php
$send_to = 'your_email@your_email_domen.ru';
$headers = 'From: sender@youdomen.ru';
if( mail($send_to ,'Тема сообщения',"Проверка функции Mail",$headers) ){
echo 'Mail() работает!';
}else{
echo 'Проблема с функцией Mail()!';
}
?>
Проверка состояния почтового события в БД
Функция 1С Битрикс CEvent->Send() не отправляет сообщение немедленно, а лишь создает почтовое событие в системе которое будет обработано функцией CEvent::CheckEvents(). (подробнее про Почтовую систему 1С Битрикс).
Идем в Настройки-Инструменты-SQL-запрос.
select * from b_event
where event_name like '%your_event_name%' order by date_insert desc
Смотрим в поле SUCCESS_EXEC:
Y — успешно отправлено (передано в функцию mail, обращаемся к хостеру.
N — Не отправлялось (читаем дальше)
F — Функция MAIL вернула ошибку при отправке (обращаемся к хостеру)
Проверяем настройки отправки по cron
Если в предыдущем пункте вы видите SUCCESS_EXEC=N, то возможно в настройках продукта включена отправка сообщений по крону.
В файле /bitrix/php_interface/dbconn.php ищем константы:
define('BX_CRONTAB', true);
define('BX_CRONTAB_SUPPORT', true);
Если значение = true, нужно поставить false либо убрать данные константы.
Подробнее про данные константы 1С Битрикс можно узнать здесь.
Снова проверяем отправку.
Проверяем кэш
Если статус отправки события по прежнему = N, то в модуле управления структурой идем по пути /bitrix/managed_cache/ и чистим содержимое.
Итог
В моем случае было 2 проблемы:
- Не работала функция mail, решилась обращением в саппорт хостинга.
- Был неправильно настроен шаблон сообщения.
Всем привет! Не отправляются письма с сайта. Интересный факт письмо отправляется с админки, а с сайта — нет. С помощью командной php-строки отправлены письма методами Event::send и CEvent::Send, в первом случае письмо отправилось, во втором — нет, но сообщение выдало что «успешно отправлено » в sql таблице b_event письмо имеет статус SUCCESS_EXEC = F. Не могу понять, где прописан CEvent::Send, помогите пожалуйста
1-я проверка Event::send
use BitrixMainMailEvent;
$arFields = array(
"EVENT_NAME" => "SALE_NEW_ORDER",
"LID" => "s1",
"C_FIELDS" => array(
"EMAIL" => "mail_to@mail.com",
"BCC" => "mail_to@mail.com",
"DEFAULT_EMAIL_FROM" => "mail_from@mail.com",
),
"DUPLICATE"=>"Y",
);
$result=Event::send($arFields);
if($result->GetId()){
echo 'Успешно отправлено!';
}else{
echo 'Отправка не удалась!';
}
2-я проверка CEvent::Send
$arEventFields = array(
"EMAIL_TO" => "mail_to@mail.com",
"BCC" => "mail_to@mail.com",
"DEFAULT_EMAIL_FROM" => "mail_from@mail.com",
"ORDER_LIST" => "состав заказа",
);
$result=CEvent::Send("SALE_NEW_ORDER", "s1", $arEventFields,'Y');
if(intval($result)){
echo 'Успешно отправлено!';
}else{
echo 'Отправка не удалась!';
}
1 / 1 / 2
Регистрация: 09.10.2009
Сообщений: 387
1
26.05.2021, 10:42. Показов 2348. Ответов 2
Всем привет!
Есть страница: https://digit.nsd.ru/
На ней внизу есть кнопка «Связаться с нами». При клике по кнопке всплывает форма обратной связи. Так вот, при отправке формы срабатывает ajax-запрос к скрипту.
Код самого скрипта:
PHP | ||
|
Этот скрипт добавляет новый элекмент в инфоблок + должен отправлять письмо на почту, с использованием функции CEvent::Send. Тип почтового события CONNECT_US_FORM в админке есть. Почтовый шаблон в админке тоже есть, и там указана моя почта для получения, но, письмо почему то не приходит.
В таблицу b_event запись добавляется, но в поле SUCCESS_EXEC стоит N, что означает, что письмо не отправлено.
Если в админке зайти в «Сервисы» — «Рассылки» — «Выпуски» — сделать там тестовое письмо, и отправить — то письмо отправляется, а вот с использованием функции CEvent::Send — почему то нет.
Подскажите, кто-нибудь с таким сталкивался? Как это лечится?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
- Главная
- Справочник
- Информатика
- PHP
- Программирование
- 1С Битрикс проблема отправки писем CEvent::Send
- Проверка настроек
- На хостинге проблема с функцией mail
Пробуем починить отправку почты на сайте под управлением 1С Битрикс. Идем от простого к сложному по шагам.
Проверка настроек
Для начала нужно проверить правильно ли настроено событие и шаблон вашего сообщения в административной панели Битрикс :
- Событие : Настройки > Настройки продукта > Почтовые и СМС события > Типы событий
- Шаблон: Настройки > Настройки продукта > Почтовые и СМС события > Почтовые шаблоны
- Почтовое событие существует и в вашу функцию CEvent->Send() передается верное значение идентификатора типа события.
Тип: FEEDBACK_FORM
Название: Отправка сообщения через форму обратной связи - Событию назначен хотя бы один почтовый шаблон.
- Шаблон события активен и в обязательных полях стоят правильные значения или шаблоны значений.
На хостинге проблема с функцией mail
Банальная проблема. Делаем тестовый файл, проверяем отправку, если действительно есть проблема, обращаемся к хостеру.
Пример кода:
<?php
$send_to = ‘your_email@your_email_domen.ru’;
$headers = ‘From: sender@your_domen.ru’;
if (mail($send_to, ‘Тема сообщения’, «Проверка функции Mail», $headers)) {
echo ‘Mail() работает!’;
} else {
echo ‘Проблема с функцией Mail()!’;
}
?>
Если материал понравился Вам и оказался для Вас полезным, поделитесь им со своими друзьями!
-
Сила упругости, возникающая в теле при его деформации, прямо пропорциональна величине этой деформации.
-
1 Ампер это сила тока, при которой через проводник проходит заряд 1 Кл за 1 сек.
-
1 чайная ложка, 5 мл жидкости это приблизительно 5 грамм
-
Современный русский алфавит состоит из 33 букв.
-
Морскую милю приравняли к 1862 метрам, сухопутная американская миля равна 1.609344 километра.
-
Парциальное давление каждого газа, входящего в состав смеси, это давление, которое создавалось бы той же массой данного газа, если он будет занимать весь объем смеси при той же температуре.
-
Один морской узел равен одной тысяче восемьсот пятьдесят двум метрам или одному километру восемьсот пятьдесят двум метрам
В сегодняшней статье хочу рассказать об основных проблемах с почтой в CMS 1с-Битрикс.
Порой до адресата не доходят письма и нужно понять, а отправляются ли они вообще? А может они были отправлены, но возникли, какие-то другие ошибки. Так что же делать в таких ситуациях?
ПРОВЕРИТЬ ОТПРАВЛЯЮТСЯ ЛИ ПИСЬМА
Для проверки достаточно на любой страничке написать следующий php код:
$mail="my@mail.ru"; // ваша почта $subject ="Test" ; // тема письма $text= "Line 1nLine 2nLine 3"; // текст письма if( mail($mail, $subject, $text) ) { echo 'Успешно отправлено!'; } else{ echo 'Отправка не удалась!'; }
Либо использовать для отправки письма функцию bitrix CEvent::Send. Если письмо не пришло, можно обращаться в тех. поддержку хостера.
СПИСОК ОТПРАВЛЕННЫХ ПИСЕМ
В битриксе нет как такого инструмента, который бы показывал сработавшие почтовые шаблоны и соответствующие отправленные письма. Но всё таки существует обходной путь, как просмотреть их.
Для этого нужно зайти в Админку Битрикс, далее Настройки -> Инструменты -> SQL-запрос. Ввести следующий sql код:
select * from b_event where event_name like '%form%' order by date_insert desc
Вместо %form% нужно указать конкретный тип почтового события например так, чтобы посмотреть отправленные письма о новых заказах:
select * from b_event where event_name like 'SALE_NEW_ORDER' order by date_insert desc
Либо можете вообще убрать вторую строку. В результате получите таблицу всех сработавших событий. Нас интересует колонка SUCCESS_EXEC.
‘Y’ — означает успешная отправка;
‘N’ или 0 — письмо не отправлено;
‘F’ — ошибка
Если найденные записи имеют значение ‘Y’ — это означает, что они отправлены и проблем быть не должно.
Но у нас всё плохо, значит обращаемся в тех. поддержку хостинга.
Если ‘N’ или 0- письма по какой-то причине не ушли.
Может помочь такое решение:
перейдите по пути: <вашсайт>/bitrix/php_interface/dbconn.php
Закомментируйте или удалите следующие строки:
define('BX_CRONTAB', true); define('BX_CRONTAB_SUPPORT', true);
Попробуйте протестировать снова. Если после этого SUCCESS_EXEC также имеет значение ‘N’, то перейдите в <вашсайт>/bitrix/managed_cache/ . Удалите содержимое через модуль управления структурой( не в коем случае не используйте FTP). Если вылезет ошибка, то не хватает доступа. Измените доступ к папкам и повторите снова.
Еще один способ — воспользоваться встроенными методами CMS Битрикс по диагностике.
- Проверка системы — <вашсайт>/bitrix/admin/site_checker.php
- Монитор качества — <вашсайт>/bitrix/admin/checklist.php
Ошибки, найденные в процессе диагностики, могут являються причиной вашей проблемы.
Возможная ошибка — почтовый сервер не поддерживает формат письма. Попробуйте изменить настройки отправки.
- Убрать BBC
- Убрать дублирование email в заголовке
- Установить Конвертировать 8-битные заголовки
Если ничего не помогло, попробуйте запросить у хостера логи почтового сервера.
Хочу рассмотреть частный случай:
НЕ ПРИХОДЯТ НА ПОЧТУ УВЕДОМЛЕНИЯ О ЗАПОЛНЕНИИ ВЕБ-ФОРМ
Шаги решения проблемы:
- Переходим в админ панель: Настройки -> Настройки продукта ->Настройки модулей -> Веб-формы. Отключаем флажок «использовать упрощенный режим». Переходим к настройкам компонента веб-форм на сайте. Вкладка дополнительно. Должен присутствовать флажок активирующий привязку к почтовому шаблону.
- Переходим: Панель управления -> Настройки -> Настройки продукта -> Почтовые события. Находим почтовый шаблон для веб-формы. Проверяем правильность данных:
- Шаблон должен быть активен;
- Привязан к одному из сайтов(если многосайтовость);
- От кого: #DEFAULT_EMAIL_FROM#;
- Кому: #DEFAULT_EMAIL_FROM#».
Для начала необходимо проверить работу почты сайта под управлением Битрикс.
Битрикс посылает почтовые шаблоны функциями CEvent::Send() и CEvent::SendImmediate().
Письмо отправляется, если Битрикс нашел активный почтовый шаблон, подходящий под это событие и соответствующий текущему сайту.
Письма, отправленные через CEvent::Send(), попадают в таблицу b_event.
Чтобы проверить таблицу, существует 2 способа.
Способ 1
Перейдите на страницу ваш_домен/bitrix/admin/perfmon_tables.php и в поле «Фильтр по имени таблицы» введите b_event, далее перейдите по точному совпадению таблицы.
Фильтр по имени таблицы
Способ 2
Письма, попавшие в b_event, посылаются на агенте (хиты) или на cron (по расписанию) и отправляются не сразу.
Письма, посылаемые через SendImmediate, не попадают в b_event, а отправляются сразу.
Send и SendImmediate — обертки на функцию Битрикса bxmail, которая использует либо стандартную php-функцию mail, либо custom_mail, если она определена.
В Административном разделе сайта перейдите на страницу по адресу Настройки -> Инструменты -> Командная PHP-строка и скопируйте туда данный код:
if( mail("mail_to@mail.com", "letter test", "my letter text",
"From: mail_from@mail.com
Reply-To: mail_from@mail.com
Content-Type: text/plain; charset=windows-1251
Content-Transfer-Encoding: 8bit"
) ){
echo 'Успешно отправлено!';
}else{
echo 'Отправка не удалась!';
}
Поля «От кого» (mail_from@mail.com), «Кому» (mail_to@mail.com) поменять на свои.
После этого нажмите на кнопку «ВЫПОЛНИТЬ«.
Командная PHP-строка
Битриксовская отправка письма — обёртка над функцией mail().
Если в результате выполнения команды появилось сообщение «Отправка не удалась!«, значит функция mail не работает. Свяжитесь с администрацией хостинга.
Далее нужно проверить срабатывает ли штатные события.
На D7:
use BitrixMainMailEvent;
$arFields = array(
"EVENT_NAME" => "ваше событие",
"LID" => "код вашего сайта",
"C_FIELDS" => array(
"EMAIL" => "mail_to@mail.com",
"BCC" => "mail_to@mail.com",
"DEFAULT_EMAIL_FROM" => "mail_from@mail.com",
),
"DUPLICATE"=>"Y",
);
$result=Event::send($arFields);
if($result->GetId()){
echo 'Успешно отправлено!';
}else{
echo 'Отправка не удалась!';
}
Проверьте, чтобы поля «DEFAULT_EMAIL_FROM«, «EMAIL«, «EVENT_NAME» были заполнены верно.
Если не поддерживается D7:
$arEventFields = array(
"EMAIL_TO" => "mail_to@mail.com",
"BCC" => "mail_to@mail.com",
"DEFAULT_EMAIL_FROM" => "mail_from@mail.com",
"ORDER_LIST" => "состав заказа",
);
$result=CEvent::Send("ваше событие", "код вашего сайта", $arEventFields,'Y');
if(intval($result)){
echo 'Успешно отправлено!';
}else{
echo 'Отправка не удалась!';
}
Далее перейдите на страницу по адресу Настройки -> Инструменты -> SQL запрос и введите:
select * from b_event order by id desc
SQL запрос
Обратите внимание на колонки SUCCESS_EXEC и DUPLICATE. Иногда нужно подождать некоторое время (недолго), пока отработает запись в лог. Первый при установленном значении ‘Y‘ говорит нам, что отправка произошла успешно. Второй, что письмо продублировано на скрытую копию ВСС (например администратору о совершенном заказе).
Что же делать, если значения ‘N‘, а отправка простого mail() выдала ‘Успешно отправлено!’?
Параметр SUCCESS_EXEC сообщает:
- Y — все письма по всем почтовым шаблонам были успешно отправлены;
- F — все письма по всем почтовым шаблонам не смогли быть отправлены;
- P — часть писем отправлена успешно, часть писем — безуспешно;
- 0 — почтовые шаблоны не были найдены;
- N — почтовое событие ещё не обрабатывалось функцией CEvent::CheckEvents.
Если там стоит ‘N’
- Возможно в настройках продукта включена отправка сообщений по крону. Зайдите в файл /bitrix/php_interface/dbconn.php и проверьте, не определены ли у вас константы BX_CRONTAB и BX_CRONTAB_SUPPORT, если да — убрать их.(ОСТОРОЖНО! Будьте готовы вернуть всё в исходное состояние)
- Если после этого SUCCESS_EXEC также N, то необходимо перейти в папку /bitrix/managed_cache/ и попытаться удалить содержимое обязательно через модуль управления структурой, а не через FTP. Если возникла ошибка, исправьте проблему с доступом продукта к папкам. Результатом должно быть удаление файлов и папок из кеша через модуль управления структурой.
- Если после выполения команды CEvent::CheckEvents(); в командной строке несколько писем с N меняют статус отправки на другой, нужно добавлять и проверять cron-задачу или переключить отправку писем на хиты.
- Поставьте cron-задачу (проверьте, есть ли она вообще) или перенесите отправку на хиты.
- Код в init.php, некорректно работающий на cron. Проверьте там редиректы и пустые данные в переменной $_SERVER.
Если там стоит ‘F’ (функция mail() по какой-то причине вернула False)
- Может почтовый сервер не поддерживает формат письма. Тогда необходимо:
- Убрать BBC (лучше добиться, чтоб оно работало, но попробовать отключить можно)
- Убрать дублирование email в заголовке
- Установить «Конвертировать 8-битные заголовки»
- Может быть это проблемы на стороне почтовой утилиты на сервере. Если почта была настроена, но вдруг перестала отправляться, ошибку нужно искать в логах почтовой утилиты. В стандартном виртуальном окружении Битрикса он находится по адресу /home/bitrix/msmtp_default.log. Проверьте также права на /home/bitrix/.msmtprc. Возможно прав для пользователя bitrix (если стантартное виртуальное окружение) не достаточно на прочтение. Поменяйте владельца на bitrix:bitrix.
- Если писем отправляется очень много. В почтовых серверах может стоять ограничение на количество писем в минуту, час или день. Если лимит превышен, письма могут быть не доставлены. Ошибки можно увидеть в логах или узнать у техподдержки почтового сервера. Лечится увеличением пропускного лимита или уменьшением количества отправляемых писем. Например, можно убрать лишних получателей из копий, отключить лишние почтовые шаблоны.
- В почтовом шаблоне письма есть заглушка #NAME#, а ключа с таким именем нет в массиве полей в b_event:
- e-mail отправителя или получателя имеет неправильный формат;
- заглушека #NAME# не может подставиться;
- какой-то из необходимых заголовков не задан в почтовом шаблоне в административной части сайта;
- в почтовом клиенте неверно настроено соответствие заголовков;
- отправитель письма не соответствует тому, что ожидает почтовый сервер.
- Битрикс заполняет заглушку #BCC# в полях Кому и Копии только в письмах, отправляемые модулем Интернет-магазин (например, создание заказа). Если вы добавите #BCC# в Кому или Копию в шаблон регистрации пользователя или в свой кастомный, или любой другой шаблон без приставки SALE — письмо не отправится и будет иметь статус отправки F.
- Обработчики событий отправки писем сработали неверно.
- Обратите внимание на функцию custom_mail. Если она определена, значит заменяет стандартную mail. Даже если она отработала корректно (отослались письма), статус может быть F или 0. Проверьте тариф используемого SMTP, проверьте логины, пароли, а также адрес отправителя. Обычно используют класс PhpMailer. Включите дебаг и посмотрите ошибки.
use PHPMailerPHPMailerPHPMailer;
use PHPMailerPHPMailerException;
$from = 'адрес отправителя';
$mail = new PHPMailer(true);
$mail->SMTPDebug = 1; // включаем дебаг
$mail->isSMTP(); // включаем SMTP
$mail->Host = ''; // SMTP сервер
$mail->SMTPAuth = true; // включаем авторизацию
$mail->Username = $from; // SMTP логин
$mail->Password = ''; // SMTP пароль
$mail->SMTPSecure = 'ssl'; // включаем шифрование
$mail->Port = 465; // используемый TCP порт
//Recipients
$mail->setFrom($from, 'Арт-Деко'); //от кого
$mail->addAddress(''); //кому
// Content
$mail->CharSet = "UTF-8"; //кодировка
$mail->isHTML(true); // формат письма HTML
$mail->Subject = '=test=';
$mail->Body = '=test body=';
$mail->send();
file_put_contents($_SERVER['DOCUMENT_ROOT'].'/mail_log.log',serialize($mail->ErrorInfo).PHP_EOL,FILE_APPEND);
Если стоит NULL
API работает только с записями, у которых значение «N«, поэтому попробуем исправить сам столбец таблицы.
Для этого перейдите на Настройки -> Инструменты -> SQL запрос и введите:
alter table b_event modify SUCCESS_EXEC char(1) not null default 'N';
SQL запрос
Если стоит «0»
- Неправильно настроен шаблон сообщения. Посмотрите правильность зополнения полей. Мало ли.
- В почтовом шаблоне снята галочка активности или нет привязки к нужному сайту.
- Обработчики событий отправки писем сработали неверно.
Если ничего не помогло
- Просите у хостера логи почтового сервера.
- По возможности проверить размер таблицы b_event (через phpmyadmin к примеру).
- Если дешевый тариф, то посмотреть использование памяти сервером.
- Возможно у хостера стоит ограничение на вес письма.
Проверка домена в настройках сайта
Для отправки писем важно, чтобы домен, с которого отправляются письма, был прописан в настройках сайта.
В Административном разделе перейдите на Настройки -> Настройки продукта -> Сайты -> Список сайтов и нажмите на id сайта, с которого идет отправка письма:
Список сайтов
На странице настроек сайта проверьте поле «Доменное имя«. Если там не указан домен, с которого отправляются письма, то введите его:
Редактирование сайта
Если письмо отправилось, но вы его не видите не забудьте перепроверить спам фильтр на почте, на которую отправляли.