Skip to content

Releases: sniner/mailvault

v0.7.0

Choose a tag to compare

@github-actions github-actions released this 01 Aug 16:28

Breaking changes

  • YAML configuration files are no longer supported. TOML is the only configuration format;
    pyyaml is gone from the dependencies. A YAML config now fails with a clear parse error
    instead of being loaded. Migration: convert the flat job-name: {...} mapping into one
    [[job]] table per job, with the former key as name

Changed

  • A broken or missing configuration file now reports a single error line naming the file
    and the problem, instead of dumping a traceback. Errors from the mailbox connection itself
    are still logged in full

  • The configuration file name no longer matters: its content is always parsed as TOML, so a
    config may be called backup.job or anything else. copy previously rejected every file not
    named *.toml -- that restriction is gone, and copy accepts the same files as every other
    command

  • mailvault is now on PyPI: install it with uv tool install mailvault (or pipx install
    / pip install) instead of pulling from the Git repository. The old name imapbackup was
    already taken on PyPI; mailvault was free, which is part of why the project was renamed.
    The package now carries the metadata a PyPI release needs (README as description,
    GPL-3.0-or-later license, project URLs) and is built with the uv_build backend

v0.6.0

Choose a tag to compare

@github-actions github-actions released this 31 Jul 23:21

Breaking changes

  • The project was renamed from imapbackup to mailvault. Same tool, new name -- the
    PyPI name imapbackup was taken and the project now covers more than IMAP. The import
    package is renamed imapbackup -> mailvault. To keep the old ib-* commands, pin to the
    last pre-rename release, v0.5.0

  • A single mailvault command replaces the three ib-mailbox / ib-archive / ib-copy
    tools.
    The subcommands map directly:

    • ib-mailbox folders|backup|verify -> mailvault folders|backup|verify
    • ib-copy copy [--idle] -> mailvault copy [--idle]; ib-copy folders -> mailvault copy --list-folders
    • ib-archive <sub> -> mailvault archive <sub>, with db-from-archive renamed to rebuild-db

    Global options are unified across all commands (-v/--verbose, -q/--quiet, --log-file,
    --config, --allow-exec, --job) and must precede the command. The Windows build now
    ships a single mailvault.exe instead of three ib-*.exe

Changed

  • The Microsoft Graph backend is now a core dependency (msal, httpx), no longer an
    optional graph extra. Microsoft 365 is a first-class mailbox source, so mailvault always
    ships with Graph support. The mailvault[graph] install variant no longer exists -- install
    mailvault plainly

  • Job configuration is validated up front: an unknown backend value, or a msgraph job
    missing tenant_id / client_id / client_secret, now fails immediately with a clear error
    naming the job. Previously an unknown backend silently fell back to IMAP and missing Graph
    credentials only surfaced deep in the backend

  • copy --idle now reports a clear error when the source mailbox is not an IMAP backend,
    instead of failing later with an internal error. IDLE is an IMAP-only feature

Fixed

  • Message-ID matching: a malformed Message-ID such as <> no longer crashes a run on
    Python 3.11/3.12, where CPython's email header parser raises IndexError on such values.
    The value is now treated as unusable (empty key), consistent with the behaviour on 3.13+

v0.5.0

Choose a tag to compare

@github-actions github-actions released this 31 Jul 18:40

Breaking changes

  • Minimum Python is now 3.11 (was 3.10). TOML configuration relies on the standard-library
    tomllib, which only exists from 3.11 on; on 3.10 TOML configs never worked and only YAML was
    usable. Dropping 3.10 removes that split. Migration: run imapbackup under Python 3.11 or newer

Fixed

  • ib-archive: stats, addresses and import now see zstd-compressed archives. Previously
    they only matched plain .eml files, so an archive written with --compress (files ending in
    .eml.zst) was reported as empty and could not be used as an import source
  • ib-copy: a configuration in which a job omits role no longer crashes the role lookup
  • ib-mailbox (exchange_journal + delete_after_export): a message that is not a journal item
    is no longer deleted from the server while being skipped. Without an error_folder such a
    message is now kept on the server instead of being removed unarchived

Changed

  • CLI: ib-mailbox, ib-archive and ib-copy now exit with a non-zero status when a job or
    operation fails, so cron jobs and scripts can detect failures
  • CLI: all three tools gained a --version flag
  • ib-archive: the default log level is now INFO, consistent with ib-mailbox and
    ib-copy (was WARNING)

v0.4.0

Choose a tag to compare

@github-actions github-actions released this 29 Jul 15:48

Added

  • ib-mailbox verify: compare a mailbox against its local archive and report messages that
    the server still holds but the archive is missing. Matching is done by Message-ID and only
    needs the folder listing, so checking a large mailbox takes minutes instead of the hours a
    full re-download would. With --repair the missing messages are fetched and added to the
    archive. Requires a job with with_db = true; not available for exchange_journal jobs,
    where the archived message and the server's journal envelope carry different Message-IDs.
    Malformed Message-IDs and the length cap Exchange applies to the ones it reports are
    accounted for, so a repaired archive verifies as complete instead of reporting the same
    messages again on every run

  • max_retries job option (default 5): how often a failed request to the MS Graph API is
    retried

Fixed

  • MS Graph backend: transient HTTP failures (429, 500, 502, 503, 504, 408) and
    connection/timeout errors are now retried with exponential backoff, honouring the
    Retry-After header. Previously any such failure made the affected message be skipped
    silently, which regularly cost single messages during long export runs

  • Incremental backups no longer hide failed downloads. The snapshot date is only advanced
    when every message of a folder was archived. Previously it advanced regardless, so messages
    lost to a failed download fell outside the date filter of every later run and were never
    picked up again. Existing archives with such gaps can be repaired with ib-mailbox verify --repair

  • ib-mailbox: a job that fails no longer prevents the remaining jobs of a config file
    from running

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 28 Mar 19:50

Full Changelog: v0.2.1...v0.3.0

v0.2.1

Choose a tag to compare

@github-actions github-actions released this 21 Feb 01:55

Full Changelog: v0.2.0...v0.2.1

v0.2.0

Choose a tag to compare

@github-actions github-actions released this 20 Feb 21:03

Full Changelog: v0.1.2...v0.2.0