Alle wesentlichen Änderungen an diesem Projekt werden hier dokumentiert. Format basiert auf Keep a Changelog.
- Discoverability, README-Design & SEO Check (2026-07-30): Added
organization: doc-bricks& Python version shields toREADME.mdandREADME-DE.md, updatedpyproject.tomlkeywords (gmail,imap,mailbox-cleaner,pyside6,windows) & URLs (Documentation,Changelog), verified 65 Pytest unit tests. - open-bricks ecosystem badges and
llms.txtcallout notes added toREADME.mdandREADME-DE.mdfor enhanced Discoverability and machine-readable indexing - Source-platform smoke (
tests/source_platform_smoke.py) for macOS and Linux with GitHub Actions CI on ubuntu-latest and macos-latest (PySide6 offscreen, 6 checks) - Gmail cleanup rules now run against Gmail API accounts in addition to IMAP accounts
- Large-mail scan, delete, and undo now work for Gmail API accounts
- Large-item scan now optionally includes Google Drive files for Gmail API accounts
- Regression tests for Gmail backend routing, Gmail service helpers, and scheduler behavior
- Secrets-free profile export/import for
universalmailcleaner-profile-v1.json pyproject.tomlwith setuptools metadata, GUI entry point, and shared pytest/Ruff configuration
- German community and contribution documentation now consistently uses UTF-8 umlauts;
llms.txtrecords the current repository-hygiene review date. - Large-mail account selection now includes Gmail API accounts
- Folder selection dialog is limited to IMAP accounts because Gmail rules do not use IMAP folders
- IMAP large-mail deletion now respects the original folder of each selected mail
- Gmail OAuth now requests full Drive access and discards cached tokens that only have the old read-only Drive scope
- Google client libraries are now imported lazily so IMAP-only setups still start even when the optional Gmail packages are not installed
- README copy, screenshot alt text, app title, and discovery metadata now describe UniversalMailCleaner as a local-first Gmail and IMAP cleanup app
- README and
llms.txtnow include clearer start points and search/disambiguation wording for Gmail cleanup, IMAP mailbox cleanup, large-mail finding, and local-first Windows mail management - README, README-DE, and
llms.txtnow include exactdoc-bricks/UniversalMailCleanersearch anchors and clearer disambiguation from anti-spam gateways, mailing-list cleaners, unsubscribe services, and browser-only Gmail extensions - Scan settings, selected IMAP target folders, and scheduler exchange settings now persist in the desktop config and portable profile
- CI: source-platform smoke workflow
paths:filter removed so the smoke now triggers on changes to any module (imap_client,models,gmail_service,profile_exchange), not just the main file mail_imap_cleaner_v1.pyexposesmain()so editable installs and GUI entry points can launch the existing desktop app without wrapper scripts
workers.py: IMAP large-mail scan, deletion, and undo now use UIDs withUIDVALIDITYepochs. Safe-mode deletion requires UIDPLUS before copying, verifies the completeCOPYUIDmapping, and every deletion uses UID-specificEXPUNGE, preventing unsafe references, orphaned copies, and unrelated expunges.imap_client.py/get_search_criteria: Guard against wildcard matches from empty or whitespace filter values (sender,subject), non-positive days (older_than_days <= 0), and non-positive sizes (size_mb <= 0), returningNoneinstead of generating queries that match all emails.workers.py/run_rules&scan_large: Safely handle[None]data payloads fromsearch()without raisingAttributeError.mail_imap_cleaner_v1.py: Die Einstellungen sind in der Hauptnavigation nicht mehr nur über ein einzelnes Zahnrad erreichbar; der Tab zeigt jetzt⚙ Einstellungenund erklärt den Bereich zusätzlich per Tooltip.mail_imap_cleaner_v1.py/closeEvent: Worker is now stopped beforesave_configto avoid a race condition on window close.mail_imap_cleaner_v1.py/save_config:OSErroris now caught so a failed config write doesn't crash the app.mail_imap_cleaner_v1.py/add_acc:keyring.set_passwordis now wrapped in try/except to handle missing or locked keyring backends gracefully.workers.py/Worker.__init__: Account list is now snapshotted as a copy, preventing cross-thread mutation with the GUI account list.mail_imap_cleaner_v1.py/run_worker: Staledata_readysignal is disconnected before the worker is replaced, avoiding the Qt signal-to-deleted-object crash.mail_imap_cleaner_v1.py/_run_label_service_task:LabelActionWorkeris now stored in an instance list to prevent it from being garbage-collected while running.imap_client.py/run_rules:imaplib.IMAP4.erroranddata is Noneguard added aroundsearch()to handle unexpected server responses.imap_client.py/scan_large: Sameimaplib.IMAP4.erroranddata is Noneguard added aroundsearch().workers.py/delete_items: Added interruption check and per-foldertry/exceptfor both IMAP and generic errors to avoid silent drop of remaining folders on partial failure.imap_client.py/list_folders: IMAPLISTresponse parser now handles both quoted and unquoted folder names (fixes folders containing spaces, e.g. ExchangeDeleted Items).imap_client.py/find_trash_folder: Same quoted/unquotedLISTparser applied so trash detection works on Exchange and non-standard IMAP servers.workers.py: guard against missingDateheader inscan_large(Noneslice raisedTypeError)profile_exchange.py: guard againstnullsettings inload_profile_payload(None or {}pattern)imap_client.py: escape backslashes in IMAP quoted strings per RFC 3501 to prevent broken search queriesgmail_service.py: persist refreshed OAuth token to disk so subsequent startups skip re-authentication
- Gmail API Backend als zweiter Account-Typ (google-auth-oauthlib)
- Scheduler-Tab für automatische periodische Bereinigung (QTimer)
- Statistiken-Tab: Gmail-Speicherverbrauch und Drive-Quota
- Labels-Tab: Gmail-Labels anzeigen, Mails nach Label löschen
- Multiple-Folder-Support für Regelausführung und Large-Mail-Scan
- Undo für Safe-Mode-Löschaktionen
- Folder-Auswahldialog im Regeln-Tab
- Modularisierung in
imap_client.py,models.pyundworkers.py - Logging-Level jetzt über
UMAIL_CLEANER_LOG_LEVELsteuerbar - README an aktuellen Funktionsstand angepasst
- IMAP-Injection-Schutz für FROM- und SUBJECT-Filter
- Mehrere generische
except-Stellen durch Logging und gezielteres Verhalten ersetzt
- Erstveröffentlichung / Initial release
- IMAP4_SSL Multi-Account-Management mit Keyring-Integration
- Regelbasiertes Aufräumsystem (Alter, Absender, Betreff, Größe)
- Safe-Mode (Papierkorb) und Unsafe-Mode (endgültig löschen)
- Großer-Mails-Scanner mit Sortierung
- Dark Theme (Qt-Stylesheet)
- Logging-Level konfigurierbar via UMAIL_CLEANER_LOG_LEVEL
- Unit-Tests für ImapService.get_search_criteria() (9 Tests)
- Docstrings und Type Hints für ImapService und Worker