Files
email-assistant/openspec/changes/archive/2026-09-14-no-mark-seen-on-archive/proposal.md
T
hermes 39df85b51c fix: архивация/вложения больше не помечают письма прочитанными (Seen)
Причина: himalaya message read и attachment download используют IMAP BODY[],
который по RFC 3501 выставляет \Seen на сервере (Microsoft Exchange).
Пользователь: письма в ящике после скачивания становятся прочитанными.

Фикс:
- чтение тела: himalaya message read --preview (не ставит Seen)
- вложения: fetch_attachments_imaplib() — сырой IMAP stdlib (socket+ssl),
  UID FETCH (BODY.PEEK[]), папки в modified UTF-7, литералы до 1.5МБ,
  MIME-encoded words, фолбэк himalaya + flag remove seen

Проверено живьём: UID 14200 (INBOX, docx 1.1МБ) флаги ()->() — Seen не выставлен.
Openspec: change no-mark-seen-on-archive заархивирован (2026-09-14-no-mark-seen-on-archive), 7/7 validate OK
2026-09-14 08:08:48 +00:00

57 lines
3.6 KiB
Markdown

# Proposal: Не помечать письма прочитанными при архивации
## Problem
`mail_archive.py` читает каждое письмо через `himalaya message read` и
`himalaya attachment download`. Обе команды himalaya по умолчанию запрашивают
тело письма через IMAP `BODY[]`, из-за чего почтовый сервер автоматически
выставляет флаг `\Seen` — письмо в почтовом ящике становится **прочитанным**.
Подтверждение на живых данных (2026-09-14):
```
INBOX/!Персонал/2026/09/73/email.md flags: ["Seen", "Answered"]
INBOX/!Персонал/2026/09/70/email.md flags: ["Seen"]
```
Свежие входящие письма (сентябрь 2026) пришли непрочитанными, но после
автоматической архивации (cron каждые 5 мин) получили флаг `Seen`.
Статистика по всему архиву: 4223 письма с `Seen` против 973 без флагов.
Это нарушает пользовательское ожидание: вложение/тело скачивается автоматически,
но «руками» в ящике письмо никто не читал, и оно должно оставаться непрочитанным.
## Expected behavior
1. Архивация (включая скачивание вложений) НЕ выставляет флаг `\Seen`.
2. Скачивание вложений НЕ выставляет флаг `\Seen`.
3. Классификация/обработчики НЕ выставляют флаг `\Seen`.
4. Ручные команды чтения (`himalaya message read` без флагов) продолжают работать
как раньше (это личное действие пользователя).
## Accepted solution
- `himalaya message read` → добавить флаг `--preview` (документировано:
«Read the message **without** applying the "seen" flag to its corresponding
envelope»).
- `himalaya attachment download` → у команды НЕТ флага `--preview`. Обход:
перед скачиванием вложений выполнять только операции, не ставящие Seen;
сам `attachment download` заменить на извлечение вложений из уже скачанного
полного письма (`himalaya message export --full` + распаковка MIME в
stdlib Python) ЛИБО временно (до починки himalaya) — выставлять Seen обратно
через `himalaya flag remove` сразу после скачивания.
Выбор между двумя вариантами для вложений — в design.md (будет решён по
результатам проверки, ставит ли `message export` Seen).
## Out of scope
- Изменение поведения `himalaya message read` для интерактивного пользователя.
- Исправление бага himalaya (это upstream issue).
## Rollback
- Патч минимален: `--preview` в одном месте + option для вложений.
- Откат: удалить строку `--preview` (или вернуть способ скачивания вложений).
- Флаги уже помеченных писем этим патчем не возвращаются (отдельная задача,
вне scope).