Extract shared mail routing and IMAP folder helpers

Prompt since previous commit: execute step 1

Centralized route targets, source-folder policy, and modified UTF-7 mailbox quoting. Verification: py_compile, route/folder consistency, and git diff --check passed.
This commit is contained in:
2026-07-04 12:23:14 +02:00
parent 537c87e472
commit eb53bc123a
8 changed files with 329 additions and 522 deletions
+6 -14
View File
@@ -24,6 +24,7 @@ import time
import config
from pathlib import Path
from datetime import datetime, timezone
from imap_utils import list_folders, quote_mailbox
LOG_FILE = Path(__file__).parent / "backup_log.json"
@@ -33,13 +34,6 @@ SKIP_MAPPEN = {"INBOX.Trash", "INBOX.Spam"}
# ── helpers ───────────────────────────────────────────────────────────────────
def parse_folder_name(raw: bytes) -> str | None:
decoded = raw.decode("utf-8", errors="replace")
m = re.match(r'\(.*?\)\s+".*?"\s+(.*)', decoded)
if m:
return m.group(1).strip().strip('"')
return None
def parse_flags(flag_str: str) -> list[str]:
"""Haal standaard IMAP-vlaggen op uit fetch-response."""
@@ -60,7 +54,7 @@ def parse_internaldate(response: bytes) -> str | None:
def haal_bestaande_message_ids(mail: imaplib.IMAP4_SSL, folder: str) -> set[str]:
"""Geef alle Message-IDs terug die al in een doelmap staan."""
status, data = mail.select(f'"{folder}"', readonly=True)
status, data = mail.select(quote_mailbox(folder), readonly=True)
if status != "OK" or int(data[0]) == 0:
return set()
@@ -100,7 +94,7 @@ def kopieer_map(
Geeft (gekopieerd, overgeslagen) terug.
"""
# Selecteer bronmap
status, data = bron.select(f'"{folder}"', readonly=True)
status, data = bron.select(quote_mailbox(folder), readonly=True)
if status != "OK":
print(f" Kan bronmap niet openen: {folder}")
return 0, 0
@@ -116,7 +110,7 @@ def kopieer_map(
ids = data[0].split()
# Zorg dat doelmap bestaat
doel.create(f'"{folder}"') # negeer fout als al bestaat
doel.create(quote_mailbox(folder)) # negeer fout als al bestaat
# Welke Message-IDs staan al in de doelmap?
bestaande = haal_bestaande_message_ids(doel, folder)
@@ -166,7 +160,7 @@ def kopieer_map(
# Schrijf naar doelmap
flag_str = "(" + " ".join(flags) + ")" if flags else "()"
status, _ = doel.append(
f'"{folder}"',
quote_mailbox(folder),
flag_str,
internaldate,
raw_message,
@@ -242,9 +236,7 @@ def run():
sys.exit(1)
# Mappenlijst van bron
status, raw_folders = bron.list()
alle_mappen = [parse_folder_name(f) for f in raw_folders if f]
alle_mappen = [f for f in alle_mappen if f and f not in SKIP_MAPPEN]
alle_mappen = [folder for folder in list_folders(bron) if folder not in SKIP_MAPPEN]
alle_mappen.sort()
log = load_log()