Files
janssen/Python-runner/5_enrich_fulltext_emails_v1.3.md
T
2026-06-05 21:21:30 +02:00

3.6 KiB

5_enrich_fulltext_emails_v1.3.py

Krok 5 pipeline — vytáhne plain-text z emailů v Mongu (emaily.<schránka>) 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í

# 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

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

docker exec python-runner pip install psycopg[binary] beautifulsoup4 lxml pymongo