imapbackup3
A Python package for creating full backups of IMAP mailboxes
Installation
python3 -m pip install --user imapbackup3
Command line usage
usage: imapbackup3 [-h] [-y] [-f FOLDERS] [-e] [-k KEY] [-c CERT] -s HOST
[-P PORT] -u USER [-p PASSWORD] [-m MAILBOX] [-t SECS]
[--thunderbird]
Back up E-mail messages from an IMAP server. mbox files are created in the
current working directory.
options:
-h, --help show this help message and exit
-y, --yes-overwrite-mboxes
Overwite existing mbox files instead of appending
-f, --folders FOLDERS
Specifify which folders use. Comma separated list.
-e, --ssl Use SSL. Port defaults to 993.
-k, --key KEY Path to PEM private key file for SSL. Specify cert,
too.
-c, --cert CERT Path to PEM certificate chain for SSL. Specify key,
too. Python's SSL module doesn't check the cert chain.
-s, --server HOST Address of server (without port)
-P, --port PORT Server port (defaults to 143 without and 993 with SSL)
-u, --user USER Username to log into server
-p, --password PASSWORD
Prompts for password if not specified. If the first
character is '@', treat the rest as a path to a file
containing the password. Leading '' makes it literal.
-m, --mailbox MAILBOX
Local e-mail storage format. Possible values: mbox
(default), Maildir
-t, --timeout SECS Sets socket timeout to SECS seconds.
--thunderbird Create Mozilla Thunderbird compatible mailbox
Python usage
Minimal example (using SSL on port 993):
from imapbackup3 import IMAPBackup
with IMAPBackup(host="mail.example.com", user="myuser", password="mypassword") as imb:
imb.download_all_messages()
Full example:
from imapbackup3 import IMAPBackup
with IMAPBackup(
host="mail.example.com",
user="myuser",
password="mypassword",
port=993,
usessl=True,
keyfilename="my_key.pem",
certfilename="my_cert.pem",
thunderbird=False,
folders=["INBOX", "INBOX.Sent"],
fmt="Maildir",
) as imb:
imb.download_all_messages()
Usage of the message filter
A function msg_filter can be passed to the download_all_messages method
that takes an email.message.EmailMessage instance as input and either
returns the same instance again (which will not change anything), returns
None (which will filter out the message) or returns a modified instance
(which will store the modified message). (Stupid) example:
def my_filter(msg):
if "SPAM" in msg["subject"]:
return None
msg["subject"] += " (no Spam)"
return msg
imb.download_all_messages(msg_filter=my_filter)
Background
This package is based on a script by Rui Carmo. Original description:
This was first published around 2007 (probably earlier) on my personal site, and it was originally developed to work around the then rather limited (ok, inconsistent) Mac OS X Mail.app functionality and allow me to back up my old mailboxes in a fully standard
mboxformat (well, at least as much asmboxcan be considered a standard...).
Somewhat to my surprise it was considered useful by quite a few people throughout the years, and contributions started coming in. Given that there seems to be renewed interest in this as a systems administration tool, I'm posting the source code here and re-licensing it under the MIT license.
Features
Inherited from imapbackup
- ZERO dependencies.
- Copies every single message from every single folder (or a subset of folders) in your IMAP server to your disk.
- Does incremental copying (i.e., tries very hard to not copy messages twice).
- Tries to do everything as safely as possible (only performs read operations on IMAP).
- Is completely and utterly free (distributed under the MIT license).
New features
- Python 3 compatible, fully type-hinted
- Supports mbox or Maildir formats
- Can be imported and used as library
- When used as a library, messages can be filtered or modified on the fly
Requirements
This package requires Python 3.10 or newer.
Development
Clone the repository and install it in editable mode with the development extras:
python3 -m pip install -e ".[dev]"
Run the test suite, linter, formatter and type checker:
pytest
ruff check .
ruff format .
mypy
Metadata
Release files for imapbackup3 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| imapbackup3-0.3.0.tar.gz | 20.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| imapbackup3-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 34.6 kB
Release files / imapbackup3-0.3.0.tar.gz
| Download URL | imapbackup3-0.3.0.tar.gz |
|---|---|
| Size | 20.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
38375628b2cd68e2f2cb6ae02d65fe7d0c46ee508443f6745557c6572d19d8aa
|
|
BLAKE2b-256 checksum How to use checksums |
218d792b54b007a0ef74f444a20eb786f22461516b7ae5e189e4501ed0b9099c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 28, 2026.
Transparency logRelease files / imapbackup3-0.3.0-py3-none-any.whl
| Download URL | imapbackup3-0.3.0-py3-none-any.whl |
|---|---|
| Size | 14.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6c31e6eea36997fb2d13bb1194ec3a4a3fb530ef9b45a023a23068d4db80f777
|
|
BLAKE2b-256 checksum How to use checksums |
2c1f4cac52cf70d66278d8b14560c784ea605503bf050ff562e166a7c703e4a2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 28, 2026.
Transparency log