notebook
This commit is contained in:
+121
-39
@@ -39,53 +39,138 @@ c.close()
|
||||
|
||||
## Volume mounty
|
||||
|
||||
| Host (Unraid) | Kontejner | Popis |
|
||||
|-----------------------|-------------------|------------------------------|
|
||||
| `/mnt/user/Scripts` | `/scripts` | Skripty, logy — working dir |
|
||||
| `/mnt/user/JNJEMAILS` | `/mnt/JNJEMAILS` | .msg soubory emailů (JNJ) |
|
||||
| Host (Unraid) | Kontejner | Popis |
|
||||
|-----------------------|-------------------|----------------------------------|
|
||||
| `/mnt/user/Scripts` | `/scripts` | Skripty, logy — working dir |
|
||||
| `/mnt/user/Emails` | `/mnt/Emails` | Stažené přílohy `<schránka>/Attachments/` |
|
||||
|
||||
---
|
||||
|
||||
## Spouštění skriptů
|
||||
|
||||
```bash
|
||||
# Interaktivně (vidíš výstup):
|
||||
docker exec -it python-runner python /scripts/parse_emails_tower_v1.1.py --limit 50 --no-indexes
|
||||
|
||||
# Na pozadí (log do souboru):
|
||||
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í (skip hotových):
|
||||
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:
|
||||
docker exec -it python-runner tail -f /scripts/parse_emails.log
|
||||
```
|
||||
> 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_tower_v1.1.py` | Import .msg → MongoDB (db: emaily, kolekce: vbuzalka@its.jnj.com) |
|
||||
| `parse_emails_tower_v1.1.md` | Dokumentace ke skriptu |
|
||||
| `parse_emails.log` | Log průběhu importu |
|
||||
| `parse_emails_errors.log` | Log chyb (soubory které selhaly) |
|
||||
| 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) |
|
||||
|
||||
Lokální protějšek: `EmailsImport/parse_emails_v1.0.py` — identický kód, liší se jen cestou
|
||||
(`\\tower\JNJEMAILS` SMB vs. `/mnt/JNJEMAILS` lokální mount) a verzí hlavičky.
|
||||
> **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`.
|
||||
|
||||
```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/<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.
|
||||
|
||||
```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
|
||||
|
||||
```
|
||||
extract-msg 0.55.0
|
||||
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
|
||||
@@ -112,11 +197,8 @@ docker exec python-runner pip install <balicek>
|
||||
|
||||
---
|
||||
|
||||
## Logika parse_emails (oba skripty)
|
||||
## Historie
|
||||
|
||||
- Čte všechny `.msg` soubory z MSGS_DIR
|
||||
- Extrahuje: předmět, odesílatel, příjemci (To/CC/BCC), tělo (text+HTML), přílohy, internet headers, všechny raw MAPI properties
|
||||
- Ukládá do MongoDB: `emaily` → `vbuzalka@its.jnj.com`
|
||||
- `_id` = Internet Message-ID (nebo `filename:<stem>` jako fallback)
|
||||
- Upsert → bezpečné opakování, `--skip-existing` pro pokračování
|
||||
- Indexy: received_at, sent_at, sender.email, filename (unique), full-text (subject+body+to+cc)
|
||||
| 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/`. |
|
||||
|
||||
Reference in New Issue
Block a user