7550aff102
- 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, формат дат)
47 lines
2.9 KiB
Markdown
47 lines
2.9 KiB
Markdown
## 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** вложения не скачиваются повторно (идемпотентность)
|