Почта внутри трекера: как мы встроили полноценный email-клиент в свою систему управления проектами
У агентства переписка с клиентами живёт в десятке мест: общий ящик info@ на одном сервисе, личные ящики менеджеров - на другом, а задачи по этим же клиентам - в трекере. В итоге письмо обсуждается в одном окне, работа ведётся в другом, и связь между ними держится только в голове у сотрудника. Мы решили закрыть этот разрыв и встроили полноценный почтовый клиент прямо в наш трекер проектов. В этом кейсе разбираем, как устроена почта на своём домене без платных сервисов и без своего почтового сервера, и какие инженерные решения за этим стоят.
Задача: почта и работа в одном окне
Мы развиваем собственный трекер - систему управления проектами, задачами и временем. В нём уже живут проекты, канбан, тайм-трекинг, вики и чаты. Не хватало одного: переписки с клиентами. Цель была конкретная:
Свои адреса на домене webcetera.ru для команды - без аренды корпоративной почты у внешних сервисов.
Вся переписка - внутри трекера: читать, отвечать, пересылать письма, не выходя из системы.
Личные и общие ящики: общий info@ видят все, личный ящик сотрудника - только он и администратор.
Без своего почтового сервера: не хотелось брать на себя эксплуатацию MTA, антиспама, прогрева IP и борьбы за доставляемость.
Архитектура: приём - сами, отправка - через облако
Ключевое решение кейса - разделить приём и отправку. Это позволило обойтись без своего почтового сервера и без платы за корпоративную почту, сохранив контроль над данными.
Приём писем берёт на себя отдельный модуль внутри нашего бэкенда: лёгкий SMTP-сервер на Node.js слушает 25-й порт, принимает входящие, проверяет подписи SPF/DKIM/DMARC, парсит письмо, складывает вложения в объектное хранилище, а текст и метаданные - в базу.
Отправку делает Yandex Cloud Postbox - облачный сервис рассылки, совместимый с протоколом Amazon SES. Письма уходят с инфраструктуры с хорошей репутацией и автоматической DKIM-подписью. Первые 2000 писем в месяц бесплатны - для деловой переписки этого с запасом.
Почему так. Главная боль собственного почтового сервера - не поднять его, а эксплуатировать: репутация IP, прогрев домена, антиспам, попадание в чёрные списки после одной жалобы. Отдавая исходящую почту облаку с готовой репутацией, мы убираем весь этот пласт рисков. А приём - операция простая и предсказуемая, её спокойно держит свой модуль, тесно интегрированный с трекером.
Письма собираются в цепочки
Почта в трекере работает тредами, как в современных почтовых клиентах. Несколько связанных писем - обращение клиента и ответы на него - автоматически собираются в одну цепочку. Связка идёт по стандартным заголовкам ответов (In-Reply-To и References), поэтому переписка не рассыпается на отдельные сообщения, а читается единой лентой.
Внутри открытой переписки видно всю историю: входящие и исходящие письма по порядку, отправителя и получателей, дату, вложения. Снизу - поле быстрого ответа. У каждого письма есть действия «Переслать» и «Удалить».
HTML-письма - безопасно
Клиенты присылают не только текст, но и свёрстанные письма: коммерческие предложения, баннеры, таблицы со сметами. Такие письма мы рендерим в изолированном окне (sandbox-iframe) без права исполнять скрипты. Это значит, что чужой HTML отображается корректно - с картинками, таблицами и кнопками - но не сможет добраться ни до куки, ни до интерфейса трекера. Безопасность без потери внешнего вида письма.
Полноценный почтовый интерфейс
Раздел «Почта» получился привычным и закрывает повседневные сценарии работы:
Папки: Входящие, Отправленные, Черновики, Корзина. Переключение мгновенно фильтрует список.
Композер открывается прямо в рабочей зоне (не модальным окном): выбор ящика-отправителя, поля «Кому» и «Копия», тема, текст, прикрепление файлов.
Поле «Копия» (CC) для отправки нескольких адресатам, как в обычной почте.
Удаление с подтверждением: письмо или вся цепочка уезжают в Корзину через модальное окно, из Корзины можно восстановить или удалить навсегда.
Черновики, которые не теряются
Отдельно проработали черновики - то, чего часто не хватает даже в зрелых системах. Пока пользователь печатает письмо, оно тихо сохраняется в «Черновики» автоматически. Если закрыть вкладку или перезагрузить страницу, недописанное письмо никуда не денется: открываешь черновик - и продолжаешь с того же места, со всеми полями и вложениями. Состояние раздела (открытая папка, выбранный ящик, открытое письмо или черновик) хранится в адресе страницы, поэтому переживает перезагрузку.
Управление ящиками и привязка к сотрудникам
Администратор заводит ящики в отдельном разделе и привязывает их к сотрудникам. Тип ящика определяет видимость:
Общий ящик (например, info@) видят все сотрудники.
Личный ящик привязан к конкретному пользователю - его видит только владелец и администратор.
Приём настроен по принципу catch-all: письмо на любой адрес домена не теряется. Если адреса-ящика ещё нет, он заводится автоматически - потом администратор привяжет его к нужному сотруднику, и вся накопившаяся переписка окажется на месте. Это особенно важно при переезде со старой почты: ни одно письмо не пропадает в момент переключения.
Гибкая навигация и доставляемость
Автодополнение получателей: в поле «Кому» подсказываются адреса из истории переписки - с кем уже общались.
Авто-обновление списка: новые письма появляются сами, без ручного обновления страницы.
Настройка меню под себя: каждый сотрудник прячет лишние пункты боковой панели - у разных ролей разный набор разделов.
DKIM и DMARC настроены на домене, поэтому исходящие письма проходят проверки и не улетают в спам.
Стек и инженерные решения
Почта - модуль внутри монорепозитория трекера, поэтому код, база и интерфейс едины, а письма нативно связываются с проектами и сотрудниками.
Бэкенд: NestJS, PostgreSQL, TypeORM. Приём - отдельный процесс с SMTP-сервером и парсером писем; вложения в объектном S3-хранилище.
Отправка: Yandex Cloud Postbox по SES-совместимому API, с собственными Message-ID для склейки тредов.
Фронтенд: Nuxt 3 с серверным рендерингом (SSR) - раздел почты и открытое письмо приходят уже готовыми с сервера, без «моргания» и догрузки после открытия страницы.
Состояние в URL: папка, ящик и открытое письмо зашиты в адрес - ссылку на конкретную переписку можно сохранить, а перезагрузка возвращает ровно туда, где был.
Отдельно повозились с серверным рендерингом авторизованных данных и согласованием дат между сервером и браузером - это классические подводные камни SSR, которые мы закрыли, чтобы интерфейс открывался мгновенно и без ошибок гидратации.
Результат
Отдельно стоит сказать про сроки. Вся разработка - от идеи до рабочего продукта на тестовом контуре - заняла два дня. Это показатель того, насколько быстро сегодня собираются такие вещи, если есть готовая архитектура, своя инфраструктура и опыт: не месяцы, а считанные дни от задумки до работающего почтового клиента внутри системы.
Почта на своём домене для команды - без аренды корпоративной почты и без своего почтового сервера.
Вся переписка с клиентами - внутри трекера, рядом с задачами и проектами.
Ноль платы за пользователей: приём - свой модуль, отправка - в пределах бесплатного лимита облака.
Контроль над данными: письма и вложения хранятся в нашей инфраструктуре.
Это типичный для нас подход: вместо набора разрозненных сервисов - единая система, где всё связано. Так же мы делаем веб-системы и автоматизацию под задачи бизнеса - от CRM и личных кабинетов до интеграций, которые экономят команде часы рутины.
Частые вопросы
Нужен ли свой почтовый сервер, чтобы сделать так же?
Нет. Приём писем закрывает компактный SMTP-модуль внутри приложения, а отправку - облачный сервис рассылки с готовой репутацией. Это снимает главную головную боль почтового сервера - доставляемость и эксплуатацию.
Письма не будут попадать в спам?
Исходящие подписываются DKIM и проходят DMARC, а отправка идёт с инфраструктуры облачного сервиса с хорошей репутацией IP. Это и есть рецепт нормальной доставляемости.
Можно ли подключить такой ящик к обычному почтовому клиенту на компьютере?
Отправку - да, через SMTP облачного сервиса. Чтение всей переписки удобнее держать в трекере, где письма связаны с задачами и клиентами. При необходимости можно добавить и полноценный доступ по IMAP - это вопрос отдельного слоя.
Сколько стоит такая разработка?
Зависит от объёма: базовый приём-отправка с тредами - это одна история, полный почтовый клиент с папками, черновиками, вложениями и управлением ящиками - другая. Оценку даём после короткой аналитики ваших сценариев.
Нужна похожая система - почта, CRM, личный кабинет или интеграция, встроенные в единый продукт? Обсудим задачу и предложим решение: разработка веб-систем и автоматизация.