Releases: sniner/mailvault
Release list
v0.7.0
Breaking changes
- YAML configuration files are no longer supported. TOML is the only configuration format;
pyyamlis gone from the dependencies. A YAML config now fails with a clear parse error
instead of being loaded. Migration: convert the flatjob-name: {...}mapping into one
[[job]]table per job, with the former key asname
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 calledbackup.jobor anything else.copypreviously rejected every file not
named*.toml-- that restriction is gone, andcopyaccepts the same files as every other
command -
mailvaultis now on PyPI: install it withuv tool install mailvault(orpipx install
/pip install) instead of pulling from the Git repository. The old nameimapbackupwas
already taken on PyPI;mailvaultwas 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 theuv_buildbackend
v0.6.0
Breaking changes
-
The project was renamed from
imapbackuptomailvault. Same tool, new name -- the
PyPI nameimapbackupwas taken and the project now covers more than IMAP. The import
package is renamedimapbackup->mailvault. To keep the oldib-*commands, pin to the
last pre-rename release, v0.5.0 -
A single
mailvaultcommand replaces the threeib-mailbox/ib-archive/ib-copy
tools. The subcommands map directly:ib-mailbox folders|backup|verify->mailvault folders|backup|verifyib-copy copy [--idle]->mailvault copy [--idle];ib-copy folders->mailvault copy --list-foldersib-archive <sub>->mailvault archive <sub>, withdb-from-archiverenamed torebuild-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 singlemailvault.exeinstead of threeib-*.exe
Changed
-
The Microsoft Graph backend is now a core dependency (
msal,httpx), no longer an
optionalgraphextra. Microsoft 365 is a first-class mailbox source, somailvaultalways
ships with Graph support. Themailvault[graph]install variant no longer exists -- install
mailvaultplainly -
Job configuration is validated up front: an unknown
backendvalue, or amsgraphjob
missingtenant_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 --idlenow 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 raisesIndexErroron such values.
The value is now treated as unusable (empty key), consistent with the behaviour on 3.13+
v0.5.0
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: runimapbackupunder Python 3.11 or newer
Fixed
ib-archive:stats,addressesandimportnow see zstd-compressed archives. Previously
they only matched plain.emlfiles, so an archive written with--compress(files ending in
.eml.zst) was reported as empty and could not be used as an import sourceib-copy: a configuration in which a job omitsroleno longer crashes the role lookupib-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 anerror_foldersuch a
message is now kept on the server instead of being removed unarchived
Changed
- CLI:
ib-mailbox,ib-archiveandib-copynow 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
--versionflag ib-archive: the default log level is nowINFO, consistent withib-mailboxand
ib-copy(wasWARNING)
v0.4.0
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--repairthe missing messages are fetched and added to the
archive. Requires a job withwith_db = true; not available forexchange_journaljobs,
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_retriesjob 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-Afterheader. 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 withib-mailbox verify --repair -
ib-mailbox: a job that fails no longer prevents the remaining jobs of a config file
from running