Я опубликовал рабочий npm-пакет, не написав ни строчки кода. И не считаю, что это история про лень

от автора

В нашем корпоративном инбоксе на 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/