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.4.4 , :latest |
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:
pingme
variants have fewer architectures. More architectures will be added in future.
- Note:
All images contain:
curl
andjq
, which are useful for sending notifications if neededrsync
which is useful for incrementally copying mails or backups
Note:
isync
the project name,mbsync
is 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 test@example.com
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 test@example.com
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 Pull
Sync:
docker run --rm -it -v $(pwd)/mbsyncrc:/mbsyncrc:ro -v mail:/mail theohbrothers/docker-isync:latest
This syncs a local Maildir /mail
to test2@example.com
. Sync state is kept in each folder in /mail
.
Create config file mbsyncrc
:
$ cat mbsyncrc
IMAPStore example-remote-2
Host imap.example.com
User test2@example.com
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 Push
Sync:
docker run --rm -it -v $(pwd)/mbsyncrc:/mbsyncrc:ro -v mail:/mail theohbrothers/docker-isync:latest
This syncs test@example.com
to test3@example.com
. 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 test@example.com
Pass test
AuthMechs LOGIN
SSLType IMAPS
# Limit the number of simultaneous IMAP commands
PipelineDepth 30
IMAPStore example-remote-3
Host imap.example.com
User test3@example.com
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 Pull
Sync:
docker run --rm -it -v $(pwd)/mbsyncrc:/mbsyncrc:ro -v mbsync:/mbsync theohbrothers/docker-isync:latest
For 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.com
IMAP servers, it might be necessary to usePipelineDepth 1
in 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.ps1
To 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 -AutoRelease
To perform a dry run, use -WhatIf
.