This commit is contained in:
2026-06-10 20:16:38 +02:00
parent 7b2f69ad85
commit bff5cc4cac
20 changed files with 4037 additions and 19 deletions
@@ -0,0 +1,75 @@
# jnj_mailbox_sync v1.0.0
**Soubor:** `jnj_mailbox_sync_v1.0.py` · **Datum:** 2026-06-09 · **Autor:** vladimir.buzalka
**Následník:** `inbox_full_sync_v1.1.py` (po validaci přesunout do `Trash/`)
## Účel
Synchronizace JNJ Outlooku (MAPI) → osobní schránka + bookkeeping v SQLite
(`C:\Users\vbuzalka\SQLITE\jnjemails.db`). Oproti `inbox_full_sync` navíc **sleduje
přesuny e-mailů mezi složkami** a příznak **„už není ve schránce" bez opětovného
přenosu těla**.
- **Scope:** primární schránka, **Inbox + Sent Items** včetně všech podsložek.
- **Online Archive se NESkenuje** — firemní pravidla tam přesouvají nejstarší
e-maily (ty už máme dávno stažené). Když e-mail ze skenované schránky zmizí,
ponechá se poslední známá cesta a nastaví se `not_in_mailbox_anymore=1`.
- **Identita = Internet Message-ID** (stabilní přes přesuny). `EntryID` jen pomocný.
## Sloupce cest (SQLite `messages`)
| sloupec | význam |
|---|---|
| `folder` | cesta při **prvním** zachycení (historie, nepřepisuje se) |
| `jnj_folder` | **aktuální** živá cesta (přepisuje se při přesunu) |
| `not_in_mailbox_anymore` | 1 = e-mail už ve skenované schránce není |
| `left_mailbox_at` | kdy detekováno, že opustil schránku |
| `updated_at` | bump při insertu i každé změně → watermark pro domácí sync |
## Režimy
| `--mode` | co dělá | upload .msg | okno `--days` |
|---|---|---|---|
| `capture` (default) | jako inbox_full_sync: nové e-maily uloží+nahraje | ano (nové) | ignoruje (vše) |
| `update-paths` | jen metadata: aktualizuje cesty/přečteno, označí „GONE" | **ne** | ano |
| `full-update` | `update-paths` + dorovná chybějící těla | ano (chybějící) | ano |
Detekce „opustilo schránku" běží **jen** v `update-paths`/`full-update` s platným
oknem (jinak by neskenováním archivu dělala falešné poplachy).
## Argumenty
```
--mode {capture,update-paths,full-update} default capture
--days N okno ve dnech (default 30); 0 = celý Inbox+Sent
--dry-run NIC nezapíše/nenahraje, jen vypíše co by udělal + souhrn
--limit N max N položek (rychlý test; vypne detekci GONE)
--no-db-upload na konci nenahrávat SQLite na server
```
## Spuštění
```powershell
# 1) Přečíst, co by full-update přinesl (NIC nezmění):
python jnj_mailbox_sync_v1.0.py --mode full-update --days 30 --dry-run
# 2) Naostro:
python jnj_mailbox_sync_v1.0.py --mode full-update --days 30
```
## Výstup
Per-položka: `NEW` (nahráno) / `NEW*` (dry-run by nahrál) / `UPD` (změna cesty/
přečteno) / `GONE` (opustilo schránku) / skip. Na konci souhrn: nalezeno, nově
zachyceno, aktualizovaná cesta, změna přečtení, vráceno, opustilo schránku, chyby.
## Závislosti
`pywin32`, `requests`, `cryptography`, `sqlite3` (stdlib). Python 3.10+, Windows,
spuštěný a přihlášený Outlook.
## Navazuje (zatím NEhotovo — domácí strana)
`sync_jnj_state` (python-runner u Monga): zrcadlo SQLite → Mongo `jnj_messages`
(watermark přes `updated_at`) + doplnění `jnj_folder`/příznaků do kolekce
`emaily."vbuzalka@its.jnj.com"`. Viz plán implementace.