Нейросеть для обработки почты: сортировка писем и черновики через API

Рабочая схема разбора входящих: письма по IMAP, категория, срочность и черновик ответа в JSON, маскировка персональных данных, проверка человеком и расчёт стоимости на 1 000 писем.

6 мин · · автоматизация · бизнес

«Нейросеть для обработки почты» ищут те, у кого общий ящик поддержки или продаж получает десятки и сотни писем в день, а сортировка и типовые ответы съедают часы. Модель через API может определить тему и срочность письма и подготовить черновик ответа, а человеку останется проверить и нажать «Отправить». Ниже — рабочий скрипт на Python с IMAP, промпт с ответом в JSON, правила приватности и расчёт стоимости на 1 000 писем.

Что можно поручить модели, а что нет

Хорошо подходит:

  • классификация по заранее заданным категориям: заказ, оплата, возврат, жалоба, сотрудничество, спам;
  • срочность — чтобы письма с проблемой оплаты не ждали в одной очереди с рассылками;
  • краткое содержание одной фразой для списка задач;
  • черновик ответа на типовые вопросы.

Что оставить человеку: отправку писем, любые обещания по деньгам и срокам, ответы на жалобы и всё, где модель сама пометила сомнение. Автоматическая отправка без проверки — плохая идея: одна ошибка в ответе клиенту стоит дороже, чем экономия времени.

Нейросеть для обработки почты: схема

  1. Скрипт забирает непрочитанные письма из ящика по IMAP.
  2. Из каждого письма достаёт тему и текст, маскирует email и телефоны.
  3. Отправляет модели текст с инструкцией и получает JSON: категория, срочность, нужен ли человек, краткое содержание, черновик.
  4. Код проверяет JSON: категория из списка, иначе письмо уходит человеку.
  5. Результат складывается в очередь на проверку — файл, таблицу или черновики в почтовом ящике.

Шаг 1. Письма по IMAP на Python

В стандартной библиотеке Python есть модуль imaplib. IMAP4_SSL подключается к серверу по защищённому соединению (порт 993 по умолчанию) и поддерживает with: при выходе из блока автоматически отправляется LOGOUT. select(..., readonly=True) открывает папку только на чтение, поэтому скрипт не меняет флаги писем. search(None, "UNSEEN") находит непрочитанные, fetch(num, "(RFC822)") скачивает письмо целиком.

Для разбора письма используется модуль email: message_from_bytes(..., policy=policy.default) возвращает объект, у которого get_body(preferencelist=("plain", "html")) находит основную текстовую часть, а get_content() отдаёт её строкой.

Многие почтовые сервисы требуют для IMAP отдельный пароль приложения и включённый доступ по IMAP в настройках ящика — проверьте в справке своего провайдера. Логин и пароль храните в переменных окружения, не в коде.

Шаг 2. Промпт и ответ в JSON

Полный скрипт: забирает до 50 непрочитанных писем, классифицирует их и сохраняет очередь в triage.json.

bash
import email
import imaplib
import json
import os
import re
from email import policy

from openai import OpenAI

CATEGORIES = ["заказ", "оплата", "возврат", "жалоба", "сотрудничество", "спам", "другое"]

