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** вложения не скачиваются повторно (идемпотентность)
|