# parse_emails_tower_v1.1 ## Spuštění **První spuštění:** ```bash docker exec -d python-runner bash -c \ "python /scripts/parse_emails_tower_v1.1.py > /scripts/parse_emails.log 2>&1" ``` **Pokračování po přerušení (přeskočí už importované):** ```bash docker exec -d python-runner bash -c \ "python /scripts/parse_emails_tower_v1.1.py --skip-existing > /scripts/parse_emails.log 2>&1" ``` --- ## Stav importu **Sledování průběhu (live log):** ```bash docker exec -it python-runner tail -f /scripts/parse_emails.log ``` **Počet emailů v MongoDB:** ```bash docker exec -it python-runner python -c \ "from pymongo import MongoClient; c=MongoClient('mongodb://192.168.1.76:27017'); print(c['emaily']['vbuzalka@its.jnj.com'].count_documents({}))" ``` --- **Název:** parse_emails_tower_v1.1.py **Verze:** 1.1 **Datum:** 2026-06-02 **Autor:** vladimir.buzalka --- ## Účel Import všech `.msg` souborů do MongoDB. Z každého souboru extrahuje **všechny dostupné vlastnosti** — podobně jako EXIF u fotek. - **DB:** `emaily` - **Kolekce:** `vbuzalka@its.jnj.com` - `_id` = Internet Message-ID (nebo `filename:` jako fallback) - Bezpečné přerušit a opakovat — upsert podle `_id` --- ## Prostředí Běží v Docker containeru **python-runner** na **Unraid Tower**. | Komponenta | Umístění | |---|---| | Container | `python-runner` (Docker na Unraid Tower) | | .msg soubory | `/mnt/user/JNJEMAILS` → `/mnt/JNJEMAILS` uvnitř containeru | | Skripty | `/mnt/user/Scripts` → `/scripts` uvnitř containeru | | MongoDB | `192.168.1.76:27017` (externí, mimo container) | --- ## Spouštění (z Unraid terminálu) **Test na 50 emailech:** ```bash docker exec -it python-runner python /scripts/parse_emails_tower_v1.1.py --limit 50 --no-indexes ``` **Kompletní import na pozadí (log do souboru):** ```bash docker exec -d python-runner bash -c \ "python /scripts/parse_emails_tower_v1.1.py > /scripts/parse_emails.log 2>&1" ``` **Pokračování po přerušení:** ```bash docker exec -d python-runner bash -c \ "python /scripts/parse_emails_tower_v1.1.py --skip-existing > /scripts/parse_emails.log 2>&1" ``` **Sledování průběhu (Ctrl+C ukončí sledování, import běží dál):** ```bash docker exec -it python-runner tail -f /scripts/parse_emails.log ``` ### Všechny parametry | Parametr | Popis | |---|---| | `--skip-existing` | Načte seznam hotových souborů z MongoDB a přeskočí je. Použij pro pokračování po přerušení. | | `--limit N` | Zpracuje jen prvních N souborů. Vhodné pro test. | | `--no-indexes` | Nevytváří indexy na konci. Použij pokud přerušíš uprostřed — indexy vytvoř ručně až je vše hotové. | | `--msgs-dir PATH` | Přepíše výchozí cestu k .msg souborům (výchozí: `/mnt/JNJEMAILS`). | --- ## Průběh na konzoli Každý email na jednom řádku: ``` 1/69371 OK RE: Protocol deviation CZ10022 jan.novak@its.jnj.com 2/69371 OK UCO3001: Draft FUL pro DD5-CZ10022 monitor@4gclinical.com 3/69371 ERR ? ? ``` Každých 500 emailů oddělovač s průběhem: ``` ──────────────────────────────────────────────────────────────────────────────── Průběh: ok=498 err=2 0.4 msg/s ETA 47h12m ──────────────────────────────────────────────────────────────────────────────── ``` Na konci souhrn: ``` ==================================================== Vysledek: ok=69300 | skip=0 | err=71 Celkovy cas: 47h 23m 10s Dokumentu v kolekci: 69300 ``` --- ## Zdroje dat z každého .msg | Pole | Popis | |---|---| | Předmět, normalized subject | | | Odesílatel | email, jméno, SMTP adresa | | Příjemci To/CC/BCC | strukturovaně `[{type, email, name}]` | | Čas doručení a odeslání | UTC | | Tělo | plaintext + HTML (max 2 MB) | | Přílohy | metadata: jméno, velikost, MIME typ, inline flag | | Internet headers | X-Originating-IP, Received, DKIM, X-Mailer, ... | | MAPI | důležitost, citlivost, příznak, konverzační vlákno, kategorie | | In-Reply-To, References | pro rekonstrukci vlákna | | Raw MAPI properties | `{0xXXXX: value}` | --- ## Hodnotové kódy | Pole | Hodnota | Význam | |---|---|---| | `importance` | 0 | Nízká | | | 1 | Normální | | | 2 | Vysoká | | `sensitivity` | 0 | Normální | | | 1 | Osobní | | | 2 | Soukromé | | | 3 | Důvěrné | | `flag_status` | 0 | Bez příznaku | | | 1 | Označeno (follow up) | | | 2 | Dokončeno | --- ## MongoDB indexy Automaticky vytvořeny na konci importu (`--no-indexes` přeskočí): | Index | Pole | |---|---| | Chronologický | `received_at`, `sent_at` | | Odesílatel | `sender.email` | | Soubor | `filename` (unique) | | Konverzace | `conversation_topic` | | Filtry | `has_attachments`, `categories`, `importance`, `flag_status` | | Full-text | `subject` + `body_text` + `to` + `cc` (text index `text_search`) | --- ## Ukázkové dotazy (MongoDB shell / MCP) **Emaily o UCO3001 s přílohou:** ```javascript db["vbuzalka@its.jnj.com"].find({ $text: { $search: "UCO3001" }, has_attachments: true }).sort({ received_at: -1 }) ``` **Emaily od konkrétního odesílatele:** ```javascript db["vbuzalka@its.jnj.com"].find({ "sender.email": /covance/i }).sort({ received_at: -1 }) ``` **Celé konverzační vlákno:** ```javascript db["vbuzalka@its.jnj.com"].find({ conversation_topic: "Protocol deviation CZ10022" }).sort({ received_at: 1 }) ``` **Statistiky podle odesílatele (top 20):** ```javascript db["vbuzalka@its.jnj.com"].aggregate([ { $group: { _id: "$sender.email", count: { $sum: 1 } } }, { $sort: { count: -1 } }, { $limit: 20 } ]) ``` --- ## Chybový log Soubory které selhaly jsou zalogrovány do `parse_emails_errors.log` vedle skriptu (tj. `/scripts/parse_emails_errors.log` → `\\tower\Scripts\parse_emails_errors.log`): ``` 2026-06-02 20:14:33 | open failed [7A3F...0000.msg]: ``` --- ## Výkon | Parametr | Hodnota | |---|---| | Počet souborů | ~69 000 | | Rychlost | ~0.4 msg/s (htmlBody dekódování) | | Odhadovaný čas | 48 hodin | | Batch size | 200 dokumentů / bulk_write | | Odhadovaná velikost DB | 2–5 GB | --- ## Závislosti (v Docker image python-runner) ``` extract-msg==0.55.0 pymongo python-dateutil ``` Image sestaven z `Dockerfile` v `/mnt/user/Scripts/python-runner/`. --- ## Historie verzí | Verze | Datum | Změna | |---|---|---| | 1.0 | 2026-06-01 | Iniciální verze | | 1.1 | 2026-06-02 | Nasazení na Unraid Tower v Docker containeru python-runner; MSGS_DIR změněno z SMB share (`\\tower\JNJEMAILS`) na lokální mount (`/mnt/JNJEMAILS`); aktualizován popis spouštění pro `docker exec` |