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í
.msgsoubory 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-da logem do souboru, průběh pak sleduj přestail -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/. |