В нашем корпоративном инбоксе на Gmail в какой-то момент перестали появляться письма от одного конкретного клиента. Не падали в спам, не отбивались с понятной ошибкой — просто исчезали где-то между MX-серверами Google и нашим инбоксом. SPF/DKIM у клиента валидные, домен в whitelist, тикет в Google Workspace Support открыт.
При этом отправить нам архив каким-то другим способом клиент не мог: их compliance разрешал передачу материалов только через корпоративную почту. Никаких облаков, никаких мессенджеров, а то увольнение и объяснительная.
Эта статья про то, как из этого тупика за один вечер вырос npm-пакет mail2tg, который позволяет читать email в Telegram.
mail2tg — CLI-утилита, которая за одну команду настраивает приём почты на вашем домене и форвардинг писем (с вложениями) в Telegram. Никаких серверов, никакой подписки, всё на бесплатных Cloudflare Workers и Email Routing.
Часть 2: Cursor как личная операционная система
Я давно использую Cursor не просто как IDE, а как пространство для мышления. Когда у меня появляется задача техническая, стратегическая, бытовая — я открываю Cursor и начинаю с ним разговаривать. Не «напиши мне функцию», а «слушай, у меня такая ситуация, что вообще можно сделать?».
Метод резинового утенка. Только утка отвечает.
Я честно описал Cursor ситуацию: Gmail блокирует, поддержка молчит, клиент ничего изменить не может, проект стоит. Дальше был нормальный разговор минут на двадцать, в котором я отметал плохие идеи, а Cursor подкидывал новые: завести email на собственном домене (теплее, но кто потом будет читать?), поднять свой почтовый сервер (спасибо, я не настолько ненавижу себя, чтобы держать SMTP в 2026), использовать Cloudflare Email Routing (стоп, это что?).
Cloudflare Email Routing оказался бесплатным сервисом, который на любом вашем домене в Cloudflare позволяет принимать почту и роутить её куда угодно например, в Cloudflare Worker.
А Worker это маленький JavaScript на edge-сети, который может разобрать MIME, вытащить аттачи и отправить их в Telegram через Bot API.
Архитектура, которая родилась за десять минут:
Корп-почта клиента → MX-записи Cloudflare → Email Routing → Cloudflare Worker (парсит письмо и аттачи) → Telegram Bot API → ваш чат
Я регистрирую отдельный адрес archive@my-domain.com на своём домене. Клиент шлёт архив туда. Gmail вообще не участвует в цепочке. ML-классификаторы Google остаются с пустыми руками. Никаких серверов держать не надо: всё в пределах free tier Email Routing бесплатен, Workers дают 100 000 запросов в день (а это, на минуточку, 100 000 писем в день больше, чем получает любой нормальный человек за всю жизнь).
В этот момент у меня случился маленький момент эйфории.
Не от технологии от того, что разговор с AI вытащил меня из тупика, в котором настройки и тикеты в поддержку были бесполезны по определению.
Часть 3: Как я сделал npm-пакет, не написав ни строчки кода
После того, как мы проговорили архитектуру, у меня было два варианта: накидать одноразовое решение «для себя» или сделать CLI-утилиту, которой можно пользоваться повторно. Логика подсказывала первый. Но я знаю свой паттерн: «одноразовое решение» через два месяца обязательно понадобится опять, я забуду, как делал, и буду переоткрывать всё заново.
Поэтому я выбрал второй и поставил себе три условия:
-
сделать за один вечер (иначе брошу),
-
не писать код руками — только описывать задачу,
-
на выходе должен быть нормальный npm-пакет, не помойка.
Сразу честно: это не «магия одного промпта». Это нормальная инженерная работа, в которой у меня поменялась роль. Я сидел в Cursor, описывал систему словами, ловил баги по поведению, говорил «нет, тут переделай вот так». Сам не открывал файл и не правил строчку руками. Всё через диалог.
И вот это и есть, как мне кажется, реальная сторона того, что зовут «vibe coding»: ты не сидишь обезьянкой над клавиатурой, ты сидишь архитектором.
Ты решаешь, что должно быть. Cursor — как именно это написать. Ты проверяешь, если хватает знаний (чаще всего нет), а когда не хватает просишь другую модель сделать review.
В итоговом пакете 20 файлов и 51 KB:
-
TypeScript-исходник Worker (парсит MIME через
postal-mime, шлёт аттачи в Telegram). -
CLI с командами
init / plan / apply / doctor(повторение Terraform-стиля). -
Провайдеры Cloudflare и Telegram, конфиг через YAML с
zod-валидацией. -
Кросс-платформенность macOS / Linux / Windows — проверено реально, не «по фотографии».
-
--jsonи--non-interactiveфлаги — чтобы инструмент можно было гонять из CI и из других AI-агентов.
Заняло не больше часа. Ранее, я бы вообще не стал решать эту задачу, и, что важнее, она бы не превратилась в публичный пакет, потому что на «оформление» меня бы не хватило.
Часть 4: Что в итоге получилось (и чего оно не умеет)
Самое приятное в финальной архитектуре: после mail2tg apply на вашем компьютере не остаётся ничего. Worker живёт на edge-сети Cloudflare, MX-записи в DNS, секреты внутри Cloudflare. CLI можно удалить, терминал закрыть. Письма продолжат приходить в Telegram.
Что умеет:
-
Принимать письма на любой адрес
*@your-domain.com. -
Парсить MIME, включая сложные multipart-структуры.
-
Пересылать аттачи до 50 МБ в Telegram как документы (это потолок Telegram Bot API). В том числе запароленные архивы — Worker не пытается их открывать, просто пересылает байты.
-
Делать всё это бесплатно: Email Routing — бесплатно, Workers — 100K запросов/день бесплатно, Telegram Bot — бесплатно.
Что не умеет (честно):
-
Не отдаёт обратно ответы. Это односторонний канал. Если надо отвечать клиенту — отвечайте через основную почту, mail2tg не для этого.
-
Не делает антиспам. Если кто-то узнает ваш адрес и польёт спам — он будет долетать до Telegram. Решение: использовать неочевидное имя адреса.
-
Не шифрует содержимое end-to-end. Письмо проходит через Cloudflare как текст. (Хотя справедливости ради, обычная корпоративная почта — тоже не E2E.)
Зачем я это потом опубликовал на npm?
Решающий аргумент простой: если эта проблема возникла у меня — она есть у кого-то ещё.
Заключение: Cursor — это не про код, это про мышление
Когда говорят «AI-помощник для разработчиков», большинство представляют автокомплит на стероидах. Это, конечно, тоже полезно, но это очень маленькая часть реальной ценности.
Реальная ценность Cursor для меня в том, что он перевёл рабочее мышление из формата «один человек думает в голове» в формат «два собеседника думают в чате». Когда у меня была проблема с Gmail, я ходил с ней в голове в формате «надо что-то с этим делать». Один. Когда я сел и начал её проговаривать с Cursor за полчаса родилась архитектура, которой я бы сам не придумал.
И ещё одно. Я не написал ни строчки кода в этом проекте и не буду делать вид, что я перечитал каждый сгенерированный файл, как старательный код-ревьюер. Я этого не делал.
Что я делал держал в голове архитектуру (что куда идёт и зачем) и проверял систему по результату: запускал plan, смотрел, какие изменения в DNS/Worker инструмент собирается сделать; запускал apply и смотрел, что Cloudflare-консоль показывает то, что я ожидал; запускал doctor и ждал реальное письмо в Telegram. Это, в общем, то же самое, что я делал бы с библиотекой, которую написал не я.
И вот тут, мне кажется, проходит граница между «vibe coding» и карго-культом из vibe coding. Не в том, прочитал ли ты каждую строчку, а в том, знаешь ли ты, как проверить, что система работает не случайно.
Если у вас нет таких чекпоинтов у вас не проект, а тыква, которая выглядит как карета до полуночи.
Если вам нужно именно это
Если у вас прямо сейчас Gmail режет важную почту, и compliance клиента не даёт обходных каналов — попробуйте mail2tg:
npm install -g mail2tgmail2tg initmail2tg planmail2tg applymail2tg doctor
Нужно: домен на Cloudflare, Cloudflare API token, Telegram-бот через @BotFather. Подробнее в README на npm и в репозитории на GitHub.
Если у вас есть «тупиковая» рабочая задача, в которой вы застряли — попробуйте сесть и проговорить её с AI. Не «реши за меня», а «помоги мне подумать». Иногда из этого получается решение. Иногда — npm-пакет. Иногда обе сразу за один вечер.
P. S. Понимаю, что мой опыт подойдёт не всем, и не претендую на истину в последней инстанции. Возможно, у вас с Gmail всё работает, и у клиента нормальный compliance. В таком случае искренне за вас рад.
ссылка на оригинал статьи https://habr.com/ru/articles/1033516/