Здравствуйте.
На VPS развернут Bitrix VM по инструкции
https://dev.1c-bitrix.ru/learning/course/?COURSE_ID=37&LESSON_ID=6489&LESSON_PATH=3908.6488.6489
Так же перенесена копия сайта. Сайт работает. Однако, проблема с почтой.
Важна только отправка почты, неважно через какой сервер, поэтому предполагается использование msmtp
Все настройки сделаны как тут
https://dev.1c-bitrix.ru/learning/course/?COURSE_ID=37&LESSON_ID=6689
а именно:
1) файл /home/bitrix/.msmtprc создан и настроен на отправку писем чере yandex.ru (грубо говоря, все настройки этого файла взяты со старого сервера, где почта работала)
2) символическая ссылка с /home/bitrix/.msmtprc на /etc/msmtprc тоже прописана.
Для проверки ошибок выполняю функцию (тоже из инструкции)
echo -e «test message» | /usr/bin/msmtp —debug -t -i _тут_любой_почтовый_адрес_
Письмо приходит (пусть и в спам, но это пока не важно). И лог msmtp пишется.
Однако, когда на сайте, в командной строке php набираю:
if(mail(«_тут_адрес_», «test», «test»)){
echo «true»;
}else{
echo «false»;
}
возвращает false. И письма нет, и лог msmtp НЕ пишется
Понимаю, что что-то где-то не донастроено для функции mail(). Только вопрос что и где?
В этой статье мы расскажем вам о том, где смотреть причины ошибки неотправленной почты в Битриксе. Рассмотрим три основных мест, откуда можно найти ошибку отправки писем.
Проверка таблицы очереди писем
Идем в административную панель Битрикса по пути: Настройки / Производительность / Таблицы. Ищем таблицу b_event и проваливаемся по ссылке.
Именно в эту таблицу попадают письма с сайта в очередь, а затем отправляются на хитах или на агентах.
На открывшейся странице можем отыскать сообщение, которое не отправилось. Проматываем в самый конец к колонке SUCCESS_EXEC – это колонка записывает состояние отправки письма.
Варианты статуса отправки (SUCCESS_EXEC):
Y – означает, что письмо было успешно отправлено
N – говорит о том, что событие еще не обработано и письмо не отправлено. В этом случае стоит полную проверку сайта и проверить настройки dbconn.php. Проверить корректность настройки почтовых шаблонов и их привязки к сайтам.
F – сообщение не было отправлено. Необходимо проверить логи сервера или хостинга.
0 – не активен или отсутствует почтовый шаблон (Настройки / Настройки продукта / Почтовые шаблоны)
Проверка системы
Проверка системы расположена на странице Настройки / Инструменты / Проверка системы. В проверке уже встроен инструмент, который проверяет возможность отправки письма с помощью стандартной PHP функции mail. Этаки быстрый проверяльщик работы почты.
Если здесь уже возникает ошибка, то проблему стоит идти смотреть в логи сервера.
Проверка логов сервера
Если ошибка ошибка идет глубже и у вас VM Bitrix, идем в консоль сервера по пути /home/bitrix/ и ищем логи с префиксом .msmtp_ (по умолчанию). Смотрим и ловим ошибки в этом файле. Логи лучше просматривать с помощью утилиты mc.
Сама конфигурация почтовых настроек расположена в файле /home/bitrix/.msmtrpc
Если письма в Битриксе отмечены как успешно отправленные, но письмо не пришло и в логах отсутствует какая-либо информация – следует обратить внимание на логи в /var/log/. Там отобразится ошибка, которая возвращается функцией mail.
Проверить возможность отправки также можно с помощью консольных команд (но в данном случае будет использоваться отправитель по умолчанию – default)
> php -a
> mail('test@example.com', "Test", "Test message");
> exit
Если произойдет ошибка при отправке, то сообщение будет у вас на экране.
Ошибки
Частая ошибка – это когда в письмах отправителем указан адрес отличимый от названия аккаунта (поле FROM). Поэтому задайте в настройках сайта нужный адрес или в почтовых шаблонах в поле «От кого». В этом случае, если требуется, чтобы человек мог ответить на другую почту, то можете указать электронную почту в качестве обратного адреса в почтовом шаблоне.
Другая ошибка – это отсутствие настроек для отправителя по умолчанию. Необходимо внести корректные настройки адреса отправителя (указать tsl, метод авторизации и т.п.)
На этом все, надеюсь статья была вам полезна. Если у вас возникнут вопросы, задавайте в комментарий.
Прежде чем приступить
Подключаемся к серверу по SSH и попадаем в меню Bitrix-окружения. Для начала нужно выйти из меню, набрав 0 для выхода.
Если в системе ранее был установлен sendmail, тогда его необходимо удалить:
# rpm -e --nodeps sendmail
Установка Postfix
# yum install postfix
Добавим postfix в автозагрузку
# chkconfig postfix on
Запустите postfix:
systemctl start postfix
теперь необходимо войти в консольное меню VMBitrix,
# /root/menu.sh
Выбираем п.6 и затем п. 4
6. Manage sites in the pool
4. Change email settings on site
Первым делом набираем название сайта из списка в консоли выше, к которому создаем файл настроек для отправки почты, к примеру baks.dev. В консоли появяться последовательно вопросы и в круглых скобках подсказки в кним с значениями по умолчанию. Если оставить поле не заполненым и нажать Enter, то в файл настроек запишуться те самые данные по умолчанию. Так как мы настраиваем отправку почты с помощью почтового сервера Postfix, то принимаем все занчения по умолчанию.
Enter site name (default) or 0 to exit: baks.dev
Затем потребует заполнит email, который будет использоваться по умолчанию, например noreply@baks.dev
Enter From email address (ex. bob@example.org): noreply@baks.dev
Указываем локальный адрес сервера 127.0.0.1 и порт 25, либо просто жмем Enter на двух следующих пунктах
Enter server address or DNS (127.0.0.1):
Enter server port (25):
Разрешаем отправку почты без авторизации, заполнив N и жмем Enter
Do you want to use SMTP authentication on 127.0.0.1:25? (N|y): N
также отключаем TLS , заполнив n и жмем Enter
Do you want to enable TLS for 127.0.0.1:25 (n|Y):n
Если ошибок не выявлено, тогда вы должны получить уведомление
Configure email for the site baks.dev
В результате будет создан файл /home/bitrix/.msmtprc, в котором будут указаны внесённые настройки:
# smtp account configuration for baks.dev
account white-sign.ru
logfile /home/bitrix/msmtp_baks.dev.log
host 127.0.0.1
port 25
from noreply@baks.dev
aliases /etc/aliases
keepbcc off
auth off
Перезапустим Postfix
systemctl restart postfix
На этом мы завершили настройку сервера отправки почты.
Проверьте работу спомощью командной стрки: переходим в панели администрирования в Настройки — Инструменты — Командная PHP-строка, втсавляем код и выполняем
if (mail("you_mail@gmail.com", "test subject", "test body" ,"From: test@bitrix.ru"))
echo "Сообщение передано функции mail, проверьте почту в ящике.";
else
echo "Функция mail не работает, свяжитесь с администрацией хостинга."
Если отправка не работает, и письма не приходят на почту?
1. Проверьте, пожалуйста, настройки почтового события заполнения формы и его шаблона.
Откройте Панель управления — Настройки — Настройки продукта — Почтовые события; выберите событие.
На первой закладке, должны стоять галочки возле используемых на Вашем сайте кодов языка. На закладке «шаблоны» должна стоять галочка возле имени Вашего сайта, хотя бы у одного шаблона (обычно он там как раз один). Также, в настройках выбранного почтового шаблона (можно перейти прямо по ссылке со страницы «шаблоны», не забудьте только перед этим нажать «применить», если были сделаны какие-то настройки), должна стоять галочка «активен», и также должен быть выбран Ваш сайт. Также должны быть корректно заполнены поля «от кого» и «кому» (значения по-умолчанию #DEFAULT_EMAIL_FROM# и #EMAIL#, соответственно).
2. Если все эти настройки соответствуют истине, то в настройках модуля веб-формы отключите флаг «использовать упрощенный режим», перейдите в настройки соответсвующей формы, вкладка дополнительно, убедитесь, что флаг привязки к почтовому шаблону проставлен. Если и здесь все в порядке, то перейдите, пожалуйста, в Настройки-Инструменты-SQL-запрос и выполните такой запрос:
select * from b_event where event_name like '%form%' order by date_insert desc
Найдите событие заполнения формы, смотрите в поле SUCCESS_EXEC:
стоит Y — письмо из продукта ушло, дальнейшую его судьбу попросите отследить администратора хостинга
стоит N — зайдите в файл /bitrix/php_interface/dbconn.php и проверьте не определены ли у Вас константы
BX_CRONTAB и BX_CRONTAB_SUPPORT, если да — убрать их определение вообще из этого файла. Если после этого SUCCESS_EXEC также N, то необходимо перейти в папку /bitrix/managed_cache/ и попытаться удалить содержимое (обязательно через модуль управления структурой, а не через FTP), если получите ошибку — значит необходимо исправить проблему с доступом продукта к папкам, чтобы Вы могли удалить файлы и папки из кеша.
стоит F — функция mail() по какой-то причине вернула False при отправке. Наиболее типичные проблемы: 1. Не настроена функция mail() на хостинге. Решается с хостером.
3. Почтовый сервер не поддерживает формат письма. Пробовать изменять настройки отправки, убирать поле ВСС, убирать галочку «Дублировать email адрес в заголовке», ставить «Конвертировать 8-битные заголовки». Не помогает — запросить логи у администратора почтового сервера, чтобы посмотреть, в чем конкретно ошибка при отправке.
Стоит 0 (ноль) — значит, что-то неверно в настройках из пп.1-2 — проверьте еще раз.
Проверка отправки почты из консоли линукс
echo «Testing» | mail -s «Test» johndoe@example.comс
Ошибка
-bash: mail: command not found
Если php почта не отправляется, устанавливаем комманду
yum install mailx
Проверяем дальше
echo «Testing» | mail -s «Test» johndoe@example.comс
Ошибка
/usr/sbin/sendmail: No such file or directory
«/root/dead.letter» 9/216
. . . message not sent.
Устанавливаем sendmail
yum install sendmail sendmail-cf -y
chkconfig —level 345 sendmail on
service sendmail start
Проверяем дальше
echo «Testing» | mail -s «Test» johndoe@example.comс
Ошибка пропала, письма приходят
Но вот не задача…
PHP Функция mail() не работает
Вопрос решился письмом в службу поддержки firstVDS сервера
У меня на сервере VDS установлено веб окрежение битрикс
Необходимо было в файле /etc/php.d/bitrixenv.ini
сменить параметр sendmail_path
;sendmail_path = msmtp -t -i
sendmail_path = /usr/sbin/sendmail -t -i
и все заработало!
PS: для работы curl потребуется еще одна настройка
копируем данные из /etc/php.d/20-curl.ini.disabled в 20-curl.ini
service httpd restart
Без обратной связи сайт словно паралитик: все видит, а сказать ничего не может. Не поступают данные с веб — форм, корпоративные ящики не работают совсем или настраиваются с удивительными ухищрениями. Деньги заплачены, а про-стей-шая, э-ле-мен-тар-ней-шая, важ-ней-шая рабочая задача не решена! Что делать?
Проверяем настройки почтового события веб-формы и связанные шаблоны
Давайте перейдем по пути Панель управления -> Настройки -> Настройки продукта -> Почтовые события и выберем событие.
1. На первой вкладке галочки кодов языка включены?
2. На вкладке «Шаблоны» галочка имени сайта включена?
3. Почтовый шаблон активен?
4. Поле «От кого» заполнено верно (по умолчанию #DEFAULT_EMAIL_FROM#) ?
5. Поле «Кому» заполнено верно (по умолчанию #EMAIL#) ?
Все верно? Смотрим дальше. В настройках модуля веб-формы отключите галочку «использовать упрощенный режим». Перейдите в настройки формы на вкладку «дополнительно» и проверьте, включен ли флаг привязки к почтовому шаблону. Готово?
Перейдите по адресу Настройки -> Инструменты -> SQL-запрос и выполните такой запрос:
select * from b_event where event_name like ‘%form%’ order by date_insert desc
Найдя событие выполнения формы, просмотрите поле SUCCESS_EXEC. Если видите «Y», то письмо из продукта ушло, и вам следует отправить запрос в техподдержку хостинга. Если видите «N», то перейдите в файл
/bitrix/php_interface/dbconn.php
и проверьте, определены ли 2 переменные: BX_CRONTAB и BX_CRONTAB_SUPPORT. Если да, то отмените определение.
Повторите SQL-запрос и снова просмотрите поле SUCCESS_EXEC. Если снова видите «N», очистите кэш в папке /bitrix/managed_cache/ через модуль управления структурой. Ни в коем случае ни через FTP! Если модуль выдаст ошибку, исправьте права доступа к папкам.
Если же значение «F», то функция mail() вернула значение False при отправке. Почему так бывает:
1. Не настроена функция mail() на хостинге. Обратитесь в техподдержку хостера.
2. Почтовый сервер не поддерживает формат письма. Попробуйте изменять настройки отправки, убирать поле ВСС, убирать галочку «Дублировать email адрес в заголовке», ставить «Конвертировать 8-битные заголовки». Если не поможет, запросите у администратора логи почтового сервера.
Наконец, если в поле «0», вернитесь к началу, настройкам почтовых событий, и проверьте заново.
Спасибо за внимание!
Читайте свежий выпуск «Кладовки программиста» каждый день!
Назад в раздел
Проверить работу почты сайта под управлением Битрикс:
Битрикс посылает почтовые шаблоны функциями CEvent::Send() и CEvent::SendImmediate().
Письмо отправляется, если Битрикс нашел активный почтовый шаблон, подходящий под это событие и соответствующий текущему сайту.
Письма отправлены через CEvent::Send() попадают в таблицу b_event.
Чтоб проверить таблицу существует 2 способа
первый: перейти на страницу
домен/bitrix/admin/perfmon_tables.php
и в поле Фильтр по имени таблицы ввести b_event. перейти по точному совпадению таблицы.
другой: описан ниже
Письма, попавшие в 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) поменять на свои.
Нажать ВЫПОЛНИТЬ.
Битриксовская отправка письма — обёртка над функцией 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
Обращаем свое внимание на колонки SUCCESS_EXEC и DUPLICATE. Иногда нужно подождать некоторое время (недолго) пока отработает запись в лог. Первый при установленном значении ‘Y’ говорит нам что отправка произошла успешно. Второй что письмо продублировано на скрытую копию ВСС (например администратору о совершенном заказе).
Что же делать если значения ‘N’, а отправка простого mail() выдала ‘Успешно отправлено!’ ?
Параметр SUCCESS_EXEC сообщает
Y — все письма по всем почтовым шаблонам были успешно отправлены
F — все письма по всем почтовым шаблонам не смогли быть отправлены
P — часть писем отправлена успешно, часть писем — безуспешно
0 — почтовые шаблоны не были найдены
N — почтовое событие ещё не обрабатывалось функцией CEvent::CheckEvents
Если там стоит ‘N’
1) Возможно в настройках продукта включена отправка сообщений по крону. зайдите в файл /bitrix/php_interface/dbconn.php и проверьте не определены ли у вас константы BX_CRONTAB и BX_CRONTAB_SUPPORT, если да — убрать их.(ОСТОРОЖНО! Быть готовым вернуть всё в исходное состояние)
2) Если после этого SUCCESS_EXEC также N, то необходимо перейти в папку /bitrix/managed_cache/ и попытаться удалить содержимое обязательно через модуль управления структурой, а не через FTP. Если ошибка — исправить проблему с доступом продукта к папкам. Результатом должно быть удаление файлов и папок из кеша через модуль управления структурой.
3) если после виполения команды CEvent::CheckEvents(); в командной строке несколько писем с N меняют статус отправки на другой нужно добавлять и проверять cron-задачу или переключить отправку писем на хиты.
4) Поставить cron-задачу(проверить есть ли она вобще) или перенести отправку на хиты.
5) Код в init.php, некорректно работающий на cron. Проверьте там редиректы и пустые данные в переменной $_SERVER.
Если там стоит ‘F’(функция mail() по какой-то причине вернула False)
1)Может почтовый сервер не поддерживает формат письма.
Убрать BBC(добиваемся чтоб оно работало, но попробовать отключить можно)
Убрать дублирование email в заголовке
Установить Конвертировать 8-битные заголовки
2)Может быть это проблемы на стороне почтовой утилиты на сервере.
Если почта была настроена, но вдруг перестала отпарвляться, ошибку нужно искать в логах почтовой утилиты. В стандартном виртуальном окружении Битрикса это /home/bitrix/msmtp_default.log
проверьте также права на
/home/bitrix/.msmtprc
возможно прав для пользователя bitrix (если стантартное виртуальное окружение) не достаточно на прочтение. Поменяйте владельца на bitrix:bitrix
3) Если писем отправляется очень много.
В почтовых серверах может стоять ограничение на количество писем в минуту, час или день. Если лимит превышен, письма могут быть не доставлены. Ошибки можно увидеть в логах или узнать у техподдержки почтового сервера. Лечится увеличением пропускного лимита или уменьшением количества отправляемых писем. Например, убрать лишних получателей из копий, отключить лишние почтовые шаблоны.
4) В почтовом шаблоне письма есть заглушка #NAME#, а ключа с таким именем нет в массиве полей в b_event.
e-mail отправителя или получателя имеет неправильный формат;
— заглушека #NAME# не может подставиться;
— какой-то из необходимых заголовков не задан в почтовом шаблоне в административной части сайта;
— в почтовом клиенте неверно настроено соответствие заголовков;
— отправитель письма не соответствует тому, что ожидает почтовый сервер.
— Битрикс заполняет заглушку #BCC# в полях Кому и Копии только в письмах, отправляемые модулем Интернет-магазин (например создание заказа).Если вы добавите #BCC# в Кому или Копию в шаблон регистрации пользователя или в свой кастомный, или любой другой шаблон без приставки SALE — письмо не отправится и будет иметь статус отправки F.
5) Обработчики событий отправки писем сработали неверно.
6) Обратите внимание на функцию 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';
Если стоит «0»
1) Неправильно настроен шаблон сообщения.
Посмотрите правильность зополнения полей. Мало ли.
2) В почтовом шаблоне снята галочка активности или нет привязки к нужному сайту.
3) Обработчики событий отправки писем сработали неверно.
Если ничего не помогло, просите у хостера логи почтового сервера.
По возможности проверить размер таблицы b_event (через phpmyadmin к примеру).
Если дешевый тариф то посмотреть использование памяти сервером.
Возможно у хостера стоит ограничение на вес письма.
Если письмо отправилось, но вы его не видите не забудьте перепроверить спам фильтр на почте, на которую отправляли.
Здравствуйте.
На VPS развернут Bitrix VM по инструкции
https://dev.1c-bitrix.ru/learning/course/?COURSE_ID=37&LESSON_ID=6489&LESSON_PATH=3908.6488.6489
Так же перенесена копия сайта. Сайт работает. Однако, проблема с почтой.
Важна только отправка почты, неважно через какой сервер, поэтому предполагается использование msmtp
Все настройки сделаны как тут
https://dev.1c-bitrix.ru/learning/course/?COURSE_ID=37&LESSON_ID=6689
а именно:
1) файл /home/bitrix/.msmtprc создан и настроен на отправку писем чере yandex.ru (грубо говоря, все настройки этого файла взяты со старого сервера, где почта работала)
2) символическая ссылка с /home/bitrix/.msmtprc на /etc/msmtprc тоже прописана.
Для проверки ошибок выполняю функцию (тоже из инструкции)
echo -e «test message» | /usr/bin/msmtp —debug -t -i _тут_любой_почтовый_адрес_
Письмо приходит (пусть и в спам, но это пока не важно). И лог msmtp пишется.
Однако, когда на сайте, в командной строке php набираю:
if(mail(«_тут_адрес_», «test», «test»)){
echo «true»;
}else{
echo «false»;
}
возвращает false. И письма нет, и лог msmtp НЕ пишется
Понимаю, что что-то где-то не донастроено для функции mail(). Только вопрос что и где?
Обновлено: 23 апреля 2021
8324 просмотра
Если используется msmtp (установлен BitrixVM) и выводятся ошибки вида
<-- 550 5.7.0 Sender or From header address rejected: not owned by authorized user
Скорее всего bitrix отправляет письма, указывая отправителя в заголовке From, но msmtp их не может читать.
В таком случае можно использовать параметр —read-envelope-from.
Однако, в том же тесте системы, заголовок From не передается, как и в некоторых других ситуациях, тогда Битрикс не отправляет письма и выводит ошибки:
envelope from address extracted from mail: (null) loaded system configuration file /etc/msmtprc loaded user configuration file /home/bitrix/.msmtprc falling back to default account msmtp: account default from /home/bitrix/.msmtprc: envelope-from address is missing
Нашлось простое решение — скрипт, который смотрит, есть ли заголовок письма, если да, то запускает msmtp с параметром —read-envelope-from, иначе запускается стандартно.
Что бы избавиться от ошибки «not owned by authorized user» — создаем скрипт /usr/bin/bitrix_email.sh с содержимым:
#!/bin/bash export HOME=/home/bitrix [email protected] message_body="" while read line; do message_body="$message_body$linen" done < /dev/stdin if [[ $message_body == *"From:"* ]]; then echo -e "$message_body" | /usr/bin/msmtp --debug -t -i --read-envelope-from $args else echo -e "$message_body" | /usr/bin/msmtp --debug -t -i $args fi
Делаем скрипт запускаемым
chmod +x /usr/bin/bitrix_email.sh
Далее прописываем этот скрипт в /etc/php.d/bitrixenv.ini , если у вас bitrixVM или в ином в вашем случае
sendmail_path = /usr/bin/bitrix_email.sh
Перезапускаем php-fpm или httpd
service httpd restart
Всё, теперь при отправке почты отправитель будет браться из заголовков письма From:, если задан такой заголовок, иначе как раньше.
Буду рад, если эта статья поможет избавиться от ситуации, в которой Битрикс не отправляет письма.
Прежде чем приступить
Подключаемся к серверу по SSH и попадаем в меню Bitrix-окружения. Для начала нужно выйти из меню, набрав 0 для выхода.
Если в системе ранее был установлен sendmail, тогда его необходимо удалить:
# rpm -e --nodeps sendmail
Установка Postfix
# yum install postfix
Добавим postfix в автозагрузку
# chkconfig postfix on
Запустите postfix:
systemctl start postfix
теперь необходимо войти в консольное меню VMBitrix,
# /root/menu.sh
Выбираем п.6 и затем п. 4
6. Manage sites in the pool
4. Change email settings on site
Первым делом набираем название сайта из списка в консоли выше, к которому создаем файл настроек для отправки почты, к примеру baks.dev. В консоли появяться последовательно вопросы и в круглых скобках подсказки в кним с значениями по умолчанию. Если оставить поле не заполненым и нажать Enter, то в файл настроек запишуться те самые данные по умолчанию. Так как мы настраиваем отправку почты с помощью почтового сервера Postfix, то принимаем все занчения по умолчанию.
Enter site name (default) or 0 to exit: baks.dev
Затем потребует заполнит email, который будет использоваться по умолчанию, например noreply@baks.dev
Enter From email address (ex. bob@example.org): noreply@baks.dev
Указываем локальный адрес сервера 127.0.0.1 и порт 25, либо просто жмем Enter на двух следующих пунктах
Enter server address or DNS (127.0.0.1):
Enter server port (25):
Разрешаем отправку почты без авторизации, заполнив N и жмем Enter
Do you want to use SMTP authentication on 127.0.0.1:25? (N|y): N
также отключаем TLS , заполнив n и жмем Enter
Do you want to enable TLS for 127.0.0.1:25 (n|Y):n
Если ошибок не выявлено, тогда вы должны получить уведомление
Configure email for the site baks.dev
В результате будет создан файл /home/bitrix/.msmtprc, в котором будут указаны внесённые настройки:
# smtp account configuration for baks.dev
account white-sign.ru
logfile /home/bitrix/msmtp_baks.dev.log
host 127.0.0.1
port 25
from noreply@baks.dev
aliases /etc/aliases
keepbcc off
auth off
Перезапустим Postfix
systemctl restart postfix
На этом мы завершили настройку сервера отправки почты.
Проверьте работу спомощью командной стрки: переходим в панели администрирования в Настройки — Инструменты — Командная PHP-строка, втсавляем код и выполняем
if (mail("you_mail@gmail.com", "test subject", "test body" ,"From: test@bitrix.ru"))
echo "Сообщение передано функции mail, проверьте почту в ящике.";
else
echo "Функция mail не работает, свяжитесь с администрацией хостинга."
Если отправка не работает, и письма не приходят на почту?
1. Проверьте, пожалуйста, настройки почтового события заполнения формы и его шаблона.
Откройте Панель управления — Настройки — Настройки продукта — Почтовые события; выберите событие.
На первой закладке, должны стоять галочки возле используемых на Вашем сайте кодов языка. На закладке «шаблоны» должна стоять галочка возле имени Вашего сайта, хотя бы у одного шаблона (обычно он там как раз один). Также, в настройках выбранного почтового шаблона (можно перейти прямо по ссылке со страницы «шаблоны», не забудьте только перед этим нажать «применить», если были сделаны какие-то настройки), должна стоять галочка «активен», и также должен быть выбран Ваш сайт. Также должны быть корректно заполнены поля «от кого» и «кому» (значения по-умолчанию #DEFAULT_EMAIL_FROM# и #EMAIL#, соответственно).
2. Если все эти настройки соответствуют истине, то в настройках модуля веб-формы отключите флаг «использовать упрощенный режим», перейдите в настройки соответсвующей формы, вкладка дополнительно, убедитесь, что флаг привязки к почтовому шаблону проставлен. Если и здесь все в порядке, то перейдите, пожалуйста, в Настройки-Инструменты-SQL-запрос и выполните такой запрос:
select * from b_event where event_name like '%form%' order by date_insert desc
Найдите событие заполнения формы, смотрите в поле SUCCESS_EXEC:
стоит Y — письмо из продукта ушло, дальнейшую его судьбу попросите отследить администратора хостинга
стоит N — зайдите в файл /bitrix/php_interface/dbconn.php и проверьте не определены ли у Вас константы
BX_CRONTAB и BX_CRONTAB_SUPPORT, если да — убрать их определение вообще из этого файла. Если после этого SUCCESS_EXEC также N, то необходимо перейти в папку /bitrix/managed_cache/ и попытаться удалить содержимое (обязательно через модуль управления структурой, а не через FTP), если получите ошибку — значит необходимо исправить проблему с доступом продукта к папкам, чтобы Вы могли удалить файлы и папки из кеша.
стоит F — функция mail() по какой-то причине вернула False при отправке. Наиболее типичные проблемы: 1. Не настроена функция mail() на хостинге. Решается с хостером.
3. Почтовый сервер не поддерживает формат письма. Пробовать изменять настройки отправки, убирать поле ВСС, убирать галочку «Дублировать email адрес в заголовке», ставить «Конвертировать 8-битные заголовки». Не помогает — запросить логи у администратора почтового сервера, чтобы посмотреть, в чем конкретно ошибка при отправке.
Стоит 0 (ноль) — значит, что-то неверно в настройках из пп.1-2 — проверьте еще раз.
Приветствую читателей thisis-blog.ru!
В сегодняшней статье хочу рассказать об основных проблемах с почтой в CMS 1с-Битрикс.
Порой до адресата не доходят письма и нужно понять, а отправляются ли они вообще? А может они были отправлены, но возникли, какие-то другие ошибки. Так что же делать в таких ситуациях?
Проверить отправляются ли письма
Для проверки достаточно на любой страничке написать следующий php код:
$mail="[email protected]"; // ваша почта $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#».
Спасибо за внимание, также читайте статью про то, как Добавить поле в почтовый шаблон.
При установке чистого шаблона виртуальной машины Bitrix в набор предустановленного ПО не входит почтовый сервер. Это политика компании 1C Битрикс, а не хостинг-провайдера.
Чтобы настроить почту на сервер Bitrix, воспользуйтесь следующей инструкцией.
Мы рекомендуем сделать это через стороннее SMTP. Для этого ваш домен должен быть делегирован на Яндекс ПДД, Почту для домена Mail.ru или аналогичные сервисы.
1. Подключаемся к серверу по SSH и попадаем в меню Bitrix-окружения:
2. Переходим в пункты:
>> 6.Manage sites in the pool >> 4. Change email settings on site
Далее последовательно появятся вопросы (подсказки в скобках):
Enter From email address (ex. bob@example.org)
— ваша почта.
Enter server address or DNS (127.0.0.1):
— адрес почтового сервера. Для Яндекс — smtp.yandex.ru
3. Указание порта, способа авторизации и шифрования:
Enter server port (25): 587 Do you want to use SMTP authentication on smtp.yandex.ru:587? (N|y) Y Do you want to enable TLS for smtp.yandex.ru: 587 (n|Y)
5. В дальнейшем будет запрошен логин и пароль от почтового ящика, вводим их.
В результате будет создан файл /etc/msmtprc, в котором будут указаны внесённые настройки:
account default logfile /home/bitrix/msmtp_default.log host smtp.yandex.ru port 587 from bitrix@yoursite.ru keepbcc off auth on user bitrix@yoursite.ru password YourPAssWord tls on tls_certcheck off
После этого почта на сайте начнёт работать.
Второй способ — через почтовик на сервере. Но мы не рекомендуем его, потому что почта может попадать в спам или грейлистинг, а настройка своего почтового сервера сложна и занимает время.
1. Устанавливаем postfix:
yum install postfix && service postfix start
2. Через меню Битрикс вносим настройки:
host 127.0.0.1 port 25 from bitrix@yoursite.ru keepbcc off auth off
3. Cоздаем файл лога и выставляем на него права:
touch /home/bitrix/msmtp_default.log chown bitrix:bitrix /home/bitrix/msmtp_default.log
Пример письма, отправленного без ошибок:
Apr 28 16:06:53 host=127.0.0.1 tls=off auth=off from=bitrix@yoursite.ru recipients=f1rst-test@ya.ru mailsize=902 smtpstatus=250 smtpmsg='250 2.0.0 Ok: queued as 8DF4F11E1AE9' exitcode=EX_OK
Вносить изменения в настройки можно непосредственно в файл либо повторно пройти настройки через меню Битрикс.
Этот материал был полезен?
В сегодняшней статье хочу рассказать об основных проблемах с почтой в 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#».
Битрикс не отправляется почта или попадает в спам
Заказать сайт
Обратившись ко мне вы получите надежного и сведущего исполнителя, который быстро и качественно реализует любую задачу для Вас и Вашего бизнеса.
Тестируем отправку писем
Отправка тестового письма из консоли
echo "Test text" | mail -s "Test title" test@test.ru
Проверяем работу функции mail
из PHP
консоли Битрикс
if( mail("test@test.ru", "Subject", "Text") ){
echo 'Успешно отправлено!'; }
else{
echo 'Отправка не удалась!';
}
Проверяем работу сокетов
$fp = fsockopen("ssl://smtp.mail.ru", 465, $errno, $errstr, 30);
if (!$fp)
echo "Error: $errstr ($errno)n";
else
echo "Connected";
fclose ($fp)
Проверяем настройки Битрикс
Идем в Настройки > Настройки продукта > Почтовые и СМС события > Почтовые шаблоны
и просматриваем шаблоны. Убеждаемся, что в поле От кого
стоит #DEFAULT_EMAIL_FROM#
Идем в Настройки > Настройки продукта > Настройки модулей > Главный модуль > Почта и СМС
в поле Email администратора сайта (отправитель по умолчанию)
вписываем правильное значение почта отправителя
На всякий случай почту можно указать еще в поле E-Mail отдела продаж:
по пути Настройки > Настройки продукта > Настройки модулей > Интернет-магазин > Настройки
Email должен совпадать во всех перечисленных случаях, плюс в настройках msmtp должен быть указан именно он
msmtp config
для простой отправки через mail.ru
account default
logfile /home/bitrix/.msmtp.log
host mail.bitrixsoft.com
port 25
from user@email.com
auth off
msmtp config
для простой отправки через smtp
mail.ru
account default
logfile /home/bitrix/msmtp_default.log
host smtp.mail.ru
port 587
from no-reply@default.ru
keepbcc off
auth on
user no-reply@default.ru
password default
tls on
tls_starttls on
tls_certcheck off
msmtp config
для простой отправки через smtp
yandex.ru
account default
logfile /var/log/msmtp.log
host smtp.yandex.ru
port 587
from usr@yandex.ru
keepbcc on
auth on
user usr@yandex.ru
password PAss
tls on
tls_starttls on
msmtp config
для простой отправки через smtp
gmail.com
account default
tls on
tls_certcheck off
auth on
host smtp.gmail.com
port 587
user YOUR_EMAIL
from YOUR_EMAIL
password YOUR_PASSWORD
msmtp config
для простой отправки через smtp
timeweb.ru
# smtp account configuration for default
account default
logfile /home/bitrix/msmtp_default.log
host smtp.timeweb.ru
port 465
from YOUR_EMAIL
aliases /etc/aliases
keepbcc off
auth on
user YOUR_EMAIL
password YOUR_PASSWORD
tls on
tls_starttls off
tls_certcheck off
Получаем список писем
select * from b_event
where event_name like 'SALE_NEW_ORDER'
order by date_insert desc
Значения статусов отправки писем в колонке SUCCESS_EXEC
‘Y’ — означает успешная отправка;
‘N’ или 0 — письмо не отправлено;
‘F’ — ошибка
Скрипт отправки почты через phpMailer
Устанавливаем composer
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'e0012edf3e80b6978849f5eff0d4b4e4c79ff1609dd1e613307e16318854d24ae64f26d17af3ef0bf7cfb710ca74755a') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
Устанавливаем phpMailer
composer require phpmailer/phpmailer
Если команда composer
не найдена, то пытаемся установиться его глобально
curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer
Добавляем в init.php
require '/var/www/YOUR_SITE/vendor/autoload.php';
use BitrixMainApplication;
use PHPMailerPHPMailerPHPMailer;
use PHPMailerPHPMailerSMTP;
use PHPMailerPHPMailerException;
//Перехват генерации почтового события с возможностью его отмены
AddEventHandler("main", "OnBeforeEventAdd", array("OnBeforeEventAddClass", "OnBeforeEventAddHandler"));
class OnBeforeEventAddClass
{
function OnBeforeEventAddHandler(&$event, &$lid, &$arFields, &$message_id, &$files)
{
$connection = BitrixMainApplication::getConnection('default');//Получаем соединение с БД
//Получаем шаблон письма
$recordset = $connection->query("select SUBJECT, MESSAGE, MESSAGE_PHP from b_event_message where ACTIVE = 'Y' AND EVENT_NAME = '".$event."'")->fetchAll();
$fields = $arFields;
AddMessage2Log($arFields, "arFields");
if(isset($recordset[0]['MESSAGE'])){//Проверяем есть ли шаблон
$mask = $recordset[0]['MESSAGE'];
$subject = $recordset[0]['SUBJECT'];
foreach ($fields as $key => $value){
if(!is_array($value) && strpos($key, '~') === false){//Исключаем из замены массивы и символы ~
//Заменяем все возможные паттерны
$mask = preg_replace('~#'.$key.'#~', $value, $mask);
$subject = preg_replace('~#'.$key.'#~', $value, $subject);
}
}
$mask = preg_replace('~#SITE_NAME#~', COption::GetOptionString("main", "site_name", $GLOBALS["SERVER_NAME"]), $mask);
$mask = preg_replace('~#SERVER_NAME#~', COption::GetOptionString("main", "server_name", $GLOBALS["SERVER_NAME"]), $mask);
$mask = preg_replace('~#DEFAULT_EMAIL_FROM#~', COption::GetOptionString("main", "email_from", "admin@".$GLOBALS["SERVER_NAME"]), $mask);
$subject = preg_replace('~#SITE_NAME#~', COption::GetOptionString("main", "server_name", $GLOBALS["SERVER_NAME"]), $subject);
$subject = preg_replace('~#SERVER_NAME#~', COption::GetOptionString("main", "server_name", $GLOBALS["SERVER_NAME"]), $subject);
if($mask) {//Ести тело сформировано, то запускаем отправку
if(isset($fields['RS_USER_EMAIL'])){
if (filter_var($fields['RS_USER_EMAIL'], FILTER_VALIDATE_EMAIL)) {
$email = $fields['RS_USER_EMAIL'];
}
}
if(isset($fields['EMAIL'])){
if (filter_var($fields['EMAIL'], FILTER_VALIDATE_EMAIL)) {
$email = $fields['EMAIL'];
}
}
if(isset($fields['EMAIL_RAW'])){
if (filter_var($fields['EMAIL_RAW'], FILTER_VALIDATE_EMAIL)) {
$email = $fields['EMAIL_RAW'];
}
}
if(isset($fields['EMAIL_BUYER'])){
if (filter_var($fields['EMAIL_BUYER'], FILTER_VALIDATE_EMAIL)) {
$email = $fields['EMAIL_BUYER'];
}
}
if(isset($fields['EMAIL_TO'])){
if (filter_var($fields['EMAIL_TO'], FILTER_VALIDATE_EMAIL)) {
$email = $fields['EMAIL_TO'];
}
}
if(!$email){
$email = 'default@email.ru';
}
if($email && filter_var($email, FILTER_VALIDATE_EMAIL)){
$cl = new OnBeforeEventAddClass;
if($cl->custom_mail($email, $subject, $mask,'','')){//Отправляем письмо
//AddMessage2Log($event, "Сообщение было отправлено");
}else{
//AddMessage2Log($event, "Ошибка. Сообщение отправлено не было");
}
}else{
//AddMessage2Log($event, "Ошибка. Почта не найдена. Почта:");
}
return false;
}else{
//AddMessage2Log($event, "Ошибка. Нет тела письма");
}
}else{
//AddMessage2Log($event, "Ошибка. Не найден шаблон письма");
}
}
public function custom_mail($to, $subject, $message, $additionalHeaders = '', $additional_parameters)
{
// Instantiation and passing `true` enables exceptions
$mail = new PHPMailer(true);
$mail->IsSMTP(true); // enable SMTP
$mail->SMTPDebug = 3; // debugging: 1 = errors and messages, 2 = messages only
$mail->SMTPAuth = true; // authentication enabled
$mail->SMTPSecure = 'ssl'; // secure transfer enabled REQUIRED for GMail
$mail->Host = 'smtp.gmail.com';
$mail->Port = 465; // set the SMTP port for the GMAIL server
$mail->Username = 'email'; // SMTP username
$mail->Password = 'password'; // SMTP password
$mail->CharSet = 'UTF-8';
$mail->addAddress($to);
$mail->setFrom('default@email.ru');
//Set the subject line
$mail->Subject = $subject;
//Read an HTML message body from an external file, convert referenced images to embedded,
//convert HTML into a basic plain-text alternative body
$mail->msgHTML($message);
//Replace the plain text body with one created manually
$mail->AltBody = 'This is a plain-text message body';
$d_message='';
//preg_match('/From: (.+)n/i', $additionalHeaders, $matches);
//list(, $from) = $matches;
$from = 'admin@YOUR_SITE';
$d_message.='$from - '.$from.' +++ '; $d_message.='$to - '.$to.' +++ ';
$d_message.='$subject - '.$subject.' +++ ';
$d_message.='$message - '.$message.' +++ ';
$mail->setFrom($from);
$mail->addAddress($to, ''); // Add a recipient
//$mail->addReplyTo($from, '');
//$mail->AddBCC($from);
//$mail->addAttachment('/var/tmp/file.tar.gz'); // Add attachments
//$mail->addAttachment('/tmp/image.jpg', 'new.jpg'); // Optional name
$mail->Subject = $subject;
if($message != strip_tags($message)) {
$mail->isHTML(true);
}
$mail->Body = $message;
// $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
if(!$mail->send()) {
AddMessage2Log($mail->ErrorInfo, "Mailer Error");
return false;
} else {
return true;
}
}
}
//Перехват письма непосредственно перед отправкой
AddEventHandler('main', 'OnBeforeEventSend', Array("OnBeforeEventSendClass", "my_OnBeforeEventSend"));
class OnBeforeEventSendClass
{
function my_OnBeforeEventSend($arFields, $arTemplate)
{
//получим сообщение
}
}
Для отправки писем с помощью phpMailer
через smtp.mail.ru
конфиг должен быть следующего вида:
$mail = new PHPMailerPHPMailerPHPMailer(true);
$mail->IsSMTP(true); // enable SMTP
$mail->SMTPDebug = 1; // debugging: 1 = errors and messages, 2 = messages only
$mail->SMTPAuth = true; // authentication enabled
$mail->SMTPSecure = 'ssl'; // secure transfer enabled REQUIRED for GMail
$mail->Host = 'ssl://smtp.mail.ru';
$mail->Port = 465; // set the SMTP port for the GMAIL server
$mail->Username = 'USER_NAME'; // SMTP username
$mail->Password = 'USER_PASSWORD'; // SMTP password
Отладка через AddMessage2Log
В файле dbconn.php
добавьте строчку define("LOG_FILENAME", $_SERVER["DOCUMENT_ROOT"]."/log.txt");
cannot connect to localhost, port 25: Connection refused
После установки чистого битрикс окружения достаточно часто вижу эту ошибку. Чтобы исправить — используйте postfix
yum install postfix
service postfix start
chkconfig postfix on
the server sent an empty reply
в логе msmtp
Добавьте в конфиг
tls_starttls off
Борьба с ошибками
Если вы пытаетесь отправить почту через smtp
компании Google
и получаете ошибку вида SMTP connect() failed
, то зайдите в аккаунт гугл с которого отправляете почту. Откройте настройки, перейдите во вкладку Безопасность, найдите пункт «Ненадежные приложения, у которых есть доступ к аккаунту», перейдите в него и разрешите доступ небезопасным приложениям (ссылка)
Боремся с ошибкой Mail command not found
yum install sendmail
yum -y install mailx
service sendmail start
Перевод агентов на крон
Правим файл /bitrix/php_interface/dbconn.php
Иногда требуется закомментировать строки подключения поддержки крона
define('BX_CRONTAB', true);
define('BX_CRONTAB_SUPPORT', true);
Перейдите на страницу Настройки > Инструменты > Командная PHP-строка
и исполните следующий код:
COption::SetOptionString("main", "agents_use_crontab", "Y");
echo COption::GetOptionString("main", "agents_use_crontab", "N");
Откроем настройки крон
crontab -u bitrix -e или crontab -e
Добавим запись:
*/1 * * * * php -f /home/bitrix/www/bitrix/modules/main/tools/cron_events.php >/dev/null 2>&1
Перезагружаем cron
systemctl restart crond.service
Настройки cron хорошо описаны в документации
Более подробно можно изучить вопрос в официально документации:
- Настройка почты на VMBitrix
- Дополнительные настройки и отладка msmtp
Теги:
1С Битриксphp
Без обратной связи сайт словно паралитик: все видит, а сказать ничего не может. Не поступают данные с веб — форм, корпоративные ящики не работают совсем или настраиваются с удивительными ухищрениями. Деньги заплачены, а про-стей-шая, э-ле-мен-тар-ней-шая, важ-ней-шая рабочая задача не решена! Что делать?
Проверяем настройки почтового события веб-формы и связанные шаблоны
Давайте перейдем по пути Панель управления -> Настройки -> Настройки продукта -> Почтовые события и выберем событие.
1. На первой вкладке галочки кодов языка включены?
2. На вкладке «Шаблоны» галочка имени сайта включена?
3. Почтовый шаблон активен?
4. Поле «От кого» заполнено верно (по умолчанию #DEFAULT_EMAIL_FROM#) ?
5. Поле «Кому» заполнено верно (по умолчанию #EMAIL#) ?
Все верно? Смотрим дальше. В настройках модуля веб-формы отключите галочку «использовать упрощенный режим». Перейдите в настройки формы на вкладку «дополнительно» и проверьте, включен ли флаг привязки к почтовому шаблону. Готово?
Перейдите по адресу Настройки -> Инструменты -> SQL-запрос и выполните такой запрос:
select * from b_event where event_name like ‘%form%’ order by date_insert desc
Найдя событие выполнения формы, просмотрите поле SUCCESS_EXEC. Если видите «Y», то письмо из продукта ушло, и вам следует отправить запрос в техподдержку хостинга. Если видите «N», то перейдите в файл
/bitrix/php_interface/dbconn.php
и проверьте, определены ли 2 переменные: BX_CRONTAB и BX_CRONTAB_SUPPORT. Если да, то отмените определение.
Повторите SQL-запрос и снова просмотрите поле SUCCESS_EXEC. Если снова видите «N», очистите кэш в папке /bitrix/managed_cache/ через модуль управления структурой. Ни в коем случае ни через FTP! Если модуль выдаст ошибку, исправьте права доступа к папкам.
Если же значение «F», то функция mail() вернула значение False при отправке. Почему так бывает:
1. Не настроена функция mail() на хостинге. Обратитесь в техподдержку хостера.
2. Почтовый сервер не поддерживает формат письма. Попробуйте изменять настройки отправки, убирать поле ВСС, убирать галочку «Дублировать email адрес в заголовке», ставить «Конвертировать 8-битные заголовки». Если не поможет, запросите у администратора логи почтового сервера.
Наконец, если в поле «0», вернитесь к началу, настройкам почтовых событий, и проверьте заново.
Спасибо за внимание!
Читайте свежий выпуск «Кладовки программиста» каждый день!
Назад в раздел
В этой статье мы расскажем вам о том, где смотреть причины ошибки неотправленной почты в Битриксе. Рассмотрим три основных мест, откуда можно найти ошибку отправки писем.
Проверка таблицы очереди писем
Идем в административную панель Битрикса по пути: Настройки / Производительность / Таблицы. Ищем таблицу b_event и проваливаемся по ссылке.
Именно в эту таблицу попадают письма с сайта в очередь, а затем отправляются на хитах или на агентах.
На открывшейся странице можем отыскать сообщение, которое не отправилось. Проматываем в самый конец к колонке SUCCESS_EXEC – это колонка записывает состояние отправки письма.
Варианты статуса отправки (SUCCESS_EXEC):
Y – означает, что письмо было успешно отправлено
N – говорит о том, что событие еще не обработано и письмо не отправлено. В этом случае стоит полную проверку сайта и проверить настройки dbconn.php. Проверить корректность настройки почтовых шаблонов и их привязки к сайтам.
F – сообщение не было отправлено. Необходимо проверить логи сервера или хостинга.
0 – не активен или отсутствует почтовый шаблон (Настройки / Настройки продукта / Почтовые шаблоны)
Проверка системы
Проверка системы расположена на странице Настройки / Инструменты / Проверка системы. В проверке уже встроен инструмент, который проверяет возможность отправки письма с помощью стандартной PHP функции mail. Этаки быстрый проверяльщик работы почты.
Если здесь уже возникает ошибка, то проблему стоит идти смотреть в логи сервера.
Проверка логов сервера
Если ошибка ошибка идет глубже и у вас VM Bitrix, идем в консоль сервера по пути /home/bitrix/ и ищем логи с префиксом .msmtp_ (по умолчанию). Смотрим и ловим ошибки в этом файле. Логи лучше просматривать с помощью утилиты mc.
Сама конфигурация почтовых настроек расположена в файле /home/bitrix/.msmtrpc
Если письма в Битриксе отмечены как успешно отправленные, но письмо не пришло и в логах отсутствует какая-либо информация – следует обратить внимание на логи в /var/log/. Там отобразится ошибка, которая возвращается функцией mail.
Проверить возможность отправки также можно с помощью консольных команд (но в данном случае будет использоваться отправитель по умолчанию – default)
> php -a
> mail('test@example.com', "Test", "Test message");
> exit
Если произойдет ошибка при отправке, то сообщение будет у вас на экране.
Ошибки
Частая ошибка – это когда в письмах отправителем указан адрес отличимый от названия аккаунта (поле FROM). Поэтому задайте в настройках сайта нужный адрес или в почтовых шаблонах в поле «От кого». В этом случае, если требуется, чтобы человек мог ответить на другую почту, то можете указать электронную почту в качестве обратного адреса в почтовом шаблоне.
Другая ошибка – это отсутствие настроек для отправителя по умолчанию. Необходимо внести корректные настройки адреса отправителя (указать tsl, метод авторизации и т.п.)
На этом все, надеюсь статья была вам полезна. Если у вас возникнут вопросы, задавайте в комментарий.
Обновлено: 23 апреля 2021
8881 просмотр
Если используется msmtp (установлен BitrixVM) и выводятся ошибки вида
<-- 550 5.7.0 Sender or From header address rejected: not owned by authorized user
Скорее всего bitrix отправляет письма, указывая отправителя в заголовке From, но msmtp их не может читать.
В таком случае можно использовать параметр —read-envelope-from.
Однако, в том же тесте системы, заголовок From не передается, как и в некоторых других ситуациях, тогда Битрикс не отправляет письма и выводит ошибки:
envelope from address extracted from mail: (null) loaded system configuration file /etc/msmtprc loaded user configuration file /home/bitrix/.msmtprc falling back to default account msmtp: account default from /home/bitrix/.msmtprc: envelope-from address is missing
Нашлось простое решение — скрипт, который смотрит, есть ли заголовок письма, если да, то запускает msmtp с параметром —read-envelope-from, иначе запускается стандартно.
Что бы избавиться от ошибки «not owned by authorized user» — создаем скрипт /usr/bin/bitrix_email.sh с содержимым:
#!/bin/bash export HOME=/home/bitrix args=$@ message_body="" while read line; do message_body="$message_body$linen" done < /dev/stdin if [[ $message_body == *"From:"* ]]; then echo -e "$message_body" | /usr/bin/msmtp --debug -t -i --read-envelope-from $args else echo -e "$message_body" | /usr/bin/msmtp --debug -t -i $args fi
Делаем скрипт запускаемым
chmod +x /usr/bin/bitrix_email.sh
Далее прописываем этот скрипт в /etc/php.d/bitrixenv.ini , если у вас bitrixVM или в ином в вашем случае
sendmail_path = /usr/bin/bitrix_email.sh
Перезапускаем php-fpm или httpd
service httpd restart
Всё, теперь при отправке почты отправитель будет браться из заголовков письма From:, если задан такой заголовок, иначе как раньше.
Буду рад, если эта статья поможет избавиться от ситуации, в которой Битрикс не отправляет письма.
Проверка отправки почты из консоли линукс
echo «Testing» | mail -s «Test» johndoe@example.comс
Ошибка
-bash: mail: command not found
Если php почта не отправляется, устанавливаем комманду
yum install mailx
Проверяем дальше
echo «Testing» | mail -s «Test» johndoe@example.comс
Ошибка
/usr/sbin/sendmail: No such file or directory
«/root/dead.letter» 9/216
. . . message not sent.
Устанавливаем sendmail
yum install sendmail sendmail-cf -y
chkconfig —level 345 sendmail on
service sendmail start
Проверяем дальше
echo «Testing» | mail -s «Test» johndoe@example.comс
Ошибка пропала, письма приходят
Но вот не задача…
PHP Функция mail() не работает
Вопрос решился письмом в службу поддержки firstVDS сервера
У меня на сервере VDS установлено веб окрежение битрикс
Необходимо было в файле /etc/php.d/bitrixenv.ini
сменить параметр sendmail_path
;sendmail_path = msmtp -t -i
sendmail_path = /usr/sbin/sendmail -t -i
и все заработало!
PS: для работы curl потребуется еще одна настройка
копируем данные из /etc/php.d/20-curl.ini.disabled в 20-curl.ini
service httpd restart
В письме в поле кому числится получатель undisclosed-recipients
Чтобы отображался e-mail получателя, в настройках главного модуля 1С-Битрикс необходимо активировать пункт «Дублировать E-Mail адрес в заголовок» во вкладке «Почта»
Как проверить работу сокетов?
Выполните через командную PHP-строку следующий код:
$fp = fsockopen("ssl://smtp.mail.ru", 465, $errno, $errstr, 30); if (!$fp) { echo "Error: $errstr ($errno)n"; }else { echo "Connected"; } fclose ($fp);
Если в результате вы получили «Connected», значит все работает.
Если в результате вы получили «Error: (0)», значит у вас не настроена поддержка OpenSSL.
Как узнать актуальные настройки для подключения?
Настройки для Яндекс — https://yandex.ru/support/mail/mail-clients.html
Настройки для Mail.ru — https://help.mail.ru/mail-help/mailer/popsmtp
Настройки для Gmail.com — https://support.google.com/mail/answer/7126229?hl=ru
Не отправляются сообщения
- Проверьте наличие необходимого кода в файле /bitrix/php_interface/init.php или /local/php_interface/init.php, смотря какой именно вы используете. Также проверьте, чтобы не было другого вызова фукнции custom_mail().
- Проверьте правильность указанных настроек для почтового ящика.
- Включите модуль, если не включен.
- Отправьте тестовое письмо.
- Проверьте систему на наличие ошибок. Если настроено выполнение агентов на cron и он не срабатывает, то сообщения не будут отправлены до тех пор, пока не будет должным образом настроено выполнение файла cron_events.php.
Ошибка при проверке системы «Ошибка! Есть ошибки при отправке системных почтовых сообщений, число неотправленных сообщений: N»
Выполните через командную PHP-строку следующий код:
$result = CEvent::CheckEvents();
var_dump($result);
Если все ок, то должен выдать «string(0) «»» иначе может отобразить ошибку, которая мешает отправке сообщений.
У меня не происходит авторизация через Gmail, что делать?
Разрешите доступ небезопасным приложениям https://support.google.com/accounts/answer/6010255?hl=ru
Подойдет ли модуль для Email-маркетинга?
Наше решение полностью совместимо с модулем email-маркетинга и рассылок. Но по опыту, большую часть писем почтовый сервис помечает как спам и не отправляет получателю, если для отправки используются обычные почтовые ящики или корпоративная почта. Для массовых рассылок мы советуем использовать специализированные сервисы для рассылок, например SendPulse.
Кириллические домены для почты
Мы не рекомендуем использовать домены в зоне .рф для организации отправки почты через smtp с сайта.
Собственный сервер исходящей почты
Работа модуля гарантируется только с основными почтовыми сервисами: Яндекс, Gmail и Mail.ru. Если вы используете собственный сервер отправки, то внимательно указывайте данные для подключения.
Яндекс.Почта Пароль не был принят сервером как верный Ошибка авторизации (пароль верный)
Модуль не поддерживает XOAUTH2 авторизацию. Скорее всего, у вас включена авторизация через пароли приложений.
Отключить данную опцию можно на странице управления паролями https://passport.yandex.ru/profile/access
Не работает на Виртуальной машине BitrixVM
Не рекомендуется использовать модуль, если у вас Виртуальная машина BitrixVM. Для отправки почты через smtp, в BitrixVM присутствует соответствующая настройка https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=37&CHAPTER_ID=08853
На почту приходит html-код
В настройках главного модуля, вкладка «Почта и СМС», отключите опцию «Генерировать текстовую версию для html-писем»