Отладка отправки почты на окружении BitrixEnv 7.5.5 с помощью MailCatcher
Картинка для привлечения внимания ;)
Практически у каждого разработчика на Битрикс при переходе с уровня «сайт из 5 страничек» на уровень «крупный проект с 10к+ пользователями» возникает потребность производить отладку отправки почты, но при этом чтобы фактически пользователи эту почту не получали. Так как случайная отправка отладочного сообщения пользователям сайта из 5 страничек, которых обычно 5–6 человек, как правило ощутимых репутационных издержек не несет, что нельзя сказать о крупном проекте с большой пользовательской базой. Когда задачи не связаны с почтовой подсистемой, многие разработчики просто отключают отправку исходящей почты на своем dev окружении, также как то давно я выходил из этой ситуации переконфигурированием почтового сервера для безусловной отправки всех писем на определенный ящик. Не совсем удобное, даже «костыльное» решение на мой взгляд, так как в приходящих сообщениях получаем измененный заголовок получателя и проверить правильность в полной мере по сути невозможно, только с точки зрения контента отправляемого письма.
Недавно я начал искать, какие решения есть сейчас для отладки отправки почты без ее фактической отправки, при этом решение должно ставиться локально на сервер, так как большинство проектов у меня связаны с разработкой порталов на Битрикс24 Энтерпрайз, поэтому за использование внешних сервисов можно получить очень большой «нагоняй» от службы ИБ заказчиков. Если же вам больше подходит онлайн-сервис, который не нужно как-то устанавливать, а просто прописать в настройках msmtp окружения — можете посмотреть в сторону DebugMail, MailSlurp, TestMail. Их «гуглится» масса, можно выбрать на свой вкус, по функционалу, цене, длине шерсти и хвоста :) Единственный недостаток — сервисы в большинстве иностранные, поэтому платную версию из России будет купить проблематично.
Я же искал приложение, которое можно установить прямо на локальный сервер или компьютер. И после непродолжительных поисков нашел довольно интересный и устраивающий меня вариант — MailCatcher. Решение OpenSource (MIT Licence), соответственно с трансграничными оплатами заморачиваться не нужно, представляет из себя простой эмулятор SMTP сервера с web GUI, где письма отображаются. Написан на Ruby.
Логотип MailCatcher
Подробно останавливаться на функционале приложения не буду — это прекрасно сделал на Хабре еще в 2014 году камрад @kriptomen в переведенной статье Отладка электронной почты при помощи MailCatcher. Я же подробно разберу процесс установки этого решения на типовом окружении BitrixEnv с точки зрения не Ruby разработчика :)
Веб-GUI приложения
Установка и настройка MailCatcher на окружении BitrixEnv 7.5.5 операционной системы CentOS 7×64
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-ruby26
Собираем 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
Для запуска mailcather в виде фоновой службы (демона) достаточно выполнить следующую команду:
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:
Отправленные тестовые письма из Битрикс в MailCatcher
Можно посмотреть как текст письма в виде HTML либо PlainText, так и исходники с заголовками, что очень удобно при отладке. В правом верхнем углу есть строка поиска по письмам и кнопка Clear — очищающая список писем.
Таким образом, мы интегрировали отладчик почты MailCatcher в стандартное окружение Битрикс — BitrixEnv. Всем спасибо за внимание!