Files
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

3.6 KiB

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).