Отладка отправки почты на окружении BitrixEnv 7.5.5 с помощью MailCatcher
Практически у каждого разработчика на Битрикс при переходе с уровня "сайт из 5 страничек" на уровень "крупный проект с 10к+ пользователями" возникает потребность производить отладку отправки почты, но при этом чтобы фактически пользователи эту почту не получали. Так как случайная отправка отладочного сообщения пользователям сайта из 5 страничек, которых обычно 5-6 человек, как правило ощутимых репутационных издержек не несет, что нельзя сказать о крупном проекте с большой пользовательской базой. Когда задачи не связаны с почтовой подсистемой, многие разработчики просто отключают отправку исходящей почты на своем dev окружении, также как то давно я выходил из этой ситуации переконфигурированием почтового сервера для безусловной отправки всех писем на определенный ящик. Не совсем удобное, даже "костыльное" решение на мой взгляд, так как в приходящих сообщениях получаем измененный заголовок получателя и проверить правильность в полной мере по сути невозможно, только с точки зрения контента отправляемого письма.
Недавно я начал искать, какие решения есть сейчас для отладки отправки почты без ее фактической отправки, при этом решение должно ставиться локально на сервер, так как большинство проектов у меня связаны с разработкой порталов на Битрикс24 Энтерпрайз, поэтому за использование внешних сервисов можно получить очень большой "нагоняй" от службы ИБ заказчиков. Если же вам больше подходит онлайн-сервис, который не нужно как-то устанавливать, а просто прописать в настройках msmtp окружения - можете посмотреть в сторону DebugMail, MailSlurp, TestMail. Их "гуглится" масса, можно выбрать на свой вкус, по функционалу, цене, длине шерсти и хвоста :) Единственный недостаток - сервисы в большинстве иностранные, поэтому платную версию из России будет купить проблематично.
Я же искал приложение, которое можно установить прямо на локальный сервер или компьютер. И после непродолжительных поисков нашел довольно интересный и устраивающий меня вариант - MailCatcher. Решение OpenSource (MIT Licence), соответственно с трансграничными оплатами заморачиваться не нужно, представляет из себя простой эмулятор SMTP сервера с web GUI, где письма отображаются. Написан на Ruby.
Подробно останавливаться на функционале приложения не буду - это прекрасно сделал на Хабре еще в 2014 году камрад @kriptomen в переведенной статье Отладка электронной почты при помощи MailCatcher. Я же подробно разберу процесс установки этого решения на типовом окружении BitrixEnv с точки зрения не Ruby разработчика :)
Установка и настройка MailCatcher на окружении BitrixEnv 7.5.5 операционной системы CentOS 7 X64
P.S. кто не любит читать вступления и прочую "воду" - статья "по существу" начинается отсюда :)
Для начала давайте условимся, что у нас уже есть сервер с установленным окружением BitrixEnv 7.5.5 (актуальная стабильная версия на момент написания статьи). Подробно установку окружения Битрикс на сервер в рамках статьи разбирать не будем - на эту тему есть много материалов в том числе от компании-разработчика Битрикс. Также сервер имеет доступ в Интернет, виден с нашего ПК в браузере и через ssh. IP адрес сервера для примера будет 10.0.0.1.
Итак, заходим по SSH с правами root на сервер где у нас установлено окружение, закрываем стандартное меню окружения "Manage server pool" для перехода в командную строку - либо нажимаем Ctrl+C либо 0 затем Enter.
Устанавливаем необходимые для сборки системные библиотеки, репозиторий и Ruby версии 3
yum update
yum install -y gcc gcc-c++ sqlite-devel centos-release-scl-rh centos-release-scl
yum --enablerepo=centos-sclo-rh install -y rh-ruby30 rh-ruby30-ruby-devel
Нужно на момент написания статьи устанавливать именно 3 версию Ruby, на версиях ниже MailCatcher собираться отказывается.
Активируем Ruby для командной строки bash
scl enable rh-ruby30 bash
Это активирует ruby только на время текущего сеанса пользователя. Если для каких-то целей ruby в командной строке нужен постоянно, необходимо прописать команду в скриптах инициализации сеанса (например .bashrc):
source scl_source enable rh-ruby30
Собираем MailCatcher
gem install mailcatcher
Начнется довольно небыстрый процесс загрузки всех необходимых зависимостей и их сборки. У меня заняло примерно 5 минут. Обязательно нужно дождаться окончания данного процесса.
Разрешаем порт MailCatcher в iptables
Встроенный в окружение iptables будет по умолчанию блокировать порт приложения при попытке подключиться из браузера. Для этого вводим следующие правила:
iptables -I INPUT -p tcp -m tcp --sport 1080 -j ACCEPT
iptables -I INPUT -p tcp -m tcp --dport 1080 -j ACCEPT
service iptables save
Данные правила актуальны если вы запускаете GUI MailCatcher на порту 1080. Если же собираетесь для этих целей использовать другой порт - в командах выше указываете его.
Прописываем MailCatcher как SMTP сервер для сайтов окружения
Сделать это можно как через меню окружения (под админом выполнить cd ~
и далее ./menu.sh
), выбрав пункт 6. Configure pool sites
далее 4. Change a site's email settings
, указываем название сайта для которого хотим прописать настройки, после чего вводим:
Enter From email address (ex. bob@example.org):test@test.ru
Вводим адрес который будет проставляться в заголовок from. В нашем случае можно ввести любое значение.
Enter server address or DNS (127.0.0.1):10.0.0.1
Вводим адрес сервера с BitrixEnv.
Enter server port (25):1025
Здесь указываем SMTP порт на который будем вешать SMTP эмулятор MailCatcher. По умолчанию - 1025.
Do you want to use SMTP authentication on 127.0.0.1:1025? (N|y) N
Авторизация по SMTP не нужна
Do you want to enable TLS for 127.0.0.1:1025 (n|Y):n
Шифрование тоже не нужно. После этого Битрикс будет отправлять всю исходящую почту для указанного сайта на порт эмулятора SMTP mailCatcher. Если нужно прописать настройки для всех сайтов, то в меню окружения выбираем сайт default, либо можно "руками" создать под пользователем bitrix файл /home/bitrix/.msmtprc
и положить туда следующий текст настроек:
account default
logfile /home/bitrix/msmtp.log
host 10.0.0.1
port 1025
from test@test.ru
keepbcc on
auth off
Запускаем MailCatcher
Для запуска mailcatcher в виде фоновой службы (демона) достаточно выполнить следующую команду:
mailcatcher --ip 10.0.0.1 --no-quit --messages-limit 10000
Если все запустилось корректно - в команднйо строке отобразятся адреса и порты эмулятора SMTP сервера и адрес для входа в веб-интерфейс браузера.
Также я указал дополнительные команды по своему конкретному "вкусу", а именно:
--no-quit
- скрывает кнопку Quit из веб-интерфейса, при нажатии которой Mailcatcher полностью останавливается. В моем случае приложение стоит на сервере где тестировщики проверяют корректность выполнения задач разработчиками, и очень часто по незнанию нажимали кнопку Quit думая что это обычная "разавторизация". В итоге после каждого такого случая демона приходилось перезапускать вручную, что не удобно. Вы для себя уже сами решайте нужна вам эта функция или нет.
--messages-limit 10000
- устанавливает максимальное количество сообщений которое хранит MailCatcher. На мой взгляд для теста 10000 сообщений вполне достаточно. Вы уже для своей ситуации решайте сами. Логика работы настройки - если писем становится больше 10000 - старые письма удаляются из списка.
Все доступные настройки запуска можно посмотреть выполнив команду:
mailcatcher --help
Проверяем все ли установилось корректно
Для начала проверяем корректность работы msmtp:
echo -e "test message" | /usr/bin/msmtp --debug -t -i name@site.ru
В ответ на эту команду в терминале не должно быть ошибок. Если они есть, то как правило связаны с некорректными правами на файл конфигурации .msmtprc и файл журнала, указанный в файле конфигурации в параметре logfile.
Далее для финальной проверки зайдите через браузер в административную часть Битрикс, установленного в окружении, далее перейдите в раздел "Проверка системы" и запустите проверку. Напротив пунктов "Отправка почтового сообщения" и "Отправка сообщения больше 64 Кб" должна отразиться зеленая строка "Успешно".
Далее тестовые письма должны отобразиться в интерфейсе MailCatcher:
Можно посмотреть как текст письма в виде HTML либо PlainText, так и исходники с заголовками, что очень удобно при отладке. В правом верхнем углу есть строка поиска по письмам и кнопка Clear - очищающая список писем.
Таким образом, мы интегрировали отладчик почты MailCatcher в стандартное окружение Битрикс - BitrixEnv. Всем спасибо за внимание!