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:
+6
-14
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user