Dockerized isync.
isync syncs an IMAP mailbox to a Maildir (emails as individual files), in contrast to imap-backup which syncs an IMAP Mailbox as .mbox backup files. Additionally, isync can also sync two IMAP mailboxes.
| Tag | Dockerfile Build Context |
|---|---|
:1.5.0, :latest |
View |
:1.5.0-pingme |
View |
:1.5.0-restic |
View |
:1.5.0-restic-pingme |
View |
:1.4.4 |
View |
:1.4.4-pingme |
View |
:1.4.4-restic |
View |
:1.4.4-restic-pingme |
View |
restic: Includesrestic. Useful for cron-based backups.pingme: Includespingme. Useful for sending notifications to well-known services.- Note:
pingmevariants have fewer architectures. More architectures will be added in future.
- Note:
All images contain:
curlandjq, which are useful for sending notifications if neededrsyncwhich is useful for incrementally copying mails or backups
Note:
isyncthe project name,mbsyncis the tool.
The mbsync config file used in this image is /mbsyncrc. The volume used to store local Maildir is /mail. The main sync script is /sync.
Here are three common sync cases:
- IMAP to Maildir - One-way sync of IMAP server to local Maildir
- Maildir to IMAP - One-way sync of local Maildir to IMAP server
- IMAP to IMAP - One-way sync of IMAP server to another IMAP server
For cron-based examples, see below.
For a simple demo of the three sync cases, see this docker-compose demo.
If needed, see official docs.
This syncs [email protected] to a local Maildir /mail. Sync state is kept in each folder in /mail.
Create config file mbsyncrc:
$ cat mbsyncrc
IMAPStore example-remote
Host imap.example.com
User [email protected]
Pass test
AuthMechs LOGIN
SSLType IMAPS
# Limit the number of simultaneous IMAP commands
PipelineDepth 30
MaildirStore example-local
SubFolders Verbatim
# The trailing '/' is important for Path
Path /mail/
Inbox /mail/INBOX
Channel example
Far :example-remote:
Near :example-local:
Patterns *
Create Near
Expunge Near
SyncState *
Sync PullSync:
docker run --rm -it -v $(pwd)/mbsyncrc:/mbsyncrc:ro -v mail:/mail theohbrothers/docker-isync:latestThis syncs a local Maildir /mail to [email protected]. Sync state is kept in each folder in /mail.
Create config file mbsyncrc:
$ cat mbsyncrc
IMAPStore example-remote-2
Host imap.example.com
User [email protected]
Pass test
AuthMechs LOGIN
SSLType IMAPS
# Limit the number of simultaneous IMAP commands
PipelineDepth 30
MaildirStore example-local
SubFolders Verbatim
# The trailing '/' is important for Path
Path /mail/
Inbox /mail/INBOX
Channel example
Far :example-remote-2:
Near :example-local:
Patterns *
Create Far
Expunge Far
SyncState *
Sync PushSync:
docker run --rm -it -v $(pwd)/mbsyncrc:/mbsyncrc:ro -v mail:/mail theohbrothers/docker-isync:latestThis syncs [email protected] to [email protected]. Sync state is kept in the /mbsync volume. The /mail volume is not used since there's no local Maildir.
Create config file mbsyncrc:
$ cat mbsyncrc
IMAPStore example-remote
Host imap.example.com
User [email protected]
Pass test
AuthMechs LOGIN
SSLType IMAPS
# Limit the number of simultaneous IMAP commands
PipelineDepth 30
IMAPStore example-remote-3
Host imap.example.com
User [email protected]
Pass test
AuthMechs LOGIN
SSLType IMAPS
# Limit the number of simultaneous IMAP commands
PipelineDepth 30
Channel example
Far :example-remote:
Near :example-remote-3:
Patterns *
Create Near
Expunge Near
SyncState /mbsync/
Sync PullSync:
docker run --rm -it -v $(pwd)/mbsyncrc:/mbsyncrc:ro -v mbsync:/mbsync theohbrothers/docker-isync:latestFor cron-based sync and backup with notifications, see docker-compose example(s):
- Cron-based sync with curl notifications
- Cron-based sync with pingme notifications
- Cron-based sync and backup (same container) with curl notifications
- Cron-based sync and backup (separate containers) with curl notifications
Instead of typing secrets as plain text in /mbsyncrc config file for the User and Pass options of IMAPStore (or IMAPAccount), use UserCmd or PassCmd which accepts a shell command. This helps to separate configuration from secrets.
For example, if secrets are bind mounted as files in /run/secrets/user and /run/secrets/pass, use the following:
UserCmd "cat /run/secrets/user"
PassCmd "cat /run/secrets/pass"If secrets are in environment variables IMAP_USER and IMAP_PASS, use the following:
UserCmd "echo $IMAP_USER"
PassCmd "echo $IMAP_PASS"To view command line usage:
docker run --rm -it theohbrothers/docker-isync:latest --help- For Exchange servers or
outlook.comIMAP servers, it might be necessary to usePipelineDepth 1in the config file to limit the number of simultaneous IMAP commands. See here.
Requires Windows powershell or pwsh.
# Install Generate-DockerImageVariants module: https://github.com/theohbrothers/Generate-DockerImageVariants
Install-Module -Name Generate-DockerImageVariants -Repository PSGallery -Scope CurrentUser -Force -Verbose
# Edit ./generate templates
# Generate the variants
Generate-DockerImageVariants .versions.json contains a list of Semver versions, one per line.
To update versions in versions.json:
./Update-Versions.ps1To update versions in versions.json, and open a PR for each changed version, and merge successful PRs one after another (to prevent merge conflicts), and finally create a tagged release and close milestone:
$env:GITHUB_TOKEN = 'xxx'
./Update-Versions.ps1 -PR -AutoMergeQueue -AutoReleaseTo perform a dry run, use -WhatIf.