Releases: ContinuMail/continumail-converter
Release list
v0.3.3 — Thunderbird exports, folders and all
Reliability release for Thunderbird folder exports and difficult real-world data.
Changed
- Thunderbird-starred messages now convert to a yellow Star category instead of Outlook follow-up flags, keeping duplicated IMAP labels out of the To-Do list.
Fixed
- Folder exports now discover extensionless Thunderbird mbox files and nested
.sbdhierarchies, preview the full folder tree, and preserve it in the PST. - Malformed address books, pathologically large messages, duplicate or invalid folder names, contact-only configurations, and pathological recurrence data no longer abort otherwise valid conversions.
- Existing PST output is protected from accidental overwrite, and
maxSizeMBis capped safely at 50 GB. - Desktop scan and conversion processes now shut down cleanly with the app, and cancellation force-stops an unresponsive engine after a short grace period.
Security
- Updated the bundled SQLite library to 2.1.12, outside the affected
<= 2.1.11advisory range, and synchronized the third-party attribution ledger.
Verified with the full Windows/Linux/macOS CI matrix, independent PST-reader validation, a clean public-clone build, and an install/scan/launch/uninstall test of the Windows installer.
ContinuMail Converter is free software provided as is. Keep backups of the source mail and validate the PST and conversion report before relying on the output. These early installer and CLI builds are not code-signed, so Windows SmartScreen or macOS Gatekeeper may show a warning.
Full changelog: https://github.com/ContinuMail/continumail-converter/blob/main/CHANGELOG.md
v0.3.2 — no folder left behind
Bug-fix release for large Thunderbird profiles.
Fixed
- Scanning a large Thunderbird profile no longer fails with "The filename or extension is too long. (os error 206)" (#66). The desktop app passed every discovered mail folder to the conversion engine as a command-line argument, so profiles with alot of mail folders could exceeded Windows' 32,767-character command-line limit and the scan couldn't start, regardless of how short the profile path was. The app now hands the folder list to the engine through a temporary file, via a new additive
scan --input-list <file>CLI flag (one path per line; combines with the existing repeatable--input).
Verified against a 400-folder reproduction that fails identically on 0.3.1 and scans/converts cleanly on this build.
Full changelog: https://github.com/ContinuMail/continumail-converter/blob/main/CHANGELOG.md
v0.3.1 — making scanpst stop yelling
Turns out when you write PST files from scratch, Microsoft's Inbox Repair Tool has opinions. This one's mostly me getting it to shut up — a bug-fix release, no new features.
The big one: PSTs larger than ~2 GB were failing scanpst.exe with hundreds of errors — a mangled allocation page (the FPMap, a deprecated structure nobody's supposed to care about, except scanpst apparently does) that only shows up once a file crosses ~2 GB. My earlier testing topped out at two-message stores, so this happily hid for weeks. A real 3.8 GB profile — mail, calendar, tasks, contacts — now scans with zero findings.
Also fixed:
- Converting an account whose folder is literally named "Deleted Items" no longer takes the whole run down with it. Your Gmail trash can finally come home.
- The desktop progress bar keeps up with the percentage now, instead of loitering 20% behind like it's got somewhere better to be.
- The Review screen shows your biggest folders first, so you're not scrolling past forty empty ones to find your inbox.
The full list is in the CHANGELOG.
Downloads
- ContinuMail Converter_0.3.1_x64-setup.exe — the Windows desktop app (installer; the GUI is Windows-only).
- mail2pst-cli-0.3.1-win-x64.exe — the command-line converter, Windows.
- mail2pst-cli-0.3.1-linux-x64 — the command-line converter, Linux.
- mail2pst-cli-0.3.1-osx-arm64 — the command-line converter, macOS (Apple Silicon).
The CLI binaries are single-file and self-contained — no .NET install needed.
Unsigned binaries — first-run steps
- Windows: SmartScreen may pop up → More info → Run anyway.
- Linux: you'll need
libicu(e.g.sudo apt install libicu-dev), thenchmod +xthe binary. - macOS:
xattr -dr com.apple.quarantine ./mail2pst-cli-0.3.1-osx-arm64 && chmod +x ./mail2pst-cli-0.3.1-osx-arm64. Heads up: the osx-arm64 binary is built and tested in CI only — it hasn't been run on a physical Mac.
SHA-256
9c0bd38bcbc7aefe7bd5b9ffd045183015f2e28ce618fd6899e431458758ae8b ContinuMail.Converter_0.3.1_x64-setup.exe
0d506b2c72382e2ddf1ca60eed22959f530f793264cd4163d9900d0b5268e2f4 mail2pst-cli-0.3.1-win-x64.exe
9a9c4e1f0b7c323e5f476f7d2d45b7b39546bbf84abc0ea2863196ab71d6637d mail2pst-cli-0.3.1-linux-x64
7402ab1cd1d2abb316a111095f3e05e1e375386e93e9420d4d6740009058c14c mail2pst-cli-0.3.1-osx-arm64
v0.3.0 — Calendars, contacts, tasks & baked-in category colours
This is a big one. ContinuMail started life mail-only — with 0.3.0 your Thunderbird calendar, to-dos and contacts come across too, at near-100% fidelity, at the click of a button. And your Outlook category colours are now baked straight into the PST.
What's new
- Contacts → PST. Address books become real Outlook contact cards — names, company and title, every phone number, home/business addresses, birthdays, websites, notes, and photos. Modern Thunderbird (
abook*.sqlite, read via vCard) and the legacy.mabbooks both work. - Calendar → PST. Events convert with timezone management, all-day handling, reminders, busy/free, attendees as proper meeting recipients, and recurring events (daily/weekly/monthly/yearly) — plus attachments and online-meeting links. I did a chunk of the timezone work in UTC+7 with my PC set to CEST, which I regret deeply, because screw timezones but that forced me to sort that out early on.
- Tasks (to-dos) → PST. Due and start dates, task completion and % complete, priority, reminders, recurrence, attachments.
- Custom tags & categories keep their colours. Mail tags and calendar/task categories are baked into every PST as your Outlook master category list, in the colours Thunderbird actually shows — no add-in, no COM, no separate step. One quirk worth knowing: Outlook only reads that list from your primary/default data store, so open the converted PST as your main store to see the colours. (Here's how it works.)
- PIM now routes per-account, like mail (desktop). Mail already split into one PST per account — now your calendars, contacts and tasks do too, landing in that account's own PST right alongside its mail instead of one undifferentiated lump.
Smaller stuff
- Fixed: folders whose names start or end with a dot (like
.Trash) used to get skipped — they convert now. - Removed: the old
import-colours/outlook-profilescommands and the one-click colour button. Colours live inside the PST now, so there's nothing extra to run.
The full, unabridged list is in the CHANGELOG.
Downloads
- ContinuMail Converter_0.3.0_x64-setup.exe — the Windows desktop app (installer; the GUI is Windows-only).
- mail2pst-cli-0.3.0-win-x64.exe — the command-line converter, Windows.
- mail2pst-cli-0.3.0-linux-x64 — the command-line converter, Linux.
- mail2pst-cli-0.3.0-osx-arm64 — the command-line converter, macOS (Apple Silicon).
The CLI binaries are single-file and self-contained — no .NET install needed.
Unsigned binaries — first-run steps
- Windows: SmartScreen may pop up → More info → Run anyway.
- Linux: you'll need
libicu(e.g.sudo apt install libicu-dev), thenchmod +xthe binary. - macOS:
xattr -dr com.apple.quarantine ./mail2pst-cli-0.3.0-osx-arm64 && chmod +x ./mail2pst-cli-0.3.0-osx-arm64. Heads up: the osx-arm64 binary is built and tested in CI only — it hasn't been run on a physical Mac.
SHA-256
976578f18af87ea004a0c37be161739b8162fc5119798e4dcab07a065105fc26 ContinuMail Converter_0.3.0_x64-setup.exe
3005f9bb56d09016b6bc46b64613d604a60658b6a51bafe90e54f9271a9cb2ec mail2pst-cli-0.3.0-win-x64.exe
bd5a1a03d667ff0cc0b563dff1a7a1af994d90b7c462c5515dc24f814e21d808 mail2pst-cli-0.3.0-linux-x64
932390775e4cd2a7bf711aef00999588dc5e233834bd29c2d791c644c85d019b mail2pst-cli-0.3.0-osx-arm64
v0.2.3 — cross-platform CLI
The command-line converter now runs on Linux and macOS, not just Windows — the engine is fully cross-platform, and prebuilt single-file CLI binaries ship for all three. The desktop app remains Windows-only for now.
Added
- Prebuilt CLI for Windows, Linux, and macOS (single-file, self-contained — no .NET install needed).
Changed
- The desktop app's conversion step starts faster: it reuses the message total from the scan it just ran instead of counting every mailbox a second time. (Direct CLI users: new
convert --expected-total <n>flag.)
Fixed
- Inline images that are also real attachments stay visible — a part referenced inline (CID) and present as an explicit attachment was being hidden and could go missing from the attachment list.
- More accurate size/count estimates for forwarded-as-attachment (
message/rfc822) messages duringscan. - Cancelling a conversion no longer leaves a stray temp file.
Downloads
- Desktop app (Windows 10/11):
ContinuMail Converter_0.2.3_x64-setup.exe(includes the CLI). - Command-line:
mail2pst-cli-0.2.3-win-x64.exe·-linux-x64·-osx-arm64.
Notes & disclaimers
- Binaries are not yet code-signed. Windows: SmartScreen may warn ("More info → Run anyway"). macOS: unsigned, so clear Gatekeeper quarantine —
xattr -dr com.apple.quarantine ./mail2pst-cli-0.2.3-osx-arm64. Linux: the self-contained runtime needs ICU (sudo apt install -y libicu-devon Debian/Ubuntu). - The
osx-arm64binary is built and CI-tested on macOS, but not yet run on bare-metal Apple hardware. - Free software, provided as is — please keep a backup of your originals and validate the output before relying on it.
SHA-256
a723de557e9502d5360ef0fd3e0caeabf417d555f0fa61de6edf356a6c5e48ab ContinuMail Converter_0.2.3_x64-setup.exe
36c46a30fe29a1f5ccf2715da346818da5bc5ba94e8af2075afeac9d90229904 mail2pst-cli-0.2.3-win-x64.exe
eff2990aa014c44f0c0e2d3eb13ed1a987ad17701db4c2fe1de63d0b7afcab1f mail2pst-cli-0.2.3-linux-x64
9c9270c8cdbc3699991f2bed38b371ab558572060471cdff88110da2da93e803 mail2pst-cli-0.2.3-osx-arm64
v0.2.2 — parallel scan
ContinuMail Converter 0.2.2
Parallel byte-range scan
The dry-run scan (CLI scan and the desktop app's pre-conversion scan) now parses each mailbox as several message-aligned byte ranges across CPU cores instead of one sequential pass.
- ~3–4× faster on large archives (a 4.5 GB Gmail export scans in ~13 s instead of ~47 s), with no slowdown on a single very large folder.
- Bounded, size-independent memory during a scan — large messages spill to a temp file rather than residing in memory, so scanning a multi-GB archive no longer grows memory with the file.
- Identical results — counts, size estimates, dates, and warnings are byte-for-byte unchanged from the previous scan.
Fixed
- "Import category colours" no longer hangs when the colours already exist in Outlook.
- Thunderbird
.msfreading no longer fails on a reparsed folder (the table-rebuild fragment is now folded into the real table, so flags/tags come across).
Install (Windows): download ContinuMail.Converter_0.2.2_x64-setup.exe below and run it.
v0.2.1
Added
- Thunderbird
.msfenrichment now preserves message priority set inside Thunderbird. A
priority a user or filter applied in Thunderbird is stored only in the.msf(not in the mbox
headers), so it was previously lost; it is now read and written to Outlook's importance. Priority
that arrived on the message's ownX-Priority/Importanceheader was already preserved. - Thunderbird
.msfenrichment now drops uncompacted dead copies. An un-compacted Thunderbird
folder can still hold old physical copies of messages it no longer shows; the converter now reads
each.msfrow's live mbox byte offset (storeToken, falling back tomsgOffset) and exports
only the messages Thunderbird still lists, so the PST matches the folder you see. Filtering
activates only when every live row maps to a real mbox message boundary — on any uncertainty it
keeps every message, so unique mail is never dropped.
Changed
- Writer: large attachments (≥ 16 MB) are now written by streaming. A single large attachment
previously caused writer-side peak memory to spike to a multiple of its size — the vendored
layer materialised the full payload in memory while building the data blocks. The attachment
data is now fed through a batched, bounded-residency pipeline, so the writer-side contribution
to peak memory stays bounded regardless of attachment size (verified end-to-end: resident block
count stays flat from 9 MB to 512 MB attachments). Small and medium attachments (< 16 MB) keep the
existingbyte[]path; output is byte-identical and is structure-validated by the independent
MS-PST reader (tools/pst-validate). Note: the mbox parser still materialises one message at a
time, so total process memory for a single multi-GB attachment remains parser-bound — removing
that end-to-end ceiling is separate, future work. - Writer: PST files are now built from scratch via
PSTFile.CreateEmptyStore()instead of
copying a pre-seeded blank seed file. The blank-seed asset, the seed-extraction helper,
and the dev-only seed-regeneration tool have been retired;PstWriter,PstPartManager,
andConversionRunnerno longer accept or require a seed file path. - Writer: large folders convert dramatically faster. Adding a message was effectively
O(n²) in the folder's message count — the vendored heap allocator located free space with
a linear block scan that grew as a folder filled — so very large single folders slowed down
progressively. The allocator now uses a maintained best-fit free-space index, keeping
per-message cost flat. A ~16,000-message folder that took ~70 s now takes ~40 s; output
validity is unchanged (verified against an independent MS-PST reader). - Thunderbird enrichment is far quieter on real profiles. Two harmless internal conditions no
longer raise per-folder warnings: (1) an empty folder (whose.msfhas no message table) is
now treated as "no messages" instead of an unreadable-.msfwarning; (2) the dead-copy
live-offset filter declining to run — the common, expected case for IMAP accounts, whose.msf
rows usually carry no usable byte offset — is now silent. In both cases behaviour is unchanged
(every message is still exported and flags/tags still applied); only the noise is gone. A genuinely
corrupt.msf, and an ambiguous multi-table.msf, still warn. The aggregate filter-disabled count
remains in the conversion report for diagnostics.
Fixed
- Writer: a failed split (e.g. the next part can't be created mid-conversion) no longer
deletes the already-completed previous part or leaves a stray blank part behind; the
failure still surfaces as fatal, but completed output is preserved. - Writer: a message carrying an attachment larger than a PST attachment can store
(PidTagAttachSize is a 32-bit value) is now skipped and reported instead of writing a
wrapped size or risking an out-of-memory load of the whole attachment. - Desktop: the per-run temp config file is now removed if the conversion engine fails to
launch (sidecar missing or spawn error), instead of being left behind in the temp directory.
ContinuMail Converter v0.2.0 — Thunderbird profile conversion
Major feature enrichments — and a hard-won grudge against Mozilla Mork — ship with 0.2.0. The
headline is Thunderbird profile conversion.
ContinuMail Converter now reads Thunderbird's .msf / Mork metadata. Point it at a profile and
your full folder and subfolder tree comes across — and the per-message state the mbox alone throws
away (read/unread, stars, replied/forwarded flags, junk, and tags) is translated into native
MAPI properties (PID tags) and shows up natively in Outlook. Tags become Outlook categories
under your real Thunderbird tag names. It's paired with a scan-for-profiles step that
automatically matches every mail account and local archive with its .msf sidecar — no hunting for
files. This resolves the v0.1.2 "Thunderbird flags/starred not preserved" and "tags unsupported"
limitations for live-profile conversions.
New in 0.2.0 (CLI + GUI)
- Thunderbird
.msf/ Mork enrichment — read/unread, replied, forwarded, starred (→ follow-up
flag), junk, and tags, recovered from a live profile and written as native MAPI properties.
Degrades gracefully: an unreadable or mismatched.msfis skipped per-source and reported, never
fatal. - Tags → Outlook categories using your real tag display-names from
prefs.js(non-ASCII included). - Scan for profiles — auto-discovers Thunderbird profiles and pairs every mail account and local
archive with its.msfsidecar; per-account detection (email / host) included. - Multi-account → one PST per account by default (each account a top-level folder), with a
"Combine into a single PST" toggle. - Junk handling — leave / tag as a "Junk" category / move to a Junk Email folder.
- Drop expunged messages — optionally skip mail Thunderbird marked deleted but hasn't compacted
out yet. - Outlook category colours —
import-colours(CLI) and a one-click card on the Done screen (GUI)
push your Thunderbird tag colours into Outlook so the categories match.
On category colours and COM: category assignments live in the PST as MAPI properties (PID tags)
and need no Outlook. The Master Category List — the names-and-colours registry Outlook draws from
— does not live in the PST and can't be written from PID tags, so colour import drives Outlook
over COM to edit the CategoryList FAI message atomically (Windows only; Outlook installed and
closed). A --plan-file mode applies a previewed plan without re-scanning.
Hardening, security & other changes
- Mork reader — nested folders no longer read as empty. Real
.msffiles reuse a small numeric
table id across scopes; tables are now keyed by the composite (scope, id), so enrichment no longer
silently finds zero messages on real profiles. - Mork reader — wider charset support (windows-1252, Shift-JIS, Big5, EUC-JP, via the runtime
code-page provider) and more robust column-dictionary detection. import-coloursfixes — correct bytes for non-ASCII categories (e.g. "ÆØÅ"); only shuts down an
Outlook instance it actually started; excludes theNonJunkpseudo-tag from candidates.- More mbox
X-Mozilla-Statusflags even without a profile — replied / forwarded / starred added
to read/unread (POP / older Local Folders stores; no effect on flag-less IMAP/EWS exports) (#7). - Faster large-folder writes — per-folder
SaveChangesis batched at checkpoints instead of after
every message. No behaviour change. - GUI polish — real source count on the Scanning screen (was "0 files"); one box per account on
the Source step (was "first@x +N more"); full-height rail with no sideways scroll; multi-account
defaults to split; stepper Back-navigation reaches the Accounts step. - Security — the vendored multi-string deserializer validates its item count with unsigned
arithmetic against the buffer length before casting, turning a malformed/oversized count into a
cleanInvalidDataExceptioninstead ofOverflowException/OutOfMemoryException.
Known limitations
.msfenrichment needs a live profile (the mbox plus its sibling.msf). A bare exported
.mboxstill imports as before — only inlineX-Mozilla-Statusflags are recoverable, not
tags / junk / expunged state.import-coloursis Windows-only and needs Outlook installed and closed. Conversion itself still
requires no Outlook — only tag colours do.
Internal
- New from-scratch, read-only Mork (
.msf) reader (src/Mail2Pst.Core/Mork/) with enrichment
built on top (src/Mail2Pst.Core/Msf/); extensive unit + env-gated real-corpus tests. - Pure, COM-free, unit-tested category-colour XML/stream helpers extracted from the colour-import path.
- Desktop helper extractions (account grouping, PST-name sanitization/de-dup, output-path join,
discovery parsing) and the single public-primary repo migration with aleak-checksafety net.
v0.1.2
[0.1.2] — 2026-06-18
A feature + hardening release. The headline is Thunderbird subfolder (.sbd) support — a new
CLI discover command that reconstructs a nested folder tree from a Thunderbird mail directory and
converts it to nested PST folders. This is currently CLI-only; the desktop app does not yet expose
it. The rest of the release is correctness, security, and robustness work that benefits everyone,
desktop users included.
Added
- Thunderbird
.sbdnested-folder support (CLI). A newdiscovercommand walks a mail-files
directory (e.g. a Thunderbird "Local Folders" or account directory), reconstructs the nested tree
from Thunderbird's<name>+ sibling<name>.sbd/layout, and emits a JSON source list with an
explicit nestedtargetFolderPathper source. Feeding that intoconvertproduces a PST with the
folder hierarchy preserved. A plain directory of.mboxfiles still works as before. - Nested folder paths in config.
convertsources accept atargetFolderPatharray (e.g.
["Inbox","Archive","2026"]) to place mail into nested PST folders; the engine creates the full
path on demand. The existingtargetFolderstring remains single-segment shorthand. schemaVersionon every CLI JSON event so consumers can detect contract changes; the desktop
app checks it permissively.
Changed
- CLI project/binary renamed
mbox2pst→mail2pst(sidecarmail2pst-cli). The product name
(ContinuMail Converter) is unchanged; this only affects anyone invoking the CLI by its old name. - PST size-splitting is now predictive — a part splits before a message would cross the cap,
rather than only at a periodic checkpoint (which could overshoot a small custom cap). - Desktop app now uses a restrictive, local-only Content-Security-Policy (previously unset).
Fixed
- NDR/bounce phantom attachment (KB-001). Bounce notifications no longer surface a phantom
embedded-message attachment in Outlook, regardless of how deeply themultipart/reportis nested. - Stricter, cross-platform output-name validation — reserved names, trailing space/period, and
platform-invalid characters are rejected up front (#17). - Envelope-postmark validation — the
Fromboundary validates the day-of-week and month, so a
body line that merely looks like a postmark can't cause a mis-split (#2). - More accurate (component-aware) split-cap size estimate, so very large messages split correctly (#4).
- A permission-denied source is skipped and reported instead of crashing the run; an empty sender
address no longer fails a write; a config/output-dir setup failure emits a fatal JSON error instead
of a bare crash; the mbox parse enumerator is disposed promptly on early exit.
Known limitations
- Thunderbird read/unread & starred state is not preserved. Thunderbird stores per-message flag
state in its.msfindex, not the mbox, so an mbox-based conversion cannot recover it (messages
generally import as read & unflagged). Read/unread is preserved for archives whose mbox carries
realX-Mozilla-Statusflags. (KB-002.)
Internal
- New format-agnostic round-trip integration test harness (parse → write → PST read-back →
compare), CI on every push/PR, and Dependabot. The PST writer and MIME mapping were
decomposed for maintainability. No behaviour change.
v0.1.1
A post-launch correctness and robustness release. The headline is a data-loss fix:
some mbox files could silently merge messages. Upgrading is recommended.
Fixed
- Silent message loss on mbox files without blank separators. A message boundary was
previously only detected after a blank line, so two messages joined without one were merged
into a single message — losing the second. Boundary detection now also recognizes the
envelope ("From ") postmark line by its asctime shape. Validated against a real corpus of
45,000+ messages with zero over-splitting. - Body corruption on mboxrd archives (e.g. Gmail Takeout). Body lines beginning with
Fromare stored escaped as>From; these are now un-escaped so message text round-trips
exactly. - Desktop app could hang at the end of a conversion. The terminal
doneevent could be
dropped when the engine exited quickly; the convert output is now buffered with an exit
fallback so the UI always finishes.
Changed
- Write failures are no longer silently skipped. A PST write error — an engine bug, a
vendored-library failure, or invalid internal state — is now fatal: the converter stops
and reports it instead of producing a quietly-incomplete PST. A failed run deletes its
in-progress PST part rather than leaving a half-written file that looks usable. (Malformed
input is still skipped/warned, as before.) - Folder names are now validated by the engine, not only the desktop UI — a hand-written
config or direct CLI use can no longer place an unsafe folder name into the PST. - PST size-splitting no longer overshoots the cap. When an output PST is split by size, the
writer now splits predictively — before a message would cross the configured maximum — rather
than only checking at a periodic interval (which could overshoot a small custom split size by up
to ~500 messages). - Review screen: sort the folder list by clicking column headers (▲/▼ for direction); a note
on the Options screen clarifies that renaming sets a folder's name, not Outlook's display order. - Documentation now describes large-attachment spill-to-disk accurately as bounding queued
memory rather than implying full end-to-end streaming.
Security
- Upgraded MimeKit 4.9.0 → 4.17.0, clearing the moderate
GHSA-g7hc-96xr-gvvx(NU1902)
advisory. - Added a restrictive Content-Security-Policy to the desktop app (previously unset): it is
limited to its own bundled assets and local IPC — no external network origins.
Unchanged
- The CLI JSON Lines event contract (
scan/convert/version) is unchanged.