Files
email-assistant/openspec/changes/email-classification-handlers/specs/email-attachments/spec.md
T
hermes 7550aff102 feat: классификация писем Qwen3:8b + обработчики (urgent→TG, task→VTODO, meeting→VEVENT)
- mail_archive.py: фикс вложений himalaya --dir → --downloads-dir; attachments/ только при has_attachment; идемпотентно
- email_classifier.py: Qwen3:8b (Ollama) → теги info/urgent/task/meeting в frontmatter email.md
- email_handlers.py: urgent→Telegram (Bot API+SOCKS5), task→Radicale VTODO, meeting→Radicale VEVENT; handled_* идемпотентность; --dry-run
- .gitignore: игнор *.env.bak*
- openspec: чейндж email-classification-handlers (в работе)
- STATUS/TODO/WALKTHROUGH: прогресс сессии, подводные камни Radicale (http.client, Depth:1, формат дат)
2026-09-13 20:35:58 +00:00

2.9 KiB

Purpose

Скачивание вложений письма в каталог этого письма. Сейчас mail_archive.py вызывает himalaya attachment download --dir, но правильный флаг в Himalaya — --downloads-dir, из-за чего команда падает (exit 2), ошибка молча глотается except: pass, и папка attachments/ всегда пустая. Вложения теряются.

ADDED Requirements

Requirement: Вложения сохраняются в каталог письма

Для каждого письма с вложениями (флаг has_attachment: true в frontmatter) вложения MUST быть сохранены в подкаталог attachments/ каталога письма (/opt/hermes/email/<folder>/YYYY/MM/<uid>/attachments/).

Scenario: Письмо с вложением архивировано

  • WHEN mail_archive.py заархивировал письмо с has_attachment: true
  • THEN файлы вложений лежат в <msg_dir>/attachments/ и совпадают с вложениями на IMAP-сервере

Requirement: Правильный флаг Himalaya

Скачивание вложений MUST использовать флаг --downloads-dir (а не несуществующий --dir) команды himalaya attachment download, и передавать ему каталог письма.

Scenario: Вызов himalaya с корректным флагом

  • WHEN get_attachments() выполняется для письма
  • THEN используется himalaya attachment download --folder <folder> --downloads-dir <msg_dir>/attachments <uid>, exit code 0 при успехе

Requirement: Учёт отсутствия вложений

Если письмо не имеет вложений (has_attachment: false или команда вернула «нет вложений»), скрипт MUST NOT создавать пустую папку attachments/ и MUST NOT считать это ошибкой.

Scenario: Письмо без вложений

  • WHEN mail_archive.py обрабатывает письмо без вложений
  • THEN каталог attachments/ не создаётся, ошибка не логируется

Requirement: Повторная обработка существующих писем

Повторный запуск mail_archive.py MUST NOT повторно качать уже сохранённые вложения (проверка по наличию каталога/файлов).

Scenario: Повторный запуск

  • WHEN mail_archive.py запущен повторно на письме с уже скачанными вложениями
  • THEN вложения не скачиваются повторно (идемпотентность)