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