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