SYSTEM = (
    "Ты помощник службы поддержки интернет-магазина и разбираешь входящую почту. "
    "Определи категорию письма — одну из: " + ", ".join(CATEGORIES) + ". "

Детали, которые стоит сохранить при доработке:

  • Закрытый список категорий в промпте и проверка в коде. Если модель вернула что-то вне списка или сломанный JSON, письмо уходит человеку, а не теряется.
  • text[:4000] обрезает длинные письма с цитатами всей переписки: платить за них не нужно, для классификации хватает начала.
  • max_tokens=600 ограничивает длину ответа и, значит, стоимость.
  • Модель deepseek-v4.1-flash здесь как самая дешёвая отправная точка. Если черновики вас не устраивают, сравните с другими моделями на 50–100 своих письмах с эталонной разметкой. Если ответ в JSON часто ломается, используйте вызов инструмента со схемой — разобрано в статье о строгом JSON-ответе.

Шаг 3. Человек в контуре

Скрипт ничего не отправляет. Дальше варианты:

  • Таблица для оператора. triage.json загружается в любую внутреннюю панель или таблицу: сортировка по срочности, фильтр needs_human, черновик рядом с письмом.
  • Черновики в почтовом ящике. IMAP позволяет положить письмо в папку командой APPEND — в imaplib это append(mailbox, flags, date_time, message). Тогда оператор открывает черновик в обычном почтовом клиенте, правит и отправляет:
bash
import imaplib
import time
from email.message import EmailMessage


def save_draft(imap, original, draft_text, folder="Drafts"):
    reply = EmailMessage()
    reply["To"] = str(original["Reply-To"] or original["From"])
    reply["Subject"] = "Re: " + str(original["Subject"] or "")
    if original["Message-ID"]:
        reply["In-Reply-To"] = str(original["Message-ID"])
    reply.set_content(draft_text)
    imap.append(folder, r"\Draft", imaplib.Time2Internaldate(time.time()), reply.as_bytes())

Название папки черновиков у разных провайдеров разное — посмотрите список папок через imap.list(). Для записи папку нужно открыть без readonly. Черновик написан по замаскированному тексту, поэтому вместо адресов и телефонов в нём могут стоять [email] и [телефон] — их оператор заполнит при проверке.

Приватность

Письма — это персональные данные клиентов. Минимальные правила:

  • Маскируйте до отправки. В примере email и телефоны заменяются заглушками регулярными выражениями. Добавьте свои шаблоны: номера договоров, карт, адреса.
  • Не логируйте тела писем и ответы модели целиком. Подробнее — в статье логирование LLM без утечки данных.
  • Отдельный ключ под эту задачу с дневным лимитом и allowed_models, где разрешена только нужная модель. Так ошибка в цикле или утечка ключа не опустошит баланс.
  • Сверьтесь с правилами компании и законодательством о персональных данных (в России — 152-ФЗ), прежде чем отправлять переписку внешнему сервису.

Сколько стоит обработка 1 000 писем

Цены на 7 октября 2026, $ за 1M токенов. Допустим, системный промпт — 600 токенов, письмо после обрезки — в среднем 900, итого 1 500 токенов входа; ответ с черновиком — 350 токенов. Формула: 1 000 × (1 500 × цена входа + 350 × цена выхода) / 1 000 000.

МодельВход / выход1 000 писем
deepseek-v4.1-flash0.013 / 0.0381 500 × 0.013 + 350 × 0.038 = 32.8 → $0.033
gemini-3.8-flash0.063 / 0.28894.5 + 100.8 = 195.3 → $0.195
gpt-6.1-sol0.27 / 1.32405 + 462 = 867 → $0.867
claude-sonnet-50.4 / 2600 + 700 = 1 300 → $1.30

Кэш здесь почти ничего не даёт: промпт в 600 токенов короче минимального кэшируемого префикса — по документации Anthropic это 1 024 токена для Claude Sonnet 5, по документации OpenAI столько же для GPT-5.6 и новее. Если ваша инструкция с примерами ответов длиннее, кэш начинает работать, и считать стоимость нужно по ценам чтения кэша из каталога. Для Claude скидка за кэш действует только в Anthropic-формате: в OpenAI-формате, как в скрипте выше, весь вход Claude идёт по цене входа. Подробнее — в документации о лимитах ключей и кэше. Актуальный список и цены — GET https://api.zukko.pro/v1/models или страница «Модели» в кабинете.

Чтобы попробовать на своём ящике, создайте отдельный ключ с лимитом на странице API-ключей и запустите скрипт на копии ящика или тестовой папке.

Частые вопросы

Можно ли отправлять ответы автоматически?

Технически да, но не советуем начинать с этого. Сначала поработайте в режиме черновиков, посмотрите, как часто оператор правит текст, и только для самых типовых категорий решайте, нужна ли автоматика.

Скрипт пометит письма прочитанными?

Нет. Папка открывается с readonly=True, поэтому флаги писем не меняются. Чтобы не обрабатывать одно письмо дважды, храните обработанные Message-ID.

Какую модель взять для черновиков?

Начните с дешёвой и сравните с одной-двумя более сильными на 50–100 своих письмах: оцените точность категорий и сколько правок нужно черновикам. Ориентир по силе — индекс в каталоге, но решает ваша проверка; как сравнивать вслепую, разобрано в статье нейросеть для написания текстов.

Работает ли это с Gmail, Яндекс Почтой и корпоративным Exchange?

Скрипт использует стандартный IMAP, поэтому подойдёт любой ящик с включённым доступом по IMAP. Как его включить и нужен ли пароль приложения, смотрите в справке своего почтового сервиса.

zukko

Платите в 25×
меньше

за Claude Code & ChatGPT

Один ключ fetch_* и base URL api.zukko.pro — в Cursor, Claude Code, Codex и любом SDK.

Нейросеть для обработки почты: письма через API · Zukko