IMAPSYNC(1)
π NAME π
imapsync β the email tool for syncing two IMAP accounts, one way, and without duplicates. This is the imapsync manual page, user-contributed Perl documentation, and honestly itβs giving βyour mailboxes are getting a glow-upβ energy. π
πΈ VERSION πΈ
This documentation refers to Imapsync $Revision: 2.314 $ β¨
β¨ USAGE β¨
Okay bestie, to synchronize the source imap account "test1" on server "test1.lamiral.info" with password "secret1" to the destination imap account "test2" on server "test2.lamiral.info" with password "secret2", do this exact thing:
imapsync \
--host1 test1.lamiral.info --user1 test1 --password1 secret1 \
--host2 test2.lamiral.info --user2 test2 --password2 secret2
π¦ DESCRIPTION π¦
Sometimes we need to transfer mailboxes from one imap server to another. Thatβs the plot. π¬
The imapsync command is a tool allowing incremental and recursive imap transfers from one mailbox to another. If you donβt understand the previous sentence, itβs normal; itβs pedantic computer-oriented jargon. No cap.
All folders are transferred, recursively, meaning the whole folder hierarchy is taken, all sub-folders, all messages in them, and all message flags (\Seen, \Answered, \Flagged, etc.) are synced too. The way that whole tree gets carried over is honestly iconic. π³β¨
Imapsync reduces the amount of data transferred by not transferring a given message if it already resides on the destination side. Messages that are on the destination side but not on the source side stay as they are. There is no deletions by default. See the --delete2 option to have strict sync and delete them.
How does imapsync know a message is already on both sides? Same specific headers, and the transfer is done only once. By default, the identification headers are Message-Id: and Received: lines. This choice can be changed with the --useheader option. Most often, a duplicate problem is solved by using --useheader "Message-Id".
All flags are preserved, unread messages will stay unread, read ones will stay read, and deleted ones will stay deleted. π
Flags are also resynchronized at each run, unless the option --noresyncflags is used.
A point about message deletions. In the IMAP protocol, a deleted message is not deleted, it is marked \Deleted and can be undeleted. Real destruction comes with the EXPUNGE or UIDEXPUNGE IMAP commands. π
You can abort the transfer at any time and restart it later. Imapsync works well with bad connections and interruptions, by design. On a terminal, hit Ctrl+c (Ctrl-c) twice within two seconds to abort the program. Hit Ctrl+c just once to make imapsync reconnect to both imap servers.
How do you know the sync is finished and well done? When imapsync ends by itself, it mentions it with lines like those:
Exiting with return value 0 (EX_OK: successful termination) 0/50 nb_errors/max_errors PID 20332
Removing pidfile /home/gilles/tmp/imapsync.pid
Log file is LOG_imapsync/2023_08_21_11_51_27_651_test1_test2.txt ( to change it, use --logfile filepath ; or use --nolog to turn off logging )
If you donβt have those lines, it means that either the sync process is still running (or eventually hanging indefinitely) or that it ended without a whisper, a strong kill -9 on Linux, for example.
If you have those final lines, then it means the sync process is properly finished. It may have encountered problems, though.
A good synchronization is mentioned by some lines above the last ones, especially those three lines:
The sync looks good, all 1745 identified messages in host1 are on host2.
There is no unidentified message on host1.
Detected 0 errors
Imapsync mentions the total sizes of both accounts at the beginning of the sync and also at the end. Sometimes, even with a strict sync, those total sizes differ, and sometimes they differ a lot. The difference is not a good criterion to conclude the sync went wrong. π«Ά
Why? Thatβs because message sizes given by the imap servers are not always accurate; they are not always the same as the actual message sizes of the messages transferred by imapsync. Imapsync uses the sizes given by the imap servers to calculate the total size. They can differ. In the early days, Imapsync used the sizes of the messages as one of the criteria to identify the messages; different sizes implied different messages. But it was a mistake, the same message had different sizes on both sides sometimes, depending on the imap servers.
Another explanation for a big total size difference is that Gmail doesnβt count the size of duplicate messages across folders twice, while imapsync does.
A classical scenario is synchronizing a mailbox B from another mailbox A, where you just want to keep a strict copy of A in B. Strict means that all messages in A will be in B but no more.
For a strict synchronization, use the option --delete2. The option --delete2 deletes the messages in the host2 folder B that are not in the host1 folder A. If you also need to destroy host2 folders that are not in host1, then use --delete2folders. See also --delete2foldersonly and --delete2foldersbutnot to set up exceptions on folders to destroy. INBOX will never be destroyed; itβs a mandatory folder in IMAP, so imapsync doesnβt even try to remove it. π«π₯
A different scenario is to delete the messages from the source mailbox after a successful transfer, it can be a good feature when migrating mailboxes since messages will be only on one side. The source account will only have messages that are not on the destination yet, i.e., messages that arrived after a sync or that failed to be transferred.
In that case, use the --delete1 option. Option --delete1 implies also the option --expunge1, so all messages marked deleted on host1 will be deleted. In the IMAP protocol, deleting a message does not delete it; it marks it with the flag \Deleted, allowing an undelete. Expunging a folder removes, definitively, all the messages marked as \Deleted in this folder.
You can also decide to remove empty folders once all of their messages have been transferred. Add --delete1emptyfolders to obtain this behavior.
Imapsync is not adequate for maintaining two active imap accounts in synchronization when the user plays independently on both sides. Use offlineimap (written by John Goerzen) or mbsync (written by Michael R. Elkins) for a 2 ways synchronization.
π OPTIONS π
usage: imapsync [options]
The standard options are the six values forming the credentials. Three values on each side are needed to login to the IMAP servers. These six values are a hostname, a username, and a password, twice. π
Here are the conventions used in the following descriptions of the options:
strβ means a stringintβ means an integer numberfloβ means a float numberregβ means a regular expressioncmdβ means a command--dryβ Makes imapsync do nothing for real; it just prints what would be done without--dry. Itβs the βlook but donβt touchβ mode, bestie. πβ¨
π OPTIONS/credentials π
--host1str β Source or"from"imap server. It can be a hostname or an IP address.--port1int β Port to connect on host1. Optional since the default port is the well-known portimap/143orimaps/993. Add--ssl1if you want an SSL/TLS connection on host1.--user1str β User to login on host1.--password1str β Password of user1.--host2str β"destination"imap server.--port2int β Port to connect on host2. Optional since the default port is the well-known portimap/143orimaps/993. Add--ssl2if you want an SSL/TLS connection on host2.--user2str β User to login on host2.--password2str β Password of user2.--showpasswordsβ Shows passwords on output instead of"MASKED". Useful to restart a complete run by just reading the command line used in the log, or to debug passwords. Itβs not a secure practice at all! π--passfile1str β Password file for the user1. It must contain the password on the first line. This option avoids showing the password on the command line like--password1does.--passfile2str β Password file for the user2.
You can also pass the passwords in the environment variables IMAPSYNC_PASSWORD1 and IMAPSYNC_PASSWORD2. If you donβt pass the user1 password via --password1 nor --passfile1 nor $IMAPSYNC_PASSWORD1 then imapsync will prompt you to enter the password on the terminal. Same thing for the user2 password. π«Ά
π OPTIONS/encryption π
--nossl1β Do not use an IMAP over SSL/TLS connection on host1.--ssl1β Use an IMAP over SSL/TLS connection on host1. It isimaps. The default port is993. Used by default, if possible.--nossl2β Do not use an IMAP over SSL/TLS connection on host2.--ssl2β Use an IMAP over SSL/TLS connection on host2. Same as--ssl1but for host2.--notls1β Do not try a"STARTTLS"SSL/TLS connection on host1.--tls1β Use a"STARTTLS"SSL/TLS encryption on host1. The default port is143. Used by default, after imaps probing failed, and if possible.--notls2β Do not use a"STARTTLS"SSL/TLS connection on host2.--tls2β Use aSTARTTLSSSL/TLS encryption on host2. Same as--tls1but for host2.--debugsslint β SSL/TLS debug mode from0to4.--sslargs1str β Pass any SSL/TLS parameter for the host1 connection. Example:
--sslargs1 SSL_verify_mode=1 --sslargs1 SSL_version=TLSv1_3
See all possibilities in the new() method of IO::Socket::SSL http://search.cpan.org/perldoc?IO::Socket::SSL#Description_Of_Methods
--sslargs2str β Pass any SSL/TLS parameter for the host2 connection. Same as--sslargs1but for host2.
πͺͺ OPTIONS/authentication πͺͺ
--authmech1str β Auth mechanism to use with host1:PLAIN,LOGIN,CRAM-MD5etc. Use UPPERCASE.--authmech2str β Auth mechanism to use with host2. See--authmech1--authuser1str β User to auth with on host1 (admin user). Avoid using--authmech1 SOMETHINGwith--authuser1.--authuser2str β User to auth with on host2 (admin user).--proxyauth1β Use proxyauth on host1. Requires--authuser1. Required by Sun/iPlanet/Netscape IMAP servers to be able to use an administrative user.--proxyauth2β Use proxyauth on host2. Requires--authuser2.--authmd51β Use MD5 authentication for host1. π--authmd52β Use MD5 authentication for host2. π--domain1str β Domain on host1 (NTLM authentication).--domain2str β Domain on host2 (NTLM authentication).--oauthaccesstoken1str β The access token to authenticate with OAUTH2 on host1. It will be combined with the--user1value to form the string to pass with XOAUTH2 authentication. Instead of the access token itself, the value can be the file containing the access token on the first line. If the value is a file, imapsync reads its first line and takes this line as the access token. The advantage of the file is that if the access token changes then imapsync can read it again when it needs to reconnect during a run. β¨--oauthaccesstoken2str β same thing as--oauthaccesstoken1but for host2.--oauthdirect1str β The direct string to pass with XOAUTH2 authentication for host1.--oauthdirect2str β same thing as--oauthdirect1but for host2.--oauthrefreshcmd1str β An optional command to call, to refresh the host1 token before any oauth authentication. It can have arguments like"cmd arg1 arg2 ..."--oauthrefreshcmd2str β same thing as--oauthrefreshcmd1but for host2.
π¦ OPTIONS/folders π¦
--folderstr β Sync this folder. Use it again for more folders, like--folderstr and this one, etc.--folderrecstr β Sync this folder and all its sub-folders. Use it again for more, like--folderrecstr and this one, etc.--folderfirststr β Sync this folder first. Ex.--folderfirst "INBOX". Use it again for then this one, etc.--folderlaststr β Sync this folder last.--folderlast "[Gmail]/All Mail". Use it again for then this one, etc.--nomixfoldersβ Do not merge folders when host1 is case-sensitive while host2 is not (like Exchange). Only the first similar folder is synced. Example: with folders"Sent","SENT"and"sent"on host1, only"Sent"will be synced to host2. π--skipemptyfoldersβ Empty host1 folders are not created on host2.--includereg β Sync folders matching this regular expression. Use it again for or this one, etc. If both--include--excludeoptions are used, then include is done before.--excludereg β Skips folders matching this regular expression. Several folders to avoid:--exclude 'fold1|fold2|f3'skips fold1, fold2 and f3. Use it again for or this one, etc.--automapβ guesses folder mapping, for folders well known as"Sent","Junk","Drafts","All","Archive","Flagged". ποΈ--f1f2str1=str2β Force folder str1 to be synced to str2.--f1f2overrides--automapand--regextrans2. Use several--f1f2options to map several folders. Option--f1f2is a one-to-one-only folder mapping, and str1 and str2 must be full path folder names. Use--regextrans2for more general mappings.--subfolder2str β Syncs the whole host1 folders hierarchy under the host2 folder named str. It does it internally by adding three--regextrans2options before all others. Add--debugto see what's going on. π--subfolder1str β Syncs the host1 folders hierarchy which is under folder str to the root hierarchy of host2. It's the counterpart of a sync done by--subfolder2when doing it in the reverse order. Backup/Restore scenario: Use--subfolder2str for a backup to the folder str on host2. Then use--subfolder1str for restoring from the folder str, after inverting host1/host2 user1/user2 values.--subscribedβ Transfers subscribed folders.--subscribeβ Subscribe to the folders transferred on the host2 that are subscribed on host1. On by default. β--subscribeallβ Subscribe to the folders transferred on the host2 even if they are not subscribed on host1.--prefix1str β Remove prefix str to all destination folders, usually"INBOX."or"INBOX/"or an empty string"". imapsync guesses the prefix if the host1 imap server does not have NAMESPACE capability. So this option should not be used most of the time.--prefix2str β Add prefix to all host2 folders. See--prefix1.--sep1str β Host1 separator. This option should not be used most of the time. Imapsync gets the separator from the server itself, by using NAMESPACE, or it tries to guess it from the folder listing (it counts characters/,.,\\,\in folder names and choose the more frequent, or finally/if nothing is found.--sep2str β Host2 separator. See--sep1.--regextrans2reg β Apply the whole regex to each destination folder. Use it again for and this one. etc. When you play with the--regextrans2option, first add also the safe options--dry --justfolders. Then, when happy, remove--dryfor a run, then remove--justfoldersfor the next ones. Have in mind that--regextrans2is applied after the automatic prefix and separator inversion. For examples see:https://imapsync.lamiral.info/FAQ.d/FAQ.Folders_Mapping.txtπ«Ά
πΈ OPTIONS/folders sizes πΈ
--nofoldersizesβ Do not calculate the size of each folder at the beginning of the sync. The default behaviour calculates them.--nofoldersizesatendβ Do not calculate the size of each folder at the end of the sync. The default behaviour calculates them.--justfoldersizesβ Exit after having printed the initial folder sizes.
π OPTIONS/tmp π
--tmpdirstr β Where to store temporary files and subdirectories. Will be created if it doesn't exist. Default is$HOME/tmp. It used to be/tmpon Unix, before imapsync2.250. But/tmpis not safe, seehttps://github.com/imapsync/imapsync/issues/399andhttps://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-34204β οΈ--pidfilestr β The file where the imapsync pid is written. It can be specified with the formdirname/filename, ie, a complete path. The default name isimapsync.pidintmpdir.--pidfilelockingβ Abort if pidfile already exists. Useful to avoid concurrent transfers on the same mailbox. π
π OPTIONS/log π
--nologβ Turn off logging on file. By default in Docker context.--logβ Turn on logging on file. By default in normal and CGI contextes.--logfilestr β Change the default log filename (can bedirname/filename).--logdirstr β Change the default log directory. Default isLOG_imapsync/
The default logfile name is, for example:
LOG_imapsync/2019_12_22_23_57_59_532_user1_user2.txt
where:
2019_12_22_23_57_59_532is nearly the date of the start in the formatYYYY_MM_DD_HH_MM_SS_mmmcorresponding to the meaningyear_month_day_hour_minute_second_millisecond- and
user1user2are the--user1--user2values.
β OPTIONS/messages β
--skipmessreg β Skips messages matching the regex. Example:'m/[\x80-\xff]/'# to avoid 8bits messages.--skipmessis applied before--regexmess. Use it again for or this one, etc.--skipcrossduplicatesβ Avoid copying messages that are already copied in another folder, good from Gmail to XYZ when XYZ is not also Gmail. Activated with--gmail1unless--noskipcrossduplicatesπ--debugcrossduplicatesβ Prints which messages (UIDs) are skipped with--skipcrossduplicatesand in what other folders they are.--pipemesscmd β Apply thiscmdcommand to each message content before the copy. Use it again for and this one, etc. With several--pipemess, the output of eachcmdcommand (STDOUT) is given to the input (STDIN) of the next command. For example,--pipemess cmd1 --pipemess cmd2 --pipemess cmd3is like a Unix pipe:"cat message | cmd1 | cmd2 | cmd3"--disarmreadreceiptsβ Disarms read receipts (host2 Exchange issue)--regexmessreg β Apply the whole regex to each message before transfer. Example:'s/\000/ /g'# to replace null characters by spaces. Use it again for and this one, etc.--truncmessint β truncates messages when their size exceeds the int value, specified in bytes. Good to sync too big messages or to "suppress" attachments. Have in mind that this way, messages become uncoherent somehow. π--nodry1β makes imapsync fetching messages from host1, even when--dryis on.--dry --nodry1is useful when debugging transformation options like--pipemessor--regexmess
π§ OPTIONS/labels π§
Gmail presents labels as folders in imap. Imapsync can accelerate the sync by syncing X-GM-LABELS; it will avoid to transferring messages when they are already on host2 in another folder. π
--synclabelsβ Syncs also Gmail labels when a message is copied to host2. Activated by default with--gmail1 --gmail2unless--nosynclabelsis added.--resynclabelsβ resyncs Gmail labels when a message is already chilling on host2. It's activated by default with--gmail1--gmail2unless you throw in--noresynclabelsto opt out π·οΈ
For Gmail syncs, see also: https://imapsync.lamiral.info/FAQ.d/FAQ.Gmail.txt
β¨ OPTIONS/flags β¨
If you encounter flag problems, see also: https://imapsync.lamiral.info/FAQ.d/FAQ.Flags.txt
--regexflagreg β applies the whole regex to each flags list. Example:'s/"Junk"//g'# to remove "Junk" flag. And you can stack it:--regexflagreg then this one, etc. π--resyncflagsβ resyncs flags for messages that were already transferred. On by default, bestie.--noresyncflagsβ do NOT resync flags for already-transferred messages. Genuinely useful when a user has already started to play with their host2 account π«Ά--filterbuggyflagsβ filters out flags that are known to be buggy and generators of errors"BAD Invalid system flag"or"NO APPEND Invalid flag list". iykyk π
π OPTIONS/deletions π
--delete1β deletes messages on host1 server after a successful transfer. Here's the whole behavior, no cap: it marks messages with the IMAP flag\Deleted, then the messages are deleted with anEXPUNGEIMAP command. If expunging after each message slows down the sync too much, then use--noexpungeaftereachto speed up β expunging will then be done only twice per folder, one at the beginning and one at the end of a folder sync.--expunge1β expunges messages on host1 just before syncing a folder. Expunge is done per folder. Expunge aims to really delete messages marked\Deleted. An expunge is also done after each message is copied if option--delete1is set (unless--noexpungeaftereach).--noexpunge1β do not expunge messages on host1.--delete1emptyfoldersβ deletes empty folders on host1,INBOXexcepted. Useful with--delete1since what remains on host1 is only what failed to be synced π--delete2β delete messages in the host2 account that are not in the host1 account. Useful for backup or pre-sync. Oh and heads up:--delete2implies--uidexpunge2.--delete2duplicatesβ deletes messages in host2 that are duplicates in host2. Works only without--useuidsince duplicates are detected with a header part of each message. NB:--delete2duplicatesis far less violent than--delete2since it removes only duplicates ποΈ--delete2foldersβ delete folders in host2 that are not in host1. Only the selected folders are considered; all folders by default but not all with--exclude--include--folderetc. For safety, first try it like this, it is safe:
--delete2folders --dry --justfolders --nofoldersizes
and see what folders will be deleted. Please actually do this, bestie, I'm begging π
--delete2foldersonlyreg β delete only folders matching the regex reg. Example:--delete2foldersonly "/^Junk$|^INBOX.Junk$/". This option activates--delete2folders.--delete2foldersbutnotreg β do not delete folders matching the regex rex. Example:--delete2foldersbutnot "/Tasks$|Contacts$|Foo$/". This option activates--delete2folders.--noexpunge2β do not expunge messages on host2.--nouidexpunge2β do not uidexpunge messages on the host2 account that are not on the host1 account.
π OPTIONS/dates π
If you encounter problems with dates, see also: https://imapsync.lamiral.info/FAQ.d/FAQ.Dates.txt
--syncinternaldatesβ sets the internal dates on host2 as the same as host1. Turned on by default β¨ The internal date is the date when a message arrives on a host (Unix mtime usually).--idatefromheaderβ sets the internal dates on host2 to the same as the ones in"Date:"headers.
π¦ OPTIONS/message selection π¦
--maxsizeint β skip messages larger (or equal) than int bytes--minsizeint β skip messages smaller (or equal) than int bytes--maxageint β skip messages older than int days. The final stats (skipped) don't count the older messages. See also--minage.--minageint β skip messages newer than int days. The final stats (skipped) don't count newer messages. Here's the whole vibe, and+zone are the messages selected:
past|----maxage+++++++++++++++>now
past|+++++++++++++++minage---->now
past|----maxage+++++minage---->now (intersection)
past|++++minage-----maxage++++>now (union, magic!)
--searchstr β selects only messages returned by this IMAPSEARCHcommand. Applied on both sides. For a complete set of what can be searched, seehttps://imapsync.lamiral.info/FAQ.d/FAQ.Messages_Selection.txt--search1str β same as--searchbut for selecting host1 messages only.--search2str β same as--searchbut for selecting host2 messages only. So--search CRITequals--search1 CRIT --search2 CRIT--noabletosearchβ makes--minageand--maxageoptions use the internal dates given by aFETCHimap command instead of the"Date:"header. The internal date is the arrival date in the mailbox.--noabletosearchequals--noabletosearch1 --noabletosearch2--noabletosearch1β like--noabletosearchbut for host1 only.--noabletosearch2β like--noabletosearchbut for host2 only.--maxlinelengthint β skip messages with a line length longer than int bytes. RFC 2822 says it must be no more than 1000 bytes, but real-life servers and email clients do much more π--useheaderstr β use this header to compare messages on both sides. Example:"Message-Id"or"Received"or"Date". And you can stack it:--useheaderstr and this one, etc.--syncduplicatesβ sync also duplicates. Off by default.--usecacheβ use cache to speed up next syncs. Off by default.--nousecacheβ do not use cache. Caveat:--useuid --nousecachecreates duplicates on multiple runs π--useuidβ use UIDs instead of headers as a criterion to recognize messages. Option--usecacheis then implied unless--nousecacheis used.
πΈ OPTIONS/miscellaneous πΈ
--syncaclsβ synchronizes ACLs (Access Control Lists). Lowkey be careful though: ACLs in IMAP are not standardized, since one ACL code on one side may signify something else on the other side.--nosyncaclsβ does not synchronize ACLs. This is the default.--addheaderβ when a message has no headers to be identified,--addheaderadds a"Message-Id"header, like"Message-Id: 12345@imapsync", where12345is the imap UID of the message on the host1 folder. Useful to sync folders"Sent"or"Draft"π¨
π OPTIONS/debugging π
--debugβ show debug notes.--debugfoldersβ show debug notes for the folders part only.--debugcontentβ show content of the messages transferred. Huge output. Like, huge huge π«--debugflagsβ show debug notes for flags.--debugimap1β show IMAP notes for host1. Very verbose.--debugimap2β show IMAP notes for host2. Very verbose.--debugimapβ show IMAP notes for host1 and host2. Twice very verbose π--debugmemoryβ show the memory consumption after each copy.--errorsmaxint β exit when int number of errors is reached. The default is 50 errors to quit.--testsβ run local non-regression tests. Exit code 0 means everything is ok β¨--testsliveβ run a live test withtest1.lamiral.infoimap server. Useful to check the basics. It needs an internet connection.--testslive6β run a live test withtests1ipv6.lamiral.infoimap server. Useful to check the IPv6 connectivity. Needs internet.
π― OPTIONS/specific π―
--gmail1β sets--host1to Gmail and other options. SeeFAQ.Gmail.txt--gmail2β sets--host2to Gmail and other options. SeeFAQ.Gmail.txt--office1β sets--host1to Office365 and other options. SeeFAQ.Office365.txt--office2β sets--host2to Office365 and other options. SeeFAQ.Office365.txt--exchange1β sets options for Exchange. SeeFAQ.Exchange.txt--exchange2β sets options for Exchange. SeeFAQ.Exchange.txt--domino1β sets options for Domino. SeeFAQ.Domino.txt--domino2β sets options for Domino. SeeFAQ.Domino.txt
β±οΈ OPTIONS/behavior β±οΈ
--timeout1flo β connection timeout in seconds for host1. Default is120and0means no timeout at all.--timeout2flo β connection timeout in seconds for host2. Default is120and0means no timeout at all.
Caveat emptor. Under CGI context, you may encounter a timeout from the web server, killing imapsync and the imap connections. See the documentINSTALL.OnlineUI.txtand search for"Timeout"for how to deal with this issue.
--keepalive1βhttps://metacpan.org/pod/Mail::IMAPClient#Keepalive. Some firewalls and network gears like to timeout connections prematurely if the connection sits idle. This option enablesSO_KEEPALIVEon the host1 socket.--keepalive1is on by default since imapsync release2.169. Use--nokeepalive1to disable it.--keepalive2β same as--keepalive2but for host2. Use--nokeepalive2to disable it.--maxmessagespersecondflo β limits the average number of messages transferred per second. π¦--maxbytespersecondint β caps the average transfer rate per second, bestie. Chill speeds only π--maxbytesafterint β the--maxbytespersecondlimit doesn't kick in until after int bytes have already been moved. Like, warm-up era β¨--maxsleepflo β never sleep more than int seconds (yes, the flag says flo, the description says int, we don't make the rules). It's on by default at 2 seconds max, literally the same as--maxsleep 2π΄--abortβ kills a previous imapsync call that's still running. It finds the target via the pidfile, so it knows exactly which process to end πͺ--exitwhenoverint β stops syncing and exits once int total bytes have been transferred. Bye at the byte limit π--versionβ prints only the software version. Nothing else, just the number π--noreleasecheckβ no checking for a new imapsync release π--releasecheckβ checks for a new imapsync release. It's an HTTP GET request tohttp://imapsync.lamiral.info/prj/imapsync/VERSIONπ‘--emailreport1β drops the final email report into host1's INBOX π¬--emailreport2β drops the final email report into host2's INBOX π¬--noemailreport1β does not put the final email report in host1's INBOX π«--noemailreport2β does not put the final email report in host2's INBOX π«--noidβ don't send or receive the IMAP"ID"command to the imap servers. Skipping the small talk π«₯--justconnectβ just connects to both servers and prints useful info. Only needs the--host1and--host2options. Obsolete sinceimapsync --host1 imaphoston its own already implies--justconnectπ--justloginβ just logs into both host1 and host2 with the users' credentials, then dips out πͺ--justfoldersβ does only folder things, ignores messages entirely. Folder admin main character energy π--helpβ prints this help, bestie π₯°
Example time, because examples ate: to sync the IMAP account "test1" on "test1.lamiral.info" over to the imap account "test2" on "test2.lamiral.info", with the test1 account password being "secret1" and the test2 account password being "secret2":
imapsync \
--host1 test1.lamiral.info --user1 test1 --password1 secret1 \
--host2 test2.lamiral.info --user2 test2 --password2 secret2
π SECURITY π
Use --passfile1 instead of --password1 to give the password, because it's safer, periodt. With the --password1 option, on Linux, literally any user on your host can see that password by running 'ps auxwwww' π Using a variable (like IMAPSYNC_PASSWORD1) is also dangerous, thanks to the 'ps auxwwwwe' command. So the move is: save the password in a well-protected file (600 or rw-------) and that's the best solution, no cap π‘οΈ
Imapsync activates SSL/TLS encryption by default, if possible.
But what detailed behavior is under this "if possible"? Let's get into it π§
Imapsync activates the SSL/TLS mechanism if the well-known imaps port (993) is open on the imap servers. If the imaps port is closed, then imapsync opens a normal (clear) connection on port 143. But then it looks for STARTTLS support in the CAPABILITY list of the servers. If STARTTLS is supported, then imapsync goes to an SSL/TLS encryption with the STARTTLS IMAP command. Slay β¨
If the automatic SSL/TLS detections fail, then imapsync uses clear-text communication. And clear-text communication does not protect against sniffing activities on the network, especially passwords. That's a real one, be careful π
If you want to force SSL/TLS, just use --ssl1, --ssl2 or --tls1 --tls2. Imapsync won't go to clear-text communication with any of these options π
See also the document FAQ.Security.txt in the FAQ.d/ directory or at https://imapsync.lamiral.info/FAQ.d/FAQ.Security.txt
πͺ EXIT STATUS πͺ
Imapsync will exit with a 0 status (return code) if everything goes well. Otherwise, it exits with a non-zero status. That's classical Unix behavior, iykyk. Here's the list of the exit code values (an integer between 0 and 255). In Bourne Shells, this exit code value can be retrieved within the variable value "$?" if you read it just after the imapsync call π
The names reflect their meaning:
EX_OK => 0 ; #/* successful termination */
EX_USAGE => 64 ; #/* command line usage error */
EX_NOINPUT => 66 ; #/* cannot open input */
EX_UNAVAILABLE => 69 ; #/* service unavailable */
EX_SOFTWARE => 70 ; #/* internal software error */
EXIT_CATCH_ALL => 1 ; # Any other error
EXIT_BY_SIGNAL => 6 ; # Should be 128+n where n is the sig_num
EXIT_BY_FILE => 7 ;
EXIT_PID_FILE_ERROR => 8 ;
EXIT_CONNECTION_FAILURE => 10 ;
EXIT_TLS_FAILURE => 12 ;
EXIT_AUTHENTICATION_FAILURE => 16 ;
EXIT_SUBFOLDER1_NO_EXISTS => 21 ;
EXIT_WITH_ERRORS => 111 ;
EXIT_WITH_ERRORS_MAX => 112 ;
EXIT_OVERQUOTA => 113 ;
EXIT_ERR_APPEND => 114 ;
EXIT_ERR_FETCH => 115 ;
EXIT_ERR_CREATE => 116 ;
EXIT_ERR_SELECT => 117 ;
EXIT_TRANSFER_EXCEEDED => 118 ;
EXIT_ERR_APPEND_VIRUS => 119 ;
EXIT_ERR_FLAGS => 120 ;
EXIT_ERR_SEARCH => 121 ;
EXIT_TESTS_FAILED => 254 ; # Like Test::More API
EXIT_CONNECTION_FAILURE_HOST1 => 101 ;
EXIT_CONNECTION_FAILURE_HOST2 => 102 ;
EXIT_AUTHENTICATION_FAILURE_USER1 => 161 ;
EXIT_AUTHENTICATION_FAILURE_USER2 => 162 ;
π LICENSE AND COPYRIGHT π
Imapsync is a free, open, and public but not always gratis software tool covered by the NOLIMIT Public License, now called NLPL. See the LICENSE file included in the distribution, or just read the following simple sentence as it IS the license text:
"No limits to do anything with this work and this license."
In case it is not long enough, I repeat:
"No limits to do anything with this work and this license."
Look at https://imapsync.lamiral.info/LICENSE π
π AUTHOR π
Gilles LAMIRAL <gilles@lamiral.info>
Good feedback is always welcome. Bad feedback is very often welcome. FR FR π«Ά
Gilles LAMIRAL earns his living by writing, installing, configuring, and sometimes teaching free, open, and often gratis software. Imapsync used to be always gratis, but now it is only often gratis. It's because imapsync is sold by its author, your servitor, a good way to maintain and support free open public software tools over decades. Respect the hustle π
π BUGS AND LIMITATIONS π
See https://imapsync.lamiral.info/FAQ.d/FAQ.Reporting_Bugs.txt
π₯οΈ IMAP SERVERS supported π₯οΈ
See https://imapsync.lamiral.info/S/imapservers.shtml
π HUGE MIGRATION π
If you have many mailboxes to migrate, think about a little shell program. Write a file called file.txt (for example) containing users and passwords. The separator used in this example is ';' β¨
The file.txt file contains:
user001_1;password001_1;user001_2;password001_2
user002_1;password002_1;user002_2;password002_2
user003_1;password003_1;user003_2;password003_2
user004_1;password004_1;user004_2;password004_2
user005_1;password005_1;user005_2;password005_2 ...
On Unix, the shell program can be:
{ while IFS=';' read u1 p1 u2 p2; do
imapsync --host1 imap.side1.org --user1 "$u1" --password1 "$p1" \
--host2 imap.side2.org --user2 "$u2" --password2 "$p2" ...
done ; } < file.txt
On Windows, the batch program can be:
FOR /F "tokens=1,2,3,4 delims=; eol=#" %%G IN (file.txt) DO imapsync ^
--host1 imap.side1.org --user1 %%G --password1 %%H ^
--host2 imap.side2.org --user2 %%I --password2 %%J ...
The ... have to be replaced by nothing or any imapsync option. Welcome to shell or batch programming! π
You will find already written scripts at https://imapsync.lamiral.info/examples/
π¦ INSTALL π¦
Imapsync works under any Unix with Perl.
Imapsync works under most Windows (2000, XP, Vista, Seven, Eight, Ten, Eleven, and all Server releases 2000, 2003, 2008 and R2, 2012 and R2, 2016) as a standalone binary software called imapsync.exe, usually launched from a batch file to avoid always typing the options. See https://imapsync.lamiral.info/README_Windows.txt πͺ
Imapsync works under OS X as a standalone binary software called imapsync_bin_Darwin See https://imapsync.lamiral.info/INSTALL.d/INSTALL.Darwin.txt π
Purchase the latest imapsync at https://imapsync.lamiral.info/ π
You'll receive a link to a compressed tarball called imapsync-2.xxx.tgz, where 2.xxx is the version number. Untar the tarball where you want (on Unix):
tar xzvf imapsync-2.xxx.tgz
Go into the directory imapsync-x.xx and read the INSTALL file. As mentioned at https://imapsync.lamiral.info/#install, the INSTALL file can also be found at https://imapsync.lamiral.info/INSTALL.d/INSTALL.ANY.txt It is now split into several files for each system https://imapsync.lamiral.info/INSTALL.d/ π
βοΈ CONFIGURATION βοΈ
There is no specific configuration file for imapsync; everything is specified by the command line parameters and the default behavior. Command line girlies rise π
π οΈ HACKING π οΈ
Feel free to hack imapsync as the NOLIMIT license permits it. Go off bestie π
π― SIMILAR SOFTWARE π―
See https://imapsync.lamiral.info/S/external.shtml
π°οΈ HISTORY π°οΈ
I initially wrote imapsync in July 2001 because an enterprise, called BaSystemes, paid me to install a new imap server without losing huge old mailboxes located in a far-away remote imap server, accessible by an often broken low-bandwidth ISDN link. The lore is real π
I had to verify every mailbox was well transferred, all folders, and all messages, without wasting bandwidth or creating duplicates upon resyncs. The imapsync design was made with the beautiful rsync command in mind. Iconic behavior honestly β¨
Imapsync originated as a patch to the copy_folder.pl script. The script copy_folder.pl comes from the Mail-IMAPClient-2.1.3 perl module tarball source (more precisely, in the examples/ directory of the Mail-IMAPClient tarball). Origin story unlocked π
So many changes have happened since then that I wonder if any lines of the original copy_folder.pl in the imapsync source code remain. Glow-up of the century π
And that's the whole page, bestie β wrote by perl v5.42.0, dated 2025-09-28, and it's IMAPSYNC(1) all the way through π¦πΈ Go forth and migrate those mailboxes π
π¦ where this page comes from
- arch rolling: imapsync 2.314-1 Β· custom:imapsync
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms