# python-runner — Docker kontejner na Tower ## Základní info | Parametr | Hodnota | |----------------|----------------------------------------------| | Název | python-runner | | Image | python-runner (vlastní) | | Status | running (unless-stopped) | | Python | 3.12.13 | | Spouštěcí cmd | `tail -f /dev/null` — container jen běží, skripty se spouštějí ručně | | Working dir | `/scripts` | | Vytvořen | 2026-06-02 | --- ## Tower — SSH přístup | Parametr | Hodnota | |----------|------------------| | Host | tower / 192.168.1.76 | | Port | 22 | | User | root | | Heslo | 7309208104 | **Připojení přes Python (paramiko)** — Docker CLI není lokálně dostupný: ```python import paramiko c = paramiko.SSHClient() c.set_missing_host_key_policy(paramiko.AutoAddPolicy()) c.connect('192.168.1.76', username='root', password='7309208104') _, out, _ = c.exec_command('...') print(out.read().decode()) c.close() ``` --- ## Volume mounty | Host (Unraid) | Kontejner | Popis | |-----------------------|-------------------|----------------------------------| | `/mnt/user/Scripts` | `/scripts` | Skripty, logy — working dir | | `/mnt/user/Emails` | `/mnt/Emails` | Stažené přílohy `/Attachments/` | > Skripty čtou emaily **přímo přes Microsoft Graph API** — lokální `.msg` soubory už nejsou potřeba. --- ## Aktuální skripty v /scripts | Soubor | Popis | |---------------------------------|--------------------------------------------------------------| | `parse_emails_graph_v1.3.py` | Import emailů ze schránky přes Graph API → MongoDB | | `download_attachments_v1.3.py` | Stažení skutečných příloh emailů (Graph API) → `/mnt/Emails` | | `python_runner.md` | Tato dokumentace | | `parse_emails_errors.log` | Log chyb (soubory/zprávy které selhaly) | > **POZOR:** oba skripty pouze **čtou** ze schránky — žádný zápis do schránky. --- ## Microsoft Graph API — konfigurace (v obou skriptech) | Parametr | Hodnota | |-----------------|----------------------------------------| | Graph URL | `https://graph.microsoft.com/v1.0` | | Tenant ID | `7d269944-37a4-43a1-8140-c7517dc426e9` | | Client ID | `4b222bfd-78c9-4239-a53f-43006b3ed07f` | | Auth | client credentials (msal) | | MongoDB | Hodnota | |-----------------|----------------------------------------| | URI | `mongodb://192.168.1.76:27017` | | DB | `emaily` | | Kolekce emailů | `` (např. `ordinace@buzalkova.cz`) | | Index příloh | `attachments_index` | --- ## 1) parse_emails_graph_v1.3.py — import emailů → MongoDB Čte **všechny složky** schránky rekurzivně (Inbox, Sent, Deleted, archivy …) přes Graph API a importuje každou zprávu jako dokument do MongoDB. `_id` = Internet Message-ID (fallback `graphid:`). Upsert → bezpečné přerušit a opakovat. Z každé zprávy extrahuje: předmět, odesílatel, příjemci To/CC/BCC, časy (UTC), HTML tělo (max 2 MB) + text preview, přílohy (metadata + `graph_att_id`), internet headers (SPF/DKIM/Received/X-*), MAPI-ekvivalenty (důležitost, příznak, konverzační vlákno, kategorie, In-Reply-To, References), `isRead`, `isDraft`, `folder_path`, `inferenceClassification`. ```bash # První import (vše): docker exec -it python-runner python /scripts/parse_emails_graph_v1.3.py --mailbox ordinace@buzalkova.cz # Test na 50 zprávách bez indexů: docker exec -it python-runner python /scripts/parse_emails_graph_v1.3.py --mailbox ordinace@buzalkova.cz --limit 50 --no-indexes # Pravidelný sync na pozadí (log do souboru): docker exec -d python-runner bash -c "python /scripts/parse_emails_graph_v1.3.py --mailbox ordinace@buzalkova.cz --mode sync > /scripts/parse_emails.log 2>&1" ``` > **`-d` = detached:** příkaz se hned vrátí a skript běží dál v kontejneru i po > zavření terminálu / odpojení SSH. Bez `-d` (resp. s `-it`) skript skončí ve chvíli, > kdy se spojení zavře. Pro dlouhé běhy vždy pouštěj s `-d` a logem do souboru, > průběh pak sleduj přes `tail -f` (viz [Sledování průběhu](#sledování-průběhu)). ### Parametry | Parametr | Popis | |---|---| | `--mailbox` | **Povinný.** Schránka (e-mail), zároveň název kolekce v MongoDB. | | `--mode` | `full` (výchozí — plný upsert), `new-only` (jen nové), `sync` (existující: aktualizuje `is_read`/`flag_status`/`categories`/`modified_at`/`folder_path`; nové importuje celé — ideální pro pravidelné spouštění). | | `--folder` | Import jen jedné složky (např. `Inbox`). | | `--limit N` | Zpracuje jen prvních N zpráv (test). | | `--no-indexes` | Nevytváří indexy na konci. | --- ## 2) download_attachments_v1.3.py — stažení příloh → /mnt/Emails Stahuje skutečné přílohy (`is_inline=False`) všech emailů z MongoDB přes Graph API do `/mnt/Emails//Attachments/`. Primárně přes `graph_att_id` (přímé ID), name-matching jako fallback pro staré emaily. Deduplikace podle **SHA256** obsahu: - stejný hash → soubor už existuje → přeskočí - kolize názvu (stejný název, jiný hash) → `faktura_2.pdf`, `faktura_3.pdf` … Po uložení aktualizuje MongoDB: každá příloha dostane `file_hash` + `local_path`; kolekce `emaily.attachments_index` (`_id`=hash, filename, path, size_bytes, mime_type, mailbox, first_seen_at, ref_count). Emaily kde mají všechny přílohy `file_hash` se přeskočí → bezpečné opakovat. ```bash # Interaktivně (vidíš výstup, skončí zavřením terminálu): docker exec -it python-runner python /scripts/download_attachments_v1.3.py --mailbox ordinace@buzalkova.cz # Na pozadí (běží dál i po zavření terminálu, log do souboru): docker exec -d python-runner bash -c "python /scripts/download_attachments_v1.3.py --mailbox ordinace@buzalkova.cz > /scripts/download_attachments.log 2>&1" ``` > `-d` = detached — stejné chování jako u skriptu výše (viz poznámka v sekci 1). ### Parametry | Parametr | Popis | |---|---| | `--mailbox` | **Povinný.** Schránka (e-mail) = kolekce v MongoDB. | | `--limit N` | Zpracuje jen prvních N emailů (test). | | `--force-recheck` | Znovu ověří i už stažené přílohy. | | `--no-indexes` | Nevytváří indexy na konci. | --- ## Sledování průběhu ```bash docker exec -it python-runner tail -f /scripts/parse_emails.log ``` --- ## Nainstalované Python balíčky ``` msal (Graph API auth) requests pymongo 4.17.0 python-dateutil 2.9.0.post0 extract-msg 0.55.0 cryptography 48.0.0 beautifulsoup4 4.13.5 oletools 0.60.2 msoffcrypto-tool 6.0.0 olefile 0.47 RTFDE 0.1.2.2 compressed-rtf 1.0.7 lark 1.3.1 pcodedmp 1.2.6 tzlocal 5.3.1 six 1.17.0 pip 25.0.1 ``` --- ## Přidání nového balíčku ```bash docker exec python-runner pip install ``` > Pozor: instalace se ztratí při recreate kontejneru — je třeba přidat do Dockerfile nebo do setup skriptu. --- ## Historie | Datum | Změna | |---|---| | 2026-06-02 | Přechod z `.msg` souborů na Microsoft Graph API. Skript `parse_emails_tower_v1.1.py` (import lokálních `.msg`) nahrazen `parse_emails_graph_v1.3.py`; přidán `download_attachments_v1.3.py`. Staré verze v `Trash/`. |