# email-attachments Specification ## ADDED Requirements ### Requirement: Скачивание вложений не помечает письмо прочитанным Скачивание вложений MUST NOT выставлять IMAP-флаг `\Seen` (письмо не должно становиться «прочитанным» в почтовом ящике). Способ: `himalaya attachment download` ставит `\Seen` (использует `BODY[]`), и флага `--preview` у него нет. Поэтому `get_attachments()` MUST использовать сырой IMAP-запрос `BODY.PEEK[]` через stdlib `imaplib` (не ставит `\Seen` на Microsoft Exchange, проверено) и распаковку MIME через stdlib `email`. #### Scenario: Скачивание вложения у непрочитанного письма - **GIVEN** письмо в INBOX с флагами `()` (непрочитанное) - **WHEN** `get_attachments()` скачивает его вложения - **THEN** файлы вложений сохранены в `attachments/`, а флаги письма на IMAP остаются `()` (флаг `\Seen` не выставлен) #### Scenario: Фолбэк при сбое сырого IMAP - **WHEN** `fetch_attachments_imaplib()` не может получить письмо (ошибка IMAP) - **THEN** вложения скачиваются через `himalaya attachment download`, после чего флаг `\Seen` снимается через `himalaya flag remove` (письмо временно помечается, но восстанавливается) ИЛИ операция помечается как недоступная — письмо НЕ остаётся прочитанным навсегда ### Requirement: Пароль IMAP для скачивания вложений `fetch_attachments_imaplib()` MUST брать учётные данные IMAP (host, port, login, пароль) из конфига himalaya (`~/.config/himalaya/config.toml`, секция `[accounts.]`, `backend.*`, пароль — `backend.auth.raw`) и MUST NOT логировать или выводить пароль. #### Scenario: Доступ к конфигу - **WHEN** `get_attachments()` запускается для письма - **THEN** подключение к IMAP выполняется с учётными данными из конфига himalaya, пароль никуда не выводится