Это финальная, двенадцатая задача. Все 11 функций майлера написаны - теперь проводим полный аудит и отладку, чтобы получить рабочую версию без багов. Новых функций НЕ добавляем, только проверяем и чиним то, что уже есть.
# Сначала проверь моё окружение
Прежде чем что-то запускать - убедись что у меня установлено всё необходимое. Дай мне команды для проверки и, если чего-то нет, пошаговую инструкцию по установке под мою систему (спроси какая у меня ОС - Windows или macOS, если не знаешь).
Проверь по порядку:
1. Python 3.11+ установлен. Команда проверки: python --version (или python3 --version). Если нет или версия ниже 3.11 - дай ссылку python.org/downloads и инструкцию по установке с галочкой «Add Python to PATH» (Windows).
2. pip работает: pip --version. Если нет - инструкция как поставить/починить pip.
3. Зависимости из requirements.txt установлены: дай команду pip install -r requirements.txt и проверку что customtkinter, requests, python-dotenv импортируются без ошибок.
4. Tkinter доступен (CustomTkinter работает поверх него). На некоторых Linux-сборках нужен отдельный пакет, на Windows/macOS обычно идёт с Python. Если import tkinter падает - дай инструкцию как доустановить.
5. VS Code и расширение Claude - опционально, но если работаю через них, проверь что проект открыт в правильной папке.
По каждому пункту: либо «✓ установлено, версия X», либо «✗ не найдено - вот как установить: [шаги]». Не переходи к аудиту кода пока окружение не готово к запуску.
# Что проверить
1. Запуск с нуля
- Свежий клон проекта: pip install -r requirements.txt && python main.py запускается без ошибок на чистом окружении.
- Все импорты разрешаются, нет отсутствующих зависимостей в requirements.txt.
- Окно открывается, все пять вкладок (Setup, Content, Campaign, Send, Stats) рисуются.
- Лаунчеры start.bat / start.command запускают майлер двойным кликом.
2. Загрузка всех файлов данных
- proxies.txt (файл и URL), smtps.txt, subjects.txt, bodies.txt, links.txt + нумерованные, senders.txt, CSV-база.
- Проверь обработку битых строк, пустых файлов, неправильных форматов - не должно быть необработанных исключений, только понятные сообщения в UI.
- Дубликаты, пустые строки, строки с # игнорируются корректно.
3. Логика формирования письма
- Спинтакс раскрывается на любой глубине вложенности.
- Плейсхолдеры {{name}}, {{email}}, {{senderName}} подставляются везде (тема, тело, From).
- Макросы [[LINK]], [[LINK1]]… заменяются, при отсутствии файла - понятная ошибка.
- From собирается правильно: "Имя <smtp_email>".
- CC/BCC добавляются по проценту, флаги had_cc/had_bcc пишутся в лог.
- Control email инжектится каждые N писем, помечается [CONTROL].
4. Ротация и устойчивость
- SMTP round-robin между живыми, мёртвые (5xx auth) исключаются, временные (4xx) идут в retry.
- Прокси проверяются перед стартом, мёртвые исключаются.
- GUI не зависает во время рассылки (threading работает, кнопки реагируют, прогресс обновляется).
- Кнопка ТЕСТ отправляет одно письмо и показывает результат, не пишет в основной лог.
5. Статистика и логи
- Real-time счётчики обновляются (отправлено, в очереди, ошибок, скорость).
- JSON-лог logs/YYYY-MM-DD.json пишется по схеме, валидный JSON.
- Экспорт в JSON и CSV работает.
6. Граничные случаи
- Что будет, если базу не загрузили, а нажали «Старт».
- Что будет при нуле живых SMTP.
- Что будет если все прокси мёртвые.
- Очень большая база (100k+) - нет ли утечек памяти, успевает ли UI.
- Спецсимволы и кириллица в темах/телах/именах - корректная кодировка письма (UTF-8, MIME).
# Как делать
1. Пройди по всем модулям (core/ и gui/) и найди: необработанные исключения, голые except, race conditions в threading, захардженные пути и значения, дублирование кода, places где UI может зависнуть.
2. По каждому найденному багу: коротко опиши проблему - где, в чём, чем грозит. Потом дай исправленный файл целиком.
3. Если нужно - добавь недостающую обработку ошибок и логирование, но не меняй логику работающих функций без причины.
4. Проверь что данные из data/ и логи в logs/ не утекают в git (.gitignore корректен).
5. Заполни memory/40-errors.md - что нашёл и как починил. Обнови memory/00-overview.md - статус «проект завершён, отлажен».
# Что отдать в ответе
1. Список найденных багов с приоритетом (критичные / средние / косметика).
2. Исправленные файлы целиком (только те, что менялись).
3. Финальный чек-лист: что протестировано и работает.
4. Если остались известные ограничения - честно перечисли их.
# Финализация памяти проекта (memory/ в Obsidian)
Это последняя задача серии, поэтому полностью закрой базу знаний в memory/ - чтобы вся история проекта была сохранена и к ней можно было вернуться в любой момент или передать другому человеку. Пройдись по всем файлам и доведи их до финального состояния:
1. memory/00-overview.md - финальный статус: проект собран и отлажен, что он умеет (список всех 12 функций), как запускать, краткое summary.
2. memory/10-architecture.md - актуальная карта всех модулей core/ и gui/: что за что отвечает, как связаны, где какие данные.
3. memory/20-tasks/ - убедись что по каждой из 12 задач есть файл: что сделано, какие файлы, какие решения. Если по ходу какие-то пропустил - допиши.
4. memory/30-decisions.md - все ключевые архитектурные решения и почему так (выбор библиотек, threading, формат логов, схема ротации).
5. memory/40-errors.md - полный журнал: все баги что встречались за проект и как их чинили (включая найденные в этой задаче).
6. memory/daily/ - финальная заметка с датой: проект завершён, что в итоге получилось.
Цель: открыв memory/ в Obsidian, человек (или новая сессия Claude) должен за 10 минут чтения восстановить ПОЛНЫЙ контекст - что за проект, как устроен, какие решения приняты, какие были проблемы. Граф связей в Obsidian должен показывать связную структуру через [[ссылки]] между заметками.
# Готовность
Проект готов когда: запускается с нуля без ошибок, проходит все шесть блоков проверки выше, баги исправлены, и в memory/ сохранена полная история проекта (overview, архитектура, все 12 задач, решения, журнал ошибок). После этого у меня на руках рабочий кастомный майлер и полная база знаний по нему - можно переходить к боевой отправке.