Files
janssen/Python-runner/python_runner.md
T
2026-06-03 07:10:15 +02:00

7.9 KiB

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ý:

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 <schránka>/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ů <mailbox> (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:<id>). 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.

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

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/<schránka>/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.

# 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

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

docker exec python-runner pip install <balicek>

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