Задача 8: классификация и обработчики — живой прогон, cron, archive change

This commit is contained in:
2026-09-14 04:50:50 +00:00
parent 7550aff102
commit 8bff6f9aa4
14 changed files with 257 additions and 28 deletions
@@ -0,0 +1,46 @@
## 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** вложения не скачиваются повторно (идемпотентность)