Перейти к содержимому

Почта в веб-окружении - пункт меню, отправка, журнал

Разбираемся с почтой со стороны сервера: что делает пункт меню окружения, чем машина отдаёт письмо дальше и где смотреть ответ почтового сервера. Настройки самого сайта здесь не трогаем.

Решение

Настройка почты сайта

Открываем настройку почты нужного сайта:

Окно терминала
/root/menu.sh
# 8. Manage sites in the pool -> нужный сайт -> 4. e-mail
/opt/webdir/bin/bx-sites -a email # тот же шаг в обход интерактивного меню
# соседний пункт 3. cron переводит письма и агенты сайта на расписание

Меню спрашивает ящик, сервер, порт и пароль, после чего переписывает настройки отправки само. Почта задаётся отдельно для каждого сайта пула, а не одна на всю машину сразу.

Чем сервер отправляет письмо

Смотрим, через что уходит письмо:

Окно терминала
grep -rn 'sendmail_path' /etc/php.d/ /etc/php.ini
sed -n '1,15p' /home/bitrix/.msmtprc
# по блоку на каждый сайт: account, host, port, from, auth, tls
grep -c '^account' /home/bitrix/.msmtprc # сколько сайтов уже настроено

Своего почтового сервера в окружении нет: отправляющая программа только передаёт письмо тому ящику, который указан в её учётной записи. Отправка от имени самой машины требует полноценной почтовой службы и ставится отдельно.

Журнал отправки

Читаем журнал отправляющей программы:

Окно терминала
tail -20 /home/bitrix/msmtp_default.log
grep -c 'exitcode=EX_OK' /home/bitrix/msmtp_default.log # сколько принято
grep 'smtpstatus=' /home/bitrix/msmtp_default.log | tail -3 # отказы сервера
# у сайта пула свой файл вида msmtp_<имя сайта>.log рядом

Строка журнала называет узел, ящик отправителя, получателя и ответ почтового сервера дословно. Очереди на машине при этом нет: отклонённое письмо теряется сразу, и повторную попытку никто не делает.

Проверка отправки с консоли

Отправляем пробное письмо от пользователя сайта:

Окно терминала
# от пользователя сайта: его домашний каталог хранит учётные записи отправки
su - bitrix -c 'php -r "mail(\"check@example.com\", \"Test\", \"Test\");"'
echo 'test' | /usr/bin/msmtp --debug -t -i check@example.com
# ключ отладки печатает весь разговор с почтовым сервером построчно

Проверка из-под своей учётной записи не доказывает ничего: настройки отправки читаются из домашнего каталога того, кто запустил команду. Отсюда самая частая жалоба: с консоли письмо уходит, а из кода сайта нет.

Письма из заданий по расписанию

Смотрим задание сайта в планировщике:

Окно терминала
cat /etc/cron.d/bx_<имя базы сайта>
# php -d sendmail_path="msmtp -t -i -a <аккаунт>" -f .../cron_events.php
# ключ аккаунта выбирает учётную запись отправки именно этого сайта
grep -n 'MAILTO' /etc/cron.d/bx_* # пустое значение глушит письма планировщика

Задание задаёт способ отправки своим ключом запуска, поэтому письма с посещений сайта и письма по расписанию уходят разными путями. Служебные письма самого планировщика идут от системной учётной записи, и почтовый сервис их отклоняет.

После обновления окружения

Проверяем отправку после обновления пакетов:

Окно терминала
php -m | grep -i curl # часть почтовых шаблонов ходит через curl
grep -rn 'sendmail_path' /etc/php.d/ # настройка отправки после обновления
systemctl restart bx-php-fpm httpd # новые настройки PHP читаются при старте

Обновление возвращает сгенерированные файлы окружения к своему виду, а выключенные расширения PHP включают заново через меню. Ручная правка учётных записей отправки живёт до первого захода в пункт e-mail: меню перепишет файл целиком.

Типичные проблемы

С консоли письмо уходит, а с сайта нет.

Настройки отправки читаются из домашнего каталога того пользователя, от которого работает PHP. После правки файла перезапускают процессы PHP вместе с веб-сервером.

В журнале envelope from address bitrix not accepted.

Это служебные письма самого планировщика с системным адресом отправителя. Их глушат строкой MAILTO="" в начале файла задания.

Почтовый сервис отклоняет пароль ящика.

Публичные сервисы требуют отдельный пароль приложения и разрешение на отправку сторонней программой. Обычный пароль от веб-почты они не принимают даже при верном логине.

После перехода на новую версию окружения письма пропали.

Обновление сбросило включённые расширения PHP, а часть почтовых шаблонов обращается к curl. Расширение возвращают через меню и перезапускают процессы PHP.

Письма нет ни в ящике, ни в очереди сервера.

Отправляющая программа окружения очереди не держит и повторов не делает. Отказ виден только в её журнале, а очередь почтовой службы на такой машине пуста всегда.

Один сайт пула шлёт письма, второй молчит.

Учётная запись отправки заводится на каждый сайт отдельно, и у второго её просто нет. Настройку повторяют в разделе этого сайта тем же пунктом меню.

Частые вопросы

Как настроить отправку писем из BitrixVM?

Пунктом e-mail в разделе нужного сайта консольного меню: ящик, сервер, порт и пароль. Меню перепишет настройки отправки само, править файлы руками для этого не нужно.

Почему с консоли почта уходит, а из битрикса нет?

PHP на сайте работает от другого пользователя и читает настройки отправки из его домашнего каталога. Проверяют из-под пользователя сайта, а после правок перезапускают процессы PHP.

Можно ли отправлять письма прямо с сервера, без чужого ящика?

Штатная программа окружения умеет только передавать письмо указанному ящику, почтового сервера здесь нет. Отправку от имени машины поднимают отдельной службой, и такие письма чаще попадают в спам.

Куда смотреть, если письмо не дошло?

В журнал отправляющей программы в домашнем каталоге пользователя сайта. Он приводит ответ почтового сервера дословно, и по нему видно, приняли письмо или отклонили.

Почему письма приходят с задержкой в несколько минут?

Настройка окружения на это не влияет: задержку даёт очередь писем самого сайта. Её разбирает задание по расписанию, и до отправляющей программы письмо доходит не сразу.

Смежное

Первоисточник