# 3_download_attachments_v1.4.py **Krok 3 pipeline** — stahuje skutečné přílohy (`is_inline=False`) z Mongo emailů přes Graph API do `/mnt/Emails//Attachments/`. Deduplikace podle **SHA256** obsahu. ## Nové ve verzi 1.4 | Typ přílohy | `@odata.type` | Co skript dělá | |---|---|---| | **File** | `#microsoft.graph.fileAttachment` | Stáhne přes `/$value`, uloží binárku | | **Item** (vnořený email) | `#microsoft.graph.itemAttachment` | `$expand=...itemAttachment/item`, sestaví **`.eml`** z hlaviček a body vnitřní zprávy | | **Reference** (OneDrive/SharePoint link) | `#microsoft.graph.referenceAttachment` | Žádný file — uloží jen `reference_url` do Mongo | Plus: - **Retry** s exponenciálním backoffem na 429/500/502/503/504 (1s, 2s, 4s; respektuje `Retry-After`). - **Permanentní označení chyb v Mongo** per-attachment: - `attachment_missing: True` + `attachment_missing_at: ` při 404 (email/příloha už neexistuje v mailboxu) - `attachment_reference: True` + `reference_url: ` u referenceAttachment - Tagované přílohy se při dalším běhu **automaticky přeskočí** (bez `--force-recheck`). ## Argumenty | Argument | Povinný | Hodnoty | Default | Popis | |---|---|---|---|---| | `--mailbox` | ne | e-mail | (všechny) | Schránka = kolekce v Mongo. Bez argumentu projede všechny kolekce mimo `NON_MAILBOX_COLLECTIONS` a `SKIP_MAILBOXES` | | `--limit N` | ne | int | 0 | Per schránka, jen prvních N emailů (test) | | `--force-recheck` | ne | flag | false | Znovu ověří i emaily kde přílohy mají `file_hash` **nebo** `attachment_missing` **nebo** `attachment_reference` | | `--no-indexes` | ne | flag | false | Nevytváří indexy na `attachments_index` | ## SKIP_MAILBOXES (hardcoded) | Schránka | Důvod | |---|---| | `vbuzalka@its.jnj.com` | JNJ tenant, nemáme Graph API přístup. Bez `--mailbox` se tiše přeskočí. S explicitním `--mailbox vbuzalka@its.jnj.com` skript skončí exit kódem 2. | ## Statistiky per schránka ``` ok=N nove=N dup=N skip=N miss=N ref=N err=N ``` | Kategorie | Význam | |---|---| | `ok` | emaily zpracované bez chyby (všechny přílohy hotové) | | `nove` | nové soubory uložené (NEW + NEW(eml)) | | `dup` | hash už existuje (jen ref_count++) | | `skip` | S/MIME (.p7m/.p7s/...) nebo inline obrázek | | `miss` | 404 — označeno `attachment_missing` (nepokračuje se) | | `ref` | referenceAttachment — uložen jen URL | | `err` | tranzientní chyba (5xx, timeout) — bude retry při dalším běhu | ## Varianty volání ```bash # Všechny schránky (mimo SKIP_MAILBOXES): docker exec -it python-runner python /scripts/3_download_attachments_v1.4.py # Jedna schránka: docker exec -it python-runner python /scripts/3_download_attachments_v1.4.py --mailbox ordinace@buzalkova.cz # Test 50 emailů: docker exec -it python-runner python /scripts/3_download_attachments_v1.4.py --mailbox ordinace@buzalkova.cz --limit 50 --no-indexes # Force-recheck (i missing/reference přepíše): docker exec -it python-runner python /scripts/3_download_attachments_v1.4.py --mailbox ordinace@buzalkova.cz --force-recheck # Na pozadí: docker exec -d python-runner bash -c "python /scripts/3_download_attachments_v1.4.py > /scripts/download_attachments.log 2>&1" ``` ## Sledování průběhu ```bash docker exec -it python-runner tail -f /scripts/download_attachments.log ```