fast-mailer: как вынос модели из шага отправки сократил письмо до секунд
fast-mailer позволяет AI-агенту отправлять письма Gmail одной командой вместо управления почтовым интерфейсом. Как это работает, что я проверил в коде и где пределы инструмента первого дня.

ИСТОРИЯ СБОРКИ · ИНСТРУМЕНТЫ ДЛЯ АГЕНТОВ
Агент, которому нужно от одной до четырёх минут на одно письмо, не думает изо всех сил. Он ждёт: пока загрузится браузер, пока появится кнопка, пока наступит его следующий ход. Автор fast-mailer, небольшого open-source репозитория, опубликованного 24 сентября 2026 года, говорит, что у друга была именно такая проблема. Решением стала не более умная модель. Он убрал модель из той части работы, где она никогда не была нужна.
Коротко
- fast-mailer - репозиторий под лицензией MIT: любой агент, который умеет запускать команду в терминале, отправляет письмо через Gmail одним вызовом:
python send.py to subject body. GitHub - По словам автора, агент друга перешёл с 1-4 минут на письмо примерно к 14 секундам. README оценивает сам вызов отправки примерно в 0,6-1 секунды. Остальное - собственный ход агента.
- Это версия 1.0.0 первого дня, без тестов. Она запрашивает у Gmail больше прав, чем нужно для отправки, и я нашёл одну проверку ввода, которую стоит добавить, прежде чем подавать в неё недоверенный текст.
БЫСТРЫЙ ОТВЕТ
Почему это быстро
Агент пишет письмо и передаёт его дальше. Обычный скрипт собирает сообщение и отправляет его прямо в Gmail API. Ни браузера, ни запуска дополнительного сервера инструментов, ни вызова модели между «отправить» и «отправлено».
Что сообщается
Этот раздел основан на публичном репозитории в состоянии на 24 сентября 2026 года (4 коммита, 0 звёзд, лицензия MIT) и на рассказе автора о том, зачем он его сделал. Я прочитал весь код. Цифры скорости - от автора и из README; настоящих писем я не отправлял.
Проблема: агент делает работу скрипта
Многие агентные системы отправляют почту так, как это сделал бы человек: открыть Gmail в браузере, нажать «Написать», ввести текст, нажать «Отправить». Каждый шаг - это круг через модель, которая смотрит на страницу и решает, что делать дальше. Файл навыка в самом репозитории ставит путь через браузер на последнее место и помечает его «minutes - last resort only» («минуты - только в крайнем случае»). Автор не описал, как именно агент друга отправлял письма раньше, поэтому браузер - вероятная причина, а не подтверждённая.
Что лежит в репозитории
| Часть | Что делает |
|---|---|
send.py | Только стандартная библиотека Python. Собирает MIME-сообщение, обновляет OAuth-токен в памяти, отправляет запрос на эндпоинт отправки Gmail и печатает JSON с ID письма и затраченным временем. |
Папка triggers/ | Положите по одному файлу .txt или .json на письмо и запустите python send.py watch --once. Отправленные файлы переезжают в triggers/sent/, неудачные получают суффикс .failed. |
cli/gmaild.mjs | Необязательный демон на Node 18+ на 127.0.0.1: держит тёплое TLS-соединение с Gmail и обновляет токен каждые 5 минут. |
cli/auth-server.js | Одноразовый вход через Google, сохраняет refresh-токен в secrets/. |
skills/fast-mailer/SKILL.md, AGENTS.md | Инструкции для Claude Code, Cursor, ZCode и похожих инструментов: какую команду запускать. Плюс обёртка-плагин для ZCode. |
Откуда берутся 14 секунд
Сам вызов отправки короткий. Сердце send.py - один HTTPS POST с сообщением в base64 на gmail.googleapis.com/gmail/v1/users/me/messages/send, эндпоинт, который Google документирует именно для этого. README оценивает его в 0,6-1 секунды «с холода» и примерно в 0,5 секунды с демоном.
Куда уходят остальные ~13 секунд? Это моя трактовка, а не измерение: агенту всё равно нужно прочитать запрос, написать команду, дождаться результата и ответить. Это один ход модели вместо десятков. Файл навыка даже велит отвечать «только message_id + ms. Без повествования», и это сокращает последний шаг.
Ускорение не в более быстрой отправке, а в меньшем числе ходов модели между просьбой и результатом.
Что я проверил в коде
Я запустил send.py офлайн в песочнице с фиктивными учётными данными и подменённым сетевым вызовом, так что ничего не отправилось. Сборка сообщения заняла около 1,4 мс. Заявления README о безопасности подтвердились в тех путях, которые я проверил:
- Разрешены только два хоста:
oauth2.googleapis.comиgmail.googleapis.com. Запрос на любой другой URL отклоняется. - Имена файлов в triggers должны соответствовать строгому шаблону.
../x.txt, имена с пробелами и скрытые файлы были отклонены. - Перед каждым запросом хост резолвится и блокируется, если указывает на частный или локальный адрес. Редиректов не больше 2.
- Python-отправитель никогда не пишет в файл токена. Демон записывает обновлённые токены с правами файла 0600.
Один пробел: поля темы и получателя не проверяются на переводы строки. В моём офлайн-тесте тема Hello + перевод строки + Bcc: attacker@example.net дала настоящий лишний заголовок Bcc. Если агент отправляет только то, что вы сами напечатали, это не важно. Если он может перенести в тему текст с веб-страницы или из входящего письма - важно. Короткое исправление:
# add at the top of send_email() in send.py
for field in [to, subject, sender or ""] + list(cc or []):
if "\r" in field or "\n" in field:
raise ValueError("line break in a header field")
Попробуйте: замерьте свой путь
Чтобы понять, куда уходит время вашего агента, замерьте скрипт отдельно и сравните с полным ходом агента. Скрипт сам возвращает поле ms; эта обёртка добавляет общее время вокруг него:
start=$(date +%s.%N)
python send.py you@example.com "timing test" "hello" | tee /tmp/send.json
end=$(date +%s.%N)
echo "script wall time: $(echo "$end - $start" | bc) s"
# the gap between this and the agent's full reply time is model time
Анализ (Jack Gross)
Общий урок: держите модель вне горячего пути
Схема простая, и её стоит копировать не только для почты. Если у задачи фиксированная форма (кому, тема, текст), пусть модель заполнит поля, а остальное сделает обычный код. Каждый шаг, который модель должна наблюдать и одобрять, стоит секунд и добавляет шанс ошибки. От 1-4 минут до 14 секунд - это примерно сокращение в 4-17 раз, и почти всё оно получено за счёт убранных ходов модели, а не более быстрой сети.
Папка triggers - идея интереснее. Она разделяет «решить, что отправить» и «отправить». Агент, cron-задача или человек могут ставить письма в очередь файлами, а одно сканирование отправит их все. Заодно исходящие легко просмотреть, прежде чем что-то уйдёт.
Ограничения, о которых стоит помнить
- Совсем новый. Опубликован в день написания статьи, v1.0.0, тестов в репозитории нет, внешних пользователей пока нет. Цифра в 14 секунд - отчёт одного человека об одной конфигурации.
- Широкие права. При входе запрашиваются
gmail.modifyиgmail.readonly. В документации Google для отправки достаточно более узкогоgmail.send. Украденный токен из такой установки позволит читать и менять вашу почту, а не только отправлять. - Проверка заголовков. Добавьте проверку переводов строки выше, прежде чем подавать недоверенный текст.
- Лимиты Gmail никуда не делись. Google ограничивает отправку в сутки (например, 2000 писем на пользователя в Google Workspace, 500 для пробных аккаунтов) и 500 получателей на одно письмо через API. В скрипте нет ограничения скорости и повторов, кроме одного обновления токена, поэтому массовые рассылки упрутся в эти лимиты.
- Скорость режет в обе стороны. Без шага в браузере нет экрана, на котором человек бросит взгляд на черновик. Если агент должен спрашивать перед отправкой, эта проверка теперь должна жить в его инструкциях.
- Настройка. Нужен свой проект Google Cloud и OAuth-клиент, а помощник входа по умолчанию занимает порт 80.
- Только Gmail. Нет Outlook или обычного SMTP, и в текущем коде нет вложений.
Вердикт
fast-mailer - небольшое читаемое решение реальной и частой проблемы, а его модель безопасности аккуратнее, чем у большинства инструментов первого дня. Считайте его хорошей отправной точкой: сузьте область до gmail.send, добавьте проверку заголовков и оставьте человеческое подтверждение там, где оно важно. Урок выходит далеко за пределы почты: меньше ходов модели лучше, чем более быстрая модель.
FAQ
fast-mailer использует AI-модель для отправки писем?
Нет. Агент пишет содержание, а затем скрипт отправляет его через Gmail API без вызова модели между ними.
14 секунд - это время отправки одного письма?
Это время всего хода агента по словам автора. Сам вызов отправки, по README, занимает около 0,6-1 секунды.
С какими агентами он работает?
С любым агентом, который умеет запускать команды в терминале. В репозитории есть инструкции для Claude Code, Cursor и ZCode.
Источники: fast-mailer на GitHub (код, README, SKILL.md, история коммитов, прочитано 24 сентября 2026) · Gmail API: users.messages.send · Лимиты отправки Gmail в Google Workspace. Время 1-4 минуты и 14 секунд - со слов автора репозитория.