# 5_enrich_fulltext_emails_v1.3.py **Krok 5 pipeline** — vytáhne plain-text z emailů v Mongu (`emaily.`) a uloží do PostgreSQL (`MongoEmaily.emails`) s tsvector GIN indexem nad konfigurací `soubory` (simple + unaccent). ## Co dělá 1. Vybere první dostupné tělo v tomto pořadí: - `smime_body_text/html` (rozbaleno krokem 4) - `body_html` → strip HTML přes BeautifulSoup - `body_text` (legacy plain) - `body_preview` (jako fallback) 2. Naplní řádek v PG `emails` (mailbox, subject, sender, recipients, body, attachments_summary, ...) + tsvector se vygeneruje sám. 3. Upsert (`ON CONFLICT (mailbox, message_id) DO UPDATE`). ## Inkrementální logika Pokud `(mailbox, message_id)` už je v PG a: - `extractor_version == EXTRACTOR_VERSION` (aktuálně `1.2`) - `ok = true` - `modified_at` v Mongo není novější než v PG → **skip**. Nemusíš se bát opakovaného spuštění — vladimirovo přepsání 73k záznamů co teď probíhá je proto, že `EXTRACTOR_VERSION` byl povýšen z 1.1 → 1.2, takže všechny řádky v PG jsou „zastaralé". Po doběhnutí bude další běh skipovat všechno až na nově přibyvší. ## Změny v1.3 vs v1.2 - **Bugfix** `NON_MAILBOX_COLLECTIONS = {"attachments_index", "sync_state"}` — předtím `sync_state` (přibyla s delta syncem) projížděla jako mailbox. - **`--index-reset`** — před zpracováním schránky `DELETE FROM emails WHERE mailbox=%s`. Force re-extract bez nutnosti povyšovat verzi. - **Vylepšený per-mailbox header** — ukáže `v Mongu N, v PG M (uptodate K), k zpracovani K`. - Když `to_process_estimate == 0` → schránku přeskočí úplně (bez iterace cursorem). ## Argumenty | Argument | Povinný | Hodnoty | Default | Popis | |---|---|---|---|---| | `--mailbox` | ne | e-mail | (všechny) | Bez argumentu projede všechny kolekce mimo `NON_MAILBOX_COLLECTIONS` | | `--limit N` | ne | int | (bez limitu) | Per schránka, jen prvních N emailů (test) | | `--index-reset` | ne | flag | false | Před zpracováním **smaže** všechny emaily dané schránky v PG. **Bez `--mailbox` smaže CELÝ index!** | ## Varianty volání ```bash # Všechny schránky, inkrementální: docker exec -it python-runner python /scripts/5_enrich_fulltext_emails_v1.3.py # Jedna schránka: docker exec -it python-runner python /scripts/5_enrich_fulltext_emails_v1.3.py --mailbox ordinace@buzalkova.cz # Test 500 emailů: docker exec -it python-runner python /scripts/5_enrich_fulltext_emails_v1.3.py --mailbox ordinace@buzalkova.cz --limit 500 # Force reindex jedné schránky: docker exec -it python-runner python /scripts/5_enrich_fulltext_emails_v1.3.py --mailbox ordinace@buzalkova.cz --index-reset # DANGEROUS: smaže celý index a postaví znovu (POMALÉ — typicky 30+ minut): docker exec -it python-runner python /scripts/5_enrich_fulltext_emails_v1.3.py --index-reset # Na pozadí, log do souboru: docker exec -d python-runner bash -c "python /scripts/5_enrich_fulltext_emails_v1.3.py > /scripts/enrich_fulltext.log 2>&1" ``` ## Sledování průběhu ```bash docker exec -it python-runner tail -f /scripts/enrich_fulltext.log ``` V průběhu skript vypisuje každých 200 zpracovaných emailů: ``` [ 38800|p= 5800] OK html 2831ch | CLEAR/RA payment information for invoice #22FV049 ``` - první číslo = pozice v cursoru (počet všech emailů co prošlo) - `p=N` = počet skutečně zprocesovaných (zbytek byl skipnut jako už-aktuální) - `OK / ERR`, `body_source`, délka, subject ## Závislosti ```bash docker exec python-runner pip install psycopg[binary] beautifulsoup4 lxml pymongo ```