Initial commit
Claude has done a lot of work, but there are still some errors which cause the mails to be distributed to wrong mail boxes. I am now going to let codex and claude compete. They will have their own branches and merge to main as soon as we are somewhere where we can switch AI.
This commit is contained in:
@@ -0,0 +1,162 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Centrale configuratie voor alle mailcat-scripts.
|
||||
|
||||
Setup: python3 config.py --setup
|
||||
Gebruik in andere scripts:
|
||||
import config
|
||||
cfg = config.load() # leest --account uit sys.argv, anders actief account
|
||||
mail.login(cfg.username, cfg.password)
|
||||
|
||||
Wisselen van account zonder config te wijzigen:
|
||||
python3 maak_mappen.py --account backup
|
||||
python3 verplaats_bestaand.py --account backup --uitvoeren
|
||||
"""
|
||||
|
||||
import json
|
||||
import sys
|
||||
import getpass
|
||||
from pathlib import Path
|
||||
from dataclasses import dataclass
|
||||
|
||||
CONFIG_FILE = Path(__file__).parent / "config.json"
|
||||
|
||||
|
||||
@dataclass
|
||||
class Account:
|
||||
name: str
|
||||
username: str
|
||||
password: str
|
||||
imap_host: str
|
||||
imap_port: int
|
||||
smtp_host: str
|
||||
smtp_port: int
|
||||
sieve_host: str
|
||||
sieve_port: int
|
||||
|
||||
|
||||
def load(account_name: str | None = None) -> Account:
|
||||
"""
|
||||
Laad het opgegeven account (of het actieve account uit config.json).
|
||||
account_name kan ook via --account <naam> op de commandoregel worden opgegeven.
|
||||
"""
|
||||
# --account vlag heeft prioriteit boven argument
|
||||
args = sys.argv[1:]
|
||||
if "--account" in args:
|
||||
idx = args.index("--account")
|
||||
if idx + 1 < len(args):
|
||||
account_name = args[idx + 1]
|
||||
|
||||
if not CONFIG_FILE.exists():
|
||||
print("Geen config gevonden. Draai eerst: python3 config.py --setup")
|
||||
sys.exit(1)
|
||||
|
||||
raw = json.loads(CONFIG_FILE.read_text(encoding="utf-8"))
|
||||
|
||||
name = account_name or raw.get("active", "")
|
||||
if not name:
|
||||
print("Geen actief account ingesteld. Gebruik --account <naam> of stel 'active' in config.json in.")
|
||||
sys.exit(1)
|
||||
|
||||
accounts = raw.get("accounts", {})
|
||||
if name not in accounts:
|
||||
beschikbaar = ", ".join(accounts.keys())
|
||||
print(f"Account '{name}' niet gevonden. Beschikbaar: {beschikbaar}")
|
||||
sys.exit(1)
|
||||
|
||||
acc = accounts[name]
|
||||
return Account(
|
||||
name = name,
|
||||
username = acc["username"],
|
||||
password = acc["password"],
|
||||
imap_host = raw.get("imap_host", "australius.nl"),
|
||||
imap_port = raw.get("imap_port", 993),
|
||||
smtp_host = raw.get("smtp_host", "australius.nl"),
|
||||
smtp_port = raw.get("smtp_port", 587),
|
||||
sieve_host = raw.get("sieve_host", "australius.nl"),
|
||||
sieve_port = raw.get("sieve_port", 4190),
|
||||
)
|
||||
|
||||
|
||||
def active_account_name() -> str:
|
||||
"""Geef de naam van het actief te gebruiken account (voor weergave)."""
|
||||
args = sys.argv[1:]
|
||||
if "--account" in args:
|
||||
idx = args.index("--account")
|
||||
if idx + 1 < len(args):
|
||||
return args[idx + 1]
|
||||
if CONFIG_FILE.exists():
|
||||
raw = json.loads(CONFIG_FILE.read_text(encoding="utf-8"))
|
||||
return raw.get("active", "?")
|
||||
return "?"
|
||||
|
||||
|
||||
# ── setup ─────────────────────────────────────────────────────────────────────
|
||||
|
||||
def setup():
|
||||
"""Interactief: voeg een account toe of wijzig een bestaand account."""
|
||||
raw: dict = {}
|
||||
if CONFIG_FILE.exists():
|
||||
raw = json.loads(CONFIG_FILE.read_text(encoding="utf-8"))
|
||||
|
||||
raw.setdefault("imap_host", "australius.nl")
|
||||
raw.setdefault("imap_port", 993)
|
||||
raw.setdefault("smtp_host", "australius.nl")
|
||||
raw.setdefault("smtp_port", 587)
|
||||
raw.setdefault("sieve_host", "australius.nl")
|
||||
raw.setdefault("sieve_port", 4190)
|
||||
raw.setdefault("accounts", {})
|
||||
|
||||
print("─" * 50)
|
||||
print("Mailcat account setup")
|
||||
print("─" * 50)
|
||||
|
||||
bestaande = list(raw["accounts"].keys())
|
||||
if bestaande:
|
||||
print(f"Bestaande accounts: {', '.join(bestaande)}")
|
||||
|
||||
naam = input("\nAccountnaam (bijv. hans of backup): ").strip()
|
||||
if not naam:
|
||||
print("Afgebroken.")
|
||||
return
|
||||
|
||||
huidig = raw["accounts"].get(naam, {})
|
||||
huidig_user = huidig.get("username", "")
|
||||
|
||||
username = input(f"E-mailadres [{huidig_user}]: ").strip() or huidig_user
|
||||
password = getpass.getpass("Wachtwoord: ")
|
||||
|
||||
raw["accounts"][naam] = {"username": username, "password": password}
|
||||
|
||||
# Vraag of dit het actieve account moet zijn
|
||||
huidig_actief = raw.get("active", "")
|
||||
instellen = input(f"\nDit als actief account instellen? (huidig: {huidig_actief or 'geen'}) [J/n]: ").strip().lower()
|
||||
if instellen != "n":
|
||||
raw["active"] = naam
|
||||
|
||||
CONFIG_FILE.write_text(json.dumps(raw, indent=2, ensure_ascii=False), encoding="utf-8")
|
||||
CONFIG_FILE.chmod(0o600)
|
||||
print(f"\n✓ Account '{naam}' opgeslagen. Actief: {raw['active']}")
|
||||
print(f" Config: {CONFIG_FILE}")
|
||||
|
||||
if len(raw["accounts"]) > 1:
|
||||
print(f"\nWisselen: voeg --account <naam> toe aan elk script.")
|
||||
print(f" Bijv: python3 maak_mappen.py --account backup")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
if "--setup" in sys.argv:
|
||||
setup()
|
||||
else:
|
||||
# Toon huidige status
|
||||
if not CONFIG_FILE.exists():
|
||||
print("Geen config. Draai: python3 config.py --setup")
|
||||
else:
|
||||
raw = json.loads(CONFIG_FILE.read_text(encoding="utf-8"))
|
||||
actief = raw.get("active", "?")
|
||||
accounts = list(raw.get("accounts", {}).keys())
|
||||
print(f"Actief account : {actief}")
|
||||
print(f"Alle accounts : {', '.join(accounts)}")
|
||||
print(f"IMAP : {raw.get('imap_host')}:{raw.get('imap_port')}")
|
||||
print(f"\nSetup: python3 config.py --setup")
|
||||
print(f"Wisselen in script: python3 <script>.py --account <naam>")
|
||||
Reference in New Issue
Block a user