Compare commits

...

23 Commits

Author SHA1 Message Date
Gilles LAMIRAL
8c82976c3f
Merge pull request #526 from elbaby/linux-france-gone
change references to the gone linux-france.org domain
2026-05-09 14:39:15 +02:00
Mariano Absatz (git)
fe237e3308 change references to the gone linux-france.org domain to either archive.org or pop2imap.lamiral.info 2026-05-08 19:14:25 -03:00
Gilles LAMIRAL
c558ffcb11
Merge pull request #504 from 0xdaedalus5/0xd/proofreading
Documentation Cleanup
2025-09-09 16:16:52 +02:00
0xdaedalus
cd17a623e5 Just a little proofreading. 2025-09-09 06:34:54 +00:00
Gilles LAMIRAL
023535075c
Merge pull request #500 from pradeepkatiyar007/patch-1
Update README
2025-07-17 13:35:07 +02:00
Pradeep Katiyar
0da5cfa4fb
Update README
I verified and listed another similar software for IMAP sync and backup.
2025-07-17 14:52:14 +05:30
Gilles LAMIRAL
0dd79e7e52
Merge pull request #491 from myvesta/patch-1
Update INSTALL.Debian.txt: Debian 12 Bookworm added
2025-01-21 16:34:01 +01:00
myvesta
5b92e1d908
Update INSTALL.Debian.txt: Debian 12 Bookworm added 2025-01-20 13:09:21 +01:00
Gilles LAMIRAL
a5ea7625a7
Merge pull request #445 from nextsux/patch-1
Add libcrypt-openssl-pkcs12-perl to Dockerfile
2024-04-23 14:13:13 +02:00
Martin Mlynář
9fc8afcae5
Add libcrypt-openssl-pkcs12-perl to Dockerfile
After merging #381 docker image started to crash when using google xoauth with:

Can't locate Crypt/OpenSSL/PKCS12.pm in @INC (you may need to install the Crypt::OpenSSL::PKCS12 module)
2024-03-16 15:58:06 +01:00
Gilles LAMIRAL
b0619eb2c8
Merge pull request #381 from FreddleSpl0it/improve-xoauth2
Improve XOAUTH2 authmech
2024-02-27 16:50:45 +01:00
Gilles LAMIRAL
c6d3925c68
Merge pull request #415 from polluks2/master
Fixed typos
2023-10-10 15:26:35 +02:00
polluks
7d7110d331 Fixed another typo 2023-10-10 15:14:50 +02:00
polluks
ed4816f3b1 Fixed typos 2023-10-10 15:12:19 +02:00
FreddleSpl0it
a877e6f162
Use pure perl code for xoauth2 authmech 2023-03-03 10:34:53 +01:00
Gilles LAMIRAL
5d6bc8149f
Merge pull request #363 from tapsiturtle/patch-1
Update FAQ.Passwords_on_Windows.txt
2022-10-26 12:57:10 +02:00
tapsiturtle
abe8fd2b0b
Update FAQ.Passwords_on_Windows.txt 2022-10-25 14:38:54 +02:00
Nick Bebout
4ec979525b Disable releasecheck in 2.229 2022-10-24 21:21:25 -05:00
Nick Bebout
399651d088 2.229 2022-10-24 21:20:30 -05:00
Nick Bebout
e2c23d57d6 Disable releasecheck in 2.200 2022-06-01 10:48:05 -05:00
Nick Bebout
42dd32ab62 2.200 2022-06-01 10:47:18 -05:00
Nick Bebout
8e4211e86d Disable releasecheck in 2.178 2022-02-15 12:30:07 -06:00
Nick Bebout
2f815205a9 2.178 2022-02-15 12:29:45 -06:00
113 changed files with 12759 additions and 3410 deletions

View File

@ -124,7 +124,7 @@ Suggested default --useheader 'Message-ID' --useheader 'Received'
Ameir Abdeldayem
Gave a patch to sync messages lacking Message-ID
http://www.linux-france.org/prj/imapsync_list/msg01151.html
https://web.archive.org/web/20160913193638/http://www.linux-france.org/prj/imapsync_list/msg01151.html
Yousaf Shah
Contributed by giving the book

392
ChangeLog
View File

@ -1,17 +1,401 @@
RCS file: RCS/imapsync,v
Working file: imapsync
head: 2.140
head: 2.229
branch:
locks: strict
gilles: 2.140
gilles: 2.229
access list:
symbolic names:
keyword substitution: kv
total revisions: 1040; selected revisions: 1040
total revisions: 1129; selected revisions: 1129
description:
----------------------------
revision 2.140 locked by: gilles;
revision 2.229 locked by: gilles;
date: 2022/09/14 18:08:24; author: gilles; state: Exp; lines: +16 -16
Make pass "make linuxtests win32tests win64tests mactests"
----------------------------
revision 2.228
date: 2022/09/13 12:14:02; author: gilles; state: Exp; lines: +10 -9
Doc. --oauthaccesstoken1 needs --password1 presence. This is a bug.
----------------------------
revision 2.227
date: 2022/07/28 15:59:38; author: gilles; state: Exp; lines: +347 -112
Bugfix. Fixed memory measurement on MacOS and Win32 Win64
----------------------------
revision 2.226
date: 2022/07/15 12:02:47; author: gilles; state: Exp; lines: +30 -26
1966 unit tests
----------------------------
revision 2.225
date: 2022/07/14 16:56:11; author: gilles; state: Exp; lines: +14 -11
*** empty log message ***
----------------------------
revision 2.224
date: 2022/07/13 17:33:42; author: gilles; state: Exp; lines: +8 -8
typo connexions connections
----------------------------
revision 2.223
date: 2022/07/03 10:39:30; author: gilles; state: Exp; lines: +48 -11
Default is now like --noemailreport1 --noemailreport2, no final email report. Popular demand.
Added a stat value: memory footprint times time spent during the sync. Unity MiB * hour. Line "Memory consumption at the end".
----------------------------
revision 2.222
date: 2022/06/29 12:13:58; author: gilles; state: Exp; lines: +9 -10
Remove --memorystress from CGI options.
----------------------------
revision 2.221
date: 2022/06/28 23:12:01; author: gilles; state: Exp; lines: +72 -63
CGI context. Refuse to serve when the cpu load is greater than 1 per cpu. A load of 3.9 with 4 cores is ok.
----------------------------
revision 2.220
date: 2022/06/28 19:01:18; author: gilles; state: Exp; lines: +8 -8
CGI context. Refuse to server when memory left is less than 1 GB.
----------------------------
revision 2.219
date: 2022/06/25 21:33:30; author: gilles; state: Exp; lines: +24 -19
heavy load by cpu limit from 6 to 3. Because 6 is too big on ks6
----------------------------
revision 2.218
date: 2022/06/25 06:38:24; author: gilles; state: Exp; lines: +12 -9
Typo. memory_consumption_all_pids_percent with only 2 decimals.
----------------------------
revision 2.217
date: 2022/06/25 06:16:42; author: gilles; state: Exp; lines: +148 -52
CGI context. Bring back to exit on heavy load by cpu. limit is a load of 6 per core, roughly the number of processes running constantly per core.
----------------------------
revision 2.216
date: 2022/06/22 18:49:55; author: gilles; state: Exp; lines: +9 -9
typo seconde second
----------------------------
revision 2.215
date: 2022/06/22 01:44:01; author: gilles; state: Exp; lines: +34 -21
Added --exitonload option. Only available in CGI context for now.
----------------------------
revision 2.214
date: 2022/06/08 21:28:34; author: gilles; state: Exp; lines: +11 -11
load_percent_threshold is now room for two average imapsync processes.
----------------------------
revision 2.213
date: 2022/05/20 11:57:22; author: gilles; state: Exp; lines: +48 -33
Filtering buggy flags is now case insensitive. \Junk or \JUNK or \jUnK etc.
Refactoring. Added sub tests_filterbuggyflags()
----------------------------
revision 2.212
date: 2022/05/19 11:18:09; author: gilles; state: Exp; lines: +67 -16
Bugfix. Do not crash when Proc::ProcessTable field pctmem does not exist.
----------------------------
revision 2.211
date: 2022/05/19 08:37:14; author: gilles; state: Exp; lines: +10 -10
Last commit 2.210 did not pass the unit tests. Fixed.
----------------------------
revision 2.210
date: 2022/05/19 08:09:57; author: gilles; state: Exp; lines: +10 -10
Added filtering \JUNK flag in cgi context or with --filterbuggyflags
----------------------------
revision 2.209
date: 2022/05/15 11:03:02; author: gilles; state: Exp; lines: +37 -9
Enhancement. heavy_load_percent_threshold now based on memory_footprint_average_bytes 300 MB
----------------------------
revision 2.208
date: 2022/05/13 20:14:25; author: gilles; state: Exp; lines: +8 -8
90%
----------------------------
revision 2.207
date: 2022/05/12 16:31:10; author: gilles; state: Exp; lines: +21 -21
memory limit to quit from 100% to 50%. Quick fix.
----------------------------
revision 2.206
date: 2022/05/12 11:07:07; author: gilles; state: Exp; lines: +139 -54
Added dependency. Perl module Proc::ProcessTable. Not mandatory anyway. For now.
CGI context. Exit when 100% of RAM memory is used by processes. Exit with status value 69 and message "EX_UNAVAILABLE: service unavailable".
Added the % of RAM used by all processes in the memory infi line.
----------------------------
revision 2.205
date: 2022/05/09 21:29:07; author: gilles; state: Exp; lines: +264 -247
perlcritic. Change all "= shift ;" to " = shift @ARG ;"
----------------------------
revision 2.204
date: 2022/05/03 22:28:53; author: gilles; state: Exp; lines: +34 -9
Do not report final emails when --dry or --justfolders
----------------------------
revision 2.203
date: 2022/04/26 22:57:46; author: gilles; state: Exp; lines: +42 -17
Bugfix. Allow quota like: QUOTA "user-defined quota (konsoleH)" (STORAGE 988 48829 MESSAGE 20 20)
Enhancement. Added --memorystress to check memory crunching in normal run.
----------------------------
revision 2.202
date: 2022/04/18 23:40:20; author: gilles; state: Exp; lines: +89 -20
CGI context. Do not append the log file name to ../list_all_logs_auto.txt when there is no parameters.
----------------------------
revision 2.201
date: 2022/04/09 08:45:27; author: gilles; state: Exp; lines: +12 -12
Moved all getppid to mygetppid (it adds a comment on Windows, where ppid is too complicated to get.
----------------------------
revision 2.200
date: 2022/04/04 16:05:55; author: gilles; state: Exp; lines: +14 -10
typo. "check the certificate server" => "check the server certificate."
----------------------------
revision 2.199
date: 2022/04/01 19:45:33; author: gilles; state: Exp; lines: +15 -14
Enhancement. Added the local ip address for the imap connexions. It can help configuring firewalls to allow the imap source IP.
----------------------------
revision 2.198
date: 2022/04/01 11:13:01; author: gilles; state: Exp; lines: +10 -12
Added SERVER_NAME SERVER_ADDR SERVER_ADMIN variables and values to the output.
----------------------------
revision 2.197
date: 2022/03/30 10:43:22; author: gilles; state: Exp; lines: +29 -28
Bugfix. --tests --testslive was listing 0 folders.
Added message "Use --noemailreport1 to avoid it" after putting the email final report in INBOX.
----------------------------
revision 2.196
date: 2022/03/25 20:35:59; author: gilles; state: Exp; lines: +120 -67
Bugfix. Dates were not displayed under Windows because POSIX::strftime %e is not portable.
Bugfix. Several other places where dates were wrong on Windows.
----------------------------
revision 2.195
date: 2022/03/24 10:00:09; author: gilles; state: Exp; lines: +26 -29
Added warning "parsing headers of folder ... It can take time for huge folders. Be patient."
----------------------------
revision 2.194
date: 2022/03/17 11:04:16; author: gilles; state: Exp; lines: +16 -15
Bugfix. --var HTTP_COOKIE=proximapsync_runs=31 was not working because of the second =
----------------------------
revision 2.193
date: 2022/03/15 11:30:02; author: gilles; state: Exp; lines: +101 -105
Refactor. Deglobalized $debuglist $debugflags
Refactor. Added sync->{ permanentflags2 }
----------------------------
revision 2.192
date: 2022/03/11 18:26:06; author: gilles; state: Exp; lines: +88 -46
Bugfix. Do not allow --skipcrossduplicates and --usecache. Exit EX_USAGE 64
----------------------------
revision 2.191
date: 2022/03/08 10:55:21; author: gilles; state: Exp; lines: +131 -48
Added --var to pass values from proximapsync for variables REMOTE_ADDR REMOTE_HOST HTTP_REFERER HTTP_USER_AGENT SERVER_SOFTWARE SERVER_PORT HTTP_COOKIE
----------------------------
revision 2.190
date: 2022/03/01 21:48:11; author: gilles; state: Exp; lines: +31 -8
Bugfix. Do not turn on --delete2duplicates when --syncduplicates is on, unless --delete2duplicates is given.
----------------------------
revision 2.189
date: 2022/02/28 18:10:10; author: gilles; state: Exp; lines: +9 -11
Upped ERRORS_MAX_CGI from 20 to 500
----------------------------
revision 2.188
date: 2022/02/26 22:43:55; author: gilles; state: Exp; lines: +182 -100
Refactor. Changed setlogfile() to be usable for different logs by proximapsync.
----------------------------
revision 2.187
date: 2022/02/23 12:01:25; author: gilles; state: Exp; lines: +26 -7
Documented why total sizes can differ even when the sync is perfect.
----------------------------
revision 2.186
date: 2022/02/22 22:39:50; author: gilles; state: Exp; lines: +27 -21
Bugfix. Redirect STDERR to STDOUT in all cases, --log or --nolog
----------------------------
revision 2.185
date: 2022/02/11 21:36:18; author: gilles; state: Exp; lines: +19 -11
Added option --emailreport1 and --emailreport2. On by default. Use --noemailreport1 and --noemailreport2 to avoid final emails reports in each INBOX.
----------------------------
revision 2.184
date: 2022/02/10 17:37:57; author: gilles; state: Exp; lines: +91 -31
Added final report to source account also.
----------------------------
revision 2.183
date: 2022/02/06 13:14:33; author: gilles; state: Exp; lines: +29 -29
Added folder name in the debug output of header identificators
----------------------------
revision 2.182
date: 2022/02/01 20:49:51; author: gilles; state: Exp; lines: +10 -10
Bugfix. GMT is good but the tests had to be changed also...
----------------------------
revision 2.181
date: 2022/02/01 20:19:22; author: gilles; state: Exp; lines: +23 -10
Bugfix. Use GMT in tests_email_report_message_id
Bugfix. Make the email report w3c validated. Crazy man!
----------------------------
revision 2.180
date: 2022/02/01 15:14:51; author: gilles; state: Exp; lines: +373 -30
Enhancement. Append a final email report on account2 at the end of the synchronization. Will be optionnal soon.
----------------------------
revision 2.179
date: 2022/01/26 14:32:19; author: gilles; state: Exp; lines: +134 -139
README reread, grammarly on it.
Added "Posta inviata" so \Sent with --automap
----------------------------
revision 2.178
date: 2022/01/12 21:28:37; author: gilles; state: Exp; lines: +75 -13
Added tests_compress_ssl()
----------------------------
revision 2.177
date: 2021/12/23 20:38:44; author: gilles; state: Exp; lines: +8 -8
Bugfix. 1849 -> 1848 unit tests
----------------------------
revision 2.176
date: 2021/12/23 20:19:04; author: gilles; state: Exp; lines: +35 -23
Bugfix. memory consumption on Mac was not relevant. Use RSS instead of VSZ, on Mac only. Linux stays with VSZ.
----------------------------
revision 2.175
date: 2021/12/21 17:46:14; author: gilles; state: Exp; lines: +23 -21
Bugix. Darwin, fixed loadavg tests, no more W/t/loadavg.out needed.
----------------------------
revision 2.174
date: 2021/12/14 15:51:58; author: gilles; state: Exp; lines: +62 -17
Added advice for:
ERR_APPEND_SIZE
ERR_CONNECTION_FAILURE_HOST1
ERR_CONNECTION_FAILURE_HOST2
ERR_AUTHENTICATION_FAILURE_USER1
ERR_AUTHENTICATION_FAILURE_USER2
----------------------------
revision 2.173
date: 2021/12/09 18:30:34; author: gilles; state: Exp; lines: +61 -40
Bugfix. Made reconnect mechanism works with --oauthdirect1 --oauthdirect2 --oauthaccesstoken1 --oauthaccesstoken2
----------------------------
revision 2.172
date: 2021/12/07 18:19:42; author: gilles; state: Exp; lines: +27 -17
Added some tests to tests_get_options_from_string() and tests_get_options_extra()
I can not have the unknown options back with Getopt::Long::GetOptionsFromString(), just the unknown values, ie, caca but not --caca
----------------------------
revision 2.171
date: 2021/12/07 17:50:12; author: gilles; state: Exp; lines: +14 -8
Added --ssl1 --ssl2 --tls1 --tls2 --compress1 --compress2 to get_options_from_string()
----------------------------
revision 2.170
date: 2021/12/07 17:19:44; author: gilles; state: Exp; lines: +12 -8
Added --keepalive1 --keepalive2 --reconnectretry1 --reconnectretry2 in get_options_from_string()
----------------------------
revision 2.169
date: 2021/12/07 17:13:44; author: gilles; state: Exp; lines: +101 -36
Added --keepalive1 and --keepalive2 options. On by default.
See https://metacpan.org/pod/Mail::IMAPClient#Keepalive
Use --nokeepalive1 and --nokeepalive2 to disable Keepalive.
----------------------------
revision 2.168
date: 2021/12/05 23:27:27; author: gilles; state: Exp; lines: +29 -11
Added --debugflags --errorsmax --folder --timeout in options from file
----------------------------
revision 2.167
date: 2021/12/02 16:59:51; author: gilles; state: Exp; lines: +9 -9
Moved the call to extra options after the chdir of the CGI context.
----------------------------
revision 2.166
date: 2021/12/02 15:23:37; author: gilles; state: Exp; lines: +107 -9
Now read extra options on the first line of the file ./options_extra.txt if it is present and readable.
----------------------------
revision 2.165
date: 2021/11/30 20:27:38; author: gilles; state: Exp; lines: +30 -11
cpu_time rounded with 2 decimals.
Added 4 tests when no compression is on.
----------------------------
revision 2.164
date: 2021/11/24 21:26:46; author: gilles; state: Exp; lines: +12 -11
Compression no more on by default. Just to see.
----------------------------
revision 2.163
date: 2021/11/20 20:11:46; author: gilles; state: Exp; lines: +8 -7
Bugfix. imapsync --version was buggy in docker context.
----------------------------
revision 2.162
date: 2021/11/20 10:16:33; author: gilles; state: Exp; lines: +14 -12
Docker. Current working directory changed from /var/tmp to /var/tmp/uid_$EFFECTIVE_USER_ID
----------------------------
revision 2.161
date: 2021/11/19 18:17:48; author: gilles; state: Exp; lines: +8 -8
Bugfix. inline doc mentioned always --nocompress1
----------------------------
revision 2.160
date: 2021/11/19 14:40:58; author: gilles; state: Exp; lines: +10 -7
Added inline documentation about --nocompress1 and --nocompress2
----------------------------
revision 2.159
date: 2021/11/19 14:29:31; author: gilles; state: Exp; lines: +113 -12
Dependency. Added use Compress::Zlib
Enhancement. Added compression in imap. On by default no matter the capability announced. Use --nocompress1 and --nocompress2 to turn it off.
----------------------------
revision 2.158
date: 2021/11/13 20:01:35; author: gilles; state: Exp; lines: +13 -7
Added README help for --truncmess
----------------------------
revision 2.157
date: 2021/10/23 21:51:43; author: gilles; state: Exp; lines: +61 -16
Refactor. Deglobalized $debugcontent. Added debugcontent() function.
1800 unit tests.
----------------------------
revision 2.156
date: 2021/10/12 13:36:36; author: gilles; state: Exp; lines: +72 -71
Added comment for ERR_FLAGS "Many STORE errors with FLAGS. Retry with the option --noresyncflags"
Refactored errors_incr() and errors_listing()
Bugfix. errors_incr() existed with CATCH_ALL
----------------------------
revision 2.155
date: 2021/10/01 07:46:55; author: gilles; state: Exp; lines: +9 -8
Like --useheader X-Gmail-Received --useheader Message-Id when --gmail1 --gmail2
----------------------------
revision 2.154
date: 2021/09/29 20:38:04; author: gilles; state: Exp; lines: +8 -8
Bugfix. Added 'E&AwE-le&AwE-ments envoye&AwE-s' in possible_special
----------------------------
revision 2.153
date: 2021/09/29 13:56:15; author: gilles; state: Exp; lines: +34 -12
Does not checknoabletosearch if --justfolders
When creating folder check if selectable and consider ok if selectable
----------------------------
revision 2.152
date: 2021/09/29 12:03:12; author: gilles; state: Exp; lines: +362 -58
Added inline advice on error ERR_OVERQUOTA
Added inline advice on error ERR_TRANSFER_EXCEEDED
Renamed function bytes_display_string() bytes_display_string_bin()
bytes_display_string_bin converts bytes to human KiB MiB GiB TiB PiB
Added function bytes_display_string_dec() to convert bytes to human decimal KB MB GB TB PB (1000 base)
----------------------------
revision 2.151
date: 2021/09/08 10:34:25; author: gilles; state: Exp; lines: +23 -18
Bugfix. load average on macosx was sometimes buggy. locale float 3,14 instead of 3.14
----------------------------
revision 2.150
date: 2021/08/08 12:10:51; author: gilles; state: Exp; lines: +9 -10
Refactor. Deglobalized warn_release variable
----------------------------
revision 2.149
date: 2021/07/31 11:24:24; author: gilles; state: Exp; lines: +7 -26
Removed --fast option.
----------------------------
revision 2.148
date: 2021/07/22 14:21:09; author: gilles; state: Exp; lines: +10 -10
Bugfix. abort didn't do charset=UTF-8; same for heavy load 503 Service Unavailable
----------------------------
revision 2.147
date: 2021/07/22 13:13:50; author: gilles; state: Exp; lines: +12 -12
Bugfix. The maximum number a pid can be is 2^22, not 2^32.
----------------------------
revision 2.146
date: 2021/07/22 12:48:21; author: gilles; state: Exp; lines: +8 -8
1742 unit tests.
----------------------------
revision 2.145
date: 2021/07/22 12:45:31; author: gilles; state: Exp; lines: +16 -13
Bugfix. Up the maximum number a pid can be. From 99999 to 2^32. See https://unix.stackexchange.com/questions/16883/what-is-the-maximum-value-of-the-process-id
----------------------------
revision 2.144
date: 2021/07/17 18:07:59; author: gilles; state: Exp; lines: +13 -10
Just an experimental loaddelay forced to 0.
----------------------------
revision 2.143
date: 2021/07/12 19:45:44; author: gilles; state: Exp; lines: +111 -15
Bugfix. Under docker context --version was buggy, too verbose.
----------------------------
revision 2.142
date: 2021/07/12 14:04:01; author: gilles; state: Exp; lines: +17 -19
Removed that hard limit --maxsize 35_651_584 set by --gmail2 since CAPABILITY is used and good.
----------------------------
revision 2.141
date: 2021/07/06 02:59:19; author: gilles; state: Exp; lines: +8 -8
cpu_time param
----------------------------
revision 2.140
date: 2021/07/05 20:14:18; author: gilles; state: Exp; lines: +14 -10
Fixed perlcrit 4 severity 4 violations.
----------------------------

View File

@ -79,7 +79,7 @@ Q. For some messages, the imapsync log says
R0. Append errors are host2 problems, append is the imap term to copy
a message to the destination account.
A problem is that the assosiated "socket closed ..." error message happens
A problem is that the associated "socket closed ..." error message happens
for several different issues. So I list here several potential issues
and their solutions if they exist.
R1 deals about too long lines in messages on Windows.

View File

@ -1,5 +1,5 @@
#!/bin/cat
$Id: FAQ.Admin_Authentication.txt,v 1.12 2021/02/19 13:44:18 gilles Exp gilles $
$Id: FAQ.Admin_Authentication.txt,v 1.13 2022/04/06 10:27:52 gilles Exp gilles $
This documentation is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -20,7 +20,7 @@ server and its configuration.
You have to follow this road:
* Determine what is the imap software server
* Find out whether it supports an admin account or not
* If no, leave this reading, take an handkerchief and cry
* If no, leave this reading, take a handkerchief and cry
* If yes, search how the imap software server supports
an admin account (see below)
* Figure out whether an admin account is actually configured or not,
@ -42,6 +42,7 @@ Known imap software servers supporting imap admin authentication:
* Zimbra. See the file FAQ.Zimbra.txt
* Kerio See the file FAQ.Kerio.txt
* Cyrus-imap. See the file FAQ.Cyrus.txt
* James. See the file FAQ.James.txt
* UW-imap. See the file FAQ.General.txt
* Sun Java Enterprise System/SunOne/iPlanet. See the file FAQ.General.txt

View File

@ -1,5 +1,5 @@
#!/bin/cat
$Id: FAQ.Archiving.txt,v 1.25 2021/05/04 16:56:59 gilles Exp gilles $
$Id: FAQ.Archiving.txt,v 1.27 2022/05/19 08:56:06 gilles Exp gilles $
This documentation is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -14,12 +14,12 @@ Questions answered in this FAQ are:
Q. How can I archive different accounts on the same destination account,
each account on a separate folder?
Q. How can I restore a complete account archived in a subfolder, like
with the option --subfolder2?
Q. How can I restore a complete account backuped in a subfolder, like
a backup done with the option --subfolder2?
Q. How to move emails from one IMAP folder to another either on the
same IMAP server or a different one?
For example, all messages older than 1 year, move from INBOX to Archive.
Q. How to move emails from one IMAP folder to another, either on the
same IMAP server or on a different one? Example:
How to move all messages older than 1 year, from INBOX to Archive?
Q. Can imapsync be used to maintain and restore a local offline copy
of a mailbox, eg for backup purposes, using Mbox or Maildir
@ -47,8 +47,12 @@ R. Use --subfolder2
Examples:
To backup the account Foo in a subfolder called FooArchiv:
imapsync ... --user1 Foo --subfolder2 FooArchiv
To backup the account Bar in a subfolder called BarArchiv:
imapsync ... --user1 Bar --subfolder2 BarArchiv
In case you need a very strict sync, add options
@ -58,20 +62,26 @@ It will delete on account2 what is not on account1 but only in the right place,
ie, the subfolder "FooArchiv".
Examples:
To mirror the account Foo in a subfolder called FooArchiv:
imapsync ... --user1 Foo --subfolder2 FooArchiv --delete2 --delete2foldersonly "FooArchiv"
To mirror the account Bar in a subfolder called BarArchiv:
imapsync ... --user1 Bar --subfolder2 BarArchiv --delete2 --delete2foldersonly "BarArchiv"
See how to restore those with the next Q/R.
=======================================================================
Q. How can I restore a complete account archived in a subfolder, like
with the option --subfolder2?
Q. How can I restore a complete account backuped in a subfolder, like
a backup done with the option --subfolder2?
R. Use --subfolder1
--subfolder1 str : Syncs the host1 folders hierarchy under folder str
to the root hierarchy of host2.
It's the couterpart of a sync done by --subfolder2
It's the counterpart of a sync done by --subfolder2
when doing it in the reverse order.
Backup/Restore scenario:
Use --subfolder2 str for a backup to the folder str
@ -81,26 +91,29 @@ R. Use --subfolder1
Examples:
To restore the whole folder FooArchiv hierarchy into the Foo account:
imapsync ... --user2 Foo --subfolder1 FooArchiv
imapsync ... --user2 Bar --subfolder1 BarArchiv
To restore the whole folder BarArchiv hierarchy into the Bar account:
imapsync ... --user2 Bar --subfolder1 BarArchiv
Read the previous FAQ item "How can I archive different accounts on the same
destination account, each account on a separate folder?"
=======================================================================
Q. How to move emails from one IMAP folder to another either on the
same IMAP server or a different one?
For example, all messages older than 1 year, move from INBOX to Archive.
Q. How to move emails from one IMAP folder to another, either on the
same IMAP server or on a different one? Example:
How to move all messages older than 1 year, from INBOX to Archive?
R1. Solution:
imapsync ... --minage 365 --folder Inbox --f1f2 INBOX=Archive --delete1 --noexpungeaftereach
imapsync ... --minage 365 --folder INBOX --f1f2 INBOX=Archive --delete1 --noexpungeaftereach
Add option --noexpungeaftereach if speed is a concern.
Add option --delete1 if you want to move messages, instead of just copy/sync them.
Use the option --noexpungeaftereach if speed is a concern.
Use the option --delete1 if you want to move messages, instead of just copy/sync them.
R2. See also file FAQ.Folders_Mapping.txt
@ -145,20 +158,23 @@ I have never used any of this tools so asking me for support with them
won't go far away.
=======================================================================
Q. How to archive a whole year in a subfolder?
Q. How to backup a whole year in a subfolder?
R. Example:
R. To backup the whole year 2018 in a subfolder called ARCHIVE_2018:
imapsync ... --search "SENTSINCE 1-Jan-2018 SENTBEFORE 31-Dec-2018" \
--folder2 ARCHIVE_2018
--subfolder2 ARCHIVE_2018
=======================================================================
Q. How to archive a whole year in subfolders but without subsubfolders?
R. Example:
R. Instead of the solution with --subfolder2, use:
imapsync ... --search "SENTSINCE 1-Jan-2018 SENTBEFORE 31-Dec-2018" \
--sep2 _ --regextrans2 's{(.*)}{Archive_$1_2018}'
For each folder "FFFF" in the source account, it will create a destination
folder called "Archive_FFFF_2018", at the top level hierarchy.
=======================================================================
=======================================================================

View File

@ -1,9 +1,9 @@
#!/bin/cat
$Id: FAQ.Authentication_failure.txt,v 1.13 2021/03/02 19:24:22 gilles Exp gilles $
$Id: FAQ.Authentication_failure.txt,v 1.16 2022/08/17 09:18:17 gilles Exp gilles $
This documentation is also available online at
https://imapsync.lamiral.info/FAQ.d/
https://imapsync.lamiral.info/FAQ.d/FAQ.Admin_Authentication.txt
https://imapsync.lamiral.info/FAQ.d/FAQ.Authentication_failure.txt
=======================================================================
Imapsync authentication issues
@ -25,15 +25,17 @@ Q. Imapsync fails with the following error, what can I do?
Host1 failure: Error login on [imap.example.com] with user [foo] auth [LOGIN]: 2 NO [AUTHENTICATIONFAILED] Authentication failed
R. One over four imapsync syncs ends up quickly with the error message
"Authentication failed" or "NO LOGIN failed" or similar.
R. One over four imapsync synchronizations end up quickly with the error message
"Authentication failed" or "NO LOGIN failed" or a similar message.
Authentication failure is the primary failure with imapsync
and since nothing tangible can be done without authentication,
this stage must succeed to go further.
Here are some advices to get you pass this difficult stage of authentication:
Here is some advice to get you to pass this difficult stage of authentication:
* Triple check each credential parameter, there are three parameters at each side:
* Triple-check each credential parameter. It's not always a password problem,
it can be the wrong host or the wrong user.
There are three parameters on each side:
* triple check --host1
* triple check --user1
* triple check --password1
@ -41,7 +43,7 @@ Here are some advices to get you pass this difficult stage of authentication:
* triple check --user2
* triple check --password2
* If you can authenticate successfully with an other imap client software
* If you can authenticate successfully with another imap client software
like Thunderbird or Outlook or Sparrow then it is a very good sign to
authenticate successfully with imapsync. Examine the parameters of
this other imap client and copy them as is for imapsync.
@ -50,11 +52,10 @@ Here are some advices to get you pass this difficult stage of authentication:
At the beginning of the output, imapsync dumps all its command
line parameters; it's the line after "Command line used:".
With --showpasswords, imapsync prints the passwords received
instead of the string MASKED. It helps for debugging quoting issues.
instead of the string MASKED. It helps with debugging quoting issues.
Option --showpasswords shows passwords again when the IMAP dialog
is dumped by --debugimap option. Search for a line like
"Sending: 2 LOGIN test1 secret1" (secret1 is the password here)
"Sending: 2 LOGIN test1 secret1" (secret1 is the password here).
* It is sometimes very hard to quote correctly unusual characters,
especially on Windows (and Mac sometimes). See
@ -62,19 +63,19 @@ Here are some advices to get you pass this difficult stage of authentication:
https://imapsync.lamiral.info/FAQ.d/FAQ.Passwords_on_Unix.txt
https://imapsync.lamiral.info/FAQ.d/FAQ.Passwords_on_Mac.txt
The quickest trick may be to change the password temporally
with easy characters like the classical alphabet, a long
string still ensure strong security.
The quickest trick may be to change the password temporarily
with easy characters like the classical alphabet, one long
string still ensures strong security.
* Sometimes some servers announce they support LOGIN but it
actually fails because the authentication mechanism
fails because the authentication mechanism
working is something else like CRAM-MD5 or PLAIN.
So:
* Try --authmech1 CRAM-MD5 (or --authmech2 CRAM-MD5)
* Try --authmech1 PLAIN (or --authmech2 PLAIN)
* Manually test a login via ssl.
Use either ncat or telnet-ssl or openssl commands like in the
Use either ncat or telnet-ssl or openssl commands, like in the
following examples with imap.gmail.com server:
ncat --ssl -C imap.gmail.com 993
@ -84,7 +85,7 @@ Here are some advices to get you pass this difficult stage of authentication:
Replace imap.gmail.com by your imap server.
The three commands do the same work here.
Tipical dialog for an imap LOGIN command:
Typical dialog for an imap LOGIN command:
* OK Gimap ready for requests from 78.196.254.58 q1mb175739668wix
a LOGIN "gilles.lamiral@gmail.com" "secret"

View File

@ -1,5 +1,5 @@
#!/bin/cat
$Id: FAQ.Big_Mailbox.txt,v 1.7 2021/02/01 21:47:41 gilles Exp gilles $
$Id: FAQ.Big_Mailbox.txt,v 1.8 2022/04/23 13:45:48 gilles Exp gilles $
This document is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -33,7 +33,7 @@ genuine IMAP commands used and their responses. The problem with
generates a very BIG logfile.
R2. If it is not ok with imapsync, the sync finally fails, then
consider spliting the whole sync into smaller chunks using
consider splitting the whole sync into smaller chunks using
the option --search
For example, select messages only for a given year:

View File

@ -0,0 +1,103 @@
$Id: FAQ.Capacity_Planning.txt,v 1.6 2022/04/23 13:45:59 gilles Exp gilles $
This documentation is also available online at
https://imapsync.lamiral.info/FAQ.d/
https://imapsync.lamiral.info/FAQ.d/FAQ.Capacity_Planning.txt
======================================================================
Imapsync tips for Capacity Planning.
======================================================================
I plan to go to a distributed architecture for the online service. I'm
doing some capacity planning. Imapsync takes memory, cpu and bandwidth
in a relatively deterministic values.
My current question is: Shall I use
* N 2GB hosts
* N/2 4GB hosts
* N/4 8GB hosts
Let's do some observations and maths
The observations are done on the standalone imapsync online which
characteristics are:
CPU: Intel i5-2300 with 4 cores
RAM: 16 GB
NET: 100 Mbps symmetrical, 12.5 MBytes/s symmetrical,
so 25 MBytes/s max for a global imapsync rate.
Disks: I don't know.
System: FreeBSD 11.4
===== CPU =====
The CPU can be an issue. On average, an imapsync run takes 5% of the
overall cpu time for a Intel i5-2300 with 4 cores. It implies 20
imapsync runs is ok on the current online host before the cpus become
the bottleneck. As a rule of thumb, imapsync takes 20% of a cpu core.
In the Intel i5-2300 4 cores, so far, the maximum number of imapsync
processes has been 68, which is 3 times what the system should
support in a standard imapsync workload. For this workload, the
imapsync performamces were not good, the server could not handle the load
and was even out of order for a while. For 40 imapsync processes, the
the performances are ok.
===== RAM =====
The RAM can be an issue. On average, an imapsync run takes 250 MB. So
4 imapsync processes per GB is the limit before swapping to disk,
which is a known phenomenon telling when memory becomes the bottleneck.
16 GB allows 64 imapsync processes.
On the 16GB, so far, the maximum memory usage taken by imapsync processes was
13 GB. For that value, the one minute load was 10 or more, the number of
imapsync processes was around 40, the total bandwidth was around 19 MiB/s.
===== LINK =====
The Bandwidth I/O can be an issue. The "Average bandwidth rate" value
given by imapsync at the end of a transfer, and also the bandwidth
rate given during the sync on the ETA line, is the total size of all
messages copied divided by the time passed. If imapsync is run between
two foreign imap servers then the total size transferred on the
network link is twice this value, one time when getting the message
from host1, rx, and one time sending the message to host2, tx.
On average, an imapsync runs at 3 Mbps both ways, rx and tx, so 6 Mbps
in total. So a 100 Mbps symmetric link allows 33 imapsync processes
before the link becomes the bottleneck.
The best minutes observed so far are a global 187 Mpbs rate (~23 MiB/s)
on a 100 Mbps symmetrical link done by 28 imapsync processes in parallel,
6.7 Mbps per process at that minute. But the best minutes observed for a
single imapsync process is at 103 Mbps (~13 MiB/s), the rx/tx link limit.
===== DISKS =====
The harddisk I/O can be an issue. I don't measure it yet because
imapsync doesn't perform heavy I/0 where it runs. Well, I don't know,
no measure is no knowledge, just guesses.
===== Repartition ======
Let's consider we have a bunch of different hosts able to run imapsync
processes. How should we distribute imapsync jobs among them?
A simple rule is "do not add more load to a host when one of the resources
has reached its maximal. The resources are memory, bandwidth, cpu, disk.
I ignore the disk part for now.
maximum number of imapsync processes for a host
= min( 4 * RAM_in_GB, 10 * nb_cores, bandwidth_in_mbps / 3 )

View File

@ -1,5 +1,5 @@
#!/bin/cat
$Id: FAQ.Contacts_Calendars.txt,v 1.14 2020/11/02 16:04:09 gilles Exp gilles $
$Id: FAQ.Contacts_Calendars.txt,v 1.17 2022/05/31 22:21:55 gilles Exp gilles $
This documentation is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -11,21 +11,20 @@ https://imapsync.lamiral.info/FAQ.d/FAQ.Contacts_Calendars.txt
Questions answered in this FAQ are:
Q. Can I copy or sync Calendars or Contacts with imapsync?
Q. Can I copy or sync Chat messages with imapsync?
Q. How can I avoid copying Calendar or Contacts folders?
Q. Can I copy or sync Contacts, Calendars, Tasks or Chat messages with imapsync?
Q. How can I copy or synchronize Calendars or Contacts?
Q. How can I avoid copying Calendar or Contacts folders?
Now the questions again with their answers.
=======================================================================
Q. Can I copy or sync Calendars or Contacts with imapsync?
Q. Can I copy or sync Contacts, Calendars, Tasks or Chat messages with imapsync?
R. No, Imapsync can't migrate Contacts and Calendars.
It's because most IMAP servers don't get contacts and calendars
R. No, Imapsync can't migrate Contacts, Calendars, Tasks nor Chat messages.
It's because most IMAP servers don't get Contacts and Calendar
events via IMAP. In other words, messages synced by imapsync from
Calendars or Contacts folders are not used by email servers to set
or get the contacts or calendars.
Contacts/Calendars/Tasks/Chat folders are not used by email servers to set
or get the contacts, calendars, tasks, or chat messages.
No way via IMAP, no way via imapsync.
So it's a good idea to avoid syncing contacts and calendars when
@ -35,12 +34,6 @@ R. No, Imapsync can't migrate Contacts and Calendars.
But see also the question below
"How can I copy or synchronize Calendars or Contacts?".
=======================================================================
Q. Can I copy or sync Chat messages with imapsync?
R. No, Imapsync can't migrate Chat messages (those in GSuite for example).
The explanation is the same as with Calendars or Contacts.
=======================================================================
Q. How can I copy or synchronize Calendars or Contacts?
@ -62,32 +55,32 @@ b) From Gmail to Gmail, export and import calendars in ical format,
c) For Outlook, use caldavsynchronizer.
Homepage: http://caldavsynchronizer.org/
Outlook CalDav Synchronizer is a free Outlook Plugin, which synchronizes
events, tasks and contacts between Outlook and Google, SOGo, Nextcloud or
events, tasks, and contacts between Outlook and Google, SOGo, Nextcloud or
any other CalDAV or CardDAV server.
Supported Outlook versions are Office 365, 2019, 2016, 2013, 2010 and 2007.
Supported Outlook versions are Office 365, 2019, 2016, 2013, 2010, and 2007.
Free and Open Source software tool.
d) Etc. Search the web. There's also specific tools and paid services.
d) Etc. Search the web. There are also specific tools and paid services.
There's no silver bullet to migrate Calendars and Contacts,
if you find one, tell me!
Also consider asking experts at Sumatra company
Also, consider asking experts at the Sumatra company
https://twitter.com/sumatra_dev
http://sumatra.com/
e) I plan to make tools for that but so far nothing has began
e) I plan to make tools for that but so far nothing has begun
more than this discussion:
http://www.linux-france.org/prj/imapsync_list/msg01797.html
http://www.linux-france.org/prj/imapsync_list/msg01811.html
http://linux-france.tk/prj/imapsync_list/msg01797.html
http://linux-france.tk/prj/imapsync_list/msg01811.html
=======================================================================
Q. How can I avoid copying Calendar or Contacts folders?
R. You can avoid synchronizing Calendar or Contacts folders with
the --exclude option. First you have to search what is their
exact name. The folders listing printed by imapsync at the
the --exclude option. First, you have to search what is their
exact name. The listing of folders printed by imapsync at the
beginning of a run will surely help to find their names.
Assuming their names are "Calendars" and "Contacts" use then:
Assuming their names are "Calendars" and "Contacts", use:
imapsync ... --exclude "Calendar" --exclude "Contacts"
@ -96,7 +89,7 @@ R. You can avoid synchronizing Calendar or Contacts folders with
like "MyCalendarZ" or "TheContactsImDoneWith".
Also, case matters: "calendar" does not match "Calendar".
To stritly avoid only "Calendar" or "Contacts" use
To strictly avoid only "Calendar" or "Contacts" use
the following
On windows:

View File

@ -1,5 +1,5 @@
#!/bin/cat
$Id: FAQ.David_Tobit.txt,v 1.4 2019/03/28 17:58:53 gilles Exp gilles $
$Id: FAQ.David_Tobit.txt,v 1.5 2022/04/05 13:48:52 gilles Exp gilles $
This documentation is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -47,8 +47,8 @@ First try above V10 solution since improvments have been made
to support Tobit.
R. Look at the discussion:
http://www.linux-france.org/prj/imapsync_list/msg00583.html
http://www.linux-france.org/prj/imapsync_list/threads.html#00583
http://linux-france.tk/prj/imapsync_list/msg00583.html
http://linux-france.tk/prj/imapsync_list/threads.html#00583
patch saved in ./patches/imapsync-1.337_tobit_V6.patch
=======================================================================

View File

@ -1,13 +1,13 @@
#!/bin/cat
# $Id: FAQ.Docker.txt,v 1.8 2021/05/04 16:57:09 gilles Exp gilles $
# $Id: FAQ.Docker.txt,v 1.10 2021/07/12 21:22:14 gilles Exp gilles $
This document is also available online at
https://imapsync.lamiral.info/FAQ.d/
https://imapsync.lamiral.info/FAQ.d/FAQ.Docker.txt
===========================================================================
Installing and using imapsync docker image
===========================================================================
======================================================================
Installing and using imapsync docker image
======================================================================
Questions answered in this FAQ are:
@ -23,27 +23,29 @@ Q. Where is the imapsync Docker hub location?
Q. How can I mask the passwords on the command line without mounting
inside the container?
===========================================================================
Q. Why imapsync isn't logging to a file in Docker context.
How can I allow it?
Q. Any tips for the Docker Mailcow distribution?
Q. How can I build my own image?
Q. What do you do to update the docker hub image?
Now the questions again with their answers.
===========================================================================
======================================================================
Q. How can I install and use the imapsync Docker image on my amd64 system?
R. Install Docker on your system. Once Docker is installed on your system,
all you have to do in order to run imapsync is the command line:
all you have to do in order install and run imapsync is the command line:
docker run gilleslamiral/imapsync imapsync <usual imapsync arguments>
===========================================================================
======================================================================
Q. How can I install and use the imapsync Docker image on my i386 system?
R. You can't for now. It will throw this error when running it:
R1. You can't do it directly for now. It will throw this error when running it:
docker run gilleslamiral/imapsync imapsync
standard_init_linux.go:211: exec user process caused "exec format error"
@ -51,21 +53,24 @@ R. You can't for now. It will throw this error when running it:
I plan to make the image multi-plateform. Drop me a note if you are
eager to have it.
===========================================================================
R2. Build the image on a i386 system with the exact same Dockerfile provided
and run it on your i386 system.
======================================================================
Q. How can I install or update only the imapsync Docker image on my system?
R. To install or update the imapsync image, run:
docker pull gilleslamiral/imapsync
===========================================================================
======================================================================
Q. Where is the imapsync Docker hub location?
R. Here:
https://hub.docker.com/r/gilleslamiral/imapsync/
===========================================================================
======================================================================
Q. How can I mask the passwords on the command line without mounting
anything inside the container?
@ -84,7 +89,7 @@ See:
https://docs.docker.com/engine/reference/commandline/run/#set-environment-variables--e---env---env-file
https://stackoverflow.com/a/30494145/491175
===========================================================================
======================================================================
Q. Why imapsync isn't logging to a file in Docker context.
How can I allow it?
@ -93,14 +98,14 @@ R. In Docker context, writing the log is disabled by default because you
inside the docker and no longer available after the sync, unless
a special mount is done before.
Starting with imapsync release 2.113 the logging can be set on
Starting with imapsync release 2.113 the logging can be turned on
by using the option --log. You can add access to the logfile with a mount
or similar. See https://docs.docker.com/storage/volumes/"
See also
https://github.com/imapsync/imapsync/issues/283
===========================================================================
======================================================================
Q. Any tips for the Docker Mailcow distribution?
R. With the Mailcow distribution, imapsync is running inside a Docker
@ -116,6 +121,40 @@ See the original Mathilde's comment:
https://github.com/imapsync/imapsync/issues/201#issuecomment-559500077
======================================================================
Q. How can I build my own image?
===========================================================================
===========================================================================
R. Use the following command to build the image:
docker build -t gilleslamiral/imapsync .
with the Dockerfile in the current directory.
The latest Dockerfile can be found at
https://imapsync.lamiral.info/INSTALL.d/Dockerfile
or
https://hub.docker.com/r/gilleslamiral/imapsync
or
https://imapsync.lamiral.info/INSTALL.d/INSTALL.Docker_build.txt
======================================================================
Q. What do you do to update the docker hub image?
R. I do in my imapsync directory:
make docker_build
make docker_upload_docker_hub
Then I go to
https://hub.docker.com/r/gilleslamiral/imapsync
I edit and update the docker "Readme" with the last Dockerfile I used.
I also update INSTALL.Docker_build.txt with the last Dockerfile
I also update the last Dockerfile on the imapsync site with:
make upload_index
======================================================================
======================================================================

View File

@ -1,5 +1,5 @@
#!/bin/cat
$Id: FAQ.Dovecot.txt,v 1.12 2021/04/30 13:02:06 gilles Exp gilles $
$Id: FAQ.Dovecot.txt,v 1.14 2022/06/16 09:06:34 gilles Exp gilles $
This documentation is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -13,6 +13,12 @@ https://imapsync.lamiral.info/FAQ.d/FAQ.Dovecot.txt
Questions answered in this FAQ are:
Q. Is there imapsync specific options to deal with Dovecot?
Q. The login fails with the error:
Err 1/1: Host2 failure: Error login on [...] with user [...] auth [LOGIN]: timeout waiting 120s for data from server (5x)
What can it be?
Q. Subfolders are not created by imapsync and the error is
"Mailbox doesn't allow inferior mailboxes"
@ -28,6 +34,19 @@ Q. Imapsync encounters timeouts and Dovecot log says
Now the questions again with their answers.
=======================================================================
Q. Is there imapsync specific options to deal with Dovecot?
R. Dovecot is ok with imapsync, nothing special is needed, just the
basic options, ie, the credentials, are needed.
=======================================================================
Q. The login fails with the error:
Err 1/1: Host2 failure: Error login on [...] with user [...] auth [LOGIN]: timeout waiting 120s for data from server (5x)
What can it be?
R. It can be special characters in the password. Change it with only
normal characters, characters from a-z A-Z 0-9
=======================================================================
Q. How to migrate to Dovecot with an admin/MasterUser account?
@ -44,11 +63,11 @@ Q. I have a mailbox that "dovecot backup" gives errors on that
I can't get rid of: "UID inserted in the middle of mailbox".
What can I do?
Q. Solution, run:
R. Solution, run:
doveadm -v deduplicate -m -u martin mailbox A/Posted
it will get rid of the duplicates (I can also be run without "-m")
it will get rid of the duplicates (it can also be run without "-m")
and this also allows "dovecot backup" to work.
Thanks to Martin Ward for this input!

View File

@ -1,5 +1,5 @@
#!/bin/cat
$Id: FAQ.Duplicates.txt,v 1.24 2021/07/04 22:59:56 gilles Exp gilles $
$Id: FAQ.Duplicates.txt,v 1.25 2021/10/06 20:21:13 gilles Exp gilles $
This documentation is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -12,6 +12,10 @@ https://imapsync.lamiral.info/FAQ.d/FAQ.Duplicates.txt
Questions answered in this FAQ are:
Q. Without imapsync, I made several copies that partially failed and it
ended with many duplicates/triplicates messages or more. Can I clean
up the account with imapsync and how?
Q. How does imapsync identify messages and duplicates?
Q. How can I know if imapsync will generate duplicates on a second run?
@ -30,6 +34,14 @@ Q. How can I remove duplicates in a lone account?
Now the questions again with their answers.
=======================================================================
Q. Without imapsync, I made several copies that partially failed and it
ended with many duplicates/triplicates messages or more. Can I clean
up the account with imapsync and how?
R. Yes.
See the Q/R "How can I remove duplicates in a lone account?" below.
=======================================================================
Q. How does imapsync identify messages and duplicates?
@ -101,7 +113,7 @@ identify messages.
If you end with many messages skipped then it's very
good and now you can safely resync the mailbox
and get rid of the dupplicates messages on host2 with:
and get rid of the duplicate messages on host2 with:
imapsync ... --useheader "Message-Id" --delete2duplicates
@ -260,6 +272,8 @@ R. In order to remove duplicates in a lone account, just run imapsync
on the same account as source and destination, plus the
option --delete2duplicates, ie, with
host1 == host2, user1 == user2, password1 == password2
imapsync ... --delete2duplicates
=======================================================================
=======================================================================

View File

@ -1,5 +1,5 @@
#!/bin/cat
$Id: FAQ.Emptying.txt,v 1.11 2020/10/13 16:24:43 gilles Exp gilles $
$Id: FAQ.Emptying.txt,v 1.14 2022/06/08 11:08:39 gilles Exp gilles $
This documentation is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -7,16 +7,26 @@ https://imapsync.lamiral.info/FAQ.d/
https://imapsync.lamiral.info/FAQ.d/FAQ.Emptying.txt
=======================================================================
Imapsync tip to empty an account.
Imapsync tips about deletions.
=======================================================================
Questions answered in this FAQ are:
Q. How to delete all emails of all folders of an account with imapsync?
Q. How to delete all folders of an account with imapsync?
Q. How to delete some folders of an account with imapsync?
Q. How to revert a sync that went to the wrong account?
Q. How to delete emails older than 90 days with imapsync?
Q. How to delete emails matching a certain criterium with imapsync?
Q. Is there a way to delete the destination folders when the source
folders are no longer there?
Now the questions again with their answers.
=======================================================================
@ -27,11 +37,11 @@ R. Use the same account on both sides with option --delete1
Option --noexpungeaftereach is just to speed up the deletions.
Example (real example):
Example:
imapsync \
--host1 test.lamiral.info --user1 empty --password1 secret \
--host2 test.lamiral.info --user2 empty --password2 secret \
--host1 test.lamiral.info --user1 foo --password1 secret \
--host2 test.lamiral.info --user2 foo --password2 secret \
--delete1 --noexpungeaftereach
=======================================================================
@ -90,5 +100,54 @@ R. If all the wrong emails have some common characteristic that is not
If the wrongly emails messages synced have no special common
characteristic then take an handkerchief and cry.
=======================================================================
Q. How to delete emails older than 90 days with imapsync?
R. Use the same account on both sides with option --delete1
--noexpungeaftereach --minage 90
Example:
imapsync \
--host1 test.lamiral.info --user1 foo --password1 secret \
--host2 test.lamiral.info --user2 foo --password2 secret \
--delete1 --noexpungeaftereach --minage 90
=======================================================================
Q. How to delete emails matching a certain criterium with imapsync?
R. Use the --search option to select the messages you want to delete
and then use the same account on both sides with the suplementary
options --delete1 --noexpungeaftereach
To select the messages read the document FAQ.Messages_Selection.txt
at https://imapsync.lamiral.info/FAQ.d/FAQ.Messages_Selection.txt
Example:
imapsync \
--host1 test.lamiral.info --user1 foo --password1 secret \
--host2 test.lamiral.info --user2 foo --password2 secret \
--delete1 --noexpungeaftereach --search "SENTBEFORE 31-Dec-2010"
======================================================================
Q. Is there a way to delete the destination folders when the source
folders are no longer there?
R. Yes, use --delete2folders
--delete2folders : Delete folders in host2 that are not in host1.
For safety, first try it like this, it is safe:
--delete2folders --dry --justfolders --nofoldersizes
and see what folders will be deleted.
--delete2foldersonly reg : Delete only folders matching the regex reg.
Example: --delete2foldersonly "/^Junk$|^INBOX.Junk$/"
This option activates --delete2folders
--delete2foldersbutnot reg : Do not delete folders matching the regex rex.
Example: --delete2foldersbutnot "/Tasks$|Contacts$|Foo$/"
This option activates --delete2folders
=======================================================================
=======================================================================

View File

@ -1,5 +1,5 @@
$Id: FAQ.Exchange.txt,v 1.75 2021/05/25 10:23:33 gilles Exp gilles $
$Id: FAQ.Exchange.txt,v 1.80 2022/04/05 13:48:52 gilles Exp gilles $
This documentation is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -31,6 +31,9 @@ Q. Exchange fails with "User is authenticated but not connected".
Q. Exchange fails with "BAD Command received in Invalid state".
Q. Exchange fails with "NO Server Unavailable. 15" and imapsync says
"could not append ... NO Server Unavailable. 15"
Q. From XXX to Exchange 2013, read receipts are all resent again
after a sync. Even for old messages. How can I fix that?
@ -77,7 +80,7 @@ R. Yes. But IMAP access to an Exchange account is not always
======================================================================
Q. How to sync from XXX to Exchange 2010/2013/2016/2019
R0. IMAP is not enable by default on Exchange, see how to enable it:
R0. IMAP is not enabled by default on Exchange, see how to enable it:
https://docs.microsoft.com/en-us/exchange/enable-imap4-in-exchange-2013-exchange-2013-help
Also read
http://clintboessen.blogspot.com/2018/03/binding-certificate-breaks-imap-or-pop.html
@ -201,6 +204,14 @@ R2. Miguel Alameda reported understanding and solving this issue
like this, the context was admin/authuser:
"The admin user had not permission in the target mailbox."
R3. Jason from magiclamp.net adds this tip (2021_11_23).
"In GoDaddy Exchange admin center, under recipients, you can
double click on a mailbox, and in the "mailbox delegation" scrolling
down to the bottom it shows a input field named "Full Access".
Add the admin account there."
======================================================================
Q. I see "NO Maximum size of appendable message has been exceeded"
What can I do with that?
@ -254,7 +265,7 @@ Q. Exchange throttles the sync and says:
"Request is throttled. Suggested Backoff Time: 299961 milliseconds".
What can I do with that?
R0. Exchange have throttle mechanisms to limit any huge
R0. Exchange has throttle mechanisms to limit any huge
usage. Sometimes imapsync transfers are too stressful for servers.
The message
"Request is throttled. Suggested Backoff Time: 299961 milliseconds"
@ -277,7 +288,7 @@ and I guess it changes over time.
R2. For Exchange, in case throttle appears anyway, fix them with:
https://docs.microsoft.com/en-us/exchange/change-user-throttling-settings-for-specific-users-exchange-2013-help
See also:
http://www.linux-france.org/prj/imapsync_list/msg02072.html
http://linux-france.tk/prj/imapsync_list/msg02072.html
(Subject: Re: [imapsync] From Exchange to Dovecot. Speed
Date: Mon, 03 Nov 2014 00:14:59 +0100)
@ -298,6 +309,35 @@ R2. This message might also happen when authenticating with ssl and tls.
It won't work, you can't do a direct double encryption, few
servers allow that.
======================================================================
Q. Exchange fails with "NO Server Unavailable. 15" and imapsync says
"could not append ... NO Server Unavailable. 15"
R1. The problem could be a mailbox quota limitation.
In the Exchange log file, if you see many
"Microsoft.Exchange.Data.Storage.QuotaExceededException",
it looks like "Quota Exceeded" could be the issue.
The solution is to increase the quota for this mailbox.
Quoting
https://docs.microsoft.com/en-us/exchange/recipients/user-mailboxes/storage-quotas?view=exchserver-2019
In the Exchange admin center (EAC), navigate to Recipients > Mailboxes.
In the list of user mailboxes, click the mailbox that you want to change the storage quotas for,
and then click Edit icon, then change "Prohibit send and receive at (GB)", then save your changes.
Or use the Exchange Management Shell, aka PowerShell:
Set-Mailbox -Identity "Joe Healy" -IssueWarningQuota 499gb -ProhibitSendQuota 500gb -ProhibitSendReceiveQuota 500gb -UseDatabaseQuotaDefaults $false
R2. A user fixed it by enabling IMAP logging on Exchange which is
quite crazy as a solution. But why not, here it is:
https://www.mantisbt.org/forums/viewtopic.php?p=68835&sid=8b1ecd2d976e85218fbf33fcd38c209d#p68835
by TerranceM
Set-ImapSettings -Server <server-name> -ProtocolLogEnabled $true
======================================================================
Q. From XXX to Exchange 2013, read receipts are all resent again
after a sync. Even for old messages. How can I fix that?
@ -315,7 +355,7 @@ Selecting seen message can be done with:
imapsync ... --search1 "SEEN" --disarmreadreceipts
Of course a second run has to be run without the --disarmreadreceipts
Of course a second run has to be done without the --disarmreadreceipts
for unseen messages:
imapsync ... --search1 "UNSEEN"
@ -387,7 +427,7 @@ R. This error message comes from Exchange IMAP server when it
Have also in mind that Exchange closes the connection after 10 errors
encountered so you might also see "BYE Connection closed" errors from
Exchange, which means Exchange leaves the session and say goodbye,
Exchange, which means Exchange leaves the session and says goodbye,
come back later. Rerun a sync then.
On Linux, there is a good Python script in the tarball that can
@ -573,7 +613,7 @@ R. Some servers take care about character case in folder names,
imapsync ... --regextrans2 "s/^trash$/Trash/"
If there are two folders Trash and trash on host1 then both
will be merge into only one Trash folder on host2.
will be merged into only one Trash folder on host2.
In case option --delete2 is used the regextans2 above becomes
mandatory, otherwise imapsync will sync messages from the
first Trash and then delete them when syncing trash.

View File

@ -1,5 +1,5 @@
#!/bin/cat
$Id: FAQ.Flags.txt,v 1.26 2021/04/25 20:47:05 gilles Exp gilles $
$Id: FAQ.Flags.txt,v 1.28 2022/06/22 17:07:35 gilles Exp gilles $
This documentation is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -22,6 +22,9 @@ Q. Exchange sends an email to any sender whose email is deleted
without reading. It's called "unread notifications".
How to set the \Seen flag on host1 (source system) before syncing?
Q. Every single mail synced to exchange online owns the
category $MDNSent after migration. How can I avoid this?
Q. Does imapsync retain the \Answered and $Forwarded flags?
Q. How to fix this error: BAD Invalid system flag \FORWARDED
@ -174,6 +177,18 @@ https://translate.google.com/translate?sl=auto&tl=en&u=https%3A%2F%2Fwww.ci-solu
German original:
https://www.ci-solution.com/blog/artikel/ungelesen-geloescht-verhindern.html
(Link from Oliver B.)
======================================================================
Q. Every single mail synced to exchange online owns the
category $MDNSent after migration. How can I avoid this?
R. To remove the flag $MDNSent from all messages, use:
imapsync ... --regexflag "s/\$MDNSent//g"
See also the document
https://imapsync.lamiral.info/FAQ.d/FAQ.Flags.txt
=======================================================================
Q. Does imapsync retain the \Answered and $Forwarded flags?
@ -305,7 +320,8 @@ You can try --nofilterflags straightaway without the
"other thunderbird" proposal.
There is also the possibility to map flags across servers
with --regexflags
with the option --regexflag. See some --regexflag examples
above.
=======================================================================

View File

@ -1,5 +1,5 @@
#!/bin/cat
$Id: FAQ.Folders_Selection.txt,v 1.11 2020/12/31 11:41:46 gilles Exp gilles $
$Id: FAQ.Folders_Selection.txt,v 1.12 2022/03/22 11:12:32 gilles Exp gilles $
This documentation is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -72,9 +72,9 @@ R. From https://imapsync.lamiral.info/README
--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).
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.

View File

@ -1,5 +1,5 @@
#!/bin/cat
$Id: FAQ.Folders_Sizes.txt,v 1.5 2021/07/04 23:02:32 gilles Exp gilles $
$Id: FAQ.Folders_Sizes.txt,v 1.7 2022/04/23 13:45:15 gilles Exp gilles $
This documentation is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -61,11 +61,16 @@ R. There are several reasons to explain the different counts between
found at the end on the line "Messages found duplicate on host1".
To sync duplicates, use the option --syncduplicates
5) There are duplicate messages on host2 so host2 is
5) There are cross-duplicate messages on host1, same messages in different
folders, and you use --gmail1 or --skipcrossduplicates, which avoid
copying cross-duplicate messages in more than one folder on host2.
Use --noskipcrossduplicates if you want imapsync to sync cross-duplicates.
6) There are duplicate messages on host2 so host2 is
bigger than host1. Solution: use --delete2duplicates to delete
the host2 duplicates.
6) Cosmic rays...
7) Cosmic rays...
The important part to take into account for a good and well done sync
is the last lines of imapsync. A good sync is when you encounter the

80
FAQ.d/FAQ.Fun_Things.txt Normal file
View File

@ -0,0 +1,80 @@
#!/bin/cat
$Id: FAQ.Fun_Things.txt,v 1.2 2021/10/15 13:37:05 gilles Exp gilles $
This documentation is also available online at
https://imapsync.lamiral.info/FAQ.d/
https://imapsync.lamiral.info/FAQ.d/FAQ.Fun_Things.txt
=======================================================================
Imapsync fun things to do with
=======================================================================
Questions answered in this FAQ are:
Q. How can I have a daily digest of my mailbox?
Now the questions again with their answers.
=======================================================================
Q. How can I have a daily digest of my mailbox?
R. Use the same account as source and destination (not mandatory)
imapsync \
--host1 imap.example.com --user1 foo --password1 secret \
--host2 imap.example.com --user2 foo --password2 secret \
--folder INBOX --maxage 1 --dry --nodry1 --debugcontent \
--truncmess 1000 --f1f2 INBOX=Unused
Some explanations on the options suggested:
--folder INBOX to only focus on the folder INBOX
--maxage 1 to select messages less old than 1 day
--dry --nodry1 to avoid really syncing the messages
--debugcontent to display the content
--truncmess 1000 to display only the first 1000 bytes
--f1f2 INBOX=Unused to force imapsync to do something.
Since it is the same mailbox as source and destination,
imapsync usually doesn't sync the messages as they are
already at the destination. The folder Unused has to
exist, otherwise imapsync won't display the messages.
If you pipe this command with a filter like egrep, it becomes like
magic:
imapsync \
--host1 imap.example.com --user1 foo --password1 secret \
--host2 imap.example.com --user2 foo --password2 secret \
--folder INBOX --maxage 1 --dry --nodry1 --debugcontent \
--truncmess 1000 --f1f2 INBOX=Unused \
| egrep 'From:|To:|Subject:|Date:|=====|msg '
Output example:
$RCSfile: FAQ.Fun_Things.txt,v $ $Revision: 1.2 $ $Date: 2021/10/15 13:37:05 $
msg INBOX/22359 copying to INBOX.Fake (not really since --dry mode) ETA: vendredi 15 octobre 2021-10-15 15:31:38 +0200 CEST 57 s 38/38 msgs left
================================================================================
Subject: test: lei7eeCh4Fulahei
To: <tata@localhost.info>
Date: Mon, 11 Oct 2021 11:56:05 +0200 (CEST)
From: gilles@localhost.info (Gilles LAMIRAL)
================================================================================
msg INBOX/22360 copying to INBOX.Fake (not really since --dry mode) ETA: vendredi 15 octobre 2021-10-15 15:31:38 +0200 CEST 57 s 37/38 msgs left
================================================================================
Subject: test: yahShee3Ohvu9mai
To: <tata@localhost.info>
Date: Mon, 11 Oct 2021 11:56:05 +0200 (CEST)
From: gilles@localhost.info (Gilles LAMIRAL)
================================================================================
Thanks to John Fedewa for this trick!
=======================================================================
=======================================================================

View File

@ -1,5 +1,5 @@
#!/bin/cat
# $Id: FAQ.General.txt,v 1.244 2021/02/19 13:38:39 gilles Exp gilles $
# $Id: FAQ.General.txt,v 1.246 2022/06/08 10:57:52 gilles Exp gilles $
=======================================================================
General FAQ for imapsync
@ -14,7 +14,7 @@ Questions answered in this FAQ are:
Q. Do I need to create IMAP mailboxes at the destination platform?
Q. Am I forced to publish the IMAP service on the Internet since the two
environment are not in the same location or same LAN?
environments are not in the same location or same LAN?
Q. What are the most important differences between the Unix shell syntax
and the Windows batch syntax.
@ -31,11 +31,11 @@ Q. How can I have commercial support?
Q. How can I have gratis support?
Q. Where I can find old imapsync releases?
Q. Where can I find old imapsync releases?
Q. Where I can find free open and gratis imapsync releases?
Q. Where can I find free open and gratis imapsync releases?
Q. Is is legal to find imapsync gratis (or not) elsewhere?
Q. Is it legal to find imapsync gratis (or not) elsewhere?
Q. How "Facts and figures" are known
https://imapsync.lamiral.info/#NUMBERS
@ -113,7 +113,7 @@ R. Yes!
=======================================================================
Q. Am I forced to publish the IMAP service on the Internet since the two
environment are not in the same location or same LAN?
environments are not in the same location or same LAN?
R. The host where you run imapsync has to contact both servers via imap.
You are not obliged to publish the imap service on the Internet if
@ -220,16 +220,16 @@ I help all users as long as I have time to help them all,
users who bought the support get my help first.
=======================================================================
Q. Where I can find old imapsync releases?
Q. Where can I find old imapsync releases?
R. Search the internet or ask the author.
=======================================================================
Q. Where I can find free open and gratis imapsync releases?
Q. Where can I find free open and gratis imapsync releases?
R. Search the internet or ask the author.
Q. Is is legal to find imapsync gratis (or not) elsewhere?
Q. Is it legal to find imapsync gratis (or not) elsewhere?
R. Yes, the license permits it
https://imapsync.lamiral.info/NOLIMIT
@ -287,7 +287,7 @@ R. Add also --nofoldersizes since the default behavior is to compute
the transfer will end (ETA).
R. Add also --noexpungeaftereach if you use --delete1.
But be warn that an interrupted transfer can lose messages
But be warned that an interrupted transfer can lose messages
on host2 in a second run if you use a (silly) combination like:
imapsync ... --delete1 --noexpunge1 --noexpungeaftereach --expunge2
@ -372,13 +372,7 @@ Use --useuid then imapsync will avoid dealing with headers.
=======================================================================
Q. How can I try imapsync with latest Mail::IMAPClient 3.xx perl module?
Three solutions at least.
R1 - Look at the script named "i3" in the tarball, it can be used to
run imapsync with the included Mail-IMAPClient-3.39/ wherever you
unpacked the imapsync tarball
R2 Run:
R1 Run:
cpanm Mail::IMAPClient # this uses cpanminus
@ -391,7 +385,7 @@ R2 Run:
perl -MCPAN -e "install Mail::IMAPClient"
R3 If you want to install the Perl module locally in a directory
R2 If you want to install the Perl module locally in a directory
- Download latest Mail::IMAPClient 3.xx at
http://search.cpan.org/dist/Mail-IMAPClient/
@ -409,7 +403,6 @@ R3 If you want to install the Perl module locally in a directory
or if imapsync is in directory /path/
perl -I./Mail-IMAPClient-3.39/lib /path/imapsync ...
=======================================================================
Q. How can I use imapsync with Mail::IMAPClient 2.2.9 perl module?
@ -577,20 +570,6 @@ In imapsync, you can achieve this by using the following options:
--proxyauth1 \
--passfile admin.txt
======================================================================
Q. Is there a way to delete the destination folder when the source
folder is no longer there?
R. Yes, use --delete2folders
--delete2folders : Delete folders in host2 that are not in host1 server.
For safety, first try it like this (it is safe):
--delete2folders --dry --justfolders --nofoldersizes
--delete2foldersonly <regex>: Deleted only folders matching regex.
Example: --delete2foldersonly "/^Junk$|^INBOX.Junk$/"
--delete2foldersbutnot <regex>: Do not delete folders matching regex.
Example: --delete2foldersbutnot "/Tasks$|Contacts$|Foo$/"
=======================================================================
Q. I would love to have a function to inject lines in the header.
Things like "X-migrated-from-foo: 20100617"

View File

@ -1,5 +1,5 @@
#!/bin/cat
$Id: FAQ.Gmail.txt,v 1.80 2021/07/06 02:30:11 gilles Exp gilles $
$Id: FAQ.Gmail.txt,v 1.92 2022/06/28 11:03:40 gilles Exp gilles $
This document is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -41,17 +41,24 @@ Q. Can not open imap connection on [imap.gmail.com]
Q. I want to sync the Sent folder only, what is it on Gmail?
Q. From Gmail to Gmail, I want to keep Categories. What can I do?
Q. The context is a Gmail account at the source, but not Gmail at the
destination. I want cross-duplicates, different Gmail folders/labels
generating duplicate messages across folders on the destination,
except for the "All Mail" folder.
Q. I can't sync more than 1000 messages in each Gmail folder.
What can I do?
Q. What are the Gmail imap names of the folders
"Sent" "Trash" "Drafts" "Junk" "Flagged" and "All"?
Q. Can I transfer Gmail "Chat" messages with imapsync?
Q. Can I safely use --useuid for Gmail transfers?
Q. Can I safely use --useuid or --usecache for Gmail transfers?
Q. Can I use --syncduplicates Gmail transfers?
Q. Gmail does not really delete messages in folder [Gmail]/All Mail
What happens? What can I do?
@ -90,77 +97,22 @@ it has to be allowed in the Gmail configuration part:
-> Click on the button "Save changes" at the bottom of the page.
That's not finished, there is also the authentication issue to consider.
There are three different ways to authenticate to Gmail with Imapsync,
There are two different ways to authenticate to Gmail with Imapsync,
either:
1) "Access for less secure apps"
2) "2-step verification"
3) XOauth2 ready for groups on any OS or
1) "App password with 2-step verification"
or
2) XOauth2 ready for groups on any OS or
for individual Gmail authentication on Linux.
For the last one, XOauth2, see the document
For the second one, XOauth2, see the document
https://imapsync.lamiral.info/FAQ.d/FAQ.XOAUTH2.txt
1) "Access for less secure apps", the first way to authenticate
to Gmail with Imapsync. This is the easiest way because
you just have to turn one button on.
Go to https://myaccount.google.com/
Click on the Security tab on the left menu or go directly to
https://myaccount.google.com/security?gar=1
-> Verify 2-step verification is OFF
https://myaccount.google.com/security?hl=en&pli=1&nlr=1#signin
Near the end of the page,
-> Turn ON "Access for less secure apps"
https://www.google.com/settings/security/lesssecureapps
https://support.google.com/accounts/answer/6010255?hl=en
Here is what Google add on this "Access for less secure apps":
"Some apps and devices use less secure sign-in technology, which makes your
account vulnerable. You can turn off access for these apps, which we recommend,
or turn it on if you want to use them despite the risks.
Google will automatically turn this setting OFF if it’s not being used."
So after a while, this button will be turned off again.
I suggest to turn it off once the job with imapsync is finished.
If you forgot to also enable imap you end up with login failure like this one:
"Host failure: Error login on [imap.gmail.com] with user [xxxx@gmail.com] auth [LOGIN]:
NO [ALERT] Your account is not enabled for IMAP use. Please visit your Gmail
settings page and enable your account for IMAP access. (Failure)"
After using imapsync on a Gmail account, sometimes you may encounter an email
with the title "Critical security alert for your linked Google Account"
and the body
"Sign-in attempt was blocked for your linked Google Account
xxxx@gmail.com
Someone just used your password to try to sign in to your account from
a non-Google app. Google blocked them, but you should check what happened.
Review your account activity to make sure that no one else has access."
Click on the button "Check Activity" and let Gmail know you were the author
of the sign in.
Sometimes, with Gsuite, the login for the users are ok with imapsync
for a while then they become forbidden with
"failure: Error login on [imap.gmail.com] with user [xxx] auth [LOGIN]:
2 NO [AUTHENTICATIONFAILED] Invalid credentials (Failure)"
In that case, use:
https://admin.google.com/AdminHome?hl=fr#ServiceSettings/notab=1&service=securitysetting&subtab=lesssecureappsaccess
to allow "Access for less secure apps to all users"
(Thanks to Sébastien R. for this input)
Remark: even if the user has enabled less secure apps at Super Admin
and reseller level, it still needs amended at
https://myaccount.google.com/security
(Thanks Tony@gle for this last tip!)
2) "2-step verification" the second way to authenticate
to Gmail with Imapsync.
1) "App password with 2-step verification" is the first way to
authenticate to Gmail with Imapsync.
Go to
https://myaccount.google.com/security
@ -236,7 +188,7 @@ imapsync \
--password2 gmailsecret2 \
--gmail1 --gmail2
Or, replacing what does --gmail1 --gmail2 (values are from imapsync 1.970):
Or, replacing what does --gmail1 --gmail2 (values are from imapsync 2.178):
imapsync \
--host1 imap.gmail.com \
@ -251,6 +203,7 @@ imapsync \
--maxbytesafter 1_000_000_000 \
--automap \
--maxsleep 2 \
--useheader X-Gmail-Received --useheader Message-Id \
--synclabels \
--resynclabels \
--exclude "\[Gmail\]$" \
@ -319,7 +272,7 @@ imapsync --host1 mail.oldhost.com \
--password2 gmailsecret \
--gmail2
Or, replacing what does --gmail2 (values are from imapsync 1.970):
Or, replacing what does --gmail2 (values are from imapsync 2.178):
(For Linux only because of the quotes)
imapsync --host1 mail.oldhost.com \
@ -428,19 +381,19 @@ R. Use this example:
imapsync \
--user1 foo@gmail.com \
--password1 gmailsecret \
--host2 localhost \
--host2 imap.example.org \
--user2 tata \
--password2 tatasecret \
--gmail1
Or, replacing what does --gmail1 (values are from imapsync 1.970):
Or, replacing what does --gmail1 (values are from imapsync 2.178):
imapsync \
--host1 imap.gmail.com \
--ssl1 \
--user1 foo@gmail.com \
--password1 gmailsecret \
--host2 localhost \
--host2 imap.example.org \
--user2 tata \
--password2 tatasecret \
--maxbytespersecond 40_000 \
@ -626,6 +579,73 @@ R2. In fact, by configuration from the user, it can be another folder
name presented in IMAP. Use --automap --dry to see this mapping.
See below
=======================================================================
Q. From Gmail to Gmail, I want to keep Categories. What can I do?
R. First, read a document to learn how to play with Gmail Categories:
https://support.google.com/mail/answer/3094499
Categories are not presented in IMAP in Gmail, so synchronizing them
with imapsync requires some work.
Let's say I want to synchronize the category named "Updates".
1. Create a label "Updates_L", or name it as you want. You can't
create a label named "Updates" like the category name because
Gmail will refuse to create it, saying it's a reserved name.
2. Select all messages in the category "Updates".
To do so, you can use the string "category:updates" in the
search input text located at the top of the Gmail page.
Notice the case is irrelevant to the search,
"category:updates" equals "Category:Updates".
Gmail then announces "All 100 messages on this page are selected."
It's not enough, I want all the "Updates" category messages.
So, on the right of this statement, click on the text
"Select all messages that match this search".
Now Gmail announces "All messages in this search are selected."
3. Apply label "Updates_L" created at step 1 to all the selected
messages. Gmail will present a warning and a
"Confirm bulk action" button. Press "Ok".
4. Repeat steps 1 to 3 for each category you want to synchronize.
5. Transfer your mailbox to the new account with imapsync using the
options --gmail1 --gmail2, the labels will be synchronized.
6. For each of the labels you made for categories, do the steps 7 to 9.
As an example, I take the label "Updates_L" previously used.
7. Select all messages with the label "Updates_L".
You can use the string "label:Updates_L" in the search input
text located at the top of the Gmail page.
Gmail then announces "All 100 messages on this page are selected."
It's not enough, I want all the "updates_l" labeled messages.
So, on the right of this statement, click on the text
"Select all messages that match this search".
Now Gmail announces "All messages in this search are selected."
(does it sound similar to a previous §?)
8. Apply the category "Updates" to all the selected
messages. Gmail will present a warning and a
"Confirm bulk action" button. Press "Ok".
If you search where are the categories: the categories are
located with the labels, as if they were labels.
9. Delete the temporary label. That part is optional.
Maybe one day Google will make categories optionally available
in IMAP, like any other label and this trick will be obsolete.
Labels can be "Show in IMAP" at
https://mail.google.com/mail/u/0/#settings/labels
Categories are listed there but not possibly "Show in IMAP", not yet :-)
Thanks to Michael Leggett https://twitter.com/leggett for this
trick. See the story at
https://twitter.com/leggett/status/1484632316697739267?s=20
=======================================================================
Q. The context is a Gmail account at the source, but not Gmail at the
destination. I want cross-duplicates, different Gmail folders/labels
@ -657,6 +677,16 @@ See https://github.com/imapsync/imapsync/pull/266
(I refused it because well maintaining it will be very hard for me
and I have other priorities).
=======================================================================
Q. I can't sync more than 1000 messages in each Gmail folder.
What can I do?
R. It's a Gmail configuration feature that someone set for your
Gmail account. Go to
https://mail.google.com/mail/u/0/?tab=wm#settings/fwdandpop
and select
"Do not limit the number of messages in an IMAP folder (default)"
=======================================================================
Q. What are the Gmail imap names of the folders
"Sent" "Trash" "Drafts" "Junk" "Flagged" and "All"?
@ -712,30 +742,41 @@ message, and Gmail will always accept and throw away the new copy. It
ends up with no duplicates on Gmail but a waste of bandwidth and time,
which is the opposite goal of --usecache implied by --useuid.
=======================================================================
Q. Can I use --syncduplicates Gmail transfers?
R. Yes, but Gmail will accept the new duplicate message and
throw away the new copy. It ends up with no duplicates on Gmail but
a waste of bandwidth and time.
=======================================================================
Q. Gmail does not really delete messages in folder [Gmail]/All Mail
What happens? What can I do?
Q. Gmail does not really delete messages in folder [Gmail]/All Mail
What happens? What can I do?
R. It's true and explained in Gmail documentation at
https://support.google.com/mail/answer/7401?hl=en
https://support.google.com/mail/answer/7401?hl=en#zippy=%2Cempty-your-trash
To really remove messages in folder "[Gmail]/All Mail", they have to
be moved to the "Trash" folder and be deleted from "Trash".
Quoting the link above (25 december 2018, happy christmas by the way!)
Quoting the link above (4 february 2022)
...
Empty your Trash
If you don't want a message to stay in your Trash for 30 days,
you can permanently delete it.
* On your computer, go to Gmail.
* On the left side of the page, scroll down,
then click More and then Trash.
* Check the box next to messages you want to permanently delete,
then click Delete forever.
* Note: The Delete forever option is only available in the Trash.
You won’t be able to delete items forever from the Search result view.
If you don't want a message to stay in your trash for 30 days,
you can permanently delete it.
* On your computer, go to Gmail.
* On the left side of the page, click More.
* Scroll to Trash.
* Check the box next to messages you want to permanently delete.
Then click Delete forever.
* Tip: The "Delete forever" option is only available in the trash.
You won’t be able to delete items permanently from the Search result view.
To delete all messages in your trash, click Empty Trash now.

View File

@ -1,5 +1,5 @@
#!/bin/cat
$Id: FAQ.ISP.txt,v 1.9 2018/05/24 11:34:30 gilles Exp gilles $
$Id: FAQ.ISP.txt,v 1.14 2022/05/22 08:04:05 gilles Exp gilles $
This document is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -9,36 +9,26 @@ https://imapsync.lamiral.info/FAQ.d/FAQ.ISP.txt
Imapsync tips for ISP. Specific issues and solutions.
=======================================================================
* IMAPSync - usage scenario with ISP - by Flávio Zarur Lucarelli.
* IMAPSync - usage scenario with ISP - by Flavio Zarur Lucarelli
(https://www.lucanet.com.br)
I thought Id write a quick step by step on my attempts to learn the
imapsync features that matter the most, so it works as we expected in
the cenario in which we use it, which is to migrate customers from
I thought I had to write a quick step by step on my attempts to learn
the imapsync features that matter the most, so it works as we expected
in the scenario in which we use it, which is to migrate customers from
their old ISP to our ISP/email hosting. Thanks to the master Gilles
Lamiral for all his help and hard work.
First of all, remember to use --dry to test things first always and
check the log file to see what would actually happen.
Initially, I used a method where I'd do an exact sync of source to
destination, deleting messages which were in destination, but not
source. I call this "Method 2", below. In this cenario, customer
shouldn't be using the destination account yet. Then, after I switch MX,
I'd do a final sync based on date. The big advantage of this is, you
get an exact sync.
Easier, however, is method 1, where I sync based on message ID, this
way, I can use the same syntax before and after MX change, with no
worries. Only disadvantage, you might not get an exact sync, there
might be some difference in terms of total emails in folders, due to
duplicates, emails that had same message ID in source server.
* Method 1 - sync based on message ID, can use same syntax before and
after MX change
This type of copy keeps destination exactly like source (except, it
doesn't copy duplicates), so use it ONLY before changing your MX to
the new server, as it will delete whatever is in destination which
isn't in source.
imapsync --host1 imap.myisp.com --user1 user@domain.com --password1 pwd \
--host2 imap.myisp.com --user2 user@domain.com --password2 pwd \
--addheader
--subscribeall --delete2 --delete2folders --addheader
Note: add header adds message ID when it doesn't exist.
@ -46,57 +36,142 @@ This syntax can also be used to sync different source accounts to one
same destination account, simply execute it as many times as desired,
switching source user (user1).
* Method 2 - exact sync source do destination, then sync based on date
after MX change
If you have a list of accounts to sync, use this:
https://imapsync.lamiral.info/examples/sync_loop_unix.sh
My first goal is to have an exact sync of an account from
current/source host to the new/destination host and be able to sync
several times. The --useuid parameter is very important for that
purpose. This is what I use:
Adjust the parameters according to the original syntax which I
explained above.
imapsync --host1 imap.gmail.com --user1 user@domain.com --password1 pwd --ssl1 \
--host2 imap.myisp.com --user2 user@domain.com --password2 pwd --ssl2 \
--useuid --delete2 --delete2folders
The Sync loop Unix script now outputs an error log, which can be
useful.
This makes it so imap.myisp.com (destination) is an exact copy of the
account at imap.gmail.com (source). This is not a problem, since the
user is not using the new host yet. ]You can check Imapsync log files
and surely you will see the final difference should be 0. Check also
for any possible errors in the log (search for "error").
We also have shell scripts to check for errors, such as:
The second goal is to lower the TTL (ex: 5 min) for the host
associated with the MX record, in the domain's DNS server. Let's say
customer has a host mail which his MX points to, with a high TTL
(usually 1 hour). Lower it to 5 min so that, when you change the MX,
it propagates faster.
- Accounts over quota
grep -R "EXIT_OVERQUOTA" *.txt
- Login error
grep -R "Error login" *.txt
- Check just critical errors
egrep 'EXIT_AUTHENTICATION_FAILURE|EXIT_CONNECTION_FAILURE|EXIT_TLS_FAILURE|EXIT_OVERQUOTA' *.txt
- Check all sorts of errors (can be too much info)
grep 'Exiting with return value' *.txt | grep -v 'Exiting with return value 0'
Also, I like to check log file sizes and compare account sizes on
source and destination.
--
Back to it.
After you do a full sync, check that everything is consistant and
let's proceed to the final stage.
Lower the TTL (ex: 5 min) for the host associated with the MX record,
in the domain's DNS server. Let's say customer has a host mail which
his MX points to, with a high TTL (usually 1 hour). Lower it to 5 min
so that, when you change the MX, it propagates faster.
When comes time to switch over to the new host, do a final sync with
above syntax, before changing the MX. Then, change the MX and tell
your users to start using exclusively the new host.
A few hours after the MX change, we will run Imapsync again. We have
to start preserving emails users move or flag in the new host, which
to start preserving emails users move or flags in the new host, which
they started using, so we can't do an exact sync anymore.
The best solution for me was to Sync any new emails (maxage:1) from
source (that could arrive in source even after MX change, due to
cache) and delete such emails from source server. This way, customer's
mailbox is still intact on the source server, except new emails, which
get synced to new server and deleted from source.
One simple solution is the same syntax as before, but without
--delete2 and --delete2folders.
imapsync --host1 imap.gmail.com --user1 user@domain.com --password1 pwd --ssl1 \
--host2 imap.myisp.com --user2 user@domain.com --password2 pwd --ssl2 \
--folder INBOX --useuid --noexpungeaftereach --skipemptyfolders --maxage 1 --delete1
So:
I personally prefer to keep a copy of users box intact in source, but
if that's not an issue for you, you can remove --folder INBOX and even
--maxage, but then, all emails in source will be deleted. You can use
--maxage 1 with --delete1, however, for all folder (without specifying
--folder INBOX), so only any new email that arrives at source is
copied to destination and deleted from source.
imapsync --host1 imap.myisp.com --user1 user@domain.com --password1 pwd \
--host2 imap.myisp.com --user2 user@domain.com --password2 pwd \
--subscribeall --addheader
My next goal was to automate the process, so I followed this advice:
http://imapsync.lamiral.info/examples/sync_loop_unix.sh
The only issue with that syntax is, it would simply copy what is in
source that is not in destination. For example, user might have moved
emails to some sub-folder in host2. However, if you do this once, one
hour after MX change, for example, it's comprehensible that
destination is not exactly as the source anymore.
What we've been doing, especially in the case of huge migrations,
since our destination server auto-archives emails in sub-folders and
changes the hierarchy, is syncing just the last day or few days of
email and just of INBOX.
So we do the sync initially explained in this doc, before the MX
change. Then we auto-archive accounts and after auto-archiving, we
change MX and do a final sync using maxage.
Something like this:
imapsync --host1 imap.myisp.com --user1 user@domain.com --password1 pwd \
--host2 imap.myisp.com --user2 user@domain.com --password2 pwd \
--subscribeall --addheader --maxage 1
If your last full sync was 2 days ago, then use --maxage 2
Goal is to get all the new emails (2 last days) from source.
Another alternative for syncing after the MX change, which Lamiral
suggests, involves deleting emails from source from the last day. I
prefer the method explained above. Anyway, here is this other
scenario...
Something like this:
imapsync --host1 imap.gmail.com --user1 user@domain.com --password1 pwd --ssl1 \
--host2 imap.myisp.com --user2 user@domain.com --password2 pwd --ssl2 \
--folder INBOX --noexpungeaftereach --skipemptyfolders --maxage 1 --delete1
This way, any new email that arrived at source is copied to
destination and deleted from source. Without the --delete1 option,
messages moved on host2 by the user are coming back from host1, and
flags changed on host2 are also reset to what they are on host1.
However, as I wrote before, if you run it just once without --delete1,
perhaps not that bad.
*** Other tips for ISPs
1) Sync entire account into 1 folder of another account
imapsync --host1 xxx --user1 user1@domain.com --password1 secret1 --ssl1 \
--host2 yyy --user2 user2@domain.com --password2 secret2 --ssl2 \
--addheader --subfolder2 "otheraccountfolder" --delete2 --delete2foldersonly /otheraccountfolder/
Above, user must not be using such destination folder in destination
account until you finish syncing.
I've used it without --delete2 and --delete2foldersonly, as it caused
problems for us, of that folder being unsubscribed in destination...
Don't think it should be a problem as this copy is done usually
without using really using the folder in host2 until you instruct him
to.
Another nice scenario, sync just one folder hierarchy of an account to
another folder of another account.
--subfolder1 test --subfolder2 test2 --delete2 --delete2foldersonly /test2/ --addheader
Also, very useful is to be move emails older than one year, from an
account to another one, to offload the source account.
imapsync ... --subfolder2 "account_user1" --addheader --minage 365 --delete1
So everything older than 365 days is deleted from source. You can even
specify same account for source and recipient, if you want to "delete
older than x days" for the account itself, without moving old emails
to another account.
2) Translate folder names
I also ended up requiring a regex to translate folder names. On the
old server (Gmail), Sent items were in a folder called [Gmail]/E-mails
@ -110,17 +185,54 @@ So this was added:
--regextrans2 "s,Lixeira,Trash," \
--regextrans2 "s,Rascunhos,Drafts,"
*** Other cenarios
Option --automap is also good to do most of the translate job.
- Sync entire account into 1 folder of another account
3) Folders to exclude, to speed up syncs, etc.
imapsync --host1 xxx --user1 user1@domain.com --password1 secret1 --ssl1 \
--host2 yyy --user2 user2@domain.com --password2 secret2 --ssl2 \
--useuid --subfolder2 otheraccountfolder --delete2 --delete2foldersonly /otheraccountfolder/
imapsync ... --exclude "^Backups" --exclude "(?i)spam" --exclude "(?i)junk" --exclude "(?i)trash" --exclude "(?i)lixeira" --exclude "(?i)Deleted Items"
4) Delete older than 1 year from an account.
Use the account itself as source and destination and use:
imapsync ... --minage 365 --delete1
5) Check size of folders in an account. Use Imapsync with same account
as source and destination, with this parameter:
imapsync ... --justfoldersizes
6) If you have problems copying messages that have labels which are
not supported, there are a few ways out.
We use Dovecot and it doesn't support a series of labels, except the
standard ones. By default, imapsync won't copy messages that have
labels not supported by the recipient server. For that reason, I now
always use --filterbuggyflags and tell customers that not all labels
are copied.
There are other alternatives, such as replacing problematic flags with
other names or copying just standard flags, detailing which ones to
copy, however, --filterbuggyflags was the easiest solution, which
worked fine for us.
7) Definitely worth reading about dupes, here
https://imapsync.lamiral.info/FAQ.d/FAQ.Duplicates.txt, if you have
problems. Always try to check, even if by sampling, if dupes
occur. In a big migration, when you do several passes, try to check a
few accounts.
The one issue we had with many duplicated emals in the destinatio, was
solved with the first solution in the above FAQ, using this syntax,
when copying from source to the destination, hence effectively
removing the dupes.
imapsync ... --useheader "Message-Id" --delete2duplicates
Note that --delete2duplicates is on when --delete2 is used, unless
--syncduplicates is used or --nodelete2duplicates is used.
Above is based on message UID, advantage of no dupes, however, user
must not be using such destination folder in destination account until
you finish syncing.
=======================================================================
=======================================================================

34
FAQ.d/FAQ.James.txt Normal file
View File

@ -0,0 +1,34 @@
#!/bin/cat
$Id: FAQ.James.txt,v 1.2 2022/04/06 10:28:16 gilles Exp gilles $
This documentation is also available online at
https://imapsync.lamiral.info/FAQ.d/
https://imapsync.lamiral.info/FAQ.d/FAQ.James.txt
=======================================================================
Imapsync tips for James. Specific issues and solutions.
=======================================================================
James: JAVA Apache Mail Enterprise Server
Questions answered in this FAQ are:
Q. How to migrate to Dovecot with an admin/MasterUser account?
=======================================================================
Q. How to migrate to James with an admin/MasterUser account?
R. James supports impersonation and is set up via the administratoId key
field stored in <install>/conf/usersrepository.conf
There are multiple user repository definitions, each using
a different key:value pair to define administratorId
https://james.apache.org/server/config-users.html
(Thanks to From Rob Davis for this Q/R)
=======================================================================
=======================================================================

View File

@ -1,5 +1,5 @@
#!/bin/cat
$Id: FAQ.Kerio.txt,v 1.2 2019/11/15 11:33:14 gilles Exp gilles $
$Id: FAQ.Kerio.txt,v 1.3 2022/04/05 13:48:52 gilles Exp gilles $
This document is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -17,7 +17,7 @@ Q. How to migrate from Kerio Connect to XXX
R. No special options required.
See also:
http://www.linux-france.org/prj/imapsync_list/msg01756.html
http://linux-france.tk/prj/imapsync_list/msg01756.html
http://web.archive.org/web/20140224041102/https://www.safetynet-it.com/it-support/mac-kerio-server-to-microsoft-exchange-2010-migration-1/
http://web.archive.org/web/20121125074756/http://www.safetynet-it.com/it-support/mac-kerio-server-to-microsoft-exchange-2010-migration-2/

41
FAQ.d/FAQ.Logfile.txt Normal file
View File

@ -0,0 +1,41 @@
$Id: FAQ.Logfile.txt,v 1.2 2021/07/23 12:27:31 gilles Exp gilles $
This documentation is also available online at
https://imapsync.lamiral.info/FAQ.d/
https://imapsync.lamiral.info/FAQ.d/FAQ.Logfile.txt
======================================================================
Imapsync log file
======================================================================
Questions answered in this FAQ are:
Q. I have these errors "could not be fetched", like this one:
Err 1/1: - msg INBOX/17219 {0} S[36592] F[] I[16-Jul-2021 12:04:15 +0000] could not be fetched
What can I do about it?
Now the questions again with their answers.
======================================================================
Q. I have these errors "could not be fetched", like this one:
Err 1/1: - msg INBOX/17219 {0} S[36592] F[] I[16-Jul-2021 12:04:15 +0000] could not be fetched
What can I do about it?
R. Explanation of a log line:
- msg INBOX/17219 {0} S[36592] F[] I[16-Jul-2021 12:04:15 +0000]
INBOX = folder
17219 = UID
{0} = got 0 bytes
S[36592] = should have got 36592 bytes (RFC size announced)
F[] = Flags, none here
I[16-Jul-2021 12:04:15 +0000] = Internal date
Usually this error doesn't appear on next runs, at least not for the
same messages. So rerun imapsync until all messages are synced.
======================================================================
======================================================================

View File

@ -1,5 +1,5 @@
#!/bin/cat
$Id: FAQ.Massive.txt,v 1.31 2020/10/15 01:53:52 gilles Exp gilles $
$Id: FAQ.Massive.txt,v 1.34 2022/07/14 16:00:23 gilles Exp gilles $
This document is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -14,7 +14,7 @@ Questions answered here are:
Q. How long will take the whole migration?
Q. I need to migrate hundred accounts, how can I do?
Q. I need to migrate hundreds of accounts, how can I do that?
Q. I have to migrate 500k users using 400 TB of disk space.
How do I proceed? How about speed?
@ -23,7 +23,7 @@ Q. How to determine where is the bottleneck in an imapsync process?
Q. Can I run several instances of imapsync in parallel on a Windows host?
Q. I run multiple imapsync applications at the same time then get a
Q. I run multiple imapsync applications at the same time and then get a
warning "imapsync.pid already exists, overwriting it".
Is this a potential problem when trying to sync multiple
IMAP account in parallel?
@ -31,17 +31,18 @@ Q. I run multiple imapsync applications at the same time then get a
=======================================================================
Q. How long will take the whole migration?
R1. First you have to consider several periods. There is the global
period, from when the migration process is decided to the final end
R1. First, you have to consider several periods. There is the global
period, from when the migration process is decided to the end,
where all mailboxes are migrated. This global period can be divided
into three smaller periods.
The first period is the analyse period: you play with the tools
The first period is the analysis period: you play with the tools
available, you estimate the volume to be transferred, the number of
accounts, you measure how long it takes for one account under
your context.
The second period is the presync period. The users are still using
The second period is what I call the presyncing period.
The users are still using
the old accounts but nothing prevents you from starting to sync
the old accounts, as they are, to the new accounts.
With tons of gigabytes to transfer, this period may be the longest one.
@ -49,31 +50,31 @@ R1. First you have to consider several periods. There is the global
until the round is finished.
The last period is the final sync period where only the last
changes of the mailboxes need to be synced in order to switch
mailboxes' changes need to be synced before switching
the users to their new mailboxes.
R2. To estimate the presync period, consider the mean imapsync transfer
R2. To estimate the presyncing period, consider the mean imapsync transfer
rate to be around 340 Kbytes/s, ie, 2.8 Mbps, no matter the local
link bandwidth.
It's a mean, measured upon various different syncs, coming from
the online service /X where the network card flow rate is 100 Mbps
and the provider bandwidth is also 100 Mbps. Max seen is a transfer
at 21 Mbps.
It's a mean, measured upon various syncs, coming from
the online service /X where the network card flow rate is 200 Mbps
(Rx 100 Mbps, Tx 100 Mbps) and the provider bandwidth is also 200 Mbps.
The maximum global rate seen is 22 MiB/s (176 Mbps).
At 340 Kbytes/s,
1 TB to transfer and one sync at a time will end in 35 days (1024^3/340/3600/24).
At 10 transfers at a time, 1 TB will take 3.5 days.
At 100 transfers at a time, 1 TB will take 8 hours.
Double the time because the best scenario never happens.
Triple the time because, well, real world is like that.
Triple the time because, well, the real world is like that.
R3. An other way to better evaluate the end of the presync period can
R3. Another way to better evaluate the end of the presyncing period can
be based on your actual data. Just apply a simple rule of three
on the mailboxes already migrated to estimate the global end.
If it took X hours to finish Y% of the mailboxes, then it
will take 100*X/Y hours to finish 100% of the mailboxes.
Following the same idea but using matematical garbage,
Following the same idea but using mathematical garbage,
the ETA can be estimated like this:
t_0 = time of global start (the start of the first presync)
t_now = time of now.
@ -90,11 +91,11 @@ R4. To estimate the last period, the final sync, just rerun a complete
the same amount of time.
=======================================================================
Q. I need to migrate hundred accounts, how can I do?
Q. I need to migrate hundreds of accounts, how can I do that?
R. If you have many mailboxes to migrate, think about a little
script program. Write a file called file.txt (for example)
containing hosts, users and passwords on both sides.
containing hosts, users, and passwords on both sides.
The separator used in this example is ";"
The file.txt file contains for example:
@ -105,8 +106,8 @@ host003_1;user003_1;password003_1;host003_2;user003_2;password003_2;
host004_1;user004_1;password004_1;host004_2;user004_2;password004_2;
etc.
Most of the times, the first column (host001_1, host002_1 ...) will
contains the same value, the value of --host1 parameter. Same
Most of the time, the first column (host001_1, host002_1 ...) will
contain the same value, the value of --host1 parameter. Same
thing for the third column (host001_2, host002_2).
On Unix the shell script can be:
@ -147,7 +148,7 @@ becomes
host001_1;user001_1;password001_1;host001_2;user001_2;password001_2; --automap --addheader
host002_1;user002_1;password002_1;host002_2;user002_2;password002_2; --automap --addheader
With this solution, options can be added, changed or removed per account.
With this solution, options can be added, changed, or removed per account.
Technically those options will go in %%M in the loop body
Here is a complete Windows example ready to use:
@ -169,11 +170,11 @@ Q. I have to migrate 500k users using 400 TB of disk space.
R. A good solution to this issue is two words: parallelism and measurements.
Since all mailboxes are functionnaly independent, they can be processed
independently, here comes the parallelism, ie, lunching several imapsync
Since all mailboxes are functionally independent, they can be processed
independently, here comes the parallelism, ie, launching several imapsync
processes in parallel.
Meanwhile, mailboxes usually belong to the same server and the syncs
Meanwhile, mailboxes usually belong to the same server, and the syncs
share the same imapsync host via the same bandwidth, here come
some limitations and bottlenecks.
@ -184,7 +185,7 @@ Here comes some measurements.
Since adding this way is not so easy, just look at the overall
network rate of the imapsync host.
On Linux and FreeBSD, nload is a good candidate to measure this overall
On Linux and FreeBSD, the command "nload" is a good candidate to measure this overall
network rate. For example, to measure the rate every 6 seconds (-t 6000),
on eth0 or em0 interface, with values in Kbytes (-u K), use:
@ -195,24 +196,26 @@ Here comes some measurements.
dstat -n -N eth0 6 # Linux only (in 2018)
Another excellent tool to measure the network trafic is iftop.
The following command will monitor imap and imaps connexions
on interfce eth0, only them, and sum them up:
Another excellent tool to measure the network traffic is iftop.
The following command will monitor imap and imaps connections
on interface eth0, only them, and sum them up:
iftop -i eth0 -f 'port imap or port imaps' -B # Linux
iftop -i em0 -f 'port imap or port imaps' -B # FreeBSD
During iftop, press the h to see the display commands available,
every single feature is useful! Press h again and try each one.
My preferred display combination is by typing
My preferred display combination is by typing the keys
t p >
meaning: one line per connection, show port numbers, sort by destination.
t means "one line per connection"
p means "show port numbers"
> means "sort by destination"
On Windows 8.1 Windows 10 Windows 2012 R2 Windows 2016,
get the overall network rate with the classical
task manager (Ctrl-Shift-Esc), there is a Performance tab
in it where resides a Network grap monitor.
in it, where resides a Network monitor.
On Windows 7, get the overall network rate with the classical
task manager (Ctrl-Shift-Esc), there is a Network tab in it.
@ -224,7 +227,7 @@ Here comes some measurements.
transfer rate increase.
3) When the total transfer rate starts to diminish, stop new launches.
Note N as the number of parallel runs you got until then.
Note N as the number of runs in parallel you got until then.
4) Only keep N-2 parallel runs for the future.
@ -234,15 +237,15 @@ Q. How to determine where is the bottleneck in an imapsync process?
R1. Divide and conquer.
In order to detect whether host1/link1 is the bottleneck or
To detect whether host1/link1 is the bottleneck or
host2/link2, we have several tests to explore:
1) run a sync from host1 to host1, with a host1 test account as destination.
This way, only host1+link1 are tested, host2 is not directly concerned.
1) run a sync from host1 to host1, with a host1 test account as the destination.
This way, only host1 and link1 are tested, host2 is not directly concerned.
If performances increase a lot then host2/link2 is the bottleneck.
2) run a sync from host2 to host2, with a host2 test account as destination.
This way, only host2+link2 are tested, host1 is not concerned.
2) run a sync from host2 to host2, with a host2 test account as the destination.
This way, only host2 and link2 are tested, host1 is not concerned.
If performances increase a lot then host1/link1 is the bottleneck.
If performances increase on both tests 1) and 2), I have no clue to explain that.
@ -250,39 +253,39 @@ Same thing if they both decrease!
R2. Isolating and overcoming bottlenecks
On any process involving several mechanisms, among all elements taking
part on the process, there is always a bottleneck. No one knows in
In any process involving several mechanisms, among all elements taking
part in the process, there is always a bottleneck. No one knows in
advance what is the first bottleneck. The first bottleneck has to be
determined, by measurements, not by guesses. Once this first
bottleneck is known and overcome then the next bottleneck has to be
determined and overcome too, if needed. Repeat the process of looking
for the next bottleneck and its elimination until you estimate the
transfer rates, money costs, time spent on this, and final dates
are good enough to proceed the whole huge migration.
are good enough to proceed with the whole huge migration.
Possible bottlenecks:
- Throttles.
IMAP servers have artificial limits.
For example Gmail, Office365, Exchange have throttle limits.
For example, Gmail, Office365, and Exchange have throttle limits.
- Bandwidth.
Usually available bandwidth is NOT a bottleneck.
Meanwhile, it can be a bottleneck on small Internet connexions.
Usually, the available bandwidth is not a bottleneck.
Meanwhile, it can be a bottleneck on small Internet connections.
Imapsync downloads messages from host1 and upload messages to host2,
consider this in case the connexion are asymmetric.
consider this in case the connection is asymmetric.
- I/O on disks.
I/O are a classical bottleneck, almost always forgotten.
- I/O, aka "Input/Output" on the disks of the imap servers.
The I/O on disks are a classical bottleneck, almost always forgotten.
Unlike CPU and RAM, Input/Output performances don't improve
very much as time goes on so it's often a bottleneck.
To measure and overcome an I/O disk bottleneck, you need
usually a direct access to host1 and host2.
usually direct access to host1 and host2.
An I/O bottleneck where imapsync runs is possible if
--usecache or --useuid is used or with very big messages.
- RAM memory.
- RAM.
On all sides, monitor that your systems don't swap its
running processes on disk, because swapping running processes
on disks decreases performance by a factor of 20, at least.
@ -291,9 +294,8 @@ Possible bottlenecks:
- CPU.
100% CPU during a whole transfer means the system is busy.
Usually CPU is not a problem with imapsync but it can be a problem
with one of the imap servers.
Most often CPU is not the real bottleneck, I/O are.
CPU can be a problem with imapsync but it can also be a problem
with one or both of the imap servers.
Other possible bottlenecks:
- Number of hosts available to run imapsync processes.
@ -312,10 +314,10 @@ Q. Can I run several instances of imapsync in parallel on a Windows host?
R. Yes!
Q. Any performance issue?
Q. Any performance issues?
You have to try and check the transfer rates, sum them up to
have a uniq numeric criteria.
have a unique numeric criterion.
There is always a limit, depending on remote imap servers
and the one running imapsync.
CPU, memory, Inputs/Outputs are the classical bottlenecks,
@ -336,7 +338,7 @@ REM After that, just double-click on each batch file to launch each process
=======================================================================
Q. I run multiple imapsync applications at the same time then get a
Q. I run multiple imapsync applications at the same time and then get a
warning "imapsync.pid already exists, overwriting it".
Is this a potential problem when trying to sync multiple
IMAP account in parallel?
@ -346,7 +348,7 @@ by yourself.
This file can help you to manage multiple runs by sending signals
to the processes (sigterm or sigkill) using their PID.
Each run can have its own pid file with --pidfile option.
Each run can have its pid file with --pidfile option.
The file imapsync.pid contains the PID of the current imapsync process.
This file is removed at the end of a normal run.
You can safely ignore the warning if you don't use imapsync.pid file

View File

@ -1,5 +1,5 @@
#!/bin/cat
$Id: FAQ.Messages_Too_Big.txt,v 1.5 2021/06/22 15:31:39 gilles Exp gilles $
$Id: FAQ.Messages_Too_Big.txt,v 1.8 2021/12/16 11:44:26 gilles Exp gilles $
This document is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -11,76 +11,128 @@ https://imapsync.lamiral.info/FAQ.d/FAQ.Messages_Too_Big.txt
Questions answered in this FAQ are:
Q. What does imapsync with big messages?
Q. Imapsync reports errors like these ones:
"could not append...Maximum size of appendable message has been exceeded"
"could not append...maximum message size exceeded"
"The most frequent error is ERR_APPEND_SIZE"
What does it mean?
Q. Does imapsync limits big messages?
Q. What are the well known servers messages size limits?
Q. What can I do to transfer messages bigger than what allows the
imap destination server?
Q. The solution --truncmess xxxx doesn't work with Gmail.
What can I do?
Now the questions again with their answers.
=======================================================================
Q. What does imapsync with big messages?
Q. Imapsync reports errors like these ones:
"could not append...Maximum size of appendable message has been exceeded"
"could not append...maximum message size exceeded"
"The most frequent error is ERR_APPEND_SIZE"
What does it mean?
R. It means the message couldn't be transferred to the destination
account because it is too big, imapsync tries to APPEND it to the
server (that's IMAP jargon) but the server refuses it by saying
either "NO. Maximum size of appendable message has been exceeded"
or "NO. maximum message size exceeded".
=======================================================================
Q. Does imapsync limits big messages?
R. No. Imapsync synchronizes messages no matter their sizes.
R. By default, imapsync checks if the host2 imap server announces a
message size limit with "APPENDLIMIT=xxxx" in its CAPABILITY response.
Then imapsync takes this value to set automatically the --maxsize
option, unless --maxsize is already set on the command line and has a
smaller value than the APPENDLIMIT value.
If the host2 imap server doesn't announce any message size limit then
imapsync syncs all messages no matter their sizes.
When a message is copied to the destination server, the destination
server accepts it or not but it does it as a whole, it takes the full
message or nothing. Nothing triggers an error in imapsync.
server accepts it or not. It does it as a whole, it takes the full
message or nothing. The destination server can refuse a too big
message, it then triggers an APPEND error message in imapsync.
* Gmail announces APPENDLIMIT=35651584 (June 2021).
* Office365 announces nothing.
* Dovecot announces nothing.
* Usually imap servers announce nothing.
So far, December 2021, the biggest message transferred by imapsync on
the online /X service is 1.51 GiB. Who can top that?
=======================================================================
Q. What are the well known servers messages size limits?
* Gmail message size limit is 35 MB.
Gmail announces APPENDLIMIT=35651584 (June 2021).
* Office365 message size limit is 45 MB by default
and it can be upped by configuration. See
https://imapsync.lamiral.info/FAQ.d/FAQ.Office365.txt
Q. I see "NO Maximum size of appendable message has been exceeded"
* Exchange message size limit is 10 MB by default
and it can be upped by configuration. See
https://imapsync.lamiral.info/FAQ.d/FAQ.Exchange.txt
Q. I see "NO Maximum size of appendable message has been exceeded"
* Dovecot message size limit is variable. It is defined
by the sysadmin. For example, quota_max_mail_size = 100M
https://doc.dovecot.org/configuration_manual/quota/
* Usually, any IMAP server has a message size limit, defined
by the sysadmin. You discover it sooner or later
=======================================================================
Q. What can I do to transfer messages bigger than what allows the
imap destination server?
R1. A solution is to truncate the message to the maximum size allowed
before copying it to host2. That's a little dirty but it's ok if you
prefer having a truncated message than no message at all. The
attachments after the truncation won't be available but everything
before should be ok. It may also depend on the software tool reading
the email message.
R1. A solution is ask imapsync to truncate the message to the maximum
size allowed before copying it to host2 by using the option
--truncmess.
For example, Gmail currently limits messages to 35651584 bytes,
aka 34 MiB (June 2021),
That's a little dirty but it's ok if you prefer having a truncated
message than no message at all. The attachments after the truncation
won't be available but everything before should be ok. It may also
depend on the software tool reading the email message.
Starting with imapsync release 1.938 option --truncmess xxxx truncates
messages bigger than the given size xxxx, size given in bytes.
imapsync --truncmess 35651584 --appendlimit 1000000000000
To truncate messages to 10 MB, use:
The --appendlimit option is only needed imap servers that offer the
APPENDLIMIT capability, for example, Gmail. Using it doesn't hurt
anyway.
Prior to imapsync release 1.938, instead of --truncmess:
On Linux, use:
imapsync ... --pipemess 'perl -0ne "print substr \$_,0,35651584" '
On windows, use (I'm not sure of, not tested yet):
imapsync ... --pipemess "perl -0ne 'print substr $_,0,35651584' "
imapsync ... --truncmess 10_000_000
R2. A not-so-dirty solution would be to transform the big messages,
replace the attachments with links to the attachments stored elsewhere.
Well, it's not done and it's too much complicated compared to a simpler
solution which is to allow bigger messages on the destination account.
replace the attachments with links to the attachments stored
elsewhere. Well, it's not done and it's too much complicated compared
to a simpler solution which is to allow bigger messages on the
destination account.
As time goes on, disk space is cheaper and cheaper. Don't make the
new user account, the destination account, worst than his previous,
buy disks. Monitor and rule your resources, not the users.
new user account, the destination account, worse than their previous
account: buy disks.
Monitor and rule your hardware resources, serve your users,
not the contrary.
=======================================================================
Q. The solution --truncmess xxxx doesn't work with Gmail.
What can I do?
R. Gmail currently limits messages size up to 35651584 bytes, aka 34
MiB (June 2021) but imapsync knows it so it avoid to transfer these
big messages. Solution, use:
imapsync ... --truncmess 35_651_584 --appendlimit 1_000_000_000_000
Explanation. By default, imapsync checks if the host2 imap server
announces a message size limit with "APPENDLIMIT=xxxx" in its
CAPABILITY response, like Gmail does. Imapsync takes this APPENDLIMIT
value to set automatically the --maxsize option, unless --maxsize is
already set on the command line and has a smaller value than the
APPENDLIMIT value.
1_000_000_000_000 is one TB, I guess you don't have any message of
that size yet.
=======================================================================
=======================================================================

View File

@ -1,5 +1,5 @@
#!/bin/cat
$Id: FAQ.Migration_Plan.txt,v 1.7 2021/03/02 22:31:36 gilles Exp gilles $
$Id: FAQ.Migration_Plan.txt,v 1.9 2021/12/19 10:00:32 gilles Exp gilles $
This document is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -8,23 +8,23 @@ https://imapsync.lamiral.info/FAQ.d/FAQ.Migration_Plan.txt
=====================================================================
Imapsync. Suggestions for a good, low impact on users,
well executed email migration plan.
well-executed email migration plan.
=====================================================================
There is two main different scenarios depending on the response to the
following question:
There are two main different scenarios. Choosing which one fits your
context depends on the response to the following question:
Will the imap software tools used by the users use the exact same
Will the imap software tools used by the users use the same
credentials triplet for both imap servers, the old server host1 and
the new server host2?
The credentials triplet is hostname/username/password.
If the answer is yes, ie, clients email tools use the exact same
triplet credentials, then it is possible to perform a migration
without changing anything on the users side. This may be a very time
saving option. But it's a rare condition so I'll describe this
scenario later in this document.
If the answer is yes, ie, clients' email tools use the same triplet
credentials, then it is possible to perform a migration without
changing anything on the users' side. This may be a very time-saving
option. But it's a rare condition so I'll describe this scenario later
in this document.
=====================================================================
@ -40,104 +40,124 @@ Classical scenario, credentials triplets are different on both sides
users are already playing with the new mailboxes on host2, don't
follow this scenario.
* Presync all the mailboxes from the old server host1 to the new
server host2. If the imap server names are going to change their IP
resolution then don't use those names, use names that will always
* Pre-synchronize all the mailboxes from the old server host1 to the
new server host2. If an imap server name is going to change its IP
address, then don't use this name, use a name that will always
match the same imap servers, or use their IP addresses.
Presyncs can usefully be done with --delete2 in order to get an
exact sync. But never use the option --delete2 once users have
started to play with their new account on host2, their play will be
lost on the next presync, or when the MX is changed, since INBOX
will start to receive new messages that are not on host1.
Pre-synchronizations can usefully be done with --delete2 to get an
exact synchronization. But never use the option --delete2 once the
users have started to play with their new account on host2, their
play will be lost on the next synchronization. Don't use --delete2
either when the MX is changed since INBOX will start to receive new
messages that are not on host1 and then removing them is not a good
idea.
* Decide a migration day/hour.
* Repeat the presyncs (with the --delete2 options) daily until the
migration hour. This repeated process will show how long should
take the last sync.
* Repeat the pre-synchronizations (with the --delete2 options) daily
until the migration hour. This repeated process will show how long
should take the last synchronization.
* At the migration hour, cut access to the users to the old server
host1, if you can. Or tell them to not use it anymore.
* Do a last presync exactly like previous ones.
* Do the last pre-synchronization exactly like the previous ones.
* Change the MX, the new messages should start to arrive in the new
imap server host2.
* Wait the TTL value, aka 5 minutes. Now, new messages should
not arrive to the old server host1.
* Wait for the TTL value, aka 5 minutes. Now, new messages should
not arrive at the old server host1.
* Tell the users that the old imap server host1 is down and no
longer available.
* Do a postsync. A postsync is a sync with the following options
--maxage 1 --delete1 --folder INBOX
* Do a post-synchronization. A post-synchronization is a run with the
following options: --folder INBOX --delete1 --maxage 1
This postsync will move the last new messages arrived on host1 to
host2 during the TTL interval and delete them on host1. Do not use
the option --delete2 in a postsync.
This post-synchronization will copy the messages arrived in the
last day (--maxage 1) in the folder INBOX (--folder INBOX) on the
source account, to the destination account. It will also delete
them on host1 (--delete1). It's --delete1, it's not --delete2.
Remember, do not use the option --delete2 in a post
synchronization, as users won't appreciate seeing their newly
arrived messages disappear because of you.
* Give access to new accounts to the users with their new credential
triplet hostname/username/password. If the way to contact users is
email then you should give this long before shutting down the old
server.
by email then you should give them the new credentials long before
shutting down the old server.
* Migration done.
* In case there are still messages arriving at the old imap server
host1, you can perform more postsyncs, ie, syncs every day
with the options:
--maxage 1 --delete1 --folder INBOX
host1, you can perform more post-synchronizations, ie, runs every
day with the options: --maxage 1 --delete1 --folder INBOX
* Increase the TTL of the MX back to its previous value, usually
24 hours, 86400 seconds. You don't want all your email system
to break down completely when your DNS are not available
temporarily, keeping dns values in cache for a 24h is a savvy
practice.
=====================================================================
Lucky scenario, credentials triplets are the same on both sides
=====================================================================
* Decrease the TTL of the MX, as well as the imap hostname resolution,
to 5 minutes (or even less). See FAQ.TTL.txt to understand why.
to 5 minutes (or even less). The document FAQ.TTL.txt explains why.
* Create the new mailboxes on the destination server host2.
* Presync all the mailboxes from the old host1 to the new server host2,
using different names that the ones used by the imap software
clients (use their IP for example).
Presyncs have to be done with --delete2 but never use --delete2
once users have started playing with their new account on host2.
* Pre-synchronize all the mailboxes from the old host1 to the new
server host2, using different names than the ones used by the imap
software clients (use their IP for example). Presyncs have to be
done with --delete2 but never use --delete2 once users have started
playing with their new account on host2.
* Decide a migration day/hour.
* repeat the presyncs (with the --delete2 options) daily until the
migration hour. This repeated process will show how long should
take the last sync.
* Repeat the pre-synchronizations (the runs with the --delete2
options) daily until the migration hour. This repeated process will
show how long should take the last sync.
* At the migration hour, cut access to the users to the old server.
You can do this by changing the imap host1 hostname to a non-imap
server for example, or by changing their password on host1.
* Do a last sync exactly like the presyncs, not using the imap hostname.
* Do the last run exactly like the pre-synchronizations.
* Change also the MX resolution, the new messages should start
to arrive in the new imap server very soon.
* Wait the TTL value, aka 5 minutes. Now, new messages should
not arrive to the old server host1.
* Wait for the TTL value, aka 5 minutes. Now, new messages should
not arrive at the old server host1.
* Do a postsync. A postsync is a sync with the following options
--maxage 1 --delete1 --folder INBOX
* Do a post-synchronization. A post-synchronization is a run with the
following options: --folder INBOX --delete1 --maxage 1
This postsync will move the last new messages arrived on host1 to
host2 during the TTL interval and delete them on host1. Do not use
the option --delete2 in a postsync.
This post-synchronization will copy the messages arrived in the
last day (--maxage 1) in the folder INBOX (--folder INBOX) on the
source account, to the destination account. It will also delete
them on host1 (--delete1). It's --delete1, it's not --delete2.
Remember, do not use the option --delete2 in a post
synchronization, as users won't appreciate seeing their newly
arrived messages disappear because of you.
* Shutdown the old imap server.
* Shut down the old imap server.
* Change the user imap hostname resolution from the old IP of host1
to the IP of the new imap server host2.
* Migration done.
* Increase the TTL of the MX back to its previous value, usually
24 hours, 86400 seconds. You don't want all your email system
to break down completely when your DNS are not available
temporarily, keeping dns values in cache for a 24h is a savvy
practice.
=======================================================================
=======================================================================

View File

@ -1,5 +1,5 @@
$Id: FAQ.Office365.txt,v 1.23 2021/07/06 02:30:01 gilles Exp gilles $
$Id: FAQ.Office365.txt,v 1.38 2022/06/22 17:07:35 gilles Exp gilles $
This documentation is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -14,18 +14,31 @@ Questions answered in this FAQ are:
Q. Can I use imapsync to transfer from or to Office365 accounts?
Q. Does IMAPSync support OAUTH2 authentication in Office 365?
Q. Can imapsync work for users that are administrators for
an Office 365 domain? (quick answer: no)
Q. Does imapsync support OAUTH2 authentication for Office365 accounts?
Q. How to sync from Office365 to XXX?
Q. How to sync from XXX to Office365
Q. For Office365 I have double and triple-checked the username and
password spelling but I still get a "LOGIN failed". Any clue?
password spelling but I still get a "LOGIN failed". Any clue?
Q. How can I access an Office365 shared mailbox?
Q. How can I use a shared account as a backup account for several
mailboxes and so avoid spending too many dollars in backup accounts?
Q. Office365 fails with "User is authenticated but not connected".
Q. I see "NO Maximum size of appendable message has been exceeded"
What can I do with that?
Q. Every single mail synced to exchange online owns the
category $MDNSent after migration. How can I avoid this?
Q. The imap connection to Office365 is not working very efficiently,
is there a solution to fix that?
@ -33,6 +46,8 @@ Q. Office365 throttles the sync and says:
"Request is throttled. Suggested Backoff Time: 299961 milliseconds".
What can I do with that?
Q. What are the receive and sending limits of Office365?
Q. The sync fails with many "Trying command when NOT connected!".
What can I do?
@ -68,20 +83,121 @@ Now the questions again with their answers.
======================================================================
Q. Can I use imapsync to transfer from or to Office365 accounts?
R. Yes. But IMAP access to Office365 account is not always allowed by default
so it has to be allowed in the server configuration part.
R0. Yes. But IMAP access to Office365 account is not always allowed
by default so it has to be allowed in the server configuration part.
https://docs.microsoft.com/en-us/exchange/clients-and-mobile-in-exchange-online/pop3-and-imap4/enable-or-disable-pop3-or-imap4-access
https://docs.microsoft.com/en-us/exchange/troubleshoot/configure-mailboxes/pop3-imap-owa-activesync-office-365
R1. Imapsync doesn't support OAUTH2 authentication for Office365
accounts yet. That's not totally true, if you have an access token
to access your mailbox then you can authenticate with imapsync this
way:
imapsync ... --oauthaccesstoken1 tokenfile
where "tokenfile" is a file containing the access token.
R2. Enable double-step authentication and configure it but after use
an "app password" with imapsync. Details:
a) Go to
https://account.microsoft.com/security
b) Click on "Advanced Security Options"
Turn "Two-step verification" on. Follow the steps and finish".
c) Then now "App passwords" is available.
Click on "Create a new app password".
Use this password to authenticate with imapsync.
d) Delete this app password when the job with imapsync is finished.
R3. Also, check a license is assigned to that account in Office365.
R4. From Dave Pusey
https://github.com/imapsync/imapsync/issues/317#issuecomment-1027776418
I quote Dave nearly verbatim:
"I had created an app password, and security defaults are already off.
I have now figured out the issue.
Despite the MS365 and EXO admin centers showing that IMAP and Basic
Auth were all enabled, it turns out that in Oct 2021, Microsoft began
disabling basic auth for all tenants that had have never used it by
that point. There was an item in my Message Center from that date
saying my tenant was being done.
You can re-enable it for specific protocols (IMAP in this case) using
the diagnostic process detailed at
https://techcommunity.microsoft.com/t5/exchange-team-blog/basic-authentication-and-exchange-online-september-2021-update/bc-p/2782230
(see the section "Limited Opt Out")
R5. Microsoft introduced something called "security defaults" which is enabled
by default for new tenants. One of the rules blocks IMAP access as of imapsync.
The funny thing is that you can't disable a single rule of this
security package without buying additional licenses.
Switching the whole thing off allows the IMAP login.
Also, disable double-step authentication on the Azure/Active Directory portal.
See here:
https://docs.microsoft.com/en-us/azure/active-directory/fundamentals/concept-fundamentals-security-defaults
Thanks to Stephan Buhre for this R5 answer.
R6. Are there special characters in the password?
https://imapsync.lamiral.info/FAQ.d/FAQ.Authentication_failure.txt
https://imapsync.lamiral.info/FAQ.d/FAQ.Passwords_on_Windows.txt
https://imapsync.lamiral.info/FAQ.d/FAQ.Passwords_on_Unix.txt
https://imapsync.lamiral.info/FAQ.d/FAQ.Passwords_on_Mac.txt
R7. Triple check the hostname then. Try all of these:
* outlook.office365.com
* imap-mail.outlook.com
* imap.outlook.com
======================================================================
Q. Can imapsync work for users that are administrators for
an Office 365 domain? (quick answer: no)
R. It doesn't seem possible to use imap for administrators, so imapsync
won't be able to work for an administrator's mailbox.
See:
https://github.com/imapsync/imapsync/issues/310#issuecomment-1002396218
https://exhaust.lewiscollard.com/post/146866104/office365-to-migadu-migration/
Solution: as explained in the article above, use Davmail as a proxy to
access this mailbox. http://davmail.sourceforge.net/
Thanks to Lewis Collard for this report and solution.
======================================================================
Q. Does imapsync support OAUTH2 authentication for Office365 accounts?
R. No. But I plan to add it during the year 2021.
R. Yes but partially. Imapsync won't help you getting an access token
but if you have one then you can use it with imapsync this way:
Office365 as source:
imapsync ... --oauthaccesstoken1 tokenfile1
Office365 as destination:
imapsync ... --oauthaccesstoken2 tokenfile2
======================================================================
Q. How to sync from Office365 to XXX?
R0. IMAP is not enabled by default on Office365, see how to enable it:
https://docs.microsoft.com/en-us/exchange/clients-and-mobile-in-exchange-online/pop3-and-imap4/enable-or-disable-pop3-or-imap4-access
https://docs.microsoft.com/en-us/exchange/troubleshoot/configure-mailboxes/pop3-imap-owa-activesync-office-365
If IMAP cannot be enabled or if it doesn't work well, you can try DavMail
(http://davmail.sourceforge.net/) which acts as an IMAP gateway
through Outlook Web Access.
R. On Windows, use:
imapsync.exe ... --office1
@ -107,7 +223,7 @@ If IMAP cannot be enabled or if it doesn't work well, you can try DavMail
(http://davmail.sourceforge.net/) which acts as an IMAP gateway
through Outlook Web Access.
R. Here is a command-line resume that solves most encountered issues when
R. Here is a command-line summary that solves most encountered issues when
migrating to Office365.
imapsync ... --office2
@ -141,42 +257,65 @@ Use it like this:
It often does some miracles on messages.
======================================================================
Q. For Office365 I have double and triple-checked the username and
password spelling but I still get a "LOGIN failed". Any clue?
Q. For Office365 I have double and triple-checked the username and
password spelling but I still get a "LOGIN failed". Any clue?
R0. Imapsync doesn't support OAUTH2 authentication for Office365 accounts yet.
R. Go to "Q. Can I use imapsync to transfer from or to Office365 accounts?"
R1. Disable double-step authentication, also known as 2-factor,
2-step authentication on the Azure/Active Directory portal.
======================================================================
Q. How can I access an Office365 shared mailbox?
R2. Also, check a license is assigned to that account in Office365.
R. First, create a shared mailbox, for example shared@example.com.
Then give full permissions to a licensed account user@example.com.
Now with imapsync, use the licensed user login with the syntax:
R3. Microsoft introduced something called "security defaults" which is enabled
by default for new tenants. One of the rules blocks IMAP access as of imapsync.
The funny thing is that you can't disable single rules of this security
package without buying additional licenses.
Switching the whole thing off allows the login.0
Also, disable double-step authentication on the Azure/Active Directory portal.
See here:
https://docs.microsoft.com/en-us/azure/active-directory/fundamentals/concept-fundamentals-security-defaults
Thanks to Stephan Buhre for this R3 answer.
user@example.com\shared@example.com
R4. Are there special characters in the password?
https://imapsync.lamiral.info/FAQ.d/FAQ.Authentication_failure.txt
https://imapsync.lamiral.info/FAQ.d/FAQ.Passwords_on_Windows.txt
https://imapsync.lamiral.info/FAQ.d/FAQ.Passwords_on_Unix.txt
https://imapsync.lamiral.info/FAQ.d/FAQ.Passwords_on_Mac.txt
and the password for user@example.com
R5. Triple check the hostname then. Try all of these:
* outlook.office365.com
* imap-mail.outlook.com
* imap.outlook.com
Caveat: Character \ is a special character, so
use double-quotes around the user login, like:
imapsync ... --user1 "user@example.com\shared@example.com"
Sources:
https://adam-hand.com/2017/07/25/connect-a-shared-mailbox-from-o365-to-outlook-via-imap/
https://www.arclab.com/en/kb/email/imap-settings-shared-mailbox-office-exchange-online.html
https://social.technet.microsoft.com/Forums/en-US/336e02ee-6767-4810-90a0-1352bd7cc9e9/office-365-how-to-access-a-shared-mailbox-using-imap-client?forum=onlineservicesexchange
======================================================================
Q. How can I use a shared account as a backup account for several
mailboxes and so avoid spending too many dollars in backup accounts?
R. Use the option --subfolder2 backup_foo
imapsync ... --user2 sharedloginsyntax --subfolder2 backup_foo
To restore, do the reverse with:
imapsync ... --user1 sharedloginsyntax --subfolder1 backup_foo
======================================================================
Q. Office365 fails with "User is authenticated but not connected".
R1. "The message User is authenticated but not connected is due to a
bug in the Office365 server's IMAP implementation. If the client
presents a valid user name but an invalid password, the server
accepts the login, but subsequent commands fail with the
aforementioned error message." Source:
https://unix.stackexchange.com/questions/164823/user-is-authenticated-but-not-connected-after-changing-my-exchange-password
Thanks to James Abbottsmith for this link and explanation at
https://github.com/imapsync/imapsync/issues/32#issuecomment-153561647
R2. Miguel Alameda reported understanding and solving this issue
like this, the context was admin/authuser:
"The admin user had not permission in the target mailbox."
======================================================================
Q. I see "NO Maximum size of appendable message has been exceeded"
What can I do with that?
R. Office365 supports send/receive max message sizes of up to 150MB
but you need to make changes in your tenant(s) to support it.
@ -198,20 +337,32 @@ values on the migration accounts in the source and target tenants.
Thanks to Sean McDougall, Ian Thomas & Matt Wilks from Toronto
for this FAQ item.
======================================================================
Q. Every single mail synced to exchange online owns the
category $MDNSent after migration. How can I avoid this?
R. To remove the flag $MDNSent from all messages, use:
imapsync ... --regexflag "s/\$MDNSent//g"
See also the document
https://imapsync.lamiral.info/FAQ.d/FAQ.Flags.txt
======================================================================
Q. The imap connection to Office365 is not working very efficiently,
is there a solution to fix that?
R. Yes. Try DavMail
http://davmail.sourceforge.net/
I don't use it myself but a user, Yannick Palanque, reported great results using it.
I don't use it myself but a user, Yannick Palanque, reported
great results using it.
======================================================================
Q. The sync fails with many "Trying command when NOT connected!".
What can I do?
R. The --debugimap option can show you more details, especially some
message like:
R. The --debugimap option can show you more details, especially
messages like this one:
"BAD Request is throttled. Suggested Backoff Time: 178755 milliseconds"
In that case, see the next faq item and its fixes.
@ -249,6 +400,29 @@ R2. Play with options --maxbytespersecond or --maxmessagespersecond
I don't know the upper value that avoids the default throttling from 0365
and I guess it changes over time.
======================================================================
Q. What are the receive and sending limits of Office365?
R1. 3600 messages per hour (22 July 2021). Maybe 1200 as imapsync can
be viewed as a single sender. Tell me what you experienced,
I'll update this point.
https://docs.microsoft.com/en-us/office365/servicedescriptions/exchange-online-service-description/exchange-online-limits#receiving-and-sending-limits
In that case, imapsync can adapt to this with (1 message/second = 3600 messages per hour)
imapsync ... --maxmessagespersecond 1
or
imapsync ... --maxmessagespersecond 0.33
R2. I also found "Microsoft theoretically allows for about 300MB of
throughput per user per hour." at
https://www.systools.in/blog/microsoft-office-365-throttling-policy/
In that case, imapsync can adapt to this with (83333 bytes/second = 300 MBytes/hour)
imapsync ... --maxbytespersecond 83333
======================================================================
Q. Office365 refuses to create the folder named "Files" with the error
"NO Folder name is reserved". What happens?
@ -277,12 +451,13 @@ R0. To fix this, add --exclude Files
The host2 account ends up with a folder named
"Files_renamed_by_imapsync", but no complaining.
R1. This folder "Files" seems to be a standard folder in Exchange Online,
but it is not. This folder contains all attachments in every email
that is in the mailbox but without any headers.
This causes some confusion for users as these appear in their search
results as duplicate lines but without the sender details or even
the message body.
R1. This folder "Files" seems to be a standard folder in Exchange Online,
but it is not. This folder contains all attachments in every email
that is in the mailbox but without any headers.
This causes some confusion for users as these appear in their search
results as duplicate lines but without the sender details or even
the message body.
This folder seems to be usually hidden so IMAP clients can’t see it,
but for some reason sometimes it becomes visible.
@ -350,8 +525,8 @@ R3. See also the FAQ FAQ.SSL_errors.txt
Q. From XXX Office365 I get this error message sometimes:
"BAD Command Argument Error 11". What does it mean?
R. This error message comes from the Office365 IMAP server when it
encounters any problem. Most of the time it is one of the following:
R. This error message comes from the Office365 IMAP server when it
encounters any problem. Most of the time it is one of the following:
* Some messages are bigger than the size limit.
45 MB by default on Office365.
@ -365,7 +540,7 @@ R. This error message comes from the Office365 IMAP server when it
* Quota reached. The whole account is full.
It can be upped by configuration.
* You use --synclabels --resynclabels from a previous command line
* You use --synclabels --resynclabels from a previous command line
related to syncing from Gmail to Gmail. Remove them.
* Some messages have some lines too long. Use option --maxlinelength
@ -429,7 +604,7 @@ Note from Yago Torres Fernandez:
(a working command using admin/authuser on host2 Office 365)
imapsync ... --authuser2 user_admin@domain.com --user2 user_to_be_migrated@domain.com ^
--password2 XXXX --ssl2 ^
--password2 XXXX --ssl2
but previously in Office365, you must do something like the following, using Powershell:
@ -437,7 +612,12 @@ but previously in Office365, you must do something like the following, using Pow
Note from Betsy Lawlor: You can use global modern authentication with two factor
on Exchange Online (M365) but you must have "AllowBasicAuthImap" on the admin account you are using to migrate the mail.
on Exchange Online (M365) but you must have "AllowBasicAuthImap" on
the admin account you are using to migrate the mail.
Note from Guido (5 April 2022):The way I fixed it was by turning off security defaults
https://docs.microsoft.com/nl-nl/azure/active-directory/fundamentals/concept-fundamentals-security-defaults.
You still need to check IMAP access on an account-basis though.
Remark: PLAIN authentication is the only way to go with --authuser1 for now.
So don't use --authmech1 SOMETHING with --authuser1 admin_user,
@ -453,7 +633,7 @@ so if two factors authentication is enabled you will no be able to sync
the mail (it will not connect to host2).
OWA (I think this is the two-factor authentication) needs to be disabled
globally and enabled individually on the users you want to.
One account can have the rights to access other mailboxes no matter if admin or
One account can have the right to access other mailboxes no matter if admin or
any other account but needs to have OWA disabled to be able to connect
to the office365 server.
@ -464,7 +644,7 @@ but not for the admin. Example:
imapsync ... --authuser2 user_admin@domain.com --user2 user_to_be_migrated
See also:
http://www.linux-france.org/prj/imapsync_list/msg02203.html
http://linux-france.tk/prj/imapsync_list/msg02203.html
Subject: RE: [imapsync] Office 365 - 'Master User'?
Date: Mon, 1 Jun 2015 17:53:54 +0000
@ -473,8 +653,8 @@ Date: Mon, 1 Jun 2015 17:53:54 +0000
Q. Couldn't create folder [trash] "Mailbox already exists".
R. Some servers take care of character cases in folder names,
some servers do not, like Exchange. Since not respecting the case can merge
two different folders into one then imapsync respects the case.
some servers do not, like Exchange. Since not respecting the case
can merge two different folders into one then imapsync respects the case.
For example, if a host1 server has a folder name called "trash"
and the host2 server already has a folder "Trash" or "TRASH"

View File

@ -10,7 +10,7 @@ https://imapsync.lamiral.info/FAQ.d/FAQ.Old_Style_Web_Design.txt
=======================================================================
=======================================================================
Q. Why the imapsync website looks so old fashion?
Q. Why does the imapsync website look so old fashioned?
R. Once in a while I receive messages from people complaining about
the website style, not that much about the content by the way,
@ -28,7 +28,7 @@ Here are several reasons it stays like that for now:
* I like static web.
Although you could argue that I do use some dynamic things, like SSI.
That's true, I use Server Side Include, aka SSI, denoted by the ".shtml"
extention of some files, instead of the classical ".html" extention.
extension of some files, instead of the classical ".html" extension.
It's because I like dynamic web when the dynamic brings something that
can't be done easily with static files.

View File

@ -1,5 +1,5 @@
#!/bin/cat
$Id: FAQ.OnlineUI.txt,v 1.29 2021/05/05 21:38:32 gilles Exp gilles $
$Id: FAQ.OnlineUI.txt,v 1.36 2022/09/14 11:18:05 gilles Exp gilles $
This document is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -12,73 +12,96 @@ https://imapsync.lamiral.info/FAQ.d/FAQ.OnlineUI.txt
Questions answered in this FAQ are:
Q. Can I launch several imap synchronizations on the visual
user interface /X?
Q. How secure is the online visual user interface /X?
Q. Does the online service store any sensitive information
like my passwords?
like my passwords?
Q. I want to switch from the visual interface /X to the
imapsync command line or to the script examples
https://imapsync.lamiral.info/#DOC_BASIC
What should I know?
Q. Shall I have issues when the browser times out?
What happens if the browser connection is closed for whatever reason?
What happens if the browser connection is closed for whatever reason?
Q. Shall I have issues when the webserver times out? What happens
if the web server closes the connection for whatever reason?
if the web server closes the connection for whatever reason?
Q. The sync stalls at the beginning, just after a line like:
"Host1: xxx says it has CAPABILITY for AUTHENTICATE LOGIN"
What is the problem?
"Host1: xxx says it has CAPABILITY for AUTHENTICATE LOGIN"
What is the problem?
Q. The synchronization fails with the error message like:
Err 1/1: Host1 failure: Error login on [10.1.161.155] with user [webmaster@truc.com] auth [LOGIN]: 2 NO [ALERT] LOGIN DENIED -- COUNTRY IS BLACKLISTED
Now the questions again with their answers.
=====================================================================
Q. Can I launch several imap synchronizations on the visual
user interface /X?
A. Yes. Open several tabs/windows on your browser and fill each one
with different credentials.
=====================================================================
Q. How secure is the online visual user interface /X?
R0. Well, I don't know if asking the provider whether his online
A0. Well, I don't know if asking the provider whether his online
service is secure or not would be of any interest.
Let's do it anyway, you'll be the judge.
R1. Some figures
A1. Some figures
Date of this report: 22 April 2021.
Date of this report: 24 December 2021. Happy Christmas!
The online imapsync service /X started 9 January 2017
(1564 days of service).
The online imapsync service /X started 9 January 2017,
5 years ago (1810 days of service).
On average, /X has 51 users per day, each user lunches on average
6 account migrations, from just one launch to many (hundreds).
On average, /X has 51 users per day, each user launches on average
6 account migrations, from just 1 launch to many (hundreds).
The total volume /X transferred so far is around 210 TiB coming
from nearly 450 000 imap account migrations and 700 million email messages.
The total volume /X transferred so far is around 240 TiB coming
from nearly 520 000 imap account migrations and 810 million email messages.
R2. Pros & Cons
A2. Pros & Cons
The online imapsync service /X runs on HTTPS only, with a
letsencrypt certificate, a certificate overall rated "A+" at
The online imapsync service /X runs on HTTPS only, with a letsencrypt
certificate, an up to date certificate overall rated "A+" at
https://www.ssllabs.com/ssltest/analyze.html?d=imapsync.lamiral.info
Because of the HTTPS usage, what the users enter in their browser,
the imap logins and passwords, can't be eavesdropped on the network.
Because of the HTTPS usage, what the users enter in their browser, the
imap logins and passwords, can't be eavesdropped on the network.
Imapsync itself takes care of encryption for the imap sessions,
if possible. First, imapsync tries to use SSL on port 993,
then TLS on port 143 if the servers announce TLS, then no encryption at all.
Imapsync itself takes care of encryption for the imap sessions, if
possible. First, imapsync tries to use SSL on port 993, then TLS on
port 143 if the servers announce TLS, then no encryption at all.
Concerning encryption, what is done with the source imap server host1
is independent of what is done with the destination imap server host2.
On the date of 22 April 2021, there is no security problem
detected or reported to me (Gilles LAMIRAL), so far.
Feel free to attack the service and feel free to report any
hole encountered. Have in mind I can watch what you do
from the server-side and take measures if the service suffers from
your acts. Drop me a note before will be fair play.
On the date of 24 December 2021, there is no security problem detected
or reported to me (Gilles LAMIRAL), so far.
As the owner of the service, it could have been 450 000 pairs of
credentials collected and nearly 210 terabytes of email messages.
I haven't kept them but I can't prove I haven't. It's just trust,
like nearly every online service in the universe.
Concerning the Log4j threats, the imapsync server doesn't use Log4j at
all, so it should be safe about this issue.
The imap server certificates are not checked for authenticity
(by default) because too many imap servers are crappy configured
regarding certified certificates.
Feel free to attack the service and feel free to report any hole
encountered. Have in mind that I can watch what you do from the
server-side, and then take measures if the service suffers from your
acts. Drop me a note before will be fair play and I will let you act
as harsh as you can.
As the owner of the service, it could have been 520 000 pairs of
credentials collected and nearly 240 terabytes of email messages.
That's massive. I haven't kept them but I can't prove I haven't. It's
just trust, like nearly every online service in the universe.
Concerning imapsync transfers, the imap server certificates are not
checked for authenticity by default because too many imap servers are
crappy configured regarding their certified certificates.
This default behavior is chosen like this because users of /X
want their emails transferred, instead of being not transferred
@ -88,43 +111,103 @@ I admit that this part, checking imap ssl/tls certificates,
could be improved from my side by including well known
certificates directly in imapsync.
If the imap servers don't honor ssl nor tls, then logins, passwords
and everything will go clear text during the imap transfers.
That's not good at all but what "comforts" me is that if an
imap server does only clear text transfers, then it's also true
for all the imap sessions the account owner encounters,
imapsync is just one of them; the imap servers are then always
unsecured for any imap software client.
If an imap server doesn't honor ssl nor tls, then logins, passwords
and everything will go clear text during the imap transfers. That's
not good at all! But what "comforts" me is that if an imap server does
only clear text transfers, then it's also true for all the imap
sessions the account owner encounters, imapsync is just one of them;
the imap servers are then always unsecured for any imap software
client.
Last point, who could be sure that no cracker cracked the online hosts
and that he isn't currently sniffing the credentials?
Last point, who could be sure that no cracker cracked the online
hosts and that he isn't currently sniffing the credentials?
No one, I'm not sure myself, even if I do take care of that
No one! I'm not sure myself, even if I do take care of that
possibility. So changing the imap accounts passwords after
the sync is a safe and recommended practice!
the sync is a safe and recommended practice! You can even
change the password just after imapsync has started its job,
just after a successful login. This way you know the previously
given password is no longer working just after imapsync has
started its job.
=====================================================================
Q. Does the online service store any sensitive information
like my passwords?
like my passwords?
No.
The online passwords are kept by your browser. The goal is
that the next time you run a sync from your browser, all the
parameters are already there without having to re-enter them.
The save is done when you click on the "Sync or resync" green
button. So, if you don't want your browser to keep your password,
enter a wrong one or empty the password field and click
on the "Sync or resync" green button, the wrong password
will be saved in your browser and no sync will be done,
since a good login is mandatory to do anything on your mailboxes.
The online passwords are kept by your browser. The goal is that the
next time you run a sync from your browser, all the parameters are
already there without having to re-enter them. The save is done when
you click on the "Sync or resync" green button. So, if you don't want
your browser to keep your password, enter a wrong one or empty the
password field and click on the "Sync or resync" green button, the
wrong password will be saved in your browser and no sync will be done,
since a correct login is mandatory to do anything on your mailboxes.
=====================================================================
Q. I want to switch from the visual interface /X to the
imapsync command line or to the script examples
https://imapsync.lamiral.info/#DOC_BASIC
What should I know?
A. Let's do some ascii art.
The visual interface looks roughly like this, for the textfields input part:
+------------------------------------------+------------------------------------------+
| IMAP source Mailbox | IMAP destination Mailbox |
| | |
| Login (usually an email address) | Login (usually an email address) |
| | |
| test1 | test2 |
| | |
| Password | Password |
| | |
| secret1 | secret2 |
| | |
| IMAP Server hostname (or its IP address) | IMAP Server hostname (or its IP address) |
| | |
| test1.lamiral.info | test2.lamiral.info |
| | |
+------------------------------------------+------------------------------------------+
Notice the 6 examples values I put in the previous "picture":
* test1
* secret1
* test1.lamiral.info
* test2
* secret2
* test2.lamiral.info
The corresponding imapsync command line on Windows is:
imapsync.exe --host1 "test1.lamiral.info" --user1 "test1" --password1 "secret1" ^
--host2 "test2.lamiral.info" --user2 "test2" --password2 "secret2"
The order of the parameters is whatever you want as long as you respect each pair
like: --optionname "value"
There is no need to type this in a command prompt window, just use the example script
https://imapsync.lamiral.info/examples/imapsync_example.bat
The corresponding imapsync command line on Linux is:
imapsync --host1 "test1.lamiral.info" --user1 "test1" --password1 "secret1" \
--host2 "test2.lamiral.info" --user2 "test2" --password2 "secret2"
There is no need to type this in a command prompt window, just use the example script
https://imapsync.lamiral.info/examples/imapsync_example.sh
=====================================================================
Q. Shall I have issues with the browser timing out?
What happens if the browser connection is closed for whatever reason?
What happens if the browser connection is closed for whatever reason?
R. A browser connection closed closes also the imapsync process,
ie, the sync is ended right away.
A. A browser connection closed closes also the imapsync process,
ie, the sync is ended right away.
Further comments on this behavior.
@ -137,7 +220,7 @@ If the Browser/WebServer connection timeouts or ends,
the imapsync sync is also ended immediately by the remote
Apache HTTPS server. Technically, Apache sends a TERM signal
to the imapsync process, then wait some seconds before
sending a KILL signal if it is still alive.
sending a KILL signal if the imapsync process is still alive.
You can relaunch the sync with the "Sync!" button, at any time.
If the "Sync!" button is gray/inactive then just reload
@ -158,29 +241,60 @@ the logfile running the sync like a "tail -f" command (isn't that magic?).
=====================================================================
Q. Shall I have issues when the webserver times out? What happens
if the web server closes the connection for whatever reason?
if the web server closes the connection for whatever reason?
R. If the webserver closes the connection then usually it also
kills the imapsync process and the imap connections as well.
A. If the webserver closes the connection then usually it also
kills the imapsync process and the imap connections as well.
To fix this issue, see the document INSTALL.OnlineUI.txt
and search for "Timeout" in it.
Tip: If the connections close for huge folders and always after
300 seconds or 60 seconds then it looks like a web server timeout.
Apache 2.2 timeout is 300 seconds.
Apache 2.4 timeout is 60 seconds.
The current webserver timeout at
https://imapsync.lamiral.info/X/
is 3600 secondes, one hour.
=====================================================================
Q. The sync stalls at the beginning, just after a line like:
"Host1: xxx says it has CAPABILITY for AUTHENTICATE LOGIN"
What is the problem?
"Host1: xxx says it has CAPABILITY for AUTHENTICATE LOGIN"
What is the problem?
A. I've seen this issue on /X with the imap server
CommuniGate Pro IMAP Server 6.0.11
R. I've seen this issue on /X with the imap server
CommuniGate Pro IMAP Server 6.0.11
The issue looks related to special characters in the password.
Solution for now: change the password, keep only standard (ASCII)
alphanumeric characters ABC-YZ abc-yz 012-89.
=====================================================================
Q. The synchronization fails with the error message like:
Err 1/1: Host1 failure: Error login on [10.1.161.155] with user [webmaster@truc.com] auth [LOGIN]: 2 NO [ALERT] LOGIN DENIED -- COUNTRY IS BLACKLISTED
A. The message "[ALERT] LOGIN DENIED -- COUNTRY IS BLACKLISTED" comes directly
from the IMAP server at 10.1.161.155
It looks like that the 10.1.161.155 imap server filters incoming
connections based on their IPS. In that case, here are the current
IPs of the imapsync online service (September 2022):
ks5.lamiral.info has address 91.121.221.224
ks5ipv6.lamiral.info has IPv6 address 2001:41d0:2:84e0::1
ks6.lamiral.info has address 5.39.87.81
ks6ipv6.lamiral.info has IPv6 address 2001:41d0:8:9951::1
ks7.lamiral.info has address 5.135.177.225
ks7ipv6.lamiral.info has IPv6 address 2001:41d0:8:b8e1::1
i050.lamiral.info has address 213.32.72.139
i050ipv6.lamiral.info has IPv6 address 2001:41d0:302:1000::155d
vp3.lamiral.info has address 51.178.81.27
vp3ipv6.lamiral.info has IPv6 address 2001:41d0:404:200::4d81
vp4.lamiral.info has address 51.38.34.201
vp4ipv6.lamiral.info has IPv6 address 2001:41d0:305:2100::4c46
The imapsync online service may contact your imap server with one
or more of those IP addresses.
CPhulk of Cpannel has a buildin country block that can cause this behavior.
Later on you may encountered issues with maximum sessions per ip.
You can change that within cPannel.
https://support.cpanel.net/hc/en-us/articles/4406663082519-What-is-cPHulk-
https://docs.cpanel.net/whm/security-center/cphulk-brute-force-protection/
=====================================================================
=====================================================================

View File

@ -1,5 +1,5 @@
#!/bin/cat
$Id: FAQ.POP3.txt,v 1.5 2019/07/27 20:18:37 gilles Exp gilles $
$Id: FAQ.POP3.txt,v 1.6 2022/04/05 13:48:52 gilles Exp gilles $
This document is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -24,8 +24,8 @@ Q. Can I use imapsync to migrate emails from pop3 server to imap server?
R1. No, but you can migrate emails from a pop3 server to an imap server
with the command line tool pop2imap:
http://www.linux-france.org/prj/pop2imap/
http://www.linux-france.org/prj/pop2imap/README
http://linux-france.tk/prj/pop2imap/
http://linux-france.tk/prj/pop2imap/README
R2. Yes, sometimes, because many pop3 servers runs in parallel
with an imap server on exactly the same mailboxes. They serve
@ -57,7 +57,7 @@ synchronization, but don't count on that...)
R2. Context and condition: you know which users use POP.
If the pop mailboxes are known then all the INBOX messages can be moved
in an subfolder called INBOX_backup for example. Ti help you do this,
in an subfolder called INBOX_backup for example. To help you do this,
the tool pop2imap transfers messages from POP to IMAP, without duplicates,
without deleting the messages transferred, by default, and can put them
in any subfolder you want to. It can also delete them and, that way,
@ -66,7 +66,7 @@ We're here to do a good job with what we have, do we?
In case of Dovecot for example, the magic can be there since already
fetched messages via POP are seen as \Seen in IMAP but the new messages are
seen as new messages, thanks to the Dovecot developper Timo's cleverness!.
seen as new messages, thanks to the Dovecot developer Timo's cleverness!
So it is possible to sync back only the new messages to INBOX,
with "imapsync ... --search UNSEEN ...", and then POP users won't see the old
messages come back but they will see the new messages and fetch them via POP.
@ -77,14 +77,14 @@ R3. Context and condition: you know nothing
Do R2 without the sync back of UNSEEN messages. It can't hurt to have a backup
of INBOX in a subfolder for IMAP or POP users.
R4. Here are some points, an analyse that made me purpose the not
to bad but not very good R2 answer.
R4. Here are some points, an analysis that made me propose the not
too bad but not very good R2 answer.
There was a discussion about this issue on the imapsync mailing-list:
http://www.linux-france.org/prj/imapsync_list/msg02622.html
http://www.linux-france.org/prj/imapsync_list/msg02623.html
http://linux-france.tk/prj/imapsync_list/msg02622.html
http://linux-france.tk/prj/imapsync_list/msg02623.html
My reply was not very good
http://www.linux-france.org/prj/imapsync_list/msg02624.html
http://linux-france.tk/prj/imapsync_list/msg02624.html
It's because I wrote pop2imap and it uses a stateless
mechanism to avoid duplicates, I wasn't aware of UIDL when I wrote pop2imap,
and later when I entered the discussion.

View File

@ -20,7 +20,7 @@ http://www.dostips.com/forum/viewtopic.php?f=3&t=1733
=======================================================================
Q. On Windows, some passwords contain $ or other special characters
like one more more of the nine characters $%&<>|^"!
like one more of the nine characters $%&<>|^"!
Login fails.

View File

@ -26,7 +26,7 @@ R.
* Stateless
* Rsync in mind
* Reliable
* Robuste
* Robust
* The user is not an expert, help him with:
* Good behavior by default.
* No harm by default.

View File

@ -1,5 +1,5 @@
#!/bin/cat
$Id: FAQ.Release_Checklist.txt,v 1.20 2021/07/06 02:29:51 gilles Exp gilles $
$Id: FAQ.Release_Checklist.txt,v 1.27 2022/09/16 05:35:27 gilles Exp gilles $
This documentation is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -10,21 +10,50 @@ https://imapsync.lamiral.info/FAQ.d/FAQ.Release_Checklist.txt
=======================================================================
Checklist before release a new release:
Checklist before making a new release:
- Make "imapsync --tests" pass on Linux
- Make "imapsync --tests" pass on Mac
- Make "imapsync --tests" pass on Windows 32 bits
- Make "imapsync --tests" pass on Windows 64 bits
make linuxtests
make win32tests
make win64tests
make mactests
or
make -j linuxtests win32tests win64tests mactests
- Make "imapsync --testslive" pass on Linux
- Make "imapsync --testslive" pass on Mac
make linuxtestslive mactestslive mactestslive6
- Add a new section in S/news.shtml reading "rlog imapsync"
- In case of a new dependency, add it to all the INSTALL/* files.
- Generate the README
make doc
- Run a spell checker on the README
- Read the README again slowly. Fix all issues, all.
- Read the OPTIONS section of README and read it very slowly
- Read slowly README_Windows.txt
- Read slowly the TUTORIAL_Unix file in html
- Make "rcsdiff imapsync" give nothing relevant and exit 0
- make ci pass.
- Review the newsletter by running:
m4 -P W/ml_announce.in.txt
- Update W/rsync_exclude_dist.txt
- Update .gitignore
- Update the file W/rsync_exclude_dist.txt
- Update the file .gitignore
- Review the TODO file and mark done what is done.
- Review the general FAQ.d/FAQ.General.txt

View File

@ -1,39 +1,63 @@
#!/bin/cat
$Id: FAQ.SSL_errors.txt,v 1.15 2021/06/22 15:35:10 gilles Exp gilles $
$Id: FAQ.SSL_errors.txt,v 1.18 2022/01/14 21:20:37 gilles Exp gilles $
This document is also available online at
https://imapsync.lamiral.info/FAQ.d/
https://imapsync.lamiral.info/FAQ.d/FAQ.SSL_errors.txt
=======================================================================
======================================================================
Imapsync SSL errors
=======================================================================
======================================================================
Questions answered in this FAQ are:
Q. What is the error
DEBUG: .../IO/Socket/SSL.pm:1177: global error: Undefined SSL object
Q. What are the errors
DEBUG: .../IO/Socket/SSL.pm:1165: local error: SSL write error
or
DEBUG: .../IO/Socket/SSL.pm:1088: local error: SSL read error
DEBUG: .../IO/Socket/SSL.pm:1165: local error: SSL write error
or
DEBUG: .../IO/Socket/SSL.pm:1088: local error: SSL read error
Q. What can I do to avoid those "SSL read/write errors"?
Q. SSL connect attempt failed SSL
Q. What are the errors
SSL connect attempt failed SSL
routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
or
SSL connect attempt failed SSL
SSL routines:ssl_choose_client_version:unsupported protocol
Q. What is the error
fatal SSL error: SSL connect attempt failed with unknown error
SSL wants a read first
Q. How to see the certificate and identify problems in it?
Now the questions again with their answers.
=======================================================================
======================================================================
Q. What is the error
DEBUG: .../IO/Socket/SSL.pm:1177: global error: Undefined SSL object
R. It's a fake error from the Perl Module IO::Socket::SSL
Imapsync works well despite this fake warning but it's disturbing
when you encounter errors due to something else, you believe it's
the issue but no, it's something else to deal with.
This fake error is fixed in IO::Socket::SSL release 2.073
https://metacpan.org/dist/IO-Socket-SSL/changes
"fix #110 - prevent internal error warning in some cases"
https://github.com/noxxi/p5-io-socket-ssl/issues/110
imapsync.exe release 2.178 uses this fixed 2.073 IO::Socket::SSL
======================================================================
Q. What are the errors
DEBUG: .../IO/Socket/SSL.pm:1165: local error: SSL write error
or
DEBUG: .../IO/Socket/SSL.pm:1088: local error: SSL read error
DEBUG: .../IO/Socket/SSL.pm:1165: local error: SSL write error
or
DEBUG: .../IO/Socket/SSL.pm:1088: local error: SSL read error
R1. As they claim, those errors are SSL errors. SSL is not directly
@ -45,11 +69,11 @@ it's often Exchange or Office365. I don't know what exactly happens.
Those errors happen more often on Windows than on Linux.
=======================================================================
======================================================================
Q. What can I do to avoid those "SSL read/write errors"?
R0. Windows users: upgrade to imapsync.exe release 1.836 (or next ones)
Those errors don't appear with recent releases, post 1.836
Those errors appear less often with imapsync releases post 1.836
R1. Remove all ssl/tls encryption
@ -70,8 +94,9 @@ R5. Set up a ssltunnel proxy to the host.
Read the file FAQ.Security.txt for an example to set up
a ssltunnel proxy.
=======================================================================
Q. SSL connect attempt failed SSL
======================================================================
Q. What are the errors
SSL connect attempt failed SSL
routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
or
SSL connect attempt failed SSL
@ -145,8 +170,14 @@ when they receive a TLS version 1.1 request.
In this case setting the version
to 'SSLv23:!SSLv2:!SSLv3:!TLSv1_1:!TLSv1_2' might help.
======================================================================
Q. What is the error
fatal SSL error: SSL connect attempt failed with unknown error
SSL wants a read first
=======================================================================
R. If you're using --ssl1 or --ssl2, try instead --tls1 or --tls2
======================================================================
Q. How to see the certificate and identify problems in it?
R. Use the command openssl like this:
@ -193,7 +224,6 @@ ggEBAMUTJVdrTl86nDI2yO6Vz5l1qxMMPqJylQcgi9vDHpwsnUq5HGPv+qZNhM69
...
After an complete server update ("apt update && apt upgrade && /etc/init.d/dovecot restart"):
echo | openssl s_client -crlf -connect test1.lamiral.info:993
@ -220,6 +250,7 @@ EnRlc3QxLmxhbWlyYWwuaW5mbzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
ggEBANuPNbYLPMZ4vPa9NBoHAUdIXqpi0eqdXMXd2sT+qRmqxS5ihr999BHOROcr
...
Champagne!
=======================================================================
=======================================================================
======================================================================
======================================================================

View File

@ -1,45 +1,122 @@
#!/bin/cat
# $Id: FAQ.Security.txt,v 1.23 2021/06/22 15:32:10 gilles Exp gilles $
# $Id: FAQ.Security.txt,v 1.26 2021/07/11 12:11:38 gilles Exp gilles $
This document is also available online at
https://imapsync.lamiral.info/FAQ.d/
https://imapsync.lamiral.info/FAQ.d/FAQ.Security.txt
=======================================================================
Imapsync tips about security. Issues and solutions.
=======================================================================
SSL: going to encryption before the imap session start.
It is on port 993.
Questions answered in this FAQ are:
TLS: going to encryption after the imap session start but before
the credential are sent. It is on port 143.
Q. Is running this program a secure method of transferring emails?
Are there any security concerns?
Q. Does imapsync refer to SSL security protocols with --ssl1 and --ssl2
and does it refer to TLS security protocols with the --tls1 and --tls2
options?
Short answer: No.
Q. I noticed that the online UI has no option for TLS/SSL.
Is this secure?
Is this more secure than using the .bat file on my computer?
Q. Are transferred emails/attachments stored on any other
server/location aside from my originating/destination server(s)?
Q. Other than changing passwords on the originating/destination email
accounts once the relevant emails have been moved,
are there any other security tips I should know?
Q. I need to transfer mail from an imap server to another imap server.
Which ports need to be open on the firewall to make this possible?
Q. Does imapsync support the IMAP command STARTTLS?
Q. Does imapsync support IMAP over SSL/TLS (IMAPS)?
Q. How can I test an ssl/tls imap connection without imapsync?
Q. How can I manually test login using --ssl?
Q. Imapsync used to use SSL_VERIFY_PEER now it uses SSL_VERIFY_NONE.
How can I change this back to the more secure SSL_VERIFY_PEER?
Q: How can I have an imaps server?
Now the questions again with their answers.
=======================================================================
Q. Is running this program a secure method of transferring emails?
Are there any security concerns?
R. Well, it depends. Use encryption, secure the access to the host running
imapsync and everything shall be safe.
R. Well, it depends. Use encryption and secure access to the host running
imapsync then everything shall be safe.
=======================================================================
Q. I noticed that the online UI has no option for TLS/SSL
Is this secure? Is this more secure that using the .bat file
on my computer?
Q. Does imapsync refer to SSL security protocols with --ssl1 and --ssl2
and does it refer to TLS security protocols with the --tls1 and --tls2
options?
Short answer: No.
R1. The online UI does TLS/SSL imap connections if the imap
servers support TLS/SSL. If you are concerned by security then
using the .bat file or .sh on your computer should be more secure
since you can examine and secure it by yourself, no matter high is
your paranoid spirit. The online UI security is mine, I am
concerned by security, not to the upmost high level possible
but I won't give you direct access to the host to discover my level.
With a good guy spirit, feel free to try to break the online UI
security and report me any security issue you encounter, I'll do my
best to fix them as soon as possible. Drop me a note before
starting because I may detect a sort of abuse and ban
definitively your IPs.
R. No.
Imapsync behaviour:
--ssl: Goes to encryption before the imap session start.
The connection is on port 993.
Can use the TLS or SSL security protocols.
Fails if encryption cannot be established.
--tls: Goes to encryption after the imap session start but before the
credential are sent.
The connection is on port 143.
Can use the TLS or SSL securityprotocols.
Fails if encryption cannot be established.
Explanation:
To force transferring emails over an encrypted connection, you can use
the imapsync parameters --ssl1 and --ssl2 or the parameters --tls1 and
--tls2, they all force the connection to be encrypted by the security
protocols series SSL/TLS.
In a security context, SSL refers to all deprecated Secure Sockets
Layer protocols. TLS refers to the SSL successors, Transport Layer
Security protocols. But TLS 1.0 and TLS 1.1 are also deprecated.
Current endorsed versions of TLS are only TLS 1.2 and TLS 1.3 (July 2021).
The whole story is detailed here:
https://en.wikipedia.org/wiki/Transport_Layer_Security
Options --ssl1 and --ssl2 are a little more paranoid than --tls1 and
--tls2 because they verify that the hostname of the certificate is the
same as the one used by imapsync. Other than that, the security
behavior is the same.
=======================================================================
Q. I noticed that the online UI has no option for TLS/SSL.
Is this secure?
Is this more secure than using the .bat file on my computer?
R1. The online UI does TLS/SSL imap connections if the imap servers
support TLS/SSL.
If you are concerned about security then using the .bat file or .sh on
your computer should be more secure since you can examine and secure
it by yourself, no matter high is your paranoid spirit compared to
mine.
The online UI security is mine, I am concerned by security, not to the
utmost high level possible but I won't give you direct access to the
host to discover my level. With a good guy spirit, feel free to try
to break the online UI security and report me any security issue you
encounter, I'll do my best to fix them as soon as possible. Drop me a
note before starting because I may detect a sort of abuse and ban your
IPs.
=======================================================================
Q. Are transferred emails/attachments stored on any other
@ -48,15 +125,15 @@ Q. Are transferred emails/attachments stored on any other
R. No!
=======================================================================
Q. Other than changing passwords on the originating/destination email
accounts once the relevant emails have been moved,
Q. Other than changing passwords on the originating/destination email
accounts once the relevant emails have been moved,
are there any other security tips I should know?
R. Secure the host where imapsync is running since credentials are
on it.
R. Yes. Secure the host where imapsync is running since credentials
are on it.
=======================================================================
Q. I need to transfer mail from an imap server to an other imap server.
Q. I need to transfer mail from an imap server to another imap server.
Which ports need to be open on the firewall to make this possible?
R. It depends. Open either:
@ -64,29 +141,31 @@ R. It depends. Open either:
* port 993 in ssl mode (--ssl1 or --ssl2)
=======================================================================
Q. Does imapsync support IMAP TLS?
Q. Does imapsync support the IMAP command STARTTLS?
R1. Yes.
Use --tls1 and/or --tls2 options:
--tls1 tells imapsync to use tls on host1.
--tls2 tells imapsync to use tls on host2.
Use --tls1 and --tls2 options:
R2. Since imapsync release 1.755 TLS mode is activated automatically
if the server announce it supports it, STARTTLS inside the response
to CAPABILITY, and if neither --notls nor --ssl is explicitely
mentioned on the command line options.
--tls1 tells imapsync to use STARTTLS on host1.
--tls2 tells imapsync to use STARTTLS on host2.
R2. Since imapsync release 1.755 STARTTLS mode is activated
automatically when the server announces that it supports it by
listing STARTTLS inside the response to the CAPABILITY command.
If either --notls or --ssl are explicitly mentioned on the
command-line options then STARTTLS won't be done.
=======================================================================
Q. Does imapsync support IMAP over SSL (IMAPS)?
Q. Does imapsync support IMAP over SSL/TLS (IMAPS)?
R. Yes natively since release 1.161.
Still, there are 2 ways, at least, to use ssl:
a) Use native --ssl1 and/or --ssl2 options
--ssl1 tells imapsync to use ssl on host1.
--ssl2 tells imapsync to use ssl on host2.
--ssl1 tells imapsync to use ssl/tls on host1.
--ssl2 tells imapsync to use ssl/tls on host2.
b) Use stunnel
@ -108,18 +187,18 @@ b) Use stunnel
If the local port 143 is already taken then use a free one,
like 10143 for example.
c) Other example for accessing gmail with no local root access
to open port 143
c) Another example for accessing Gmail with no local root access
to open port 143:
stunnel3 -P '' -c -d 9993 -r imap.gmail.com:993 -f
Then, to access gmail as host2 use:
Then, to access Gmail as host2 use:
imapsync ... --host2 localhost --port2 9993 --nossl2
=======================================================================
Q.How can I test an ssl imap connection without imapsync?
Q.How can I test an ssl/tls imap connection without imapsync?
R1. Use either ncat or telnet-ssl or openssl commands like in the
following examples with imap.gmail.com server:
@ -133,37 +212,39 @@ R1. Use either ncat or telnet-ssl or openssl commands like in the
The previous commands are interactive, hit ctrl-c
to finish them. If you want to finish automatically, then use:
{ sleep 2; echo "a logout"; sleep 1; } | ncat --ssl -C imap.gmail.com 993
{ sleep 2; echo "A LOGOUT"; sleep 1; } | ncat --ssl -C imap.gmail.com 993
=======================================================================
Q. How can I manually test a login via ssl?
Q. How can I manually test login using --ssl?
R. Use either ncat or telnet-ssl or openssl commands like in the
following examples with imap.gmail.com server:
ncat --ssl -C imap.gmail.com 993
telnet-ssl -z ssl imap.gmail.com 993
openssl s_client -crlf -connect imap.gmail.com:993
Tipical dialog for an imap LOGIN command:
Typical dialog for an imap LOGIN command:
* OK Gimap ready for requests from 78.196.254.58 q1mb175739668wix
a LOGIN "gilles.lamiral@gmail.com" "secret"
A1 LOGIN "gilles.lamiral@gmail.com" "secret"
* CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE ... ESEARCH
a OK gilles.lamiral@gmail.com Gilles Lamiral authenticated (Success)
b LOGOUT
A1 OK gilles.lamiral@gmail.com Gilles Lamiral authenticated (Success)
A2 LOGOUT
* BYE LOGOUT Requested
b OK 73 good day (Success)
A2 OK 73 good day (Success)
The client part you have to type is
a LOGIN ...
b LOGOUT
A1 LOGIN ...
A2 LOGOUT
while replacing ... by your credentials values,
other lines are the server responses.
=======================================================================
Q.How can I test an tls imap connection without imapsync?
Q. How can I test a STARTTLS imap connection without imapsync?
R1. Use openssl command like the following example with
an outlook.office365.com server:
@ -177,13 +258,12 @@ to finish them. If you want to finish automatically, then use:
Replace outlook.office365.com with your imap server name.
======================================================================
Q. Imapsync used to use SSL_VERIFY_PEER now it uses SSL_VERIFY_NONE.
How can I change this back to the more secure SSL_VERIFY_PEER?
R2. After imapsync 1.673,
R. After imapsync 1.673,
to set SSL_verify_mode to SSL_VERIFY_PEER on host1
and SSL_verify_mode to SSL_VERIFY_NONE on host2
@ -191,18 +271,20 @@ R2. After imapsync 1.673,
--sslargs1 SSL_verify_mode=1 \
--sslargs2 SSL_verify_mode=0
See perldoc IO::Socket::SSL for all possibilities, also at
See "perldoc IO::Socket::SSL" for all possibilities, also at
http://search.cpan.org/perldoc?IO%3A%3ASocket%3A%3ASSL
It might be possible you need an extra:
--sslargs1 SSL_ca_file=/etc/ssl/certs/ca-certificates.crt
It might be possible you need an extra option
--sslargs1 SSL_ca_file=/etc/ssl/certs/ca-certificates.crt
to help the ssl software verifying the server certificate.
The file ca-certificates.crt may be elsewhere on your system, even
named differently.
The imap server certificates are not checked for authenticity
(by default) because too many imap servers are crappy configured
regarding certified certificates.
by imapsync by default because too many imap servers are crappy
configured regarding certified certificates.
This default behavior is chosen like this because users
want their emails transferred, instead of being not transferred
@ -211,12 +293,13 @@ because of an incompetent imap server sysadmin.
I admit that this part, checking imap ssl/tls certificates,
could be improved from my side by including well known
certificates directly in imapsync.
Drop me a note to encourage me.
Drop me a note to encourage me, I'm lazy.
=======================================================================
Q: How to have an imaps server?
Q: How can I have an imaps server?
R. Three solutions.
R.
a) Install one
b) or use stunnel :

View File

@ -1,4 +1,4 @@
$Id: FAQ.Two_Ways_Sync.txt,v 1.5 2021/06/10 11:21:09 gilles Exp gilles $
$Id: FAQ.Two_Ways_Sync.txt,v 1.8 2022/07/25 14:03:49 gilles Exp gilles $
This documentation is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -6,18 +6,9 @@ https://imapsync.lamiral.info/FAQ.d/FAQ.Two_Ways_Sync.txt
=======================================================================
Two ways sync with Imapsync
================ Two ways sync with Imapsync =========================
=======================================================================
Questions answered in this FAQ are:
Q. Can Imapsync do a good "two ways" sync?
Short answer: no, not a good one. Why?
Now the questions again with their answers.
=======================================================================
Q. Can Imapsync do a good "two ways" sync?
Short answer: no, not a good one. Why?
@ -30,14 +21,15 @@ stateless.
Each time imapsync runs, it considers messages and folders as if it
were the first time it encounters them. Imapsync looks at messages,
flags, and folders as they are now, not considering what they were
before. Imapsync has no memory outside the current running sync.
before the current. Imapsync has no memory outside the current running
sync.
So now, why a stateless behavior cannot handle well a two ways sync
between an account A and an account B?
The problem arises with deletions, messages deletions, folders
deletions, or movings, messages movings across folders, folders
movings, and also folders renamings. Deletions and moves are ambiguous
deletions, or with moves, messages moves across folders, folders
moves, and also folders renamings. Deletions and moves are ambiguous
changes when combined with creations on the opposite side.
For example, if a message is deleted from A by a user, then imapsync
@ -47,21 +39,65 @@ that has to be copied from B.
But if you know the answer yourself, that missing messages on one side
A are deleted messages that have to be deleted on the other side then
run a sync with the --delete2 option from A to B.
run a sync with the --delete2 option from A to B. This assumes there
is no new messages on B because --delete2 will delete them.
If you know that the missing messages on A are missing messages from B
that has to be copied to A then run a sync from B to A.
If you know that the missing messages on A are messages from B
that has to be copied to A, then run a sync from B to A.
If you know it's a mixed scenario, some deletions/moves on A,
and some deletions/moves on B, but not the same, then you are in
trouble and so you end up with a not very good "two ways" sync.
I suggest to avoid imapsync to do deletions in that case, which is
the default imapsync behavior.
If you know it's a mixed scenario, that there are some deletions/moves
on A, and there are some deletions/moves on B, but not the same, then
you are in trouble and it ends up with a not very good "two ways"
sync. In that case, two runs of imapsync, one from A to B, one from B
to A, put the two accounts in a synchronized state. The deletions of
messages on either side get cancelled, deleted messages come back. A
folder renaming on either side brings back the old folder. It's not a
good two ways synchronization.
My suggestion is:
a) Use a single active imap account that fits all your needs,
available from anywhere, at any time. Access it from both your
laptop and your iphone.
b) Feed this active account with foreign and passive accounts with any
tool that can handle the transfer, imapsync being one of them.
c) Have a slave imap backup account of the active one, available also
from anywhere, at any time. Use it only as a failsafe account, when
the active one is broken or to bring back misguidely deleted
messages to the active account. Use any tool that can handle the
synchronization, imapsync being a good one of them.
=======================================================================
Q. What can I do instead of having two ways synchronizations?
R. My suggestion is:
a) Use only one single active imap account that fits all your needs,
available from anywhere, at any time. Access it from all your
devices, laptops, phones, tablets.
b) Feed this active account with foreign and passive accounts with any
tool that can handle the transfer, imapsync being one of them.
c) Have a slave imap backup account of the active one, available also
from anywhere, at any time. Use it only as a failsafe account, when
the active one is broken or to bring back misguidely deleted
messages to the active account. Use any tool that can handle the
synchronization, imapsync being a good one of them.
=======================================================================
Q. What tools can I use to handle two ways synchronizations?
R. There are offlineimap and mbsync/isync tools:
offlineimap is located at http://www.offlineimap.org/
mbsync/isync is located at https://isync.sourceforge.io/
With a two ways sync, the account user is very surprised and
disapointed when his actions (deletions, renamings, or movings) come
back: the deletions are cancelled, the renamings and movings end up
with duplicates.
=======================================================================
=======================================================================

View File

@ -1,5 +1,5 @@
#!/bin/cat
$Id: FAQ.User_Concurrent_Access.txt,v 1.5 2018/05/24 11:34:30 gilles Exp gilles $
$Id: FAQ.User_Concurrent_Access.txt,v 1.6 2022/05/05 13:18:29 gilles Exp gilles $
This document is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -35,6 +35,23 @@ Details:
so --delete2 is needed to sync the deletion.
* message flag change => will need a resync
Let's more precise about timing.
Imapsync works per folder, one folder at a time.
If imapsync has already synced a folder during a run,
what happens to this folder now won't be synced by the current run.
If imapsync has not already synced a folder during a run,
what happens to this folder now will be synced by the current run.
If imapsync is syncing a folder during a run,
what happens to this folder now depends on when things happen.
Imapsync starts by listing messages and getting meta data about them,
Message-Id, Date, Size.
A message deleted just after the listing, won't be synced.
A new message arriving just after the listing, won't be synced.
* Writing at destination/host2:
* adding folder => no problem, unless --delete2folders is used
* deleting folder => will reappear by a new sync
@ -42,5 +59,7 @@ Details:
* deleting message => might reappear by a new sync.
* message flag change => will be reseted by a new sync.
=======================================================================
=======================================================================

View File

@ -1,5 +1,5 @@
#!/bin/cat
$Id: FAQ.XOAUTH2.txt,v 1.17 2021/01/21 13:25:02 gilles Exp gilles $
$Id: FAQ.XOAUTH2.txt,v 1.18 2022/04/05 13:48:52 gilles Exp gilles $
This document is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -154,7 +154,7 @@ also called cpanminus.
The code and first explanation comes from Joaquin Lopez at
https://github.com/imapsync/imapsync/pull/25
http://www.linux-france.org/prj/imapsync_list/msg02129.html
http://linux-france.tk/prj/imapsync_list/msg02129.html
Also, the binary command "openssl" is needed since it is used to
convert the pk12 file.

View File

@ -1,5 +1,5 @@
$Id: FAQ.Yahoo.txt,v 1.12 2021/05/04 11:04:51 gilles Exp gilles $
$Id: FAQ.Yahoo.txt,v 1.15 2022/05/05 14:17:22 gilles Exp gilles $
This document is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -18,24 +18,6 @@ Q. Synchronizing from XXX to Yahoo
Now the questions again with their answers.
Some explanation about the options given later:
https://imapsync.lamiral.info/README
...
--noabletosearch : Makes --minage and --maxage options use the internal
dates given by a FETCH imap command instead of the
"Date:" header. Internal date is the arrival date
in the mailbox.
--noabletosearch equals --noabletosearch1 --noabletosearch2
--regexmess reg : Apply the whole regex to each message before transfer.
Example: 's/\000/ /g' # to replace null by space.
--regexmess reg : and this one, etc.
I'm not sure anymore about the need of --noabletosearch with Yahoo, maybe
they fixed the issue about the standard imap searching command SEARCH
they didn't honor before.
=======================================================================
Q. Synchronizing from Yahoo to XXX
@ -49,8 +31,7 @@ Example:
--password1 billysecreta \
--host2 XXX \
--user2 Billy@other.com \
--password2 billysecretb \
--noabletosearch
--password2 billysecretb
You also need to go to Yahoo, security and enable
@ -83,6 +64,7 @@ Q. Synchronizing from XXX to Yahoo
R. Example:
On Linux:
./imapsync \
--host1 XXX \
--user1 Billy@other.com \
@ -90,7 +72,19 @@ R. Example:
--host2 imap.mail.yahoo.com \
--user2 Billy@yahoo.com \
--password2 billysecretb \
--noabletosearch --regexmess "s{(?<![\n])\z}{\r\n}gxms"
--regexmess 's{(?<![\n])\z}{\r\n}gxms'
On Windows:
imapsync.exe \
--host1 XXX \
--user1 Billy@other.com \
--password1 billysecreta \
--host2 imap.mail.yahoo.com \
--user2 Billy@yahoo.com \
--password2 billysecretb \
--regexmess "s{(?<![\n])\z}{\r\n}gxms"
You wonder why there is this ugly regex, what it does and where does it
come from?
@ -101,5 +95,11 @@ when copying some messages to Yahoo.
It adds a final \r\n on a message if a final \r\n is missing.
See https://github.com/imapsync/imapsync/issues/209
https://imapsync.lamiral.info/README
...
--regexmess reg : Apply the whole regex to each message before transfer.
Example: 's/\000/ /g' # to replace null by space.
--regexmess reg : and this one, etc.
=======================================================================
=======================================================================

24
FAQ.d/FAQ.iCloud.txt Normal file
View File

@ -0,0 +1,24 @@
#!/bin/cat
# $Id: FAQ.iCloud.txt,v 1.1 2022/04/13 11:44:19 gilles Exp gilles $
This documentation is also available online at
https://imapsync.lamiral.info/FAQ.d/
https://imapsync.lamiral.info/FAQ.d/FAQ.iCloud.txt
=======================================================================
Imapsync tips for iCloud accounts.
=======================================================================
Q. How to migrate from or to an iCloud account?
R. From https://support.apple.com/en-us/HT202304
Use "imap.mail.me.com" as the imap server and use an app password.
How to generate an app password is described at
https://support.apple.com/kb/HT204397
It's not necessary to precise the port and the ssl thing, imapsync
auto-detect this.

View File

@ -1,5 +1,5 @@
# $Id: htaccess.txt,v 1.31 2021/05/29 08:09:11 gilles Exp gilles $
# $Id: htaccess.txt,v 1.33 2022/04/06 10:27:52 gilles Exp gilles $
AddDescription "<b>Back</b> to Imapsync main page." ..
@ -40,13 +40,16 @@ AddDescription "<b>Flags tips and issues</b>." FAQ.Flag
AddDescription "<b>General Data Protection Regulation</b> (GDPR)." FAQ.GDPR.txt
AddDescription "<b>General</b> and <b>pot-pourri</b> issues" FAQ.General.txt
AddDescription "<b>Gmail</b> accounts." FAQ.Gmail.txt
AddDescription "<b>GoDaddy</b> accounts." FAQ.GoDaddy.txt
AddDescription "<b>IceWarp</b> accounts." FAQ.IceWarp.txt
AddDescription "<b>ISP tips</b>." FAQ.ISP.txt
AddDescription "<b>James</b> accounts." FAQ.James.txt
AddDescription "<b>Kerio</b> accounts." FAQ.Kerio.txt
AddDescription "<b>MailEnable</b> accounts." FAQ.MailEnable.txt
AddDescription "<b>Massive/bulk migrations</b>." FAQ.Massive.txt
AddDescription "<b>Memory issues</b>." FAQ.Memory.txt
AddDescription "<b>Migration Plan</b>." FAQ.Migration_Plan.txt
AddDescription "<b>Massive and bulk</b> migrations." FAQ.Massive.txt
AddDescription "<b>Log file, content, errors and tips</b>." FAQ.Logfile.txt
AddDescription "<b>Memory</b> issues." FAQ.Memory.txt
AddDescription "Migration <b>Plan</b>." FAQ.Migration_Plan.txt
AddDescription "<b>Office365</b> accounts." FAQ.Office365.txt
AddDescription "<b>The Online UI service Q&R</b>." FAQ.OnlineUI.txt
AddDescription "<b>Password & special characters on Windows</b>." FAQ.Passwords_on_Windows.txt
@ -56,7 +59,7 @@ AddDescription "<b>POP3 issues</b>." FAQ.POP3
AddDescription "<b>Principles & design decisions</b>." FAQ.Principles.txt
AddDescription "<b>Selecting messages</b>." FAQ.Messages_Selection.txt
AddDescription "<b>How to transfer too big messages</b>." FAQ.Messages_Too_Big.txt
AddDescription "<b>Why the imapsync web site looks so old?</b>" FAQ.Old_Style_Web_Design.txt
AddDescription "Why the imapsync web site <b>looks so old?</b>" FAQ.Old_Style_Web_Design.txt
AddDescription "<b>UCS</b> accounts." FAQ.UCS.txt
AddDescription "<b>Checklist before release a new release</b>." FAQ.Release_Checklist.txt

61
INSTALL.d/Dockerfile Executable file → Normal file
View File

@ -1,39 +1,48 @@
## Dockerfile for building a docker imapsync image
# $Id: Dockerfile,v 1.30 2020/03/26 07:15:04 gilles Exp gilles $
# $Id: Dockerfile,v 1.43 2022/05/17 14:29:36 gilles Exp gilles $
# I use the following command to build the image:
#
# docker build -t gilleslamiral/imapsync .
#
# where this Dockerfile is in the current directory
#
# This Dockerfile build an image with two imapsync
# 1) One comes from https://imapsync.lamiral.info/imapsync
# and goes to /usr/bin/imapsync in the Docker image
# It is used with the command:
#
# docker run gilleslamiral/imapsync imapsync ...
#
# 2) One comes from the local file ./imapsync
# and goes to /imapsync in the Docker image
# It is used with the command:
#
# docker run gilleslamiral/imapsync /imapsync ...
# I thank you very much
# I like thanks
# I like stars
# I also like (and need) money
# I like money to keep on doing this stuff
# Number of imapsync images pulled so far (2021_05_29): 368881
# Number of imapsync images pulled so far (2022_04_04): 673551
# Command used:
# curl -s https://hub.docker.com/v2/repositories/gilleslamiral/imapsync/ | jq '.pull_count'
# Debian Buster is Debian 10
# Debian Bullseye is Debian 11
FROM debian:buster
FROM debian:bullseye
LABEL maintainer="Gilles LAMIRAL <gilles@lamiral.info>" \
description="Imapsync" \
documentation="https://imapsync.lamiral.info/#doc"
# Put a copy of the Dockerfile in the image itself
# It can help future maintenance, isn't it?
# I put a copy of the Dockerfile in the image itself
# It can help maintenance, isn't it?
# Also put optionally my local and usually more recent imapsync on /, for testing purpose
COPY Dockerfile /
# Also put my local imapsync on /usr/bin/ for testing purpose
# renamed imapsync_local since would be erased by the wget
COPY imapsync /usr/bin/imapsync_local
COPY prerequisites_imapsync /usr/bin/prerequisites_imapsync_local
COPY Dockerfile imapsyn[c] prerequisites_imapsyn[c] /
RUN set -xe && \
apt-get update \
@ -41,10 +50,12 @@ RUN set -xe && \
libauthen-ntlm-perl \
libcgi-pm-perl \
libcrypt-openssl-rsa-perl \
libcrypt-openssl-pkcs12-perl \
libdata-uniqid-perl \
libencode-imaputf7-perl \
libfile-copy-recursive-perl \
libfile-tail-perl \
libfile-tail-perl \
libio-compress-perl \
libio-socket-ssl-perl \
libio-socket-inet6-perl \
libio-tee-perl \
@ -54,6 +65,7 @@ RUN set -xe && \
libparse-recdescent-perl \
libmodule-scandeps-perl \
libpar-packer-perl \
libproc-processtable-perl \
libreadonly-perl \
libregexp-common-perl \
libsys-meminfo-perl \
@ -70,16 +82,21 @@ RUN set -xe && \
lsof \
ncat \
openssl \
&& rm -rf /var/lib/apt/lists/*
ca-certificates \
&& rm -rf /var/lib/apt/lists/* \
&& cpanm IO::Socket::SSL
# I added the IO::Socket::SSL update to avoid the annoying, confusing and useless warning
# DEBUG: .../IO/Socket/SSL.pm:1177: global error: Undefined SSL object
RUN set -xe \
&& cd /usr/bin/ \
&& pwd \
&& wget -N https://imapsync.lamiral.info/imapsync \
https://imapsync.lamiral.info/prerequisites_imapsync \
https://raw.githubusercontent.com/google/gmail-oauth2-tools/master/python/oauth2.py
&& mv imapsync oauth2.py /usr/bin/ \
&& chmod +x /usr/bin/imapsync /usr/bin/imapsync_local /usr/bin/oauth2.py # just_a_comment_to_force_update 2019_11_26_12_58_34
&& wget -N --no-check-certificate https://imapsync.lamiral.info/imapsync \
https://imapsync.lamiral.info/prerequisites_imapsync \
https://raw.githubusercontent.com/google/gmail-oauth2-tools/master/python/oauth2.py \
&& chmod +x imapsync oauth2.py \
&& /usr/bin/imapsync --testslive && /usr/bin/imapsync --tests # just_a_comment_to_force_update 2022_04_04_21_16_50
USER nobody:nogroup

View File

@ -42,7 +42,7 @@ Those documents are also available at https://imapsync.lamiral.info/INSTALL.d/
- Docker
- Online UI like /X
If you are not familiar with any of these systems but you have to chose
If you are not familiar with any of these systems but you have to choose
one to install imapsync, imapsync online, or the latest imapsync then
Centos 7 (not 8 for now) is the easiest system to consider (June 2020).

View File

@ -1,5 +1,5 @@
#!/bin/cat
# $Id: INSTALL.AWS_EC2.txt,v 1.8 2020/04/14 20:56:47 gilles Exp gilles $
# $Id: INSTALL.AWS_EC2.txt,v 1.9 2022/05/17 14:32:47 gilles Exp gilles $
This documentation is also located online at
https://imapsync.lamiral.info/INSTALL.d/
@ -43,7 +43,8 @@ To install a more recent imapsync
perl-Test-NoWarnings \
perl-Test-Simple \
perl-Test-Warn \
perl-Sub-Uplevel
perl-Sub-Uplevel \
perl-Proc-ProcessTable
sudo cpanm Encode::IMAPUTF7
wget -N https://imapsync.lamiral.info/imapsync
@ -96,6 +97,7 @@ perl-Test-Requires \
perl-Try-Tiny \
perl-Unicode-String \
perl-URI \
perl-Proc-ProcessTable \
cpanminus
sudo cpanm Authen::NTLM Data::Uniqid IO::Tee \

View File

@ -1,5 +1,5 @@
#!/bin/cat
# $Id: INSTALL.ArchLinux.txt,v 1.5 2019/11/28 14:37:59 gilles Exp gilles $
# $Id: INSTALL.ArchLinux.txt,v 1.6 2022/05/17 14:31:44 gilles Exp gilles $
This documentation is also located online at
https://imapsync.lamiral.info/INSTALL.d/
@ -88,7 +88,8 @@ Other Perl modules, needed sometimes:
JSON::WebToken::Crypt::RSA \
Test::Mock::Guard \
Test::Warn \
PAR::Packer
PAR::Packer \
Proc::ProcessTable

View File

@ -1,5 +1,5 @@
#!/bin/cat
# $Id: INSTALL.Centos.txt,v 1.25 2021/02/02 17:08:46 gilles Exp gilles $
# $Id: INSTALL.Centos.txt,v 1.32 2022/05/17 14:32:47 gilles Exp gilles $
This documentation is also located online at
https://imapsync.lamiral.info/INSTALL.d/
@ -9,37 +9,68 @@ https://imapsync.lamiral.info/INSTALL.d/INSTALL.Centos.txt
Installing imapsync on CentOS
=======================================================================
There is one section for Centos 8,
There is one section for AlmaLinux and Centos 8,
one for Centos 7,
and one for Centos 6.
=======================================================================
Centos 8
AlmaLinux and Centos 8
=======================================================================
How to install imapsync on AlmaLinux and Centos 8:
How to install the latest imapsync on Centos 8
dnf install --enablerepo=powertools imapsync
imapsync --testslive
dnf install wget perl-App-cpanminus gcc
# then
cpanm lazy Test::MockObject
wget https://imapsync.lamiral.info/imapsync
perl -Mlazy imapsync
For Centos 8 End Of Life fix:
https://www.centos.org/centos-linux-eol/
If you encounter the error
"Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist"
Do this:
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-Linux-*
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-Linux-*
dnf update
To upgrade to CentOS stream:
dnf install centos-release-stream
dnf swap centos-{linux,stream}-repos
dnf distro-sync
Taken from
https://stackoverflow.com/questions/70926799/centos-through-vm-no-urls-in-mirrorlist
and tested successfully on one of my hosts, an ex-Centos8/CentOS-stream now.
=======================================================================
AlmaLinux and Centos 8 and latest imapsync
=======================================================================
At the time of this writing (December 2021), the powertools repository
contains imapsync release 1.977, which is not the latest available
imapsync release. (1.977 date is 2019/12/23 while 2.174 is 2021/12/14)
In order to install the latest imapsync I suggest the following process:
Install the powertools imapsync 1.977 release via dnf like mentioned above.
It will install the needed packages, Perl itself and Perl modules
for release 1.977.
The imapsync 2.206 and next ones needs the Perl module:
dnf install perl-Proc-ProcessTable
wget -N https://imapsync.lamiral.info/imapsync
chmod +x imapsync
./imapsync --testslive
./imapsync --tests
If you encounter the following error during the run of "perl -Mlazy imapsync"
...
Can't locate object method "new" via package "Archive::Tar" at ...
FAIL install IO-String-1.08
fix it with:
wget http://mirror.centos.org/centos/8/PowerTools/x86_64/os/Packages/perl-IO-String-1.08-31.el8.noarch.rpm
yum install perl-IO-String-1.08-31.el8.noarch.rpm -y
See also https://github.com/imapsync/imapsync/issues/211
You may get an even more recent imapsync release this way.
=======================================================================
Centos 7
@ -72,7 +103,7 @@ Unit tests:
At the time of this writing (March 2020), the epel7 repository still
contains imapsync release 1.727, which is not the latest available
imapsync release. (1.727 date is 2016/08/19 while 1.979 is 2020/01/14)
imapsync release. (1.727 date is 2016/08/19 while 2.174 is 2021/12/14)
In order to install the latest imapsync I suggest the following process:
@ -102,7 +133,9 @@ Then:
perl-Test-NoWarnings \
perl-Test-Simple \
perl-Test-Warn \
perl-Sub-Uplevel
perl-Sub-Uplevel \
perl-Proc-ProcessTable \
ca-certificates
Also, run the following commands:
@ -185,7 +218,8 @@ Then:
perl-Test-Requires \
perl-Test-Deep \
perl-File-Tail \
perl-Unicode-String
perl-Unicode-String \
perl-Proc-ProcessTable
wget https://imapsync.lamiral.info/imapsync

View File

@ -1,12 +1,12 @@
#!/bin/cat
# $Id: INSTALL.Darwin.txt,v 1.34 2021/06/15 10:02:37 gilles Exp gilles $
# $Id: INSTALL.Darwin.txt,v 1.39 2022/05/17 14:31:44 gilles Exp gilles $
This documentation is also located online at
https://imapsync.lamiral.info/INSTALL.d/
https://imapsync.lamiral.info/INSTALL.d/INSTALL.Darwin.txt
Usual users should follow the A) section only, with the exeption
Usual users should follow the A) section only, with the exception
of reading B) before if you use a Catalina system.
A) Installing imapsync binary on Darwin / Mac OS X
@ -20,44 +20,43 @@ E) Building imapsync binary on Darwin / Mac OS X
A) Installing imapsync binary on Darwin / Mac OS X
=======================================================================
There is a standalone imapsync binary for Mac OS X
called "imapsync_bin_Darwin" (without the quotes),
available in the compressed tarball called imapsync-1.977.tgz
where 1.977 is the imapsync version number.
available in the compressed tarball called imapsync-2.200.tgz
where 2.200 is the imapsync version number.
In case you haven't buy it yet or forgot where the download link is,
In case you haven't bought it yet or forgot where the download link is,
check https://imapsync.lamiral.info/dist/
Download the tarball imapsync-1.977.tgz, not the binary imapsync_bin_Darwin
Download the tarball imapsync-2.200.tgz, not the binary imapsync_bin_Darwin
because the binary is also in the tarball and there are other useful files
in the tarball. The binary present in /dist/ is just there for a fast upgrade
when you need one.
I suppose this tarball imapsync-1.977.tgz is downloaded under your $HOME directory,
let say /Users/gilles/, but you can put it anywhere. In real, your $HOME directory
is not /Users/gilles/, it maybe /Users/john/ or /Users/zoey/ where John or Zoey
is you login name.
Suppose this tarball imapsync-2.200.tgz is downloaded under your $HOME directory,
lets say /Users/gilles/, but you can put it anywhere. (But obviously your $HOME
directory is not /Users/gilles/, it maybe /Users/john/ or /Users/zoey/ where John
or Zoey is your login name.)
Open a terminal: /Applications/Utilities/Terminal double-click on Terminal.
Open a terminal: /Applications/Utilities/Terminal, double-click on Terminal.
Untar the tarball:
cd
pwd
tar xzvf imapsync-1.977.tgz
tar xzvf imapsync-2.200.tgz
In case the previous command fails, it means the tarball file called imapsync-1.977.tgz
In case the previous command fails, it means the tarball file called imapsync-2.200.tgz
is not in your $HOME directory, you may have downloaded it elsewhere on the file system.
A way to find it is the command:
find / | grep imapsync
Now that the tarball is extracted, it created a directory called imapsync-1.977/
Go into the directory imapsync-1.977 with the command:
Now that the tarball is extracted, it created a directory called imapsync-2.200/
Go into the directory imapsync-2.200 with the command:
cd imapsync-1.977
cd imapsync-2.200
First let's have a simple run to see if imapsync_bin_Darwin works.
@ -119,7 +118,7 @@ the script examples/sync_loop_darwin.sh is also ready to use.
B) Installing imapsync on Catalina
=======================================================================
Caveat Catalina: The binary imapsync_bin_Darwin is detected as a malware
Caveat Catalina: The binary imapsync_bin_Darwin is detected as malware
or similar on the latest Mac OS X named Catalina.
It's Catalina new security policy. Imapsync is not a malware or similar.
All other Mac OS X releases are ok.
@ -128,7 +127,7 @@ In order to pass away this detection, follow these steps:
Run imapsync_bin_Darwin
After this first launch, the security asks to authorize the unknown
developer program. Setup the root of the imapsync_bin_Darwin file
developer program. Set up the root of the imapsync_bin_Darwin file
and then run it again or any of the .sh files, it should run ok
without any notice any more.
@ -178,18 +177,19 @@ Install the "make" command in case it is not already installed.
First let us install cpanminus locally in ~/perl5
wget --no-check-certificate -O- http://cpanmin.us | perl - -l ~/perl5 App::cpanminus local::lib
curl -L https://cpanmin.us | perl - -l ~/perl5 App::cpanminus local::lib
Then take this install into account in the current environment
eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`
perl -I ~/perl5/lib/perl5 -Mlocal::lib
perl -I ~/perl5/lib/perl5 -Mlocal::lib # just to see the variables
eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib` # doing the variables assignments
If you want to have always this setting in your environment then run the commands
echo 'eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`' >> ~/.profile
echo 'export MANPATH=$HOME/perl5/man:$MANPATH' >> ~/.profile
cat ~/.profile
. ~/.profile
Now let's update the standard CPAN Perl module
@ -202,18 +202,27 @@ helps to verify what is needed to install on your system
sh prerequisites_imapsync
cpanm Authen::NTLM
cpanm File::Copy::Recursive IO::Tee
cpanm Mail::IMAPClient
cpanm Readonly
cpanm IO::Tee
cpanm Mail::IMAPClient # File::Copy::Recursive?
cpanm Unicode::String
cpanm Sys::MemInfo
cpanm File::Tail
cpanm Proc::ProcessTable
cpanm Test::MockObject
cpanm Readonly
cpanm Data::Uniqid
cpanm JSON::WebToken
We're ready to install and test the latest imapsync
wget -c http://imapsync.lamiral.info/imapsync
curl -L http://imapsync.lamiral.info/imapsync > imapsync
chmod +x imapsync
./imapsync
./imapsync --modules
./imapsync --testslive
./imapsync --tests
You can rerun "sh prerequisites_imapsync"
to verify everything is ok:
@ -223,10 +232,6 @@ to verify everything is ok:
When everything is ok the script execution ends with this sentence
"All needed modules are already installed"
Now imapsync should work on your system.
./imapsync --testslive
=======================================================================
E) Building imapsync binary on Darwin / Mac OS X
=======================================================================
@ -234,7 +239,7 @@ E) Building imapsync binary on Darwin / Mac OS X
cpanm Module::ScanDeps
cpanm PAR::Packer
pp -o imapsync.bin imapsync
pp -x -u -o imapsync.bin imapsync
./imapsync.bin
./imapsync.bin --testslive

View File

@ -1,24 +1,27 @@
#!/bin/cat
# $Id: INSTALL.Debian.txt,v 1.32 2020/12/11 09:27:29 gilles Exp gilles $
# $Id: INSTALL.Debian.txt,v 1.38 2022/05/17 14:29:36 gilles Exp gilles $
This documentation is also located online at
https://imapsync.lamiral.info/INSTALL.d/
https://imapsync.lamiral.info/INSTALL.d/INSTALL.Debian.txt
There is three install sections in this document,
1) one for Debian 9 Stretch and Debian 10 Buster
2) one for Debian 8 Jessie
3) one for Debian 7 Wheezy
There are four install sections in this document,
1) one for Debian 9 Stretch, Debian 10 Buster, Debian 11 Bullseye, Debian 12 Bookworm
2) one for all the Debian, called "After installing the dependencies".
3) one for Debian 8 Jessie (obsolete)
4) one for Debian 7 Wheezy (even more obsolete)
After reading and following 1) or 2) or 3), you'll be invited to read and follow
the fourth section "4) After installing the dependencies"
After reading and following 1) or 3) or 4), you'll be invited to read and follow
the section "2) After installing the dependencies"
What is your Debian release?
Type on a terminal:
cat /etc/debian_version
12.x => Bookworm
11.x => Bullseye
10.x => Buster
9.x => Stretch
8.x => Jessie
@ -27,20 +30,20 @@ Type on a terminal:
where x is any number between 0 and 9, x is minor and to be forgotten.
First a call to Debian packagers
First, a call to Debian packagers
Why imapsync is not in Debian as a package?
Imapsync used to be in Debian from 2005-04-25 (release 1.125) to 2011-01-25 (release 1.315).
It could be in Debian nowadays, as always, my last words on this discussion were
"Do what you want, I promise I won't complain anymore about the fact imapsync is on Debian or not."
"Do what you want, I promise I won't complain anymore about the fact imapsync is in Debian or not."
https://lists.debian.org/debian-legal/2011/01/msg00058.html
The license is now "No limits to do anything with this work and this license".
Feel free.
The Imapsync license is "No limits to do anything with this work and this license".
So feel free!
See also a more detailed story at
https://lists.debian.org/debian-user/2016/11/msg00849.html
=======================================================================
1) Installing imapsync on Debian 9 Stretch or Debian 10 Buster
1) Installing imapsync on Debian 9 Stretch, 10 Buster, 11 Bullseye
=======================================================================
How to install imapsync dependencies on a Debian system?
@ -48,14 +51,24 @@ How to install imapsync dependencies on a Debian system?
The repositories are the classical ones, ie, a
/etc/apt/sources.list file with:
# Debian 9 Stretch
deb http://deb.debian.org/debian stretch main contrib
# Debian 12 Bookworm
deb http://deb.debian.org/debian bookworm main contrib
or
# Debian 11 Bullseye
deb http://deb.debian.org/debian bullseye main contrib
or
# Debian 10 Buster
deb http://deb.debian.org/debian buster main contrib
or
# Debian 9 Stretch
deb http://deb.debian.org/debian stretch main contrib
You need root privilege to run it, be root or use sudo.
@ -74,6 +87,7 @@ apt install -y \
libjson-webtoken-perl \
libmail-imapclient-perl \
libparse-recdescent-perl \
libproc-processtable-perl \
libmodule-scandeps-perl \
libreadonly-perl \
libregexp-common-perl \
@ -88,20 +102,64 @@ apt install -y \
libtest-deep-perl \
libtest-warn-perl \
make \
time \
cpanminus
After installing the dependencies, imapsync should be working,
go to the section "4) After installing the dependencies" below.
go to the section "2) After installing the dependencies" below.
=======================================================================
2) After installing the dependencies
=======================================================================
You don't have to be root to test and use imapsync.
Take imapsync either on github:
wget -N https://raw.githubusercontent.com/imapsync/imapsync/master/imapsync
or be on the cutting edge with the upstream site:
wget -N https://imapsync.lamiral.info/imapsync
Add execution permission to the downloaded script:
chmod +x imapsync
Check the dependencies and print also the basic example:
./imapsync
Perform a live test showing imapsync job:
./imapsync --testslive
Now install imapsync on the system (need root privileges again):
cp imapsync /usr/bin/
That's finished for the installation part.
You can now use imapsync without knowing where it is located
on the system:
imapsync
Now go read the menu http://imapsync.lamiral.info/#doc
and start with the tutorial
https://imapsync.lamiral.info/doc/TUTORIAL_Unix.html
Feedback is welcome!
=============================================
2) Installing imapsync on Debian 8 Jessie
=============================================
=======================================================================
3) Installing imapsync on Debian 8 Jessie
=======================================================================
How to install imapsync dependencies on a Debian system?
You need root priviledge.
You need root privilege.
The first command installs standard Debian packages:
apt install \
@ -165,16 +223,16 @@ the module JSON::WebToken with the command:
cpanm JSON::WebToken
After installing the dependencies, imapsync should be working,
go to the section "4) After installing the dependencies" below.
go to the section "2) After installing the dependencies" above.
=======================================================================
3) Installing imapsync on Debian 7 Wheezy
4) Installing imapsync on Debian 7 Wheezy
=======================================================================
How to install imapsync dependencies on a Debian system?
You need root priviledge to run the commands.
You need root privilege to run the commands.
The first command installs standard Debian packages:
@ -234,40 +292,6 @@ the module JSON::WebToken with the command:
After installing the dependencies, imapsync should be working,
then go to the section "4) After installing the dependencies" below.
=======================================
4) After installing the dependencies
=======================================
You don't have to be root to test and use imapsync.
Take imapsync either on github or at the upstream site.
Add execution permission to the downloaded script:
chmod +x imapsync
Check the dependencies and print also the basic example:
./imapsync
Perform a live test showing imapsync job:
./imapsync --testslive
Now install imapsync on the system (need root priviledges again):
cp imapsync /usr/bin/
That's finished for the installation part.
You can now use imapsync without knowing where it is located
on the system:
imapsync
Now go to read http://imapsync.lamiral.info/#doc
and start with the tutorial.
then go to the section "2) After installing the dependencies" above.
=======================================================================
=======================================================================

View File

@ -1,5 +1,5 @@
#!/bin/cat
# $Id: INSTALL.Docker_build.txt,v 1.12 2019/11/28 14:43:48 gilles Exp gilles $
# $Id: INSTALL.Docker_build.txt,v 1.17 2022/05/17 14:29:36 gilles Exp gilles $
This documentation is also located online at
https://imapsync.lamiral.info/INSTALL.d/
@ -10,39 +10,53 @@ https://imapsync.lamiral.info/INSTALL.d/INSTALL.Docker_build.txt
=======================================================================
Nearly verbatim copy from https://imapsync.lamiral.info/INSTALL.d/Dockerfile
(nearly but the Dockerfile rcs tag Id: removed, that would conflict)
(verbatim but the Dockerfile rcs tag $ removed because it would conflict)
## Dockerfile for building a docker imapsync image
# Dockerfile,v 1.26 2019/11/27 15:49:13 gilles Exp gilles $
# Id: Dockerfile,v 1.42 2022/04/04 19:16:50 gilles Exp gilles $
# I use the following command to build the image:
#
# docker build -t gilleslamiral/imapsync .
#
# where this Dockerfile is in the current directory
#
# This Dockerfile builds an image with two imapsync
# 1) One comes from https://imapsync.lamiral.info/imapsync
# and goes to /usr/bin/imapsync in the Docker image
# It is used with the command:
#
# docker run gilleslamiral/imapsync imapsync ...
#
# 2) One comes from the local file ./imapsync
# and goes to /imapsync in the Docker image
# It is used with the command:
#
# docker run gilleslamiral/imapsync /imapsync ...
# I thank you very much
# I like thanks
# I like stars
# I also like (and need) money
# I thank you very much in advance
# I like money to keep on doing this stuff
# Number of imapsync images pulled so far (2022_04_04): 673551
# Command used:
# curl -s https://hub.docker.com/v2/repositories/gilleslamiral/imapsync/ | jq '.pull_count'
FROM debian:buster
# Debian Bullseye is Debian 11
FROM debian:bullseye
LABEL maintainer="Gilles LAMIRAL <gilles@lamiral.info>" \
description="Imapsync" \
documentation="https://imapsync.lamiral.info/#doc"
# Put a copy of the Dockerfile in the image itself
# It can help future maintenance, isn't it?
# I put a copy of the Dockerfile in the image itself
# It can help maintenance, can't it?
# Also put optionally my local and usually more recent imapsync on /, for testing purpose
COPY Dockerfile /
# Also put my local imapsync on /usr/bin/ for testing purpose
# renamed imapsync_local since would be erased by the wget
COPY imapsync /usr/bin/imapsync_local
COPY prerequisites_imapsync /usr/bin/prerequisites_imapsync_local
COPY Dockerfile imapsyn[c] prerequisites_imapsyn[c] /
RUN set -xe && \
apt-get update \
@ -53,7 +67,8 @@ RUN set -xe && \
libdata-uniqid-perl \
libencode-imaputf7-perl \
libfile-copy-recursive-perl \
libfile-tail-perl \
libfile-tail-perl \
libio-compress-perl \
libio-socket-ssl-perl \
libio-socket-inet6-perl \
libio-tee-perl \
@ -63,6 +78,7 @@ RUN set -xe && \
libparse-recdescent-perl \
libmodule-scandeps-perl \
libpar-packer-perl \
libproc-processtable-perl \
libreadonly-perl \
libregexp-common-perl \
libsys-meminfo-perl \
@ -77,15 +93,23 @@ RUN set -xe && \
make \
cpanminus \
lsof \
&& rm -rf /var/lib/apt/lists/*
ncat \
openssl \
ca-certificates \
&& rm -rf /var/lib/apt/lists/* \
&& cpanm IO::Socket::SSL
# I added the IO::Socket::SSL update to avoid the annoying, confusing and useless warning
# DEBUG: .../IO/Socket/SSL.pm:1177: global error: Undefined SSL object
RUN set -xe \
&& cd /usr/bin/ \
&& pwd \
&& wget -N https://imapsync.lamiral.info/imapsync \
https://imapsync.lamiral.info/prerequisites_imapsync \
&& mv imapsync /usr/bin/imapsync \
&& chmod +x /usr/bin/imapsync /usr/bin/imapsync_local # just_a_comment_to_force_update 2019_11_26_12_58_34
&& wget -N --no-check-certificate https://imapsync.lamiral.info/imapsync \
https://imapsync.lamiral.info/prerequisites_imapsync \
https://raw.githubusercontent.com/google/gmail-oauth2-tools/master/python/oauth2.py \
&& chmod +x imapsync oauth2.py \
&& /usr/bin/imapsync --testslive && /usr/bin/imapsync --tests # just_a_comment_to_force_update 2022_04_04_21_16_50
USER nobody:nogroup
@ -100,8 +124,5 @@ CMD ["/usr/bin/imapsync"]
#
# End of imapsync Dockerfile
=======================================================================
=======================================================================

View File

@ -1,5 +1,5 @@
#!/bin/cat
# $Id: INSTALL.FreeBSD.txt,v 1.11 2019/11/28 14:38:42 gilles Exp gilles $
# $Id: INSTALL.FreeBSD.txt,v 1.12 2022/05/17 14:31:44 gilles Exp gilles $
This documentation is also located online at
https://imapsync.lamiral.info/INSTALL.d/
@ -9,7 +9,7 @@ https://imapsync.lamiral.info/INSTALL.d/INSTALL.FreeBSD.txt
Installing imapsync on FreeBSD
=======================================================================
Thanks to Kurt Jaeger pi@FreeBSD.org a imapsync package is available in FreeBSD
Thanks to Kurt Jaeger pi@FreeBSD.org, an imapsync package is available in FreeBSD
http://portsmon.freebsd.org/portoverview.py?category=mail&portname=imapsync
So, to install imapsync you just have to type one command in a terminal:
@ -32,5 +32,8 @@ p5-Test-MockObject
p5-CGI
p5-Encode-IMAPUTF7
Call to FreeBSD developer: It's also the new dependencies to add
for next the imapsync package 1.882
Call to FreeBSD developer: These are also the new Perl module dependencies to add
for imapsync 2.206 and next ones:
Proc::ProcessTable

View File

@ -1,5 +1,5 @@
#!/bin/cat
# $Id: INSTALL.OnlineUI.txt,v 1.49 2021/03/19 09:39:01 gilles Exp gilles $
# $Id: INSTALL.OnlineUI.txt,v 1.56 2022/05/19 08:55:50 gilles Exp gilles $
This documentation is also located online at
https://imapsync.lamiral.info/INSTALL.d/
@ -11,7 +11,7 @@ https://imapsync.lamiral.info/INSTALL.d/INSTALL.OnlineUI.txt
I'm now confident with /X since the /X service is up and running quite
well since January 2017. Anyway, if you run this service on your own
well since January 2017. Anyway, if you run this service on your own,
online, you take responsibility for it.
=======================================================================
@ -22,30 +22,28 @@ Average_bandwidth_rate: 345 KiB/s ~ 2.8 Mbps.
Load mean: 0.8 on a CPU 4 cores "Intel(R) i5-2320 3.00GHz K8-class"
=======================================================================
Installation
You have to be a little familiar with what a CGI script is
and how to activate a CGI script on the Apache
HTTP server, or any other HTTP server. I have received demands
to run it on the Ngnix HTTP server but I haven't played with it yet.
Linux is also a preferred platform (I run /X service on Linux and FreeBSD).
You have to be a little familiar with what a CGI script is and how to
activate a CGI script on the Apache HTTP server, or any other HTTP
server. I have received demands to run it on the Ngnix HTTP server but
I haven't played with it yet. Linux is also a preferred platform (I
run /X service on Linux and FreeBSD).
I have tested this visual interface on Mac. It works.
For now, it demands some skills few Mac users have.
Drop me a note in case you want to do that.
I have tested this visual interface on Mac. It works. For now, it
demands some skills few Mac users have. Drop me a note in case you
want to do that.
I have tested this visual interface on Windows,
it fails on Windows because of some hardcoded Unix paths.
I'm working on it to be Windows ok but it's not done yet (May 2020).
I have tested this visual interface on Windows, it fails on Windows
because of some hardcoded Unix paths. I'm working on it to be Windows
ok but it's not done yet (May 2020).
Some users have successfully installed a /X visual interface
on Windows using a Linux VM machine.
Some users have successfully installed a /X visual interface on
Windows using a Linux VM machine.
The web visual user interface frontend /X is compounded in four
files: a html5 file, a CSS file, a javascript file, and
a logo image:
The web visual user interface frontend /X is compounded in four files:
a html5 file, a CSS file, a javascript file, and a logo image:
* https://imapsync.lamiral.info/X/imapsync_form_extra.html
* https://imapsync.lamiral.info/X/imapsync_form.css
@ -53,29 +51,28 @@ a logo image:
* https://imapsync.lamiral.info/X/logo_imapsync_Xn.png
You can do a "view source" to see the HTML file as
it is written, and a "save" to get it locally.
The three other files can be saved the same way or
with a command named "wget". I suggest using wget,
see below the ready-to-use command lines.
You can do a "view source" to see the HTML file as it is written, and
a "save" to get it locally. The three other files can be saved the
same way or with a command named "wget". I strongly suggest using
wget, see below the ready-to-use command lines.
Those four files can be put anywhere on a web server,
as long as they stand in the same directory. If you
want to put them in different directories, just change
the content of imapsync_form_extra.html to reflect the change,
ie, change the two lines referencing imapsync_form.css and imapsync_form.js
href="imapsync_form.css" (near the beginning of imapsync_form_extra.html)
src="imapsync_form.js" (near the end of imapsync_form_extra.html)
I let you change the image logo as an exercise, it's safe if you fail.
Those four files can be put anywhere on a web server, as long as they
stand in the same directory. If you want to put them in different
directories, just change the content of imapsync_form_extra.html to
reflect the change, ie, change the two lines referencing
imapsync_form.css and imapsync_form.js href="imapsync_form.css" (near
the beginning of imapsync_form_extra.html) src="imapsync_form.js"
(near the end of imapsync_form_extra.html) I let you change the image
logo as an exercise, it's safe if you fail.
The actual imap syncing work is done by imapsync acting as a CGI,
the visual interface is only there to give imapsync the parameters
needed for the sync.
The actual imap syncing work is done by imapsync acting as a CGI, the
visual interface is only there to give imapsync the parameters needed
for the sync.
Use at least Perl module CGI.pm release 4.08 (2014-10-18)
to avoid the bug "Undefined subroutine CGI::multi_param".
You can use the command named cpanm to upgrade CGI.pm to
its last version, it's the easiest way.
Use at least Perl module CGI.pm release 4.08 (2014-10-18) to avoid the
bug "Undefined subroutine CGI::multi_param". You can use the command
named cpanm to upgrade CGI.pm to its last version, it's the easiest
way.
Print the CGI.pm release with:
@ -85,8 +82,12 @@ If it is under release 4.08 (2014-10-18) then upgrade it with
cpanm CGI
It is a good thing to remove the old one if it was installed
by a distribution package, I let you this part as an exercise too.
It is a good thing to remove the old one if it was installed by a
distribution package, I let you this part as an exercise too. Ok, here
is a way:
apt remove libcgi-pm-perl # for the Debian family
dnf remove perl-CGI # for the Centos family
To check and fix the Perl modules dependencies, run:
@ -94,53 +95,69 @@ To check and fix the Perl modules dependencies, run:
wget -N https://imapsync.lamiral.info/prerequisites_imapsync
sh prerequisites_imapsync
To make imapsync work as a CGI script, there are two conditions.
First, imapsync has to work by itself on the web host.
To make imapsync work as a CGI script, there are three conditions.
If imapsync doesn't work by itself, as a command line,
then it won't work as a CGI script.
First, imapsync has to work by itself on the web host. If imapsync
doesn't work by itself, as a command line, then it won't work as a CGI
script.
Second, imapsync has to work by itself on the web host using
the Unix user running the webserver. Detailed examples to
verify that will be provided further in this document.
Second, imapsync has to work by itself on the web host using the Unix
user running the webserver.
Third, the file imapsync has to be considered as a cgi script.
Command lines to provide and verify those three conditions will be
provided further in this document, for the Debian family systems and
for the Centos family systems. You are strongly advised to follow this
commands if need and want help from me because I will first ask you to
run them before searching what you did wrong.
The imapsync_form_extra.html file in action calls the CGI location
/cgi-bin/imapsync
which has to be imapsync itself, the file script (not the directory).
The very latest and relatively stable imapsync is at
The very latest and relatively stable imapsync is
https://imapsync.lamiral.info/imapsync
This file is the program file used verbatim for the service given at
https://imapsync.lamiral.info/X/
Copy the three files imapsync_form.* on a directory that is exported
Copy the three files imapsync_form.* on a directory that is exported
by your HTTP server.
Copy the imapsync script on the cgi-bin/ directory
allowing CGIs and you'll have your imapsync visual interface
and service. The cgi-bin/ directory is usually outside the
hierarchy exported to anybody by the HTTP server.
The default Apache 2.4 timeout is 60 seconds, one minute, 300 for older Apache.
The default Apache 2.4 timeout is 60 seconds, one minute, and 300
secondes for older Apache, 5 minutes. See
https://httpd.apache.org/docs/2.4/mod/core.html#timeout
Mine is now "Timeout 3600", 3600 seconds, an hour. I chose this huge
timeout value because imapsync can spend a long time without talking while
getting the headers of huge folders of 100k messages.
If you intend to offer this service for huge mailboxes or for a long
time, I strongly recommand you to set this "Timeout 3600" in
the Apache configuration right now because you will sure end up with this
timeout issue in a few months.
Search for timeouts in the Apache error log to see if you have timeout issues.
Now that I have explained the general context for any system,
I'll describe concrete examples on several systems,
Debian/Ubuntu and Centos. Feedbacks show that the Centos
process is easier in case you don't know very much any of the
Linux distributions.
I use "Timeout 3600", 3600 seconds, an hour. I chose this huge timeout
value because imapsync can spend a long time without talking while
getting the headers of huge folders of 100k messages. If you intend
to offer this service for huge mailboxes or for a long time, I
strongly recommend you to set this "Timeout 3600" in the Apache
configuration right now because you will sure end up with this timeout
issue in a few months. You can search for timeouts in the Apache error
log to see if you have timeout issues.
Now that I have explained the general context for any system, I'll
describe concrete examples on several systems, Debian/Ubuntu and
Centos. Feedbacks show that the Centos process is easier in case you
don't know very much any Linux distribution. But I have to add that if
you don't know very much the Linux distribution you use, then you
shouldn't install this imapsync service at all.
=============================================================================
A) Concrete example on a Debian server with Apache:
Imapsync script place on the server disk is
First, install Apache on your Debian system:
apt install apache2
Imapsync script place on the server disk will be
/usr/lib/cgi-bin/imapsync
This classical /cgi-bin directory is usually already configured
@ -151,7 +168,9 @@ or
This configuration file contains the following section
somewhere, maybe in comments for now, ie, with
some # characters at the beginning to make them ignored:
some # characters at the beginning to make them ignored.
If you don't find the following section, keep reading,
the solution is below.
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
@ -172,7 +191,18 @@ ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
Require all granted
</Directory>
That's all for the Apache configuration side.
In recent Debian distributions you can activate this cgi
stuff with the following commands:
a2enmod cgi
a2enconf serve-cgi-bin
/etc/init.d/apache2 restart
If the cgi mode and the cgi-bin configuration are not activated then
you may encounter a 404 error when, later, you will run the command
wget -nv -S -O- http://localhost/cgi-bin/imapsync?testslive=1
That's all for the Apache Debian family configuration side.
Now get, test, and install the latest imapsync:
@ -186,15 +216,25 @@ Now get, test, and install the latest imapsync:
cp imapsync /usr/lib/cgi-bin/
Assuming that the Unix account running Apache is www-data,
check that it will work under Apache with this command:
Assuming that the Unix account running Apache is www-data, check that
it will work under Apache with this command:
su -s /bin/sh -c 'SERVER_SOFTWARE=foo /usr/lib/cgi-bin/imapsync' www-data
You should end with something like:
Exiting with return value 0 (EX_OK: successful termination)
Test that imapsync is considered a cgi with:
wget -nv -S -O- http://localhost/cgi-bin/imapsync?testslive=1
The last command should print something like:
Status: 200 OK to sync IMAP boxes. Load on bar is ...
...
Exiting with return value 0 (EX_OK: successful termination)
If you get a 404 or a 5xx here then review the cgi installation and
configuration part.
You can also verify that the webserver is not buffering its output with the
@ -202,17 +242,16 @@ command:
wget -nv -S -O- 'http://localhost/cgi-bin/imapsync?testslive=1&simulong=10'
You should get the output as time goes on. If you don't get the
output as time goes on, ie you see no output then all output
at once, it means the webserver is buffering. Fix it with
the "SetEnv no-gzip 1" described above.
You should get the output as time goes on. If you don't get the output
as time goes on, ie you see no output then all output at once, it
means the webserver is buffering. Fix it with the "SetEnv no-gzip 1"
described above.
The UI front-end file place on the server disk in
this example is
The UI front-end file place on the server disk in this example is
/var/www/html/X/imapsync_form_extra.html
but it can be placed anywhere on the disk, the important
thing is that it has to be served by the webserver.
but it can be placed anywhere on the disk, the important thing is that
it has to be served by the webserver.
mkdir /var/www/html/X/
cd /var/www/html/X/
@ -225,9 +264,8 @@ thing is that it has to be served by the webserver.
The imapsync process working directory in cgi mode is
/var/tmp/imapsync_cgi/
it is not configurable unless changing it in
imapsync directly, it is hard-coded in imapsync.
In this directory will go the log files and
it is not configurable unless changing it in imapsync directly, it is
hard-coded in imapsync. In this directory will go the log files and
the pid files.
Check
@ -235,14 +273,20 @@ Check
or the safer
https://yourhost/X/imapsync_form_extra.html
That's all for installing a /X service on Debian.
Let's encrypt your site because credentials should never travel in
clear form. Go to https://certbot.eff.org/instructions
See the Troubleshooting section to fix the systemd Apache
PrivateTmp=true issue.
That's all for installing a /X service on a Debian family system.
=============================================================================
B) Here is a concrete example on a Centos 7 server with the Apache
webserver httpd:
First, follow and apply the section "Centos 7 and latest imapsync"
at https://imapsync.lamiral.info/INSTALL.d/INSTALL.Centos.txt
First, follow and apply the section "Centos 7 and latest imapsync" at
https://imapsync.lamiral.info/INSTALL.d/INSTALL.Centos.txt
Then:
@ -288,14 +332,14 @@ The last command should print something like:
Status: 200 OK to sync IMAP boxes. Load on bar is ...
...
You can also verify that the webserver is not buffering its output with the
command:
You can also verify that the webserver is not buffering its output
with the command:
wget -nv -S -O- 'http://localhost/cgi-bin/imapsync?testslive=1&simulong=10'
You should get the output as time goes on. If you don't, no output then all
output at once, it means the webserver is buffering. Fix it with
the "SetEnv no-gzip 1" described above.
You should get the output as time goes on. If you don't, no output
then all output at once, it means the webserver is buffering. Fix it
with the "SetEnv no-gzip 1" described above.
Now check
http://yourhost/X/imapsync_form_extra.html
@ -307,62 +351,53 @@ That's all for installing a /X service on Centos 7.
B bis) How about Centos 8?
Follow the procedure for Centos 7. While imapsync is ok on the command line,
you will encounter some permission denied in the CGI context. Something like:
Follow the procedure for Centos 7. While imapsync is ok on the command
line, you will encounter some permission denied in the CGI
context. Something like:
wget -nv -S -O- http://localhost/cgi-bin/imapsync?testslive=1
...
Host1 failure: can not open imap connection on host1 [test1.lamiral.info]
with user [test1]: Unable to connect to test1.lamiral.info: Permission denied
Host1 failure: can not open imap connection on host1
[test1.lamiral.info] with user [test1]: Unable to connect to
test1.lamiral.info: Permission denied
The issue might come from SELinux. I haven't dig into SELinux enough to give
you the commands that will allow imapsync online and only it while maintaining
SELinux in enforcing mode.
The issue might come from SELinux. I haven't dig into SELinux enough
to give you the commands that will allow imapsync online and only it
while maintaining SELinux in enforcing mode.
Quick solution:
sestatus
setenforce 0
sestatus
getsebool httpd_can_network_connect # should show --> off
setsebool -P httpd_can_network_connect=1
getsebool httpd_can_network_connect # should show --> on
wget -nv -S -O- http://localhost/cgi-bin/imapsync?testslive=1 # no more "Permission denied"
The -P option installs the rule permanently, even after a reboot
To go back to the previous state:
setenforce 1
sestatus
getsebool httpd_can_network_connect # should show --> on
setsebool -P httpd_can_network_connect=0
getsebool httpd_can_network_connect # should show --> off
Nota bene
=========
You may also want to avoid being placed by systemd in
a directory like (where xxx are crypto hash characters):
You may also want to avoid being placed by systemd in a directory like
(where xxx are crypto hash characters):
/var/tmp/systemd-private-xxx-httpd.service-xxx/tmp/
In that case, edit the file
In that case, see the Troubleshooting section below.
/usr/lib/systemd/system/httpd.service
and in it, replace the line
PrivateTmp=true
by the line
PrivateTmp=false
then reload systemd and restart httpd with the commands:
systemctl daemon-reload
systemctl restart httpd
systemctl status httpd
=======================================================================
=================== Bandwidth statistics ==========================
=======================================================================
If you want the bandwidth statistics like the ones at the bottom
of the page and following the image link, more detailed at
If you want the bandwidth statistics like the ones at the bottom of
the page and following the image link, more detailed at
https://imapsync.lamiral.info/vnstat/vnstati.html
Those stats are generated by vnstat
@ -371,16 +406,18 @@ https://humdi.net/vnstat/
Vnstat is already available as a package in most Linux distros.
The images are generated by the following commands, every minute:
vnstati -s -o /var/www/vnstat/vnstat_s.png
vnstati -h -o /var/www/vnstat/vnstat_h.png
vnstati -hg -o /var/www/vnstat/vnstat_hg.png
vnstati -hs -o /var/www/vnstat/vnstat_hs.png
vnstati -d -o /var/www/vnstat/vnstat_d.png
vnstati -m -o /var/www/vnstat/vnstat_m.png
vnstati -y -o /var/www/vnstat/vnstat_y.png
vnstati -t -o /var/www/vnstat/vnstat_t.png
vnstati -vs -o /var/www/vnstat/vnstat_vs.png
vnstati -5 -o /var/www/vnstat/vnstat_5.png
vnstati -s -o /var/www/html/vnstat/vnstat_s.png
vnstati -h -o /var/www/html/vnstat/vnstat_h.png
vnstati -hg -o /var/www/html/vnstat/vnstat_hg.png
vnstati -hs -o /var/www/html/vnstat/vnstat_hs.png
vnstati -d -o /var/www/html/vnstat/vnstat_d.png
vnstati -m -o /var/www/html/vnstat/vnstat_m.png
vnstati -y -o /var/www/html/vnstat/vnstat_y.png
vnstati -t -o /var/www/html/vnstat/vnstat_t.png
vnstati -vs -o /var/www/html/vnstat/vnstat_vs.png
vnstati -5 -o /var/www/html/vnstat/vnstat_5.png
=======================================================================
@ -389,39 +426,58 @@ vnstati -5 -o /var/www/vnstat/vnstat_5.png
The log says the temporary directory is
/var/tmp/imapsync_cgi/
but it is not in the system.
but this directory is not in the system. What a mystery!
It may be that the apache or httpd service is run by systemd with a jailed
temporary directory.
It may be that the apache or httpd service is run by systemd with a
jailed temporary directory.
Solution:
find /etc/systemd/ /usr/lib/systemd/ |xargs grep -s PrivateTmp
find /etc/systemd/ /usr/lib/systemd/ | xargs grep -s PrivateTmp
If systemd jails Apache then you'll find a line like:
If systemd jails Apache, then you'll find a line like:
/etc/systemd/system/multi-user.target.wants/apache2.service:PrivateTmp=true
(Debian/Ubuntu)
or
/usr/lib/systemd/system/httpd.service:PrivateTmp=true
(Centos)
Replace this line "PrivateTmp=true"
in /etc/systemd/system/multi-user.target.wants/apache2.service
The goal is to override the line
PrivateTmp=true
found in /etc/systemd/system/multi-user.target.wants/apache2.service
or
/usr/lib/systemd/system/httpd.service
with:
with the line:
PrivateTmp=false
Then reload the systemd daemon and restart the apache2 service
The right way to do it is by using the "systemctl edit ..." command
and then reload the systemd daemon and restart the apache2 service.
You can also edit directly the file override.conf if you know where
to do it. If you don't use the override.conf mechanism then your change will
be canceled the next time the apache package is updated.
Debian:
systemctl edit apache2
cat /etc/systemd/system/apache2.service.d/override.conf
[Service]
PrivateTmp=false
systemctl daemon-reload
systemctl restart apache2
systemctl status apache2
Centos:
systemctl edit httpd
cat /etc/systemd/system/httpd.service.d/override.conf
[Service]
PrivateTmp=false
systemctl daemon-reload
systemctl restart httpd
systemctl status httpd
@ -458,6 +514,7 @@ So if your https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js
is not what it should be, your access looks compromised.
Thanks to Dominik Ulrich for this insight!
=======================================================================
=======================================================================
@ -484,11 +541,11 @@ Debian:
chmod +x imapsync_shell_wrapper
cp imapsync_shell_wrapper /usr/lib/cgi-bin/
Normally, you only have to change the script imapsync_shell_wrapper
to suit your needs.
Normally, you only have to change the script imapsync_shell_wrapper to
suit your needs.
Have in mind that the abort button will kill only one imapsync so
it is not a working button in case of successive imapsync runs.
Have in mind that the abort button will kill only one imapsync so it
is not a working button in case of successive imapsync runs.
=======================================================================
=======================================================================
@ -497,13 +554,12 @@ it is not a working button in case of successive imapsync runs.
====== mod_perl failure ======
This part is for mod_perl experts only.
The script imapsync doesn't work under Modperl::Registry
nor under ModPerl::PerlRun. So read on if you think you
are better than me.
I tried the standard way, telling how any cgi Perl script
can be run under mod_perl perlrun, but it fails with imapsync.
Any hint welcome!
The script imapsync doesn't work under Modperl::Registry nor under
ModPerl::PerlRun. So read on if you think you are better than me.
I tried the standard way, telling how any cgi Perl script can be run
under mod_perl perlrun, but it fails with imapsync. Any hint welcome!
# This is a Debian example
@ -542,6 +598,5 @@ Any hint welcome!
curl http://localhost/perl-run/imapsync
=======================================================================
=======================================================================

View File

@ -1,5 +1,5 @@
#!/bin/cat
# $Id: INSTALL.Ubuntu.txt,v 1.17 2019/11/28 14:35:43 gilles Exp gilles $
# $Id: INSTALL.Ubuntu.txt,v 1.21 2022/06/03 16:58:47 gilles Exp gilles $
This documentation is also located online at
https://imapsync.lamiral.info/INSTALL.d/
@ -17,6 +17,7 @@ This command installs standard Ubuntu packages:
sudo apt-get install \
libauthen-ntlm-perl \
libclass-load-perl \
libcrypt-openssl-rsa-perl \
libcrypt-ssleay-perl \
libdata-uniqid-perl \
libdigest-hmac-perl \
@ -28,11 +29,13 @@ libio-compress-perl \
libio-socket-inet6-perl \
libio-socket-ssl-perl \
libio-tee-perl \
libjson-webtoken-perl \
libmail-imapclient-perl \
libmodule-scandeps-perl \
libnet-dbus-perl \
libnet-ssleay-perl \
libpar-packer-perl \
libproc-processtable-perl \
libreadonly-perl \
libregexp-common-perl \
libsys-meminfo-perl \
@ -49,6 +52,7 @@ libtest-nowarnings-perl \
libtest-deep-perl \
libtest-warn-perl \
make \
time \
cpanminus
In case you want to update the Perl module
@ -57,11 +61,6 @@ the following command installs it "manually":
sudo cpanm Mail::IMAPClient
In case you need to use XOAUTH2 authentication you have to install
the module JSON::WebToken with the command:
sudo cpanm JSON::WebToken
After installing the dependencies, imapsync should be working.
You don't have to be root to test and use imapsync.
@ -84,7 +83,7 @@ A live test showing imapsync job:
./imapsync --testslive
Now the install command (need root priviledges again):
Now the install command (need root privileges again):
cp imapsync /usr/bin/

View File

@ -0,0 +1,18 @@
#!/bin/cat
# $Id: INSTALL.webserver.txt,v 1.6 2022/06/15 12:09:39 gilles Exp gilles $
This documentation is also located online at
https://imapsync.lamiral.info/INSTALL.d/
https://imapsync.lamiral.info/INSTALL.d/INSTALL.webserver.txt
The script named webserver in the top directory is a small web server
dedicated to offer the visual interface. It is experimental and it is
for now a plain text HTTP server (ie, not https).
Dependencies to run webserver on Debian/Ubuntu distributions:
sudo apt install libnet-server-perl

View File

@ -1,5 +1,7 @@
#!/bin/sh
# $Id: memo_docker,v 1.17 2022/04/04 14:46:21 gilles Exp gilles $
echo imapsync_docker_timestamp_dockerfile
imapsync_docker_timestamp_dockerfile()
{
@ -14,11 +16,6 @@ imapsync_docker_build()
{
docker build -t gilleslamiral/imapsync . \
&& imapsync_docker_add_tag_version && echo Build SUCCEEDED || echo Build FAILED
echo
#docker run gilleslamiral/imapsync imapsync --testslive
#docker run gilleslamiral/imapsync imapsync --testslive6
# docker run gilleslamiral/imapsync imapsync --testslive6 --nossl2
}
echo imapsync_docker_version
@ -27,6 +24,12 @@ imapsync_docker_version()
docker run gilleslamiral/imapsync imapsync --version
}
echo imapsync_local_docker_version
imapsync_local_docker_version()
{
docker run gilleslamiral/imapsync /imapsync --version
}
echo imapsync_docker_add_tag_version
imapsync_docker_add_tag_version()
{
@ -43,15 +46,15 @@ imapsync_docker_add_tag_version()
echo imapsync_docker_testslive
imapsync_docker_testslive()
{
echo docker run gilleslamiral/imapsync imapsync --testslive
docker run gilleslamiral/imapsync imapsync --testslive
echo docker run gilleslamiral/imapsync imapsync --testslive "$@"
docker run gilleslamiral/imapsync imapsync --testslive "$@"
}
echo imapsync_docker_testslive6
imapsync_docker_testslive6()
{
echo docker run gilleslamiral/imapsync imapsync --testslive6 --ssl1 --ssl2
docker run gilleslamiral/imapsync imapsync --testslive6 --ssl1 --ssl2
echo docker run gilleslamiral/imapsync imapsync --testslive6 "$@"
docker run gilleslamiral/imapsync imapsync --testslive6 "$@"
}
echo imapsync_docker_tests
@ -102,16 +105,29 @@ imapsync_docker_rebuild_from_scratch()
imapsync_docker_build
}
echo is_release_number
is_release_number()
{
echo "$1" | perl -pe 'm/^\d\.\d+$/ || exit 1'
}
echo imapsync_docker_upload
imapsync_docker_upload()
{
version=`imapsync_docker_version`
version_local=`imapsync_local_docker_version`
# upload only after successful tests
set -x \
&& rcsdiff imapsync \
&& is_release_number "$version" \
&& is_release_number "$version_local" \
&& test "$version" = "$version_local" \
&& rcsdiff imapsync Dockerfile memo_docker \
&& imapsync_docker_testslive \
&& imapsync_docker_tests \
&& docker run gilleslamiral/imapsync true \
&& docker run gilleslamiral/imapsync diff /imapsync /usr/bin/imapsync \
&& docker login --username=gilleslamiral --password=`cat $HOME/var/pass/secret.docker` \
&& docker push gilleslamiral/imapsync:latest \
&& docker push gilleslamiral/imapsync:$version \

View File

@ -1,6 +1,6 @@
#!/bin/sh
# $Id: prerequisites_imapsync,v 1.35 2019/11/27 15:58:46 gilles Exp gilles $
# $Id: prerequisites_imapsync,v 1.36 2022/05/17 13:46:16 gilles Exp gilles $
MODULES_MANDATORY='
App::cpanminus
@ -39,6 +39,7 @@ Package::Stash::XS
PAR::Packer
Parse::RecDescent
Pod::Usage
Proc::ProcessTable
Readonly
Regexp::Common
Sys::MemInfo

328
Makefile
View File

@ -1,5 +1,5 @@
# $Id: Makefile,v 1.335 2021/07/06 02:00:46 gilles Exp gilles $
# $Id: Makefile,v 1.349 2022/09/15 08:43:25 gilles Exp gilles $
.PHONY: help usage all doc
@ -34,6 +34,7 @@ usage:
@echo "make upload_index"
@echo "make upload_FAQ # upload FAQs and documentation"
@echo "make upload_X # upload online UI"
@echo "make upload_csv # upload online CSV service"
@echo "make upload_latest # upload latest imapsync and binaries (dev)"
@echo "make upload_cgi # upload latest imapsync online, after local and remote --tests success."
@echo "make upload_cgi_memo # upload cgi_memo stat_patterns.txt to /X servers."
@ -108,8 +109,6 @@ VERSION: imapsync
touch -r ./imapsync ./VERSION
doc/GOOD_PRACTICES.html: doc/GOOD_PRACTICES.t2t
txt2tags -i doc/GOOD_PRACTICES.t2t -t html --toc -o doc/GOOD_PRACTICES.html
./W/tools/validate_html4 doc/GOOD_PRACTICES.html
@ -150,7 +149,7 @@ clean_bak:
rm -f index.shtml.bak ./S/style.css.bak
clean_oauth2:
rm oauth2/typescript oauth2/D_*txt
rm -f oauth2/typescript oauth2/D_*txt
.PHONY: install dist man
@ -160,6 +159,7 @@ clean_man:
rm -f W/imapsync.1
W/imapsync.1: imapsync
mkdir -p W
pod2man imapsync > W/imapsync.1
install: testp W/imapsync.1
@ -170,36 +170,49 @@ install: testp W/imapsync.1
install W/imapsync.1 $(DESTDIR)$(PREFIX)/share/man/man1/imapsync.1
chmod 644 $(DESTDIR)$(PREFIX)/share/man/man1/imapsync.1
###############
# Local goals
###############
.PHONY: prereq test tests unitests testp testf test3xx perlcritic allcritic crit compok dev cover tidy nytprof functree
.PHONY: dailybuild dailytests prereq test tests unitests testp testf test3xx perlcritic allcritic crit compok dev cover tidy nytprof functree
dev: test functree crit cover nytprof bin
dailytests: linuxtests win32tests win64tests mactests
dailybuild: linuxbuild win32build win64build macbuild
linuxtests:
./imapsync --tests
linuxtestsdebug:
./imapsync --testsdebug
testsdebug: linuxtestsdebug win64testsdebug win32testsdebug mactestsdebug
testslive: mactestslive
docker:
@echo "make docker_copy_to_vp3 # copy imapsync Dockerfile memo_docker to vp3"
@echo "make docker_build # build the imapsync docker image"
@echo "make docker_upload_docker_hub # upload last build to https://hub.docker.com/r/gilleslamiral/imapsync"
@echo "ssh vp3 THEN cd docker/imapsync && . memo_docker"
docker_build:
docker_build: docker_copy_to_vp3
ssh vp3 'cd docker/imapsync && . memo_docker && imapsync_docker_build'
docker_copy_to_vp3:
ssh vp3 'mkdir -p docker/imapsync/ var/pass/'
rsync -av /g/var/pass/secret.docker vp3:var/pass/secret.docker
rsync -av imapsync INSTALL.d/Dockerfile INSTALL.d/memo_docker INSTALL.d/prerequisites_imapsync INSTALL.d/secret.txt vp3:docker/imapsync/
rsync -av RCS/imapsync,v INSTALL.d/RCS/Dockerfile,v INSTALL.d/RCS/memo_docker,v vp3:docker/imapsync/RCS/
docker_upload_docker_hub:
docker_upload_docker_hub: docker_build
ssh vp3 'cd docker/imapsync && . memo_docker && imapsync_docker_upload'
functree: W/imapsync_functions_tree_ppi.txt W/imapsync_functions_tree.txt
@ -257,7 +270,7 @@ perlcritic: W/perlcritic_3.txt W/perlcritic_2.txt
allcritic: W/perlcritic_4.txt W/perlcritic_3.txt W/perlcritic_2.txt W/perlcritic_1.txt
W/perlcritic_1.txt: imapsync W/.compok
perlcritic --statistics-only -1 imapsync > W/perlcritic_1.txt.tmp || :
perlcritic --statistics -1 imapsync > W/perlcritic_1.txt.tmp || :
mv W/perlcritic_1.txt.tmp W/perlcritic_1.txt
echo | ci -l W/perlcritic_1.txt
@ -285,10 +298,10 @@ testv: imapsync tests.sh
tests: test
test: .test_3xx
test: .tests_passed
# .test_3xx is created by tests.sh with success at all mandatory tests
.test_3xx: imapsync tests.sh
# .tests_passed is created by tests.sh with success at all mandatory tests
.tests_passed: imapsync
/usr/bin/time sh tests.sh 1>/dev/null
unitests:
@ -330,6 +343,7 @@ win32testsdebug:
./W/check_winerr test_testsdebug.bat
.PHONY: W/*.bat examples/*
@ -450,20 +464,47 @@ imapsync_32bit.exe: imapsync
chmod a+r+x imapsync_32bit.exe
(date "+%s"| tr "\n" " "; echo -n "END 32bit " $(VERSION) ": "; date) >> W/.BUILD_EXE_TIME
win64tests: win64tests_p26
win64tests:
win64tests_p24:
unix2dos W/test_tests.bat
scp imapsync W/test_tests.bat pc_HP_DV7_p24:'Desktop/imapsync_build'
ssh 'pc HP DV7'@p24 'Desktop/imapsync_build/test_tests.bat'
./W/check_win64err test_tests.bat
win64testsdebug:
win64testsdebug_p24:
unix2dos W/test_testsdebug.bat
scp imapsync W/test_testsdebug.bat pc_HP_DV7_p24:'Desktop/imapsync_build'
ssh 'pc HP DV7'@p24 'Desktop/imapsync_build/test_testsdebug.bat'
./W/check_win64err test_testsdebug.bat
win64testsdebug: win64testsdebug_p26
win64testsdebug_p26:
unix2dos W/test_testsdebug.bat
scp imapsync W/test_testsdebug.bat gille@p26:'OneDrive\Bureau\imapsync_build'
ssh gille@p26 'OneDrive\Bureau\imapsync_build\test_testsdebug.bat'
./W/check_p26err test_testsdebug.bat
win64tests_p26:
unix2dos W/test_tests.bat
scp imapsync W/test_tests.bat gille@p26:'OneDrive\Bureau\imapsync_build'
ssh gille@p26 'OneDrive\Bureau\imapsync_build\test_tests.bat'
./W/check_p26err test_tests.bat
win64_test_exe_always_fail_p26:
unix2dos W/test_exe_always_fail.bat
scp W/test_exe_always_fail.bat gille@p26:'OneDrive\Bureau\imapsync_build'
ssh gille@p26 'OneDrive\Bureau\imapsync_build\test_exe_always_fail.bat'
./W/check_p26err test_exe_always_fail.bat
win64_test_always_fail_p26:
unix2dos W/test_exe_always_fail.bat
scp imapsync W/test_always_fail.bat gille@p26:'OneDrive\Bureau\imapsync_build'
ssh gille@p26 'OneDrive\Bureau\imapsync_build\test_always_fail.bat'
./W/check_p26err test_always_fail.bat
zzz:
unix2dos W/build_exe.bat W/install_module_one.bat
@ -517,30 +558,62 @@ W/test_tail.bat:
win64sshaccess:
ssh 'pc HP DV7'@p24 'perl -V'
win64prepa:
ssh 'pc HP DV7'@p24 'perl -V'
winprepalocal:
unix2dos W/build_exe.bat W/test_exe.bat W/install_modules.bat W/install_module_one.bat
win64prepa: winprepalocal
ssh 'pc HP DV7'@p24 'perl -V'
scp imapsync W/build_exe.bat W/install_modules.bat W/install_module_one.bat \
W/test_exe_tests.bat W/test_exe_testsdebug.bat W/test_exe.bat \
pc_HP_DV7_p24:'Desktop/imapsync_build'
ssh 'pc HP DV7'@p24 'Desktop/imapsync_build/build_exe.bat'
./W/check_win64err build_exe.bat
win64build:
unix2dos W/build_exe.bat W/install_modules.bat
win64build_p24: winprepalocal
scp imapsync W/build_exe.bat W/install_modules.bat pc_HP_DV7_p24:'Desktop/imapsync_build'
ssh 'pc HP DV7'@p24 'Desktop/imapsync_build/build_exe.bat'
./W/check_win64err build_exe.bat
imapsync.exe: imapsync_64bit.exe
cp -a imapsync_64bit.exe imapsync.exe
imapsync.exe: imapsync_64bit.exe_p26
cp -a imapsync_64bit.exe_p26 imapsync.exe
win64build: imapsync_64bit.exe_p26
imapsync_64bit.exe: imapsync
win64build_p26: winprepalocal
scp imapsync W/build_exe.bat W/install_modules.bat gille@p26:'OneDrive\Bureau\imapsync_build'
ssh gille@p26 'OneDrive\Bureau\imapsync_build\build_exe.bat'
./W/check_win64err build_exe.bat
.PHONY: imapsync_64bit.exe_p24 imapsync_64bit.exe_p26
64exe: imapsync_64bit.exe_p26
imapsync_64bit.exe_p26: imapsync
(date "+%s"| tr "\n" " "; echo -n "BEGIN 64bit " $(VERSION) ": "; date) >> W/.BUILD_EXE_TIME
ssh 'pc HP DV7'@p24 'perl -V'
unix2dos W/build_exe.bat W/test_exe.bat W/install_modules.bat W/install_module_one.bat
ssh gille@p26 'perl -V'
ssh gille@p26 'if not exist OneDrive\Bureau\imapsync_build mkdir OneDrive\Bureau\imapsync_build'
scp imapsync W/build_exe.bat W/install_modules.bat W/install_module_one.bat \
W/test_exe_tests.bat W/test_exe_testsdebug.bat W/test_exe.bat \
gille@p26:'OneDrive\Bureau\imapsync_build'
ssh gille@p26 'OneDrive\Bureau\imapsync_build\build_exe.bat'
./W/check_p26err build_exe.bat
scp ../../var/pass/secret.tata ../../var/pass/secret.titi gille@p26:'OneDrive\Bureau\imapsync_build'
ssh gille@p26 'OneDrive\Bureau\imapsync_build\test_exe.bat'
./W/check_p26err test_exe.bat
rm -f imapsync_64bit.exe
scp -T gille@p26:'OneDrive\Bureau\imapsync_build\imapsync_64bit.exe' .
chmod a+r+x imapsync_64bit.exe
(date "+%s"| tr "\n" " "; echo -n "END 64bit " $(VERSION) ": "; date) >> W/.BUILD_EXE_TIME
imapsync_64bit.exe_p24: imapsync
(date "+%s"| tr "\n" " "; echo -n "BEGIN 64bit " $(VERSION) ": "; date) >> W/.BUILD_EXE_TIME
unix2dos W/build_exe.bat W/test_exe.bat W/install_modules.bat W/install_module_one.bat
ssh 'pc HP DV7'@p24 'perl -V'
scp imapsync W/build_exe.bat W/install_modules.bat W/install_module_one.bat \
W/test_exe_tests.bat W/test_exe_testsdebug.bat W/test_exe.bat \
pc_HP_DV7_p24:'Desktop/imapsync_build'
@ -554,40 +627,43 @@ imapsync_64bit.exe: imapsync
(date "+%s"| tr "\n" " "; echo -n "END 64bit " $(VERSION) ": "; date) >> W/.BUILD_EXE_TIME
zip: dosify_bat
zip: dosify_bat cidone
rm -rfv ../prepa_zip/imapsync_$(VERSION)/
mkdir -p ../prepa_zip/imapsync_$(VERSION)/FAQ.d/ ../prepa_zip/imapsync_$(VERSION)/Cook/
cp -av examples/imapsync_example.bat examples/sync_loop_windows.bat examples/file.txt ../prepa_zip/imapsync_$(VERSION)/
cp -av W/build_exe.bat W/install_modules.bat W/test_cook_exe.bat W/test_cook_src.bat imapsync ../prepa_zip/imapsync_$(VERSION)/Cook/
for f in README ; do cp -av $$f ../prepa_zip/imapsync_$(VERSION)/$$f.txt ; done
cp -av README.txt ../prepa_zip/imapsync_$(VERSION)/
cp -av FAQ.d/*.txt ../prepa_zip/imapsync_$(VERSION)/FAQ.d/
cp -av imapsync.exe imapsync_32bit.exe README_Windows.txt ../prepa_zip/imapsync_$(VERSION)/
unix2dos ../prepa_zip/imapsync_$(VERSION)/*.txt
cd ../prepa_zip/ && rm -f ./imapsync_$(VERSION).zip && zip -r ./imapsync_$(VERSION).zip ./imapsync_$(VERSION)/
scp ../prepa_zip/imapsync_$(VERSION).zip Admin@c:'C:/msys/1.0/home/Admin/'
scp ../prepa_zip/imapsync_$(VERSION).zip pc_HP_DV7_p24:'Desktop/'
# scp ../prepa_zip/imapsync_$(VERSION).zip pc_HP_DV7_p24:'Desktop/'
cp ../prepa_zip/imapsync_$(VERSION).zip /fe/imapsync/
# C:\Users\mansour\Desktop\imapsync
.PHONY: mac maccopy macforce mactests mactestsdebug mactestslive mactestslive6 bin win lin win64
.PHONY: mac macstadiumcopy maccopy macforce mactests mactestsdebug mactestslive mactestslive6 bin win lin win64
mac: imapsync_bin_Darwin
maccopy:
rsync -p -e 'ssh -4 -p 995' imapsync W/build_mac.sh INSTALL.d/prerequisites_imapsync webserver \
gilleslamira@gate.polarhome.com:
rsync -av -p -e 'ssh -4 -p 995' X/ gilleslamira@gate.polarhome.com:X/
macstadiumcopy:
rsync -pv imapsync W/build_mac.sh INSTALL.d/prerequisites_imapsync webserver administrator@macstadium.lamiral.info:
rsync -pv examples/file.txt examples/sync_loop_darwin.sh administrator@macstadium.lamiral.info:examples/
rsync -pv X/ administrator@macstadium.lamiral.info:X/
maccopy:
rsync -v -p -e 'ssh -4 -p 995' imapsync W/build_mac.sh INSTALL.d/prerequisites_imapsync webserver \
gilleslamira@gate.polarhome.com:
rsync -v -p -e 'ssh -4 -p 995' examples/file.txt examples/sync_loop_darwin.sh gilleslamira@gate.polarhome.com:examples/
rsync -v -p -e 'ssh -4 -p 995' X/ gilleslamira@gate.polarhome.com:X/
macforce: maccopy
ssh -4 -p 995 gilleslamira@gate.polarhome.com 'sh -x build_mac.sh'
imapsync_bin_Darwin: imapsync W/build_mac.sh INSTALL.d/prerequisites_imapsync
imapsync_bin_Darwin: maccopy imapsync W/build_mac.sh INSTALL.d/prerequisites_imapsync
rcsdiff imapsync
rsync -p -e 'ssh -4 -p 995' imapsync W/build_mac.sh INSTALL.d/prerequisites_imapsync gilleslamira@gate.polarhome.com:
ssh -4 -p 995 gilleslamira@gate.polarhome.com 'sh -x build_mac.sh'
rsync -P -e 'ssh -4 -p 995' gilleslamira@gate.polarhome.com:imapsync_bin_Darwin .
@ -607,18 +683,32 @@ mactestslive6:
rsync -p -e 'ssh -4 -p 995' imapsync gilleslamira@gate.polarhome.com:
ssh -4 -p 995 gilleslamira@gate.polarhome.com '. .bash_profile; perl imapsync --testslive6'
macstests:
rsync -pv imapsync administrator@macstadium.lamiral.info:
ssh administrator@macstadium.lamiral.info '. .bash_profile; perl imapsync --tests'
macstestsdebug:
rsync -pv imapsync administrator@macstadium.lamiral.info:
ssh administrator@macstadium.lamiral.info '. .bash_profile; perl imapsync --testsdebug'
.PHONY: bin win lin win32 win64
bin: mac win
lin: $(BIN_NAME)
win: win64 win32 imapsync.exe
win: win32 win64 imapsync.exe
win32: imapsync_32bit.exe
win64: imapsync_64bit.exe
win32build: imapsync_32bit.exe
linuxbuild: lin
$(BIN_NAME): imapsync
rcsdiff imapsync
@ -705,21 +795,21 @@ biz: S/imapsync_sold_by_country.txt docker_pull_count
auto_ci: docker_pull_count
docker_pull_count:
cd W/ && rcsdiff docker_pull_count.txt || { echo | ci -l docker_pull_count.txt ; }
rcsdiff W/docker_pull_count.txt || { echo | ci -l W/docker_pull_count.txt ; }
S/imapsync_sold_by_country.txt: /g/bin/imapsync_by_country
cd S/ && /g/bin/imapsync_by_country && echo | ci -l imapsync_sold_by_country.txt
cd S/ && /g/bin/imapsync_by_country && { echo | ci -l imapsync_sold_by_country.txt ; }
ks:
rsync -avHz --delete --exclude '*.exe' \
. gilles@ks.lamiral.info:public_html/imapsync/
ssh root@ks.lamiral.info 'apachectl configtest && /etc/init.d/apache2 reload'
ssh root@ks.lamiral.info 'apachectl configtest && apachectl reload'
ksa:
rsync -avHz --delete -P \
. gilles@ks.lamiral.info:public_html/imapsync/
ssh root@ks.lamiral.info 'apachectl configtest && /etc/init.d/apache2 reload'
ssh root@ks.lamiral.info 'apachectl configtest && apachectl reload'
ks3:
rsync -avHz --delete -P \
@ -745,11 +835,10 @@ ks5tests: ks5tests_gilles ks5tests_root
ks5tests_gilles:
rsync -P imapsync gilles@ks.lamiral.info:public_html/imapsync/
rsync -P oauth2_access_token.txt oauth2_string_for_oauthdirect.txt gilles@ks.lamiral.info:
ssh gilles@ks.lamiral.info 'public_html/imapsync/imapsync --tests'
ks5tests_root:
rsync -P imapsync oauth2_access_token.txt oauth2_string_for_oauthdirect.txt root@ks5.lamiral.info:
rsync -P imapsync root@ks5.lamiral.info:
ssh root@ks5.lamiral.info './imapsync --tests'
@ -825,19 +914,21 @@ W/.valid.index.shtml: index.shtml S/*.shtml
S/template_xhtml1.shtml
touch W/.valid.index.shtml
.PHONY: upload_index upload_FAQ ci_imapsync upload_bin
.PHONY: upload_index ci_imapsync upload_latest upload_FAQ upload_bin
upload_index: valid_index clean_permissions
rcsdiff index.shtml README_Windows.txt S/style.css S/*.shtml FAQ.d/*.txt LICENSE CREDITS TODO examples/*.bat examples/*.sh index.shtml INSTALL.d/*.txt
rcsdiff S/quiz/quiz_imapsync.html S/quiz/quiz_imapsync.js S/quiz/quiz_imapsync.css
rm -f examples/LOG_imapsync/*
rsync -avH index.shtml README_Windows.txt FAQ INSTALL NOLIMIT LICENSE CREDITS TODO S/robots.txt S/favicon.ico ../imapsync_website/
rsync -aHv --delete ./W/ks.htaccess ../imapsync_website/.htaccess
rsync -aHv --delete S/ ../imapsync_website/S/
rsync -aHv --delete ./S/ ../imapsync_website/S/
rsync -aHv --delete ./examples/ ../imapsync_website/examples/
rsync -aHv --delete ./INSTALL.d/ ../imapsync_website/INSTALL.d/
rsync -aHv --delete ./FAQ.d/ ../imapsync_website/FAQ.d/
rsync -avH --delete ./doc/ ../imapsync_website/doc/
rsync -avH --delete ./W/tools/ ../imapsync_website/W/tools/
rsync -aHvz --delete ../imapsync_website/ root@ks5.lamiral.info:/usr/local/www/apache24/data/imapsync/
@ -850,26 +941,148 @@ upload_latest: unitests ci_imapsync bin
rsync -aHvzP --delete ../imapsync_website/ root@ks5.lamiral.info:/usr/local/www/apache24/data/imapsync/
upload_cgi: unitests ks5tests ks5tests_root ci_imapsync
rsync -a imapsync ./INSTALL.d/prerequisites_imapsync ../imapsync_website/
rsync -aHvz --delete ../imapsync_website/ root@ks5.lamiral.info:/usr/local/www/apache24/data/imapsync/
rsync -P imapsync root@ks5.lamiral.info:/home/www/apache24/cgi-bin/imapsync
.PHONY: upload_cgi upload_cgi_ks5 upload_cgi_memo upload_cgi_vp3 upload_cgi_vp4 upload_cgi_ks6 upload_tmphash_all
upload_proximapsync:
rcsdiff W/learn/proximapsync
W/learn/proximapsync --tests
W/learn/proximapsync --testslive | grep 'Exiting with return value 0'
rsync -P W/learn/proximapsync root@ks5.lamiral.info:/home/www/apache24/cgi-bin/proximapsync_new
ssh root@ks5.lamiral.info '/home/www/apache24/cgi-bin/proximapsync_new --tests'
ssh root@ks5.lamiral.info '/home/www/apache24/cgi-bin/proximapsync_new --testslive' | grep 'Exiting with return value 0'
curl -v --data 'testslive=1' https://imapsync.lamiral.info/cgi-bin/proximapsync_new 2>/dev/null | grep 'Exiting with return value 0'
rsync -P W/learn/proximapsync root@ks5.lamiral.info:/home/www/apache24/cgi-bin/proximapsync
curl -v --data 'testslive=1' https://imapsync.lamiral.info/cgi-bin/proximapsync 2>/dev/null | grep 'Exiting with return value 0'
upload_cgi_memo:
dos2unix X/stat_patterns.txt X/server_survey_patterns.txt
sed -i".bak" '/^[[:space:]]*$$/d' X/stat_patterns.txt X/server_survey_patterns.txt
rsync -av X/cgi_memo X/stat_patterns.txt X/server_survey_patterns.txt root@ks5:/var/tmp/imapsync_cgi/
upload_cgi_memo_all:
rsync -av X/cgi_memo X/stat_patterns.txt X/server_survey_patterns.txt root@ks5:/var/tmp/imapsync_cgi/
rsync -av X/cgi_memo X/stat_patterns.txt X/server_survey_patterns.txt root@ks6:/var/tmp/imapsync_cgi/
rsync -av X/cgi_memo X/stat_patterns.txt X/server_survey_patterns.txt root@ks7:/var/tmp/imapsync_cgi/
rsync -av X/cgi_memo X/stat_patterns.txt X/server_survey_patterns.txt root@vp3:/var/tmp/imapsync_cgi/
rsync -av X/cgi_memo X/stat_patterns.txt X/server_survey_patterns.txt root@vp4:/var/tmp/imapsync_cgi/
! ping -c1 -W1 cl1 || rsync -av X/cgi_memo X/stat_patterns.txt X/server_survey_patterns.txt root@cl1:/var/tmp/imapsync_cgi/
upload_tmphash_all:
scp /var/tmp/imapsync_hash root@ks5:/var/tmp/imapsync_hash && ssh root@ks5 chgrp www /var/tmp/imapsync_hash
scp /var/tmp/imapsync_hash root@ks6:/var/tmp/imapsync_hash && ssh root@ks6 chgrp www-data /var/tmp/imapsync_hash
scp /var/tmp/imapsync_hash root@vp3:/var/tmp/imapsync_hash && ssh root@vp3 chgrp www-data /var/tmp/imapsync_hash
scp /var/tmp/imapsync_hash root@vp4:/var/tmp/imapsync_hash && ssh root@vp4 chgrp apache /var/tmp/imapsync_hash
scp /var/tmp/imapsync_hash root@i050:/var/tmp/imapsync_hash && ssh root@i050 chgrp www-data /var/tmp/imapsync_hash
test_cgi_all:
curl -v --data 'testslive=1;exitonload=0' https://imapsync.lamiral.info/cgi-bin/imapsync 2>/dev/null | grep 'Exiting with return value 0' # ks5
curl -v --data 'testslive=1;exitonload=0' https://i006.lamiral.info/cgi-bin/imapsync 2>/dev/null | grep 'Exiting with return value 0'
curl -v --data 'testslive=1;exitonload=0' https://i007.lamiral.info/cgi-bin/imapsync 2>/dev/null | grep 'Exiting with return value 0'
curl -v --data 'testslive=1;exitonload=0' https://i013.lamiral.info/cgi-bin/imapsync 2>/dev/null | grep 'Exiting with return value 0'
curl -v --data 'testslive=1;exitonload=0' https://i014.lamiral.info/cgi-bin/imapsync 2>/dev/null | grep 'Exiting with return value 0'
upload_cgi: upload_cgi_ks5 upload_cgi_vp3 upload_cgi_vp4 upload_cgi_ks6 upload_cgi_ks7
# FreeBSD
upload_cgi_ks5: ci_imapsync unitests ks5tests
rsync -P imapsync root@ks5.lamiral.info:/home/www/apache24/cgi-bin/imapsync_new
curl -v --data 'testslive=1;exitonload=0' https://imapsync.lamiral.info/cgi-bin/imapsync_new 2>/dev/null | grep 'Exiting with return value 0'
rsync -P imapsync root@ks5.lamiral.info:/home/www/apache24/cgi-bin/imapsync
curl -v --data 'testslive=1;exitonload=0' https://imapsync.lamiral.info/cgi-bin/imapsync 2>/dev/null | grep 'Exiting with return value 0'
# Debian
upload_cgi_vp3: ci_imapsync vp3tests
rsync -P imapsync root@vp3.lamiral.info:/usr/lib/cgi-bin/imapsync_new
curl -v --data 'testslive=1;exitonload=0' https://vp3.lamiral.info/cgi-bin/imapsync_new 2>/dev/null | grep 'Exiting with return value 0'
rsync -P imapsync root@vp3.lamiral.info:/usr/lib/cgi-bin/imapsync
curl -v --data 'testslive=1;exitonload=0' https://vp3.lamiral.info/cgi-bin/imapsync 2>/dev/null | grep 'Exiting with return value 0'
# Centos
upload_cgi_vp4: ci_imapsync vp4tests
rsync -P imapsync root@vp4.lamiral.info:/var/www/cgi-bin/imapsync_new
curl -v --data 'testslive=1;exitonload=0' https://vp4.lamiral.info/cgi-bin/imapsync_new 2>/dev/null | grep 'Exiting with return value 0'
rsync -P imapsync root@vp4.lamiral.info:/var/www/cgi-bin/imapsync
curl -v --data 'testslive=1;exitonload=0' https://vp4.lamiral.info/cgi-bin/imapsync 2>/dev/null | grep 'Exiting with return value 0'
# Debian
upload_cgi_ks6: ci_imapsync ks6tests
rsync -P imapsync root@ks6.lamiral.info:/usr/lib/cgi-bin/imapsync_new
curl -v --data 'testslive=1;exitonload=0' https://ks6.lamiral.info/cgi-bin/imapsync_new 2>/dev/null | grep 'Exiting with return value 0'
rsync -P imapsync root@ks6.lamiral.info:/usr/lib/cgi-bin/imapsync
curl -v --data 'testslive=1;exitonload=0' https://ks6.lamiral.info/cgi-bin/imapsync 2>/dev/null | grep 'Exiting with return value 0'
# Promox/Debian
upload_cgi_ks7: ci_imapsync ks7tests
rsync -P imapsync root@ks7.lamiral.info:/usr/lib/cgi-bin/imapsync_new
curl -v --data 'testslive=1;exitonload=0' https://ks7.lamiral.info/cgi-bin/imapsync_new 2>/dev/null | grep 'Exiting with return value 0'
rsync -P imapsync root@ks7.lamiral.info:/usr/lib/cgi-bin/imapsync
curl -v --data 'testslive=1;exitonload=0' https://ks7.lamiral.info/cgi-bin/imapsync 2>/dev/null | grep 'Exiting with return value 0'
# Debian
upload_cgi_cl1: ci_imapsync cl1tests
rsync -P imapsync root@cl1.lamiral.info:/usr/lib/cgi-bin/imapsync_new
curl -v --data 'testslive=1;exitonload=0' https://cl1.lamiral.info/cgi-bin/imapsync_new 2>/dev/null | grep 'Exiting with return value 0'
rsync -P imapsync root@cl1.lamiral.info:/usr/lib/cgi-bin/imapsync
curl -v --data 'testslive=1;exitonload=0' https://cl1.lamiral.info/cgi-bin/imapsync 2>/dev/null | grep 'Exiting with return value 0'
.PHONY: vp3tests vp4tests ks6tests
vp3tests:
rsync -P imapsync root@vp3.lamiral.info:imapsync
ssh root@vp3.lamiral.info ./imapsync --tests
ssh root@vp3.lamiral.info ./imapsync --testslive6
vp4tests:
rsync -P imapsync root@vp4.lamiral.info:imapsync
ssh root@vp4.lamiral.info ./imapsync --tests
ssh root@vp4.lamiral.info ./imapsync --testslive6
ks6tests:
rsync -P imapsync root@ks6.lamiral.info:imapsync
ssh root@ks6.lamiral.info ./imapsync --tests
ssh root@ks6.lamiral.info ./imapsync --testslive6
ks7tests:
rsync -P imapsync root@ks7.lamiral.info:imapsync
ssh root@ks7.lamiral.info ./imapsync --tests
ssh root@ks7.lamiral.info ./imapsync --testslive6
cl1tests:
rsync -P imapsync root@cl1.lamiral.info:imapsync
ssh root@cl1.lamiral.info ./imapsync --tests
ssh root@cl1.lamiral.info ./imapsync --testslive6
upload_imapsync_all:
scp imapsync INSTALL.d/prerequisites_imapsync W/learn/processtable root@i005.lamiral.info:
scp imapsync INSTALL.d/prerequisites_imapsync W/learn/processtable root@i006.lamiral.info:
scp imapsync INSTALL.d/prerequisites_imapsync W/learn/processtable root@i013.lamiral.info:
scp imapsync INSTALL.d/prerequisites_imapsync W/learn/processtable root@i014.lamiral.info:
upload_X:
./W/tools/validate_xml_html5 X/index.html X/imapsync_form.html X/imapsync_form_extra.html X/imapsync_form_extra_free.html X/imapsync_form_wrapper.html
rcsdiff X/imapsync_form.html X/imapsync_form_extra.html X/imapsync_form_wrapper.html X/imapsync_form.css X/noscript.css
rcsdiff X/imapsync_form.js X/imapsync_form_wrapper.js
./W/tools/validate_xml_html5 X/imapsync_form.html X/imapsync_form_extra.html X/imapsync_form_extra_free.html X/imapsync_form_wrapper.html X/proximapsync_form_extra_free.html
rcsdiff X/imapsync_form.html X/imapsync_form_extra.html X/imapsync_form_extra_free.html X/imapsync_form_wrapper.html X/proximapsync_form_extra_free.html
rcsdiff X/imapsync_form.css X/noscript.css
rcsdiff X/imapsync_form.js X/imapsync_form_wrapper.js X/proximapsync_form.js
rcsdiff INSTALL.d/INSTALL.OnlineUI.txt
rsync -a ./INSTALL.d/INSTALL.OnlineUI.txt ../imapsync_website/INSTALL.d/INSTALL.OnlineUI.txt
rsync -av --delete X/ ../imapsync_website/X/
rsync -aHvz --delete ../imapsync_website/ root@ks5.lamiral.info:/usr/local/www/apache24/data/imapsync/
upload_csv:
./W/tools/validate_xml_html5 X/sandbox_csv.html
rcsdiff X/sandbox_csv.html X/sandbox_csv.js X/imapsync_csv_wrapper
rsync -a X/sandbox_csv.html X/sandbox_csv.js X/imapsync_csv_wrapper ../imapsync_website/X/
rsync -aHvz X/sandbox_csv.html X/sandbox_csv.js X/imapsync_csv_wrapper root@ks5.lamiral.info:/usr/local/www/apache24/data/imapsync/X/
rsync X/imapsync_csv_wrapper root@ks5.lamiral.info:/home/www/apache24/cgi-bin/
upload_FAQ:
rcsdiff FAQ.d/*.txt LICENSE CREDITS TODO INSTALL.d/*.txt
rsync -avH FAQ INSTALL CREDITS TODO ../imapsync_website/
@ -878,6 +1091,10 @@ upload_FAQ:
rsync -avH --delete ./doc/ ../imapsync_website/doc/
rsync -aHvz --delete ../imapsync_website/ root@ks5.lamiral.info:/usr/local/www/apache24/data/imapsync/
upload_oauth2:
rm -f oauth2/D_oauth2_*
rsync -aHv --delete ./oauth2/ ../imapsync_website/oauth2/
rsync -aHvz --delete ../imapsync_website/ root@ks5.lamiral.info:/usr/local/www/apache24/data/imapsync/
upload_ks_W_memo:
rsync -av W/memo gilles@ks.lamiral.info:public_html/imapsync/W/memo
@ -891,8 +1108,9 @@ upload_ks: ci tarball
rsync -aHv --delete ./INSTALL.d/ ../imapsync_website/INSTALL.d/
rsync -aHv --delete ./FAQ.d/ ../imapsync_website/FAQ.d/
rsync -avH --delete ./doc/ ../imapsync_website/doc/
rsync -avH --delete ./W/tools/ ../imapsync_website/W/tools/
rsync -aHvz --delete ../imapsync_website/ root@ks5.lamiral.info:/usr/local/www/apache24/data/imapsync/
ssh root@ks.lamiral.info 'apachectl configtest && /etc/init.d/apache2 reload'
ssh root@ks.lamiral.info 'apachectl configtest && apachectl reload'
upload_ks5:

140
README
View File

@ -6,7 +6,7 @@ NAME
VERSION
This documentation refers to Imapsync $Revision: 2.140 $
This documentation refers to Imapsync $Revision: 2.229 $
USAGE
@ -38,7 +38,7 @@ DESCRIPTION
that are on the destination side but not on the source side stay as they
are. See the --delete2 option to have strict sync and delete them.
How imapsync know a message is already on both sides? Same specific
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 but this
choice can be changed with the --useheader option, most often a
@ -46,8 +46,8 @@ DESCRIPTION
All flags are preserved, unread messages will stay unread, read ones
will stay read, deleted will stay deleted. In the IMAP protocol, a
deleted message is not really deleted, it is marked \Deleted and can be
undelete. Real destruction comes with the EXPUNGE or UIDEXPUNGE IMAP
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
@ -76,16 +76,35 @@ DESCRIPTION
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 use the sizes
given by the imap servers to calculate the big 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 meaning all
messages in A will be in B but no more.
For this, option --delete2 can be used, it deletes 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.
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
@ -114,18 +133,19 @@ OPTIONS
usage: imapsync [options]
The standard options are the six values forming the credentials. Three
values on each side are needed in order to login into the IMAP servers.
These six values are a hostname, a username, and a password, two times.
values on each side are needed to login into the IMAP servers. These six
values are a hostname, a username, and a password, two times.
Conventions used in the following descriptions of the options:
Here are the conventions used in the following descriptions of the
options:
str means string
int means integer number
flo means float number
reg means regular expression
cmd means command
str means a string
int means an integer number
flo means a float number
reg means a regular expression
cmd means a command
--dry : Makes imapsync doing nothing for real; it just print what
--dry : Makes imapsync do nothing for real; it just prints what
would be done without --dry.
OPTIONS/credentials
@ -182,16 +202,6 @@ OPTIONS
--sslargs2 str : Pass any ssl parameter for host2 ssl or tls connection.
See --sslargs1
--timeout1 flo : Connection timeout in seconds for host1.
Default is 120 and 0 means no timeout at all.
--timeout2 flo : Connection timeout in seconds for host2.
Default is 120 and 0 means no timeout at all.
Caveat, under CGI context, you may encounter a timeout
from the webserver, killing imapsync and the imap connexions.
See the document INSTALL.OnlineUI.txt and search
for "Timeout" for how to deal with this issue.
OPTIONS/authentication
--authmech1 str : Auth mechanism to use with host1:
@ -215,7 +225,7 @@ OPTIONS
It will be combined with the --user1 value to form the
string to pass with XOAUTH2 authentication.
The password given by --password1 or --passfile1
is ignored.
is ignored but needed on the command line.
Instead of the access token itself, the value can be a
file containing the access token on the first line.
If the value is a file, imapsync reads its first line
@ -229,7 +239,8 @@ OPTIONS
--oauthdirect1 str : The direct string to pass with XOAUTH2 authentication.
The password given by --password1 or --passfile1 and
the user given by --user1 are ignored.
the user given by --user1 are ignored but they are
needed to be on the command line. Consider it a bug.
--oauthdirect2 str : same thing as oauthdirect1
@ -247,9 +258,9 @@ OPTIONS
--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).
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.
@ -279,7 +290,7 @@ OPTIONS
--subfolder1 str : Syncs the host1 folders hierarchy which is under folder
str to the root hierarchy of host2.
It's the couterpart of a sync done by --subfolder2
It's the counterpart of a sync done by --subfolder2
when doing it in the reverse order.
Backup/Restore scenario:
Use --subfolder2 str for a backup to the folder str
@ -358,7 +369,7 @@ OPTIONS
2019_12_22_23_57_59_532 is nearly the date of the start
YYYY_MM_DD_HH_MM_SS_mmm
year_month_day_hour_minute_seconde_millisecond
year_month_day_hour_minute_second_millisecond
and user1 user2 are the --user1 --user2 values.
@ -395,6 +406,12 @@ OPTIONS
Example: 's/\000/ /g' # to replace null characters
by spaces.
--regexmess reg : and this one, etc.
--truncmess int : truncates messages when their size exceed 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.
OPTIONS/labels
@ -595,6 +612,26 @@ OPTIONS
OPTIONS/behavior
--timeout1 flo : Connection timeout in seconds for host1.
Default is 120 and 0 means no timeout at all.
--timeout2 flo : Connection timeout in seconds for host2.
Default is 120 and 0 means no timeout at all.
Caveat, under CGI context, you may encounter a timeout
from the webserver, killing imapsync and the imap connections.
See the document INSTALL.OnlineUI.txt and 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 enables SO_KEEPALIVE on the host1 socket.
--keepalive1 is on by default since imapsync release 2.169
Use --nokeepalive1 to disable it.
--keepalive2 : Same as --keepalive2 but for host2.
Use --nokeepalive2 to disable it.
--maxmessagespersecond flo : limits the average number of messages
transferred per second.
@ -617,6 +654,12 @@ OPTIONS
it's an http request to
http://imapsync.lamiral.info/prj/imapsync/VERSION
--emailreport1 : Put the email final report in host1 INBOX
--emailreport2 : Put the email final report in host2 INBOX
--noemailreport1 : Do not put the email final report in host1 INBOX
--noemailreport2 : Do not put the email final report in host2 INBOX
--noid : Do not send/receive IMAP "ID" command to imap servers.
--justconnect : Just connect to both servers and print useful
@ -710,8 +753,8 @@ LICENSE AND COPYRIGHT
Imapsync is free, open, public but not always gratis software cover by
the NOLIMIT Public License, now called NLPL. See the LICENSE file
included in the distribution or just read this simple sentence as it IS
the licence text:
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."
@ -728,7 +771,7 @@ AUTHOR
Good feedback is always welcome. Bad feedback is very often welcome.
Gilles LAMIRAL earns his living by writing, installing, configuring and
sometimes teaching free, open and often gratis software. Imapsync used
sometimes teaching free, open, and often gratis software. Imapsync used
to be "always gratis" but now it is only "often gratis" because imapsync
is sold by its author, your servitor, a good way to maintain and support
free open public software tools over decades.
@ -780,19 +823,19 @@ INSTALL
Imapsync works under most Windows (2000, XP, Vista, Seven, Eight, Ten
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 in order to avoid always typing
the options. There is also a 32bit binary called imapsync_32bit.exe
as a standalone binary software called imapsync.exe, usually launched
from a batch file in order to avoid always typing the options. There
is also a 32bit binary called imapsync_32bit.exe
Imapsync works under OS X as a standalone binary
software called imapsync_bin_Darwin
Imapsync works under OS X as a standalone binary software called
imapsync_bin_Darwin
Purchase latest imapsync at
https://imapsync.lamiral.info/
You'll receive a link to a compressed tarball called imapsync-x.xx.tgz
where x.xx is the version number. Untar the tarball where
you want (on Unix):
You'll receive a link to a compressed tarball called
imapsync-x.xx.tgz where x.xx is the version number.
Untar the tarball where you want (on Unix):
tar xzvf imapsync-x.xx.tgz
@ -837,7 +880,7 @@ SIMILAR SOFTWARE
imapmigrate: http://sourceforge.net/projects/cyrus-utils/
larch: https://github.com/rgrove/larch (derived from wonko_imapsync, good at Gmail)
wonko_imapsync: http://wonko.com/article/554 (superseded by larch)
pop2imap: http://www.linux-france.org/prj/pop2imap/ (I wrote that too)
pop2imap: https://pop2imap.lamiral.info/ (I wrote that too)
exchange-away: http://exchange-away.sourceforge.net/
SyncBackPro: http://www.2brightsparks.com/syncback/sbpro.html
ImapSyncClient: https://github.com/ridaamirini/ImapSyncClient
@ -848,6 +891,7 @@ SIMILAR SOFTWARE
BitRecover email-backup 99 USD, 299 USD https://www.bitrecover.com/email-backup/.
ImportExportTools: https://addons.thunderbird.net/en-us/thunderbird/addon/importexporttools/ ImportExportTools for Mozilla Thunderbird by Paolo Kaosmos. ImportExportTools does not do IMAP.
rximapmail: https://sourceforge.net/projects/rximapmail/
Shoviv: https://www.shoviv.com/email-backup.html Allows backup from various sources including Office 365 (Exchange Online, Exchange On-Premises), IMAP, and Google Workspace.
CodeTwo: https://www.codetwo.com/ but CodeTwo does imap source to Office365 only.
HISTORY

View File

@ -1,4 +1,4 @@
# $Id: README_Windows.txt,v 1.24 2021/06/15 10:29:45 gilles Exp gilles $
# $Id: README_Windows.txt,v 1.27 2022/04/05 19:45:21 gilles Exp gilles $
#
# This is the README_Windows.txt file for imapsync
# imapsync: IMAP syncing and migration tool.
@ -21,48 +21,52 @@ A) Simplest way
A.0) Preamble for visual users looking for a visual tool.
First, the visual thing I am talking about here is not the online visual
interface I call /X that you might have seen and used at the URL
https://imapsync.lamiral.info/X/
First, the visual thing I am talking about here is not the online
visual interface I call /X that you might have seen and used at the
URL https://imapsync.lamiral.info/X/
This /X visual interface is not yet available on Windows as a service
that you can install and use in your system.
I plan to make a visual tool available on Windows but, for now,
I encountered technical issues.
that you can install and use in your system. I plan to make a visual
tool available on Windows but, for now, I encountered technical
issues.
So what visual thing am I talking about?
Imapsync itself is not a visual tool. The visual tool is Notepad or
any text editor. Many pure visual users have succeeded in using
imapsync to transfer their email accounts. As you can guess, only
the ones that tried have succeeded, so don't give up before
trying at least once. Another assumption is that visual users can read.
imapsync to transfer their email accounts. As you can guess, only the
ones that tried have succeeded, so don't give up before trying at
least once. Another assumption is that visual users can read.
Let's go for some reading!
A.1) Get imapsync.
Get imapsync at https://imapsync.lamiral.info/
You'll then have access to a zip archive file named imapsync_1.977.zip
where 1.977 is the imapsync release number.
You'll then have access to a zip archive file named imapsync_2.200.zip
where 2.200 is the imapsync release number.
A.2) Extract the zip file in a folder where you will work with imapsync.
You can work on the Desktop since the zip file extraction creates
a unique folder named imapsync_1.977/
a unique folder named imapsync_2.200/
Do not unzip the archive in what is called a "system" directory since
you may encounter permission issues.
Two-point to have in mind:
Two points to have in mind:
* You don't need to be an Administrator to unzip the zip archive.
* You don't need to be an Administrator to run imapsync.
In short, any user on your system can use imapsync.
A.3) Check the folder
In the folder extracted imapsync_1.977 you see 7 files and 2 directories,
which may be presented in a different order than the following, the order
is not important anyway. The really important files to get your mailbox
transfer job started in a few minutes are the first two files of the
In the folder extracted and called imapsync_2.200, you see 7 files
and 2 directories. Those files and directories may be presented in a
different order than the following, the order is not important
anyway. There are only two important files to get your mailbox
transfer job started in a few minutes, the first two files of the
following list:
* README_Windows.txt is the current file you are reading.
@ -80,90 +84,104 @@ A.3) Check the folder
You can copy or rename the file imapsync_example.bat as you wish,
as long as its extension remains ".bat", for example, mysync.bat
On Windows systems, a file name ending with a .bat extension means "I am a batch script".
A batch script is a file containing commands, it's a program.
Don't be afraid, a program can be very simple to modify and I hope
imapsync_example.bat is one of them.
On Windows systems, a file name ending with a .bat extension means
"I'm a batch script". A batch script is a file containing commands,
it's a program. Don't be afraid, a program can be very simple to
modify and I hope imapsync_example.bat is one of them.
The batch scripts have to stay in the same directory as
imapsync.exe because of the way they call imapsync.exe.
They use the string ".\imapsync.exe", so let them be in the same directory.
The batch scripts have to stay in the same directory as imapsync.exe
because of the way they call imapsync.exe. They use the string
".\imapsync.exe", so let them be in the same directory.
You can change the path .\ to whatever you want if you understand what
you are doing (you have to use a pathname from the script point of view).
You can change the path .\ to whatever you want if you understand
what you are doing (you have to use a pathname from the script point
of view).
For the rest of this documentation, I assume you copied
imapsync_example.bat to a file named mysync.bat
If you don't know how to copy and rename a file then use imapsync_example.bat
itself, it's ok. The original file is still in the zip file in case
you want to restart from scratch.
If you don't know how to copy and rename a file then use
imapsync_example.bat itself, it's ok. The original file is still in
the zip file in case you want to restart from scratch.
A.4) Edit the batch file
This section describes how to edit the file mysync.bat to change
the example values with yours.
This section describes how to edit the file mysync.bat and change
it by replacing example values with your values.
To edit mysync.bat, you have to right-click on it and select "modify"
in the list presented in the small window menu.
Notepad or Notepadd++ are very good editor candidates to modify it.
Notepad is already installed on any Windows system, Notepadd++
is not usually installed but if you have it then use it.
Notepad or Notepadd++ are very good editor candidates to modify the
script. Notepad is already installed on any Windows system,
Notepadd++ is not usually installed but if you have it, then use it.
Office Word or any powerful text processor is NOT good for that job.
Text processors transform files in a special format that is wrong to
make them stay a good batch file, so don't use them!
Files FAQ.txt and FAQ.d/* contain many tips and special options sometimes
needed by specific imap software servers like Exchange, Office365, or Gmail.
Those files are also available online at
The documents FAQ.txt and FAQ.d/* contain many tips. They describe
some special options that are sometimes needed by specific imap
software servers like Exchange, Office365, or Gmail.
Those documents are also available online at
https://imapsync.lamiral.info/FAQ.d/
You don't have to look into them unless you encounter problems.
A.5) Run the batch file
To run imapsync with your values just double-click on the batch file mysync.bat
To run imapsync with your values just double-click on the batch file
mysync.bat
There is no need to have administrator privileges to run imapsync.
The run happens in a DOS window; usually, this window is black.
If imapsync.exe returns immediately with the ERRORLEVEL -1, it may be
because you have a Group Policy in place to prevent the execution of
programs in the %TEMP% directory. Temporarily remove this restriction
and imapsync will work as expected. Thanks to Walter H. for this
input!
If imapsync.exe returns immediately with the ERRORLEVEL -1, it may be
because you have an Group Policy in place to prevent execution of
programs in %TEMP%. Temporarily remove this restriction and imapsync
will work as expected. Thanks to Walter H. for this input!
Technically imapsync.exe is an embedded Perl script with also Perl
and many Perl modules glued together in an archive auto-extracted.
Technically speaking, imapsync.exe is an embedded Perl script with
also the Perl interpreter and many Perl modules, all glued together
in an archive auto-extracted at run time. So it needs write-access to
the temporary directory. The temporary directory name depends on the
user but its value is in the variable %TEMP%. You can have the value
by running the command ECHO %TEMP% in a DOS window. You can have a
DOS window by launching the command cmd.exe
A.6) Look at the sync running.
You can abort the sync at any time with a quick double ctrl-c,
ie hit ctrl-c twice within one second.
You can abort the sync at any time with a quick double ctrl-c, hit
ctrl-c twice within one second.
A single ctrl-c will reconnect to both imap servers.
You can also simply abort the sync by closing the DOS window,
using the cross situated at the up-right corner.
You can also simply abort the sync by closing the DOS window, using
the cross situated at the up-right corner.
What you see in this DOS terminal is also put in a logfile located
in the subdirectory LOG_imapsync/
A.7) Control what happened.
When the sync is finished you can find the whole log file
of the output in the folder named "LOG_imapsync/".
The logfile name is based on the launching date,
hour, minute, second, milliseconds, plus the user1 and user2 parameters.
When the sync is finished you can find the whole log file of the
output in the folder named "LOG_imapsync/".
The logfile name is based on the launching date, hour, minute,
second, milliseconds, plus the user1 and user2 parameters.
For example, a file name can be
LOG_imapsync\2019_11_29_14_49_36_514_tata_titi.txt
There is one log file created for each run.
The log file name is printed at the end of the imapsync run.
There is one log file created for each run. The log file name is
printed both at the beginning and the end of the imapsync run.
IMPORTANT: When there is a problem, the problem is very often described
at the end of the log file. It means you don't have to read all this
bloody ununderstandable verbose logfile, just read the end first.
IMPORTANT: When there is a problem, the problem is very often
described at the end of the log file. It means you don't have to read
all this bloody ununderstandable verbose logfile, just read the end
first.
A.8) Loop on A.4 through A.7
@ -173,7 +191,7 @@ A.8) Loop on A.4 through A.7
* A.6) look at the run and the log file
* A.7) control what happened.
Loop on the process of editing, running, and controlling imapsync
Loop on the process of editing, running and controlling imapsync
until you solve all issues and the sync is over.
A good sign that the sync went very well is when the nearly last lines are like:
@ -195,8 +213,8 @@ This is the way for modifying imapsync.exe if needed.
B.1) Install Perl if it isn't already installed.
Strawberry Perl is a very good candidate
http://strawberryperl.com/
I use 5.30.1.1 (released 2019-11-22) but previous and later releases
should work as well (Perl 5.18 to 5.26 do).
I use 5.32.1.1 (released 2021-01-24) but previous and later releases
should work as well (Perl 5.18 to 5.30 do).
B.2) Go into the Cook/ directory
B.3) Double-click build_exe.bat
@ -205,4 +223,3 @@ It should create a binary imapsync.exe in the current Cook/ directory.
B.4) Move imapsync.exe in the upper directory and follow instructions
from A.3) to A.8)

View File

@ -57,7 +57,7 @@
<li> imapmigrate: <a href="http://sourceforge.net/projects/cyrus-utils/">http://sourceforge.net/projects/cyrus-utils/</a></li>
<li> larch: <a href="https://github.com/rgrove/larch">https://github.com/rgrove/larch</a> (derived from wonko_imapsync, good at Gmail)</li>
<li> wonko_imapsync: <a href="http://web.archive.org/web/20130807173030/http://wonko.com/post/ruby_script_to_sync_email_from_any_imap_server_to_gmail">http://wonko.com/article/554</a> (superseded by larch)</li>
<li> pop2imap: <a href="http://www.linux-france.org/prj/pop2imap/">http://www.linux-france.org/prj/pop2imap/</a> (I wrote that too)</li>
<li> pop2imap: <a href="https://pop2imap.lamiral.info/">https://pop2imap.lamiral.info/</a> (I wrote that too)</li>
<li> exchange-away: <a href="http://exchange-away.sourceforge.net/">http://exchange-away.sourceforge.net/</a></li>
<li> SyncBackPro: <a href="http://www.2brightsparks.com/syncback/sbpro.html">http://www.2brightsparks.com/syncback/sbpro.html</a></li>
@ -65,9 +65,13 @@
<li> MailStore: <a href="https://www.mailstore.com/en/products/mailstore-home/">https://www.mailstore.com/en/products/mailstore-home/</a></li>
<li> mnIMAPSync: <a href="https://github.com/manusa/mnIMAPSync">https://github.com/manusa/mnIMAPSync</a></li>
<li> imap-upload: <a href="http://imap-upload.sourceforge.net/">http://imap-upload.sourceforge.net/</a>
(A tool for uploading a local mbox file to IMAP4 server)</li>
(A tool to upload a local mbox file to IMAP4 server)</li>
<li> imapbackup: <a href="https://github.com/rcarmo/imapbackup">https://github.com/rcarmo/imapbackup</a>
(A Python script for incremental backups of IMAP mailboxes)</li>
(A Python script to incremental backups of IMAP mailboxes)</li>
<li> imap-backup: <a href="https://github.com/joeyates/imap-backup">https://github.com/joeyates/imap-backup</a>
(A Ruby script to backup GMail (or other IMAP) accounts to disk)</li>
<li> BitRecover email-backup <b>99 USD, 299 USD</b> <a href="https://www.bitrecover.com/email-backup/">https://www.bitrecover.com/email-backup/</a>.</li>
@ -87,12 +91,11 @@
</h1>
<p>These services are similar to the
<a href="https://imapsync.lamiral.info/X/" title="Free online service under 1 GB">imapsync <b>online service</b></a>
<a href="https://imapsync.lamiral.info/X/" title="Free online service under 3 GB">imapsync <b>online service</b></a>
I call /X. Some are an exact copy of /X, some are not, some use Imapsync, some don't.<br/>
I have no share in these free or paid services.
Prices are given par mailbox and may be outdated
(Last checked on Tuesday 10th November 2020).
Prices are given par mailbox and may be outdated (Last checked on Saturday 19 February 2022).
</p>
<h2>Imapsync based</h2>
@ -118,29 +121,28 @@ this is a better choice to avoid duplicates with some imap servers.
</p>
<ol>
<li> NameHero <b>0 USD</b>: <a href="https://imapsync.net/">https://imapsync.net/</a> (imapsync 2.140)</li>
<li> Slovenia Control Panel <b>0 USD</b>: <a href="https://tools.controlpanel.si/imapsync/">https://tools.controlpanel.si/imapsync/</a> (imapsync 1.810)</li>
<li> Intertune Cloud <b>0 USD</b>: <a href="https://tools.intertune.io/imapsync/X/" >https://tools.intertune.io/imapsync/X/</a> (imapsync 1.882)</li>
<li> Web Hosting Canada <b>0 USD</b>: <a href="https://imapsync.whc.ca/" >https://imapsync.whc.ca/</a> (imapsync 1.882)</li>
<li> BoomHost <b>0 USD</b>: <a href="https://imapsync.boomhost.com/" >https://imapsync.boomhost.com/</a> (imapsync 1.925)</li>
<li> WebHosting|4u (greek) <b>0 USD</b>: <a href="https://imapcopy.webhosting4u.gr/" >https://imapcopy.webhosting4u.gr/</a> (imapsync 1.977)</li>
<li> WebHosting|4u (greek) <b>0 USD</b>: <a href="https://imapcopy.webhosting4u.gr/" >https://imapcopy.webhosting4u.gr/</a> (imapsync 2.178)</li>
<li> Vimexx <b>0 USD</b>: <a href="https://imapsync.nl/" >https://imapsync.nl/</a> (imapsync 1.991)</li>
<li> Timetakernet <b>0 USD</b>: <a href="https://mailsync.timetakernet.info/" >https://mailsync.timetakernet.info/</a> (imapsync 1.998)</li>
<li> KeurigOnline <b>0 USD</b>: <a href="https://imapsync.keurigonline.nl/" >https://imapsync.keurigonline.nl/</a> (imapsync 1.998)</li>
<li> UK Migration Wizard <b>0 USD</b>: <a href="https://app.migrationwizard.co.uk/" >https://app.migrationwizard.co.uk/</a> (imapsync ?.???)</li>
</ol>
<h2>Not Imapsync based</h2>
<ol>
<li> Ovh migration <b>0 EUR</b>: <a href="https://omm.ovh.net/Migration/Create">https://omm.ovh.net/Migration/Create</a></li>
<li> Rackspace migration <b>0 USD</b>: <a href="http://www.rackspace.com/email-hosting/migrations">http://www.rackspace.com/email-hosting/migrations</a></li>
<li> Movemymail one free, 5 USD after: <a href="https://movemymail.net">https://movemymail.net/</a></li>
<li> TransferMyEmail 1.50 USD for a day pass: <a href="https://transfermyemail.ca/">https://transfermyemail.ca/</a></li>
<li> Migrationwiz 11.99 USD: <a href="https://www.bittitan.com/products/migrationwiz/">https://www.bittitan.com/products/migrationwiz/</a> </li>
<li> Audriga 11.90 EUR: <a href="https://www.groupware-migration.com/">https://www.groupware-migration.com/</a></li>
<li> Movemymail one free, <a href="https://movemymail.net/faq.php">5 USD</a> after: <a href="https://movemymail.net">https://movemymail.net/</a></li>
<li> TransferMyEmail <a href="https://transfermyemail.ca/shop/">1.50 USD</a> for a day pass: <a href="https://transfermyemail.ca/">https://transfermyemail.ca/</a></li>
<li> Migrationwiz <a href="https://www.bittitan.com/pricing/">12 USD</a>: <a href="https://www.bittitan.com/products/migrationwiz/">https://www.bittitan.com/products/migrationwiz/</a> </li>
<li> Audriga <a href="https://www.audriga.com/en/Self-service_migration/Pricing">11.90 EUR</a>: <a href="https://www.audriga.com/">https://www.audriga.com/</a></li>
<li> <del>Yippiemove 14.95 USD</del> (discontinued on April 2019): <a href="http://www.yippiemove.com">http://www.yippiemove.com/</a>
( See <a href="https://web.archive.org/web/20161027124328/https://www.yippiemove.com/help/faq_generic.html#imapsync">Yippiemove vs ImapSync</a> )</li>
<li> ShuttleCloud one free, 19.95 USD after <a href="https://www.shuttlecloud.com/">https://www.shuttlecloud.com/</a></li>
<li> Cloudasta ??? USD: <a href="https://cloudasta.com/">https://cloudasta.com/</a></li>
</ol>
<h2>Imap to files services</h2>
@ -182,7 +184,7 @@ alt="Viewable With Any Browser" />
<!--#config timefmt="%D" -->
<!--#config timefmt="%A %B %d, %Y" -->
<b>This document last modified on <!--#echo var="LAST_MODIFIED" --></b>
($Id: external.shtml,v 1.58 2021/06/30 20:34:23 gilles Exp gilles $)<br/>
($Id: external.shtml,v 1.61 2022/02/19 20:26:25 gilles Exp gilles $)<br/>
<a href="#TOP">Top of the page</a>
</p>

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@ -4,7 +4,7 @@
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" id="TOP">
<head>
<title>Imapsync list of the 86 imap server software applications supported</title>
<title>Imapsync list of the 88 imap server software applications supported</title>
<meta name="generator" content="Bluefish 2.2.2" />
<meta name="author" content="Gilles LAMIRAL" />
<meta name="date" content="2016-04-10T00:24:15+0200" />
@ -27,12 +27,13 @@
<body>
<h1>Imapsync list of the 86 imap server software applications supported (and the broken ones)
<h1>Imapsync list of the 88 imap server software applications supported (and the broken ones)
<a id="imap_server_success" href="../#TOP"><small>(back to menu)</small></a>
</h1>
<p>To know whether your IMAP server is a widespread choice,
take a look at <a href="http://openemailsurvey.org/">http://openemailsurvey.org/</a><br/>
take a look at <a href="http://openemailsurvey.org/">http://openemailsurvey.org/</a> or
the <a href="https://www.shodan.io/search/facet?query=imap&amp;facet=product">Shodan imap query result</a>.<br/>
The short answer is that if you're not using the famous <b>Dovecot</b> then you're in a niche!
</p>
@ -128,6 +129,9 @@ imapsync --host1 imap.gmail.com
<li>GMX IMAP4 StreamProxy. (<a href="http://www.gmx.com/">http://www.gmx.com/</a>) </li>
<li>Godaddy IMAP (since Godaddy runs Courier) (<a href="https://www.godaddy.com/">https://www.godaddy.com/</a>) </li>
<li>Gromox/Grammm IMAP server (<a href="https://docs.grammm.com/">https://docs.grammm.com/</a>)</li>
<li>Grommunio (<a href="https://grommunio.com/">https://grommunio.com/</a>)</li>
<li>Groupwise IMAP (Novell) 6.x and 7.0. Buggy so see the <a href="../FAQ.d/FAQ.Various_Software_Servers.txt">FAQ item about Groupwise</a>
(<a href="http://www.novell.com/products/groupwise/">http://www.novell.com/products/groupwise/</a>) </li>
<li>hMailServer 5.40-B1950 [host12], 5.3.3 [host2], 4.4.1 [host1], 5.3.2-B1769 [host2], 5.6 [host2]
@ -185,6 +189,8 @@ imapsync --host1 imap.gmail.com
<li>SunONE Messaging server 5.2, 6.0 (SUN JES - Java Enterprise System) (<a href="http://www.oracle.com/">http://www.oracle.com/</a>) </li>
<li>Sun Java(tm) System Messaging Server 6.2-2.05, 6.2-7.05, 6.3 (<a href="http://www.oracle.com/">http://www.oracle.com/</a>) </li>
<li>Surgemail 3.6f5-5, 6.3d-72 [host2] (<a href="http://netwinsite.com/surgemail/">http://netwinsite.com/surgemail/</a>) </li>
<li>Tegu mail server (<a href="https://mbk-lab.ru/">https://mbk-lab.ru/</a>)</li>
<li>UW-imap servers (imap-2000b) rijkkramer IMAP4rev1 2000.287
(RedHat uses UW like 2003.338rh), v12.264 Solaris 5.7 (OSI Approved)
(<a href="http://www.washington.edu/imap/">http://www.washington.edu/imap/</a>) </li>
@ -246,7 +252,7 @@ alt="Viewable With Any Browser" />
<!--#config timefmt="%D" -->
<!--#config timefmt="%A %B %d, %Y" -->
<b>This document last modified on <!--#echo var="LAST_MODIFIED" --></b>
($Id: imapservers.shtml,v 1.56 2021/06/08 09:56:54 gilles Exp gilles $)<br/>
($Id: imapservers.shtml,v 1.59 2022/06/02 10:45:27 gilles Exp gilles $)<br/>
<a href="#TOP">Top of the page</a>
</p>

View File

@ -1,100 +1,108 @@
1 Bahrein_________________ 0.01 % 100 % 0 % 99
1 Bolivie_________________ 0.01 % 100 % 0 % 98
1 Burkina_Faso____________ 0.01 % 100 % 0 % 97
1 Cameroun________________ 0.01 % 100 % 0 % 96
1 Coree_du_Sud____________ 0.01 % 100 % 0 % 95
1 Grenade_________________ 0.01 % 100 % 0 % 94
1 Iles_Feroe______________ 0.01 % 100 % 0 % 93
1 Iles_Vierges_britanniques__ 0.01 % 100 % 0 % 92
1 Jamaique________________ 0.01 % 100 % 0 % 91
1 Jordanie________________ 0.01 % 100 % 0 % 90
1 Kenya___________________ 0.01 % 100 % 0 % 89
1 Koweit__________________ 0.01 % 100 % 0 % 88
1 Maldives________________ 0.01 % 100 % 0 % 87
1 Monaco__________________ 0.01 % 100 % 0 % 86
1 Mongolie________________ 0.01 % 100 % 0 % 85
1 Namibie_________________ 0.01 % 100 % 0 % 84
1 Oman____________________ 0.01 % 100 % 0 % 83
1 Panama__________________ 0.01 % 100 % 0 % 82
1 Qatar___________________ 0.01 % 100 % 0 % 81
1 Republique_d'Azerbaidjan__ 0.01 % 100 % 0 % 80
1 Saint_Christophe-Nevis-Anguilla__ 0.01 % 100 % 0 % 79
1 Senegal_________________ 0.01 % 100 % 0 % 78
1 Tanzanie________________ 0.01 % 100 % 0 % 77
1 Trinite-et-Tobago_______ 0.01 % 100 % 0 % 76
2 Albanie_________________ 0.03 % 100 % 0 % 75
2 Antilles_neerlandaises__ 0.03 % 100 % 0 % 74
2 Arabie_Saoudite_________ 0.03 % 100 % 0 % 73
2 Bosnie-Herzegovine______ 0.03 % 100 % 0 % 72
2 Colombie________________ 0.03 % 100 % 0 % 71
2 Ile_Maurice_____________ 0.03 % 100 % 0 % 70
2 Moldavie________________ 0.03 % 100 % 0 % 69
2 Nouvelle-Caledonie______ 0.03 % 100 % 0 % 68
2 Perou___________________ 0.03 % 99 % 1 % 67
3 Costa_Rica______________ 0.04 % 99 % 1 % 66
3 Maroc___________________ 0.04 % 99 % 1 % 65
3 Nigeria_________________ 0.04 % 99 % 1 % 64
3 Taiwan__________________ 0.04 % 99 % 1 % 63
3 Ukraine_________________ 0.04 % 99 % 1 % 62
3 Venezuela_______________ 0.04 % 99 % 1 % 61
4 Indonesie_______________ 0.05 % 99 % 1 % 60
4 Serbie__________________ 0.05 % 99 % 1 % 59
4 Turquie_________________ 0.05 % 99 % 1 % 58
4 Uruguay_________________ 0.05 % 99 % 1 % 57
4 Vietnam_________________ 0.05 % 99 % 1 % 56
5 Ireland_________________ 0.06 % 99 % 1 % 55
5 Philippines_____________ 0.06 % 99 % 1 % 54
6 Egypte__________________ 0.08 % 99 % 1 % 53
6 Lituanie________________ 0.08 % 99 % 1 % 52
7 Islande_________________ 0.09 % 99 % 1 % 51
7 Malte___________________ 0.09 % 99 % 1 % 50
7 Russie,_Federation______ 0.09 % 99 % 1 % 49
8 Bulgarie________________ 0.10 % 98 % 2 % 48
8 Estonie_________________ 0.10 % 98 % 2 % 47
10 Chypre__________________ 0.13 % 98 % 2 % 46
10 Lettonie________________ 0.13 % 98 % 2 % 45
11 Croatie_________________ 0.14 % 98 % 2 % 44
11 Emirats_Arabes_Unis_____ 0.14 % 98 % 2 % 43
12 Thailande_______________ 0.15 % 98 % 2 % 42
15 Israel__________________ 0.19 % 98 % 2 % 41
16 Chine___________________ 0.20 % 97 % 3 % 40
18 Malaisie________________ 0.23 % 97 % 3 % 39
18 Singapour_______________ 0.23 % 97 % 3 % 38
20 Argentine_______________ 0.25 % 97 % 3 % 37
20 Chili___________________ 0.25 % 96 % 4 % 36
20 Luxembourg______________ 0.25 % 96 % 4 % 35
20 Slovenie________________ 0.25 % 96 % 4 % 34
23 Mexique_________________ 0.29 % 96 % 4 % 33
24 Slovaquie_______________ 0.30 % 95 % 5 % 32
26 Hong-Kong_______________ 0.33 % 95 % 5 % 31
27 Inde____________________ 0.34 % 95 % 5 % 30
27 Irlande_________________ 0.34 % 94 % 6 % 29
28 Grece___________________ 0.35 % 94 % 6 % 28
29 Afrique_du_Sud__________ 0.36 % 94 % 6 % 27
30 Roumanie________________ 0.38 % 93 % 7 % 26
31 Russie__________________ 0.39 % 93 % 7 % 25
32 Japon___________________ 0.40 % 93 % 7 % 24
36 Nouvelle-Zelande________ 0.45 % 92 % 8 % 23
40 ________________________ 0.50 % 92 % 8 % 22
41 Hongrie_________________ 0.52 % 91 % 9 % 21
45 Portugal________________ 0.57 % 91 % 9 % 20
55 Finlande________________ 0.69 % 90 % 10 % 19
56 Norvege_________________ 0.70 % 90 % 10 % 18
61 Republique_tcheque______ 0.77 % 89 % 11 % 17
85 Bresil__________________ 1.07 % 88 % 12 % 16
105 Danemark________________ 1.32 % 87 % 13 % 15
107 Pologne_________________ 1.35 % 86 % 14 % 14
122 Suede___________________ 1.53 % 84 % 16 % 13
135 Belgique________________ 1.70 % 83 % 17 % 12
170 Espagne_________________ 2.14 % 81 % 19 % 11
186 Autriche________________ 2.34 % 79 % 21 % 10
249 Australie_______________ 3.13 % 77 % 23 % 9
301 Suisse__________________ 3.79 % 73 % 27 % 8
317 Canada__________________ 3.99 % 70 % 30 % 7
354 Pays-Bas________________ 4.45 % 66 % 34 % 6
407 France__________________ 5.12 % 61 % 39 % 5
498 Italie__________________ 6.26 % 56 % 44 % 4
703 Royaume-Uni_____________ 8.84 % 50 % 50 % 3
1568 Allemagne_______________ 19.72 % 41 % 59 % 2
1693 Etats-Unis______________ 21.29 % 21 % 79 % 1
TOTAL = 7951 sales 407161 EUR over 99 countries on Wed Dec 2 12:24:33 CET 2020
1 Bahrein_________________ 0.01 % 100 % 0 % 107
1 Bolivie_________________ 0.01 % 100 % 0 % 106
1 Botswana________________ 0.01 % 100 % 0 % 105
1 Burkina_Faso____________ 0.01 % 100 % 0 % 104
1 Cameroun________________ 0.01 % 100 % 0 % 103
1 Coree_du_Sud____________ 0.01 % 100 % 0 % 102
1 Equateur________________ 0.01 % 100 % 0 % 101
1 Grenade_________________ 0.01 % 100 % 0 % 100
1 Guatemala_______________ 0.01 % 100 % 0 % 99
1 Honduras________________ 0.01 % 100 % 0 % 98
1 Iles_Feroe______________ 0.01 % 100 % 0 % 97
1 Iles_Vierges_britanniques__ 0.01 % 100 % 0 % 96
1 Jamaique________________ 0.01 % 100 % 0 % 95
1 Jordanie________________ 0.01 % 100 % 0 % 94
1 Koweit__________________ 0.01 % 100 % 0 % 93
1 Madagascar______________ 0.01 % 100 % 0 % 92
1 Maldives________________ 0.01 % 100 % 0 % 91
1 Monaco__________________ 0.01 % 100 % 0 % 90
1 Mongolie________________ 0.01 % 100 % 0 % 89
1 Mozambique______________ 0.01 % 100 % 0 % 88
1 Namibie_________________ 0.01 % 100 % 0 % 87
1 Polynesie_francaise_____ 0.01 % 100 % 0 % 86
1 Qatar___________________ 0.01 % 100 % 0 % 85
1 Republique_d'Azerbaidjan__ 0.01 % 100 % 0 % 84
1 Saint_Christophe-Nevis-Anguilla__ 0.01 % 100 % 0 % 83
1 Salvador________________ 0.01 % 100 % 0 % 82
1 Trinite-et-Tobago_______ 0.01 % 100 % 0 % 81
2 Albanie_________________ 0.02 % 100 % 0 % 80
2 Antilles_neerlandaises__ 0.02 % 100 % 0 % 79
2 Arabie_Saoudite_________ 0.02 % 100 % 0 % 78
2 Bosnie-Herzegovine______ 0.02 % 100 % 0 % 77
2 Ile_Maurice_____________ 0.02 % 100 % 0 % 76
2 Moldavie________________ 0.02 % 100 % 0 % 75
2 Nouvelle-Caledonie______ 0.02 % 100 % 0 % 74
2 Oman____________________ 0.02 % 100 % 0 % 73
2 Panama__________________ 0.02 % 100 % 0 % 72
2 Senegal_________________ 0.02 % 99 % 1 % 71
2 Tanzanie________________ 0.02 % 99 % 1 % 70
3 Colombie________________ 0.03 % 99 % 1 % 69
3 Kenya___________________ 0.03 % 99 % 1 % 68
3 Maroc___________________ 0.03 % 99 % 1 % 67
3 Taiwan__________________ 0.03 % 99 % 1 % 66
3 Ukraine_________________ 0.03 % 99 % 1 % 65
4 Costa_Rica______________ 0.04 % 99 % 1 % 64
4 Nigeria_________________ 0.04 % 99 % 1 % 63
4 Perou___________________ 0.04 % 99 % 1 % 62
4 Serbie__________________ 0.04 % 99 % 1 % 61
4 Turquie_________________ 0.04 % 99 % 1 % 60
4 Venezuela_______________ 0.04 % 99 % 1 % 59
4 Vietnam_________________ 0.04 % 99 % 1 % 58
5 Indonesie_______________ 0.06 % 99 % 1 % 57
5 Ireland_________________ 0.06 % 99 % 1 % 56
5 Uruguay_________________ 0.06 % 99 % 1 % 55
6 Egypte__________________ 0.07 % 99 % 1 % 54
6 Philippines_____________ 0.07 % 99 % 1 % 53
8 Islande_________________ 0.09 % 99 % 1 % 52
8 Malte___________________ 0.09 % 99 % 1 % 51
9 Lituanie________________ 0.10 % 98 % 2 % 50
10 Bulgarie________________ 0.11 % 98 % 2 % 49
10 Estonie_________________ 0.11 % 98 % 2 % 48
10 Russie,_Federation______ 0.11 % 98 % 2 % 47
11 Lettonie________________ 0.12 % 98 % 2 % 46
12 Croatie_________________ 0.13 % 98 % 2 % 45
12 Emirats_Arabes_Unis_____ 0.13 % 98 % 2 % 44
12 Thailande_______________ 0.13 % 98 % 2 % 43
15 Chypre__________________ 0.17 % 98 % 2 % 42
15 Israel__________________ 0.17 % 97 % 3 % 41
16 Chine___________________ 0.18 % 97 % 3 % 40
19 Singapour_______________ 0.21 % 97 % 3 % 39
21 Argentine_______________ 0.23 % 97 % 3 % 38
22 Luxembourg______________ 0.24 % 97 % 3 % 37
24 Chili___________________ 0.27 % 96 % 4 % 36
24 Malaisie________________ 0.27 % 96 % 4 % 35
27 Hong-Kong_______________ 0.30 % 96 % 4 % 34
27 Slovenie________________ 0.30 % 96 % 4 % 33
28 Slovaquie_______________ 0.31 % 95 % 5 % 32
30 Inde____________________ 0.33 % 95 % 5 % 31
30 Mexique_________________ 0.33 % 95 % 5 % 30
31 Russie__________________ 0.34 % 94 % 6 % 29
32 Irlande_________________ 0.36 % 94 % 6 % 28
33 Japon___________________ 0.37 % 94 % 6 % 27
34 Roumanie________________ 0.38 % 93 % 7 % 26
39 Afrique_du_Sud__________ 0.43 % 93 % 7 % 25
39 Grece___________________ 0.43 % 92 % 8 % 24
41 Nouvelle-Zelande________ 0.46 % 92 % 8 % 23
49 Hongrie_________________ 0.55 % 91 % 9 % 22
58 Finlande________________ 0.65 % 91 % 9 % 21
60 Portugal________________ 0.67 % 90 % 10 % 20
61 Norvege_________________ 0.68 % 90 % 10 % 19
65 ________________________ 0.72 % 89 % 11 % 18
69 Republique_tcheque______ 0.77 % 88 % 12 % 17
102 Bresil__________________ 1.13 % 87 % 13 % 16
116 Danemark________________ 1.29 % 86 % 14 % 15
127 Suede___________________ 1.41 % 85 % 15 % 14
148 Belgique________________ 1.65 % 84 % 16 % 13
150 Pologne_________________ 1.67 % 82 % 18 % 12
206 Autriche________________ 2.29 % 80 % 20 % 11
210 Espagne_________________ 2.34 % 78 % 22 % 10
275 Australie_______________ 3.06 % 76 % 24 % 9
319 Suisse__________________ 3.55 % 73 % 27 % 8
347 Canada__________________ 3.86 % 69 % 31 % 7
404 Pays-Bas________________ 4.50 % 65 % 35 % 6
511 France__________________ 5.69 % 61 % 39 % 5
592 Italie__________________ 6.59 % 55 % 45 % 4
793 Royaume-Uni_____________ 8.82 % 48 % 52 % 3
1720 Allemagne_______________ 19.14 % 40 % 60 % 2
1837 Etats-Unis______________ 20.44 % 20 % 80 % 1
TOTAL = 8987 sales 467605 EUR over 107 countries on Mon Mar 28 11:40:45 CEST 2022

View File

@ -61,8 +61,8 @@ http://www.w3schools.com/html/html5_browsers.asp
<p>
The <b>list archives</b> are available at
<a href="http://www.linux-france.org/prj/imapsync_list/">
http://linux-france.org/prj/imapsync_list/</a><br />
<a href="https://web.archive.org/web/20211024051744/http://linux-france.org/prj/imapsync_list/">
https://web.archive.org/web/20211024051744/http://linux-france.org/prj/imapsync_list/</a><br />
So consider that the list is public, anyone can see your post.<br />
<i>Use a pseudonym or do not post to
this list if you want to stay private</i>.<br />

View File

@ -58,11 +58,11 @@ If you are very interrested in those projects, don't hesitate to solicit me!
<!--
<ul>
<li><b>2.xxx</b></li>
<li><b>2.230</b></li>
<li><b>General</b>: </li>
<li><b>Dependencies removed</b>: None </li>
<li><b>Dependencies added</b>: None </li>
<li><b>Dependencies removed</b>: None </li>
<li><b>Enhancement</b>: </li>
<li><b>Enhancement</b>: </li>
@ -82,9 +82,125 @@ If you are very interrested in those projects, don't hesitate to solicit me!
<li><b>Portability</b>: </li>
<li><b>Portability</b>: </li>
<li><b>CGI context</b>: </li>
<li><b>CGI context</b>: </li>
<li><b>CGI context</b>: </li>
<li><b>CGI context</b>: </li>
</ul>
-->
<ul>
<li><b>2.229</b></li>
<li><b>General</b>: </li>
<li><b>Dependencies added</b>: Proc::ProcessTable </li>
<li><b>Dependencies removed</b>: None </li>
<li><b>Enhancement</b>: Added a stat value: memory footprint times time spent during the sync. The unity is MiB * hour. The stat line is "Memory consumption at the end".</li>
<li><b>Enhancement</b>: Filtering buggy flags is now case insensitive. \Junk or \JUNK or \jUnK etc. (sub tests_filterbuggyflags)</li>
<li><b>Enhancement</b>: Added --memorystress to check memory crunching in normal run.</li>
<li><b>Usability</b>: Do not email final reports by default. Use --emailreport1 and --emailreport2 to add final emails reports in each INBOX.</li>
<li><b>CGI context</b>:
<ul>
<li>Refuse to serve when the cpu load is greater than 1 per cpu. A load of 3.9 with 4 cores is ok, 4.1 is not. (sub heavy_load_reached_by_cpu)</li>
<li>Refuse to serve when the RAM memory available for imapsync processes is less than 1 GB, presented by percentage on the first line like "64.80% used by processes". (sub heavy_load_percent_threshold)</li>
<li>When refuse to serve, exits with value 69 EX_UNAVAILABLE</li>
</ul>
</li>
<li><b>Testing</b>: 1992 unit tests</li>
</ul>
<ul>
<li><b>2.200</b></li>
<li><b>Dependencies removed</b>: None </li>
<li><b>Dependencies added</b>: None </li>
<li><b>Enhancement</b>: Append a final email report on each account at the end of the synchronization. Use --noemailreport1 and --noemailreport2 to avoid final emails reports in each INBOX.</li>
<li><b>Enhancement</b>: Documented why total sizes can differ even when the sync is perfect.</li>
<li><b>Enhancement</b>: Added SERVER_NAME SERVER_ADDR SERVER_ADMIN variables and values to the output.</li>
<li><b>Enhancement</b>: Added the local ip address for the imap connexions. It can help configuring firewalls to allow the imap source IP.</li>
<li><b>Enhancement</b>: Added "Posta inviata" for \Sent with --automap</li>
<li><b>CGI context</b>: Upped ERRORS_MAX_CGI from 20 to 500.</li>
<li><b>CGI context</b>: Added --var to get values from proximapsync for variables REMOTE_ADDR REMOTE_HOST HTTP_REFERER HTTP_USER_AGENT SERVER_SOFTWARE SERVER_PORT HTTP_COOKIE</li>
<li><b>Usability</b>: Added warning "parsing headers of folder ... It can take time for huge folders. Be patient."</li>
<li><b>Bug fix</b>: Do not turn on --delete2duplicates when --syncduplicates is on, unless --delete2duplicates is given.</li>
<li><b>Bug fix</b>: Redirect STDERR to STDOUT in all cases, --log or --nolog</li>
<li><b>Bug fix</b>: Do not allow --skipcrossduplicates and --usecache. Exit EX_USAGE 64</li>
<li><b>Bug fix</b>: Dates were not displayed under Windows because POSIX::strftime %e is not portable. Fixed several other places where dates were wrong on Windows.</li>
<li><b>Bug fix</b>: --tests --testslive was listing 0 folders.</li>
<li><b>Refactoring</b>: Deglobalized $debuglist $debugflags </li>
<li><b>Refactoring</b>: Added sync->{ permanentflags2 }</li>
</ul>
<ul>
<li><b>2.178</b></li>
<li><b>Dependencies removed</b>: None </li>
<li><b>Dependencies added</b>: Perl module Compress::Zlib</li>
<li><b>Enhancement</b>: Added final statistic line: "CPU time and %cpu : 13.27 sec 8.3 %cpu 2.1 %allcpus</li>
<li><b>Enhancement</b>: Removed the hard limit --maxsize 35_651_584 set by --gmail2 since CAPABILITY is used and good.</li>
<li><b>Enhancement</b>: Does not checknoabletosearch if --justfolders</li>
<li><b>Enhancement</b>: When creating a folder, check if it is selectable and consider ok if it is selectable.</li>
<li><b>Enhancement</b>: Options --gmail1 --gmail2 together sets --useheader X-Gmail-Received --useheader Message-Id</li>
<li><b>Enhancement</b>: Added compression in the imap connexions.
Compression is off by default no matter the capability announced.
Use --compress1 and --compress2 to turn compression on.</li>
<li><b>Enhancement</b>: Added --keepalive1 and --keepalive2 options.
Some firewalls and network gears like to timeout connections prematurely if the connection sits idle.
This option enables SO_KEEPALIVE on the host1 socket.
--keepalive1 is on by default since imapsync release 2.169
Use --nokeepalive1 to disable it. Same thing for --keepalive2 but for --host2. See <a href="https://metacpan.org/pod/Mail::IMAPClient#Keepalive">https://metacpan.org/pod/Mail::IMAPClient#Keepalive</a></li>
<li><b>Usability</b>: Removed --fast option. It didn't do anything anyway, it was a fake option.</li>
<li><b>Usability</b>: Added advice inline advice on errors
<ul>
<li>ERR_OVERQUOTA. "The destination mailbox is 100% full, get free space on it and then resume the sync."</li>
<li>ERR_TRANSFER_EXCEEDED. "The maximum transfer size for a single sync is reached ( over 3 GB ). Relaunch the sync to sync more."</li>
<li>ERR_APPEND_SIZE. "The destination server refuses too big messages. Use --truncmess option. Read https://imapsync.lamiral.info/FAQ.d/FAQ.Messages_Too_Big.txt" </li>
<li>ERR_CONNECTION_FAILURE_HOST1. "Check that host1 on port1 is the right IMAP server to be contacted for your mailbox."</li>
<li>ERR_CONNECTION_FAILURE_HOST2. "Check that host2 on port2 is the right IMAP server to be contacted for your mailbox."</li>
<li>ERR_AUTHENTICATION_FAILURE_USER1. "Check the credentials for user1."</li>
<li>ERR_AUTHENTICATION_FAILURE_USER2. "Check the credentials for user2."</li>
</ul>
</li>
<li><b>Usability</b>: Bytes sizes human readable are now presented in KB MB GB TB PB (1000 base) instead of KiB MiB GiB TiB PiB (1024 base)</li>
<li><b>Usability</b>: Added README help for --truncmess</li>
<li><b>CGI context</b>: Experimental loaddelay forced to 0 (no delay at all). So far a huge load is rarely a problem.</li>
<li><b>CGI context</b>: Bugfix. Abort didn't set charset=UTF-8; same thing for heavy load 503 Service Unavailable</li>
<li><b>Bug fix</b>: Made reconnect mechanism works with --oauthdirect1 --oauthdirect2 --oauthaccesstoken1 --oauthaccesstoken2</li>
<li><b>Bug fix</b>: Upped the maximum number a pid can be. From 99999 to 2^22.
See <a href="https://unix.stackexchange.com/questions/16883/what-is-the-maximum-value-of-the-process-id">what-is-the-maximum-value-of-the-process-id</a> </li>
<li><b>Bug fix</b>: Load average on Mac was sometimes buggy. locale float 3,14 instead of 3.14</li>
<li><b>Bug fix</b>: errors_incr() exited with CATCH_ALL</li>
<li><b>Bug fix</b>: Memory consumption on Mac was not relevant. Use RSS instead of VSZ, on Mac only. Linux stays with VSZ.</li>
<li><b>Docker context</b>: Current working directory changed from /var/tmp to /var/tmp/uid_$EFFECTIVE_USER_ID</li>
</ul>
<ul>
<li><b>2.140</b></li>
<li><b>General</b>: New release numbering from 1.999 directly to 2.100; I want to avoid 1.1000 and sorting issues in directory listing.</li>
@ -157,8 +273,6 @@ Exit value 112 (EXIT_WITH_ERRORS_MAX) is now replaced by the most common error e
<li><b>Refactoring</b>: Continuing to deglobalize the global variables.</li>
<li><b>Refactoring</b>: 1734 unit tests.</li>
<li><b>Refactoring</b>: </li>
</ul>
@ -954,7 +1068,7 @@ by ignoring PERMANENTFLAGS (Exchange tests)</li>
<!--#config timefmt="%D" -->
<!--#config timefmt="%A %B %d, %Y" -->
<b>This document last modified on <!--#echo var="LAST_MODIFIED" --></b>
($Id: news.shtml,v 1.78 2021/07/05 20:22:15 gilles Exp gilles $)<br />
($Id: news.shtml,v 1.87 2022/09/15 08:42:40 gilles Exp gilles $)<br />
<a href="#TOP">Top of the page</a>
</p>
</body></html>

View File

@ -41,7 +41,7 @@ to pay for free speech software.
not gratis from the homepage. It is the best decision I've done
about imapsync to continue to maintain it.
See detailed motivations in this
<a href="http://www.linux-france.org/prj/imapsync_list/msg00459.html">call for business solution</a>.
<a href="https://web.archive.org/web/20210309005209/http://www.linux-france.org/prj/imapsync_list/msg00459.html">call for business solution</a>.
</p>
<p>"Download and donate if happy" doesn't work well.<br/>

View File

@ -41,7 +41,7 @@ to view details of this transaction (if you have a Paypal account).
</p>
<p>Now you have access to the <b>full unlimited imapsync
<a href="https://imapsync.lamiral.info/X/imapsync_form_extra.html">online service /X</a></b>.
<a href="https://imapsync.lamiral.info/X/u.html">online service /X</a></b>.
This online imapsync service doesn't require any installation on your side, just use it as it is.</p>
<p>Also, in case you want to <b>run imapsync by yourself</b>, you will find <b>imapsync</b>
@ -112,7 +112,7 @@ src="S/images/ab_jlh.png"
<!--#config timefmt="%D" -->
<!--#config timefmt="%A %B %d, %Y" -->
<b>This document last modified on <!--#echo var="LAST_MODIFIED" --></b>
($Id: paypal_return.shtml,v 1.39 2020/10/13 16:25:09 gilles Exp gilles $)
($Id: paypal_return.shtml,v 1.40 2022/05/04 10:23:52 gilles Exp gilles $)
</p>
<script type="text/javascript" src="S/conversion_data.js">

29
S/quiz/README.txt Normal file
View File

@ -0,0 +1,29 @@
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
LICENSE
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Copyright by Code Boxx
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
MORE
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Please visit https://code-boxx.com/ for more!

45
S/quiz/comment_to_toh.txt Executable file
View File

@ -0,0 +1,45 @@
Hi Toh!
First, I thank you very much for posting and sharing this good piece
of code!
I like it because, it's simple, it's embedable, no dependency, pure
javascript.
I found your code search for a simple quiz code. I consider quizzes as
a fun learning learning experience on something.
Some things I'd like to improve on it:
ux/reload) The user has to reload the page to restart the quiz and
it's not evident. How about making the last button a possibility
to redo the quiz from start and make a better score?
ux/where I am) The user doesn't know how many questions there are in
the quiz, where he is along the quiz, how good he is. Knowing where we
are in a serie makes it easier to reach the end. This one is easy to
add, as I could do it.
css functional) The quiz.css is not so cosmetic: if you comment it in the
html, then the quiz functionally doesn't work the same; we have to
click twice on a button to go to the next question, and the second
click has to be outside the round of the radio button, on the label.
I don't know how to fix that but it's not important anyway, the css is
needed for cosmetics.
css cosmetic) this quiz code is to be embedded in a page then I suggest
that the cosmetics are inheritated.
I'm also adept of minimal css, the less to achieve a goal, the better.
dev testing) I don't know how do you test it while coding and
modifying it. A manual loop browser_reload_run_editor?
dev jslint) I paste it to jslint (https://www.jslint.com/)
and it didn't pass the lint test.
dev data load) How about putting all the Q/R in a dedicated text file
to maintain a single quiz.js and quiz.css and have multiple quizzes
using the same functional code?

46
S/quiz/quiz.css Normal file
View File

@ -0,0 +1,46 @@
/* (A) WRAPPER */
#quizWrap {
max-width: 600px;
margin: 0 auto;
}
/* (B) QUESTION */
#quizQn {
padding: 20px;
background: #4c93ba;
color: #fff;
font-size: 24px;
border-radius: 10px;
}
/* (C) ANSWERS */
#quizAns {
margin: 10px 0;
display: grid;
grid-template-columns: auto auto;
grid-gap: 10px;
}
#quizAns input[type=radio] { display: none; }
#quizAns label {
background: #fafafa;
border: 1px solid #eee;
border-radius: 10px;
padding: 10px;
font-size: 20px;
cursor: pointer;
text-align: center;
}
#quizAns label.correct {
background: #d8ffc4;
border: 1px solid #60a03f;
}
#quizAns label.wrong {
background: #ffe8e8;
border: 1px solid #c78181;
}
/* (D) BODY... DOES NOT QUITE MATTER */
html, body {
background: #74b6db;
font-family: arial, sans-serif;
}

16
S/quiz/quiz.html Normal file
View File

@ -0,0 +1,16 @@
<!DOCTYPE html>
<html>
<head>
<title>
Simple Javascript Quiz Demo
</title>
<!-- (A) LOAD QUIZ CSS + JS -->
<link href="quiz.css" rel="stylesheet">
<script src="quiz.js"></script>
</head>
<body>
<!-- (B) QUIZ CONTAINER -->
<div id="quizWrap"></div>
</body>
</html>

136
S/quiz/quiz.js Normal file
View File

@ -0,0 +1,136 @@
var quiz = {
// (A) PROPERTIES
// (A1) QUESTIONS & ANSWERS
// Q = QUESTION, O = OPTIONS, A = CORRECT ANSWER
data: [
{
q : "What is the standard distance between the target and archer in Olympics?",
o : [
"50 meters",
"70 meters",
"100 meters",
"120 meters"
],
a : 1 // arrays start with 0, so answer is 70 meters
},
{
q : "Which is the highest number on a standard roulette wheel?",
o : [
"22",
"24",
"32",
"36"
],
a : 3
},
{
q : "How much wood could a woodchuck chuck if a woodchuck would chuck wood?",
o : [
"400 pounds",
"550 pounds",
"700 pounds",
"750 pounds"
],
a : 2
},
{
q : "Which is the seventh planet from the sun?",
o : [
"Uranus",
"Earth",
"Pluto",
"Mars"
],
a : 0
},
{
q : "Which is the largest ocean on Earth?",
o : [
"Atlantic Ocean",
"Indian Ocean",
"Arctic Ocean",
"Pacific Ocean"
],
a : 3
}
],
// (A2) HTML ELEMENTS
hWrap: null, // HTML quiz container
hQn: null, // HTML question wrapper
hAns: null, // HTML answers wrapper
// (A3) GAME FLAGS
now: 0, // current question
score: 0, // current score
// (B) INIT QUIZ HTML
init: function(){
// (B1) WRAPPER
quiz.hWrap = document.getElementById("quizWrap");
// (B2) QUESTIONS SECTION
quiz.hQn = document.createElement("div");
quiz.hQn.id = "quizQn";
quiz.hWrap.appendChild(quiz.hQn);
// (B3) ANSWERS SECTION
quiz.hAns = document.createElement("div");
quiz.hAns.id = "quizAns";
quiz.hWrap.appendChild(quiz.hAns);
// (B4) GO!
quiz.draw();
},
// (C) DRAW QUESTION
draw: function(){
// (C1) QUESTION
quiz.hQn.innerHTML = quiz.data[quiz.now].q;
// (C2) OPTIONS
quiz.hAns.innerHTML = "";
for (let i in quiz.data[quiz.now].o) {
let radio = document.createElement("input");
radio.type = "radio";
radio.name = "quiz";
radio.id = "quizo" + i;
quiz.hAns.appendChild(radio);
let label = document.createElement("label");
label.innerHTML = quiz.data[quiz.now].o[i];
label.setAttribute("for", "quizo" + i);
label.dataset.idx = i;
label.addEventListener("click", quiz.select);
quiz.hAns.appendChild(label);
}
},
// (D) OPTION SELECTED
select: function(){
// (D1) DETACH ALL ONCLICK
let all = quiz.hAns.getElementsByTagName("label");
for (let label of all) {
label.removeEventListener("click", quiz.select);
}
// (D2) CHECK IF CORRECT
let correct = this.dataset.idx == quiz.data[quiz.now].a;
if (correct) {
quiz.score++;
this.classList.add("correct");
} else {
this.classList.add("wrong");
}
// (D3) NEXT QUESTION OR END GAME
quiz.now++;
setTimeout(function(){
if (quiz.now < quiz.data.length) { quiz.draw(); }
else {
quiz.hQn.innerHTML = `You have answered ${quiz.score} of ${quiz.data.length} correctly.`;
quiz.hAns.innerHTML = "";
}
}, 1000);
}
};
window.addEventListener("load", quiz.init);

83
S/quiz/quiz_imapsync.css Executable file
View File

@ -0,0 +1,83 @@
/* Taken from https://code-boxx.com/simple-javascript-quiz */
/* (A) WRAPPER */
#quizWrap {
border-style: solid;
border-collapse: collapse;
background: #e0e0e0;
}
#quizNumber,#quizScore{
text-align: center;
padding: 10px;
border-width: thin;
border-style: solid;
border-left-style: none;
border-right-style: none;
}
#quizScore{
border-bottom-style: none;
}
#quizRestart {
margin: auto;
margin-bottom: 10px;
text-align: center;
padding: 10px;
border-radius: 10px;
border-style: solid;
border-width: thin;
background: #d8ffc4;
width: 100px;
cursor: pointer;
}
#quizQn {
padding: 20px;
text-align: center;
font-weight: bold;
}
/* (C) ANSWERS */
#quizAns {
margin: 10px;
text-align: center;
border-width: thin;
display: grid;
grid-template-columns: auto auto;
grid-gap: 10px;
justify-content: space-evenly;
align-content: space-evenly;
}
#quizAns input[type=radio] { display: none; }
#quizAns label {
/* background: #cccccc;
border: 1px solid #eee;
font-size: 20px; */
cursor: pointer;
background: #ffffff;
font-weight: bold;
padding: 10px;
border-radius: 10px;
border-style: solid;
border-width: thin;
margin-top: 5px;
margin-left: 25px;
margin-right: 25px;
margin-bottom: 5px;
}
#quizAns label.correct {
background: #d8ffc4;
border: 1px solid #60a03f;
}
#quizAns label.wrong {
background: #ffe8e8;
border: 1px solid #c78181;
}

20
S/quiz/quiz_imapsync.html Executable file
View File

@ -0,0 +1,20 @@
<!DOCTYPE html>
<!-- Taken from https://code-boxx.com/simple-javascript-quiz -->
<html>
<head>
<title>
Imapsync Quiz
</title>
<!-- (A) LOAD QUIZ CSS + JS -->
<link href="quiz_imapsync.css" rel="stylesheet">
<script src="quiz_imapsync.js"></script>
</head>
<body>
<!-- (B) QUIZ CONTAINER -->
<div id="quizWrap"></div>
</body>
</html>

245
S/quiz/quiz_imapsync.js Executable file
View File

@ -0,0 +1,245 @@
// Taken from https://code-boxx.com/simple-javascript-quiz
var quiz = {
// (A) PROPERTIES
// (A1) QUESTIONS & ANSWERS
// Q = QUESTION, O = OPTIONS, A = CORRECT ANSWER
data: [
{
a : 1,
o : [
"Facebook",
"POP, IMAP, HTTP",
"SMTP, ICQ",
"Twitter",
"FTP, GOPHER",
"Instagram"
],
q : "What are the main protocols usually used to access a mailbox?"
},
{
a : 2,
o : [
"I'M A Passager",
"Instant Mailbox Access Possibility",
"Internet Message Access Protocol",
"In My Ambiguous Posture",
"In My Ambience Place",
"Izorc Muggle Ark Prout"
],
q : "What means the acronym IMAP?"
},
{
a : 2,
o : [
"No parameter is needed",
"Harry Potter's magic wang",
"1) The IMAP server name + 2) the user login + 3) the password",
"1) the user login + 2) the password"
],
q : "What are the parameters needed to access an IMAP mailbox?"
},
{
a : 4,
o : [
"0",
"2",
"3",
"4",
"6",
"8"
],
q : "How many parameters are mandatory to synchronize two IMAP mailboxes with imapsync?"
},
{
a : 0,
o : [
"No",
"Yes"
],
q : "Can Imapsync synchronize POP accounts?"
},
{
a : 1,
o : [
"No",
"Yes"
],
q : "Can Imapsync synchronize Gmail accounts?"
},
{
a : 1,
o : [
"No",
"Yes"
],
q : "Can Imapsync synchronize Office365 accounts?"
},
{
a : 0,
o : [
"No",
"Yes"
],
q : "Can Imapsync synchronize Contacts, Calendars, Chats, or Notes?"
},
{
a : 0,
o : [
"NO LIMIT",
"GPL",
"WTFPL",
"MIT",
"CC0",
"Proprietary"
],
q : "What is the Imapsync License name?"
},
{
a : 0,
o : [
"No limits to do anything with this work and this license.",
"All permissions restricted.",
"Use it for good or evil.",
"Too long to fit here."
],
q : "What is the Imapsync License main text?"
},
{
a : 0,
o : [
"Yes, sometimes with delay, he's a human",
"No, never, email is dead",
"Yes, immediately and 24h/24, he's a robot",
"What is email?"
],
q : "Does the imapsync author Gilles LAMIRAL reply to every email?"
}
],
dataDev: [
{
a : 1,
o : [
"Facebook",
"POP, IMAP, HTTP",
"SMTP, ICQ",
"Twitter",
"FTP, GOPHER",
"Instagram"
],
q : "What are the main protocols usually used to access a mailbox?"
}
],
// (B) INIT QUIZ HTML
init: function(){
// (B1) WRAPPER
quiz.hWrap = null;
quiz.hScore = null;
quiz.hRestart = null;
quiz.hQn = null;
quiz.hAns = null;
quiz.now = 0;
quiz.score = 0;
quiz.hWrap = document.getElementById("quizWrap");
quiz.hWrap.innerHTML = "";
// NUMBER SECTION
quiz.hNumber = document.createElement("div");
quiz.hNumber.id = "quizNumber";
quiz.hWrap.appendChild(quiz.hNumber);
// (B2) QUESTIONS SECTION
quiz.hQn = document.createElement("div");
quiz.hQn.id = "quizQn";
quiz.hWrap.appendChild(quiz.hQn);
// (B3) ANSWERS SECTION
quiz.hAns = document.createElement("div");
quiz.hAns.id = "quizAns";
quiz.hWrap.appendChild(quiz.hAns);
// SCORE SECTION
quiz.hScore = document.createElement("div");
quiz.hScore.id = "quizScore";
quiz.hWrap.appendChild(quiz.hScore);
// RESTART SECTION
quiz.hRestart = document.createElement("div");
quiz.hRestart.id = "quizRestart";
quiz.hWrap.appendChild(quiz.hRestart);
quiz.hRestart.innerHTML = "Restart Quiz";
document.getElementById("quizRestart").addEventListener("click", quiz.restart);
// (B4) GO!
quiz.draw();
},
// (C) DRAW QUESTION
draw: function(){
// SCORE
var QnNumber = `${quiz.now + 1}/${quiz.data.length}`;
var ScoreNb = `${quiz.score}/${quiz.now}`;
quiz.hNumber.innerHTML = `Question ${QnNumber}`;
quiz.hScore.innerHTML = `Score ${ScoreNb}`;
// (C1) QUESTION
quiz.hQn.innerHTML = quiz.data[quiz.now].q;
// (C2) OPTIONS
quiz.hAns.innerHTML = "";
for (let i in quiz.data[quiz.now].o) {
let radio = document.createElement("input");
radio.type = "radio";
radio.name = "quiz";
radio.id = "quizo" + i;
quiz.hAns.appendChild(radio);
let label = document.createElement("label");
label.innerHTML = quiz.data[quiz.now].o[i];
label.setAttribute("for", "quizo" + i);
label.dataset.idx = i;
label.addEventListener("click", quiz.select);
quiz.hAns.appendChild(label);
}
},
// (D) OPTION SELECTED
select: function(){
// (D1) DETACH ALL ONCLICK
let all = quiz.hAns.getElementsByTagName("label");
for (let label of all) {
label.removeEventListener("click", quiz.select);
}
// (D2) CHECK IF CORRECT
let correct = this.dataset.idx == quiz.data[quiz.now].a;
if (correct) {
quiz.score++;
this.classList.add("correct");
} else {
this.classList.add("wrong");
}
// (D3) NEXT QUESTION OR END GAME
quiz.now++;
setTimeout(function(){
if (quiz.now < quiz.data.length) { quiz.draw(); }
else {
// quiz.hNumber.innerHTML = "";
ScoreNb = `${quiz.score}/${quiz.now}`;
quiz.hScore.innerHTML = `Score ${ScoreNb}`;
quiz.hQn.innerHTML = "Finished!";
quiz.hAns.innerHTML = "";
}
}, 800);
},
restart:function(){
quiz.init() ;
}
};
window.addEventListener("load", quiz.init);

View File

@ -42,6 +42,15 @@ I'm not sure I deserve such great quotes for my work on Imapsync, anyway here th
</p>
<!--#include file="S/tw-mention.html" -->
<blockquote class="twitter-tweet">
<p lang="en" dir="ltr">
imapsync is simply the best and most usable tool ever developed. Works perfect!
Thank you <a href="https://twitter.com/imapsync?ref_src=twsrc%5Etfw">@imapsync</a></p>&mdash; bkcrri (@bkcrri)
<a href="https://twitter.com/bkcrri/status/1456392869808328706?ref_src=twsrc%5Etfw">November 4, 2021</a>
</blockquote>
<hr>
<blockquote class="twitter-tweet">
<p lang="en" dir="ltr">What’s your favorite IMAP migration/sync tool? I made the best experiences with
<a href="https://twitter.com/imapsync?ref_src=twsrc%5Etfw">@imapsync</a>.
@ -157,7 +166,7 @@ alt="Viewable With Any Browser" >
<!--#config timefmt="%D" -->
<!--#config timefmt="%A %B %d, %Y" -->
<b>This document was last modified on <!--#echo var="LAST_MODIFIED" --></b>
($Id: testimonial.shtml,v 1.8 2019/11/15 11:35:16 gilles Exp gilles $)<br>
($Id: testimonial.shtml,v 1.9 2021/11/05 12:04:12 gilles Exp gilles $)<br>
<a href="#TOP">Top of the page</a>
</p>
</footer>

62
TODO
View File

@ -1,5 +1,5 @@
#!/bin/cat
# $Id: TODO,v 1.257 2021/07/05 20:19:31 gilles Exp gilles $
# $Id: TODO,v 1.269 2022/07/22 09:51:06 gilles Exp gilles $
This documentation is also at http://imapsync.lamiral.info/#doc
@ -9,6 +9,49 @@ TODO file for imapsync
https://imapsync.lamiral.info/TODO
SUGGESTED 2022_07_22 by Flavio
Have a parameter to reconnect in case of failure
Exiting with return value 102 (EXIT_CONNECTION_FAILURE_HOST2)
SUGGESTED 2022_01_04 by Franck
It might be even more efficient if at the end there was a summary in
categories for mails that did not transfer, e.g.:
xx number of mails not transferred due to missing header: use --addheader to transfer
xx number of duplicate mails not transferred: use ... to force transfer
... etc
Thus one would not have to scroll through the log unless there
were particular mails to be inspected as to problems.
SUGGESTED 2022_05_05 by mao13820
https://github.com/imapsync/imapsync/issues/330#issuecomment-1118190081
Try IO::Socket::Socks::Wrapper
on Socks server.
SUGGESTED 2022_02_19
Talk about size discrepencies.
Gmail doesn't count duplicates sizes twice.
Servers reported message sizes are always not the actual messages sizes.
Where put that information?
SUGGESTED 2022_01_26 by Kuch/Mitchell/D.
Make --delete1 be optionally "Move to Trash folder"
Use MOVE if possible
https://datatracker.ietf.org/doc/html/rfc6851
SUGGESTED 2022_01_09 by Neustradamus
Add SCRAM-SHA* support
https://github.com/imapsync/imapsync/issues/313
https://perldoc.perl.org/Digest::SHA
SUGGESTED 2021_06_13 by rotemes
https://github.com/imapsync/imapsync/issues/288
Add a counter for skipped because of already copied and
because of other things.
What ENVELOPE could bring?
( 'FLAGS', 'INTERNALDATE', 'RFC822.SIZE' ) ;
( 'FLAGS', 'INTERNALDATE', 'RFC822.SIZE' , 'ENVELOPE' )
SUGGESTED 2021_05_29 on github https://github.com/imapsync/imapsync/issues/78
ripmime https://github.com/inflex/ripMIME
@ -51,7 +94,7 @@ to sync only the Sent folder.
SUGGESTED 2020_11_30 by Gilles
Add a FAQ.Invalid_Argument.txt
This error is a low level connexion issue, either ipv6 or dns resolution of
This error is a low level connection issue, either ipv6 or dns resolution of
the name.
@ -519,7 +562,7 @@ Write a Windows tutorial, TUTORIAL_Windows.html.
Write a good practices migration tips document, GOOD_PRACTICES.html
Add uidexpunge with --delete if possible (like with --delete2).
Add uidexpunge with --delete1 if possible (like with --delete2).
Add the possibility to specify a unity with --maxsize and --minsize
Example --maxsize 10MB --minsize 10KB
@ -696,6 +739,15 @@ http://asg.web.cmu.edu/cyrus/download/imapd/altnamespace.html
Now the TODO done! (or not)
===========================================================================
DONE revision 2.169 date: 2021/12/07 17:13:44;
Added --keepalive1 and --keepalive2 options. On by default.
See https://metacpan.org/pod/Mail::IMAPClient#Keepalive
DONE revision 2.159 date: 2021/11/19 14:29:31
SUGGESTED 2021_11_18 by Justas Umbrasas
Add COMPRESS to imap connections
--compress1 --compress2
DONE 2021/04/30 revision 2.111 by Gilles
SUGGESTED 2021_04_22 by popular request
Add an option --syncduplicates that syncs duplicates.
@ -862,7 +914,7 @@ Inline help when Ctrl-c is hit
SUGGESTED 2016_07_15 by Alan Williams
DONE 2016_07_20 for IO::Socket::SSL
Add --inet4 --inet6 to force AF_INET or AF_INET6 ip connexion,
Add --inet4 --inet6 to force AF_INET or AF_INET6 ip connection,
aka ipv4 or ipv6.
SUGGESTED 2016_06_24 by Jean-Dominique Delyon
@ -947,7 +999,7 @@ Option name: --pipemess "command arg1 arg2 ..."
DONE. Transform messages with too long linelength.
Office365 and Exchange abort connexion
Office365 and Exchange abort connection
when they encounter a message with more than 10000 characters on a single line.
Could be done with the previous --pipemess with reformime.
Thanks to Larry Moore for suggesting reformime tool!

View File

@ -1 +1 @@
2.140
2.229

1238
X/cgi_memo

File diff suppressed because it is too large Load Diff

View File

@ -1,11 +1,14 @@
#!/bin/sh
# $Id: imapsync_csv_wrapper,v 1.5 2020/05/01 21:26:30 gilles Exp gilles $
# $Id: imapsync_csv_wrapper,v 1.13 2021/11/01 13:24:47 gilles Exp gilles $
exec 3>&1
debug=/bin/true
debug=/bin/false
debug=true
# comment the following to have debug data
debug=false
PATH=$PATH:/home/www/apache24/cgi-bin/
echo3() {
echo "$@" >&3
@ -83,8 +86,9 @@ tests_uri_unescape()
run_test test '"_a\n\n\nz_" = "_`uri_unescape a%0A%0A%0Az`_"'
run_test test '"_`uri_unescape a%0A%0A%0Az`_" = "_`uri_unescape a%0A%0A%0Az`_"'
run_test test 'A B' = 'A B'
uri_unescape 'a%0A%0A%0Az' > /tmp/$$_zzz1.txt
/bin/echo -e "a\n\n\nz" > /tmp/$$_zzz2.txt
uri_unescape 'a%0Az' > /tmp/$$_zzz1.txt
/bin/echo "a
z" > /tmp/$$_zzz2.txt
run_test diff /tmp/$$_zzz1.txt /tmp/$$_zzz2.txt
rm /tmp/$$_zzz1.txt /tmp/$$_zzz2.txt
z3=`uri_unescape a%0A%0A%0Az`
@ -208,17 +212,33 @@ tests_is_blank_or_comment()
logfailures()
{
:
run_on_each_line_failures="$run_on_each_line_failures
$@"
}
tests_logfailures()
{
:
#reset
run_on_each_line_failures=
# add Blabla
run_test logfailures Blabla
run_test test "
Blabla" = "$run_on_each_line_failures"
# add Kiki
run_test logfailures Kiki
run_test test "
Blabla
Kiki" = "$run_on_each_line_failures"
#reset again
run_on_each_line_failures=
}
run_on_each_line()
run_on_each_line()
{
echodebug '### Entering run_on_each_line ###'
test -f abort_$$.txt && { echo abort demanded so not doing normal stuff ; return ; }
@ -228,12 +248,6 @@ run_on_each_line()
csv_data_multilines="$1"
echodebug "csv_data_multilines=[$csv_data_multilines]"
test 1 -le "$#" && shift
failures_file=${1:-""}
echodebug failures_file="$failures_file"
test -x "$failures_file" && { echo3 "failure file $failures_file is an executable. Leaving run_on_each_line()." ; return ; }
test 1 -le "$#" && shift
command=${1:-echo}
echodebug command="$command" "$@"
@ -244,43 +258,49 @@ run_on_each_line()
line_number=0
csv_number=0
failures_number=0
echo "$csv_data_multilines" | while IFS=';' read h1 u1 p1 h2 u2 p2 fake; do
while IFS=';' read h1 u1 p1 h2 u2 p2 extra fake; do
test -f abort_$$.txt && { echo abort demanded so not doing normal stuff ; return ; }
line_number=`expr 1 + $line_number`
if is_blank_or_comment "$h1$u1$p1$h2$u2$p2$fake" ; then
echo3 "Ignoring line " $line_number "$h1$u1$p1$h2$u2$p2$fake"
if is_blank_or_comment "$h1$u1$p1$h2$u2$p2$extra" ; then
echo3 "Ignoring line " $line_number "$h1$u1$p1$h2$u2$p2$extra"
else
csv_number=`expr 1 + $csv_number`
echo3 "Processing line " $line_number run $csv_number "[$h1] [$u1] [xxx] [$h2] [$u2] [xxx] [$fake] $$"
$command "$@" --host1 "$h1" --user1 "$u1" --password1 "$p1" --host2 "$h2" --user2 "$u2" --password2 "$p2"
echo3 "Processing line " $line_number csv run $csv_number "[$h1] [$u1] [xxx] [$h2] [$u2] [xxx] [$extra] $$"
$command "$@" --host1 "$h1" --user1 "$u1" --password1 "$p1" --host2 "$h2" --user2 "$u2" --password2 "$p2" $extra
command_status=$?
test "0" != "$command_status" && failures_number=`expr 1 + $failures_number`
logfailures "$failures_file" "$command_status" "$line_number" "$csv_number"
echodebug command_status=$command_status failures_number=$failures_number
test "0" != "$command_status" && logfailures "line $line_number csv run $csv_number returned with status $command_status ($h1;$u1;$p1;$h2;$u2;$p2;$extra;)"
fi
done
echodebug Leaving run_on_each_line
done << EOF
$csv_data_multilines
EOF
echodebug Leaving run_on_each_line, failures_number=$failures_number
test "0" != "$failures_number" && echo "$run_on_each_line_failures"
test "0" != "$failures_number" && return 1
return 0
}
tests_run_on_each_line()
tests_run_on_each_line()
{
# 1-4
run_test test '' = "`run_on_each_line`"
run_test test '' = "`run_on_each_line ''`"
run_test test '' = "`run_on_each_line '' 'log.txt'`"
run_test test '' = "`run_on_each_line '' 'log.txt' echo imapsync`"
run_test test '' = "`run_on_each_line '' echo imapsync`"
run_test test '' = "`run_on_each_line '' echo imapsync blabla blibli`"
# 5-7 blank data
run_test test '' = "`run_on_each_line ' '`"
run_test test '' = "`run_on_each_line ' ' 'log.txt'`"
run_test test '' = "`run_on_each_line ' ' 'log.txt' echo imapsync`"
run_test test '' = "`run_on_each_line ' ' `"
run_test test '' = "`run_on_each_line ' ' echo imapsync blabla blibli`"
# 8-10 comment data
run_test test '' = "`run_on_each_line '# '`"
run_test test '' = "`run_on_each_line '# ' 'log.txt'`"
run_test test '' = "`run_on_each_line '# ' 'log.txt' echo imapsync`"
run_test test '' = "`run_on_each_line ' # '`"
run_test test '' = "`run_on_each_line '# ' echo imapsync blabla blibli`"
# 11-13 empty line
myval='
@ -289,10 +309,10 @@ tests_run_on_each_line()
myret=`run_on_each_line "$myval"`
run_test test "" = "$myret"
myret=`run_on_each_line "$myval" 'log.txt'`
myret=`run_on_each_line "$myval"`
run_test test "" = "$myret"
myret=`run_on_each_line "$myval" 'log.txt' echo imapsync`
myret=`run_on_each_line "$myval" echo imapsync blabla blibli`
run_test test "" = "$myret"
@ -308,39 +328,33 @@ tests_run_on_each_line()
myret=`run_on_each_line "$myval"`
run_test test "" = "$myret"
myret=`run_on_each_line "$myval" 'log.txt'`
myret=`run_on_each_line "$myval" `
run_test test "" = "$myret"
myret=`run_on_each_line "$myval" 'log.txt' echo imapsync`
myret=`run_on_each_line "$myval" echo imapsync blabla blibli`
run_test test "" = "$myret"
# 17-21
# 17-18
# csv data no blank no comment
lines='a1;b1;c1;d1;e1;f1
a2;b2;c2;d2;e2;f2
a3;b3;c3;d3;e3;f3'
# No failure file (so /dev/null), no command (so echo)
# no command (so echo)
lines_out='--host1 a1 --user1 b1 --password1 c1 --host2 d1 --user2 e1 --password2 f1
--host1 a2 --user1 b2 --password1 c2 --host2 d2 --user2 e2 --password2 f2
--host1 a3 --user1 b3 --password1 c3 --host2 d3 --user2 e3 --password2 f3'
run_test test "$lines_out" = "`run_on_each_line "$lines"`"
# failure file is a command => BAD => do nothing
cp /bin/echo "/tmp/myecho$$"
run_test test "" = "`run_on_each_line "$lines" /tmp/myecho$$`"
run_test test "" = "`run_on_each_line "$lines" /tmp/myecho$$ echo`"
run_test test "" = "`run_on_each_line "$lines" /tmp/myecho$$ echo imapsync blabla bla`"
rm "/tmp/myecho$$"
# No failure file (so /dev/null), command = echo imapsync
# command = echo imapsync
lines_out='imapsync --host1 a1 --user1 b1 --password1 c1 --host2 d1 --user2 e1 --password2 f1
imapsync --host1 a2 --user1 b2 --password1 c2 --host2 d2 --user2 e2 --password2 f2
imapsync --host1 a3 --user1 b3 --password1 c3 --host2 d3 --user2 e3 --password2 f3'
run_test test "$lines_out" = "`run_on_each_line "$lines" '' echo imapsync`"
run_test test "$lines_out" = "`run_on_each_line "$lines" echo imapsync`"
# 22-27
# 19-20
# csv data + blanks + comments
lines='a1;b1;c1;d1;e1;f1
# blabla 2
@ -349,34 +363,97 @@ a2;b2;c2;d2;e2;f2
a3;b3;c3;d3;e3;f3
# end'
# No failure file (so /dev/null), no command (so echo)
# no command (so echo)
lines_out='--host1 a1 --user1 b1 --password1 c1 --host2 d1 --user2 e1 --password2 f1
--host1 a2 --user1 b2 --password1 c2 --host2 d2 --user2 e2 --password2 f2
--host1 a3 --user1 b3 --password1 c3 --host2 d3 --user2 e3 --password2 f3'
run_test test "$lines_out" = "`run_on_each_line "$lines"`"
# failure file is a command => BAD => do nothing
cp /bin/echo "/tmp/myecho$$"
run_test test "" = "`run_on_each_line "$lines" /tmp/myecho$$`"
run_test test "" = "`run_on_each_line "$lines" /tmp/myecho$$ echo`"
run_test test "" = "`run_on_each_line "$lines" /tmp/myecho$$ echo imapsync blabla bla`"
rm "/tmp/myecho$$"
# No failure file (so /dev/null), command = echo imapsync
# command = echo imapsync
lines_out='imapsync --host1 a1 --user1 b1 --password1 c1 --host2 d1 --user2 e1 --password2 f1
imapsync --host1 a2 --user1 b2 --password1 c2 --host2 d2 --user2 e2 --password2 f2
imapsync --host1 a3 --user1 b3 --password1 c3 --host2 d3 --user2 e3 --password2 f3'
run_test test "$lines_out" = "`run_on_each_line "$lines" '' echo imapsync`"
run_test test "$lines_out" = "`run_on_each_line "$lines" echo imapsync`"
# 21-22
# csv data 3/3;/6/6;/7/7;/8/8; parameters + blanks + comments
# runs 1 2 3 4 5 6 7 8
lines='a1;b1;c1
# blabla 2
a2;b2;c2;
# bloblo 3
a3;b3;c3;d3;e3;f3
a4;b4;c4;d4;e4;f4;
a5;b5;c5;d5;e5;f5;--extra blurp
a6;b6;c6;d6;e6;f6;--extra blurp;
a7;b7;c7;d7;e7;f7;--extra blurp; ignored
a8;b8;c8;d8;e8;f8;--extra blurp; ignored;
# end'
# no command (so echo)
lines_out='--host1 a1 --user1 b1 --password1 c1 --host2 --user2 --password2
--host1 a2 --user1 b2 --password1 c2 --host2 --user2 --password2
--host1 a3 --user1 b3 --password1 c3 --host2 d3 --user2 e3 --password2 f3
--host1 a4 --user1 b4 --password1 c4 --host2 d4 --user2 e4 --password2 f4
--host1 a5 --user1 b5 --password1 c5 --host2 d5 --user2 e5 --password2 f5 --extra blurp
--host1 a6 --user1 b6 --password1 c6 --host2 d6 --user2 e6 --password2 f6 --extra blurp
--host1 a7 --user1 b7 --password1 c7 --host2 d7 --user2 e7 --password2 f7 --extra blurp
--host1 a8 --user1 b8 --password1 c8 --host2 d8 --user2 e8 --password2 f8 --extra blurp'
run_test test "$lines_out" = "`run_on_each_line "$lines"`"
# command = echo imapsync
lines_out='imapsync --host1 a1 --user1 b1 --password1 c1 --host2 --user2 --password2
imapsync --host1 a2 --user1 b2 --password1 c2 --host2 --user2 --password2
imapsync --host1 a3 --user1 b3 --password1 c3 --host2 d3 --user2 e3 --password2 f3
imapsync --host1 a4 --user1 b4 --password1 c4 --host2 d4 --user2 e4 --password2 f4
imapsync --host1 a5 --user1 b5 --password1 c5 --host2 d5 --user2 e5 --password2 f5 --extra blurp
imapsync --host1 a6 --user1 b6 --password1 c6 --host2 d6 --user2 e6 --password2 f6 --extra blurp
imapsync --host1 a7 --user1 b7 --password1 c7 --host2 d7 --user2 e7 --password2 f7 --extra blurp
imapsync --host1 a8 --user1 b8 --password1 c8 --host2 d8 --user2 e8 --password2 f8 --extra blurp'
run_test test "$lines_out" = "`run_on_each_line "$lines" echo imapsync`"
# 23-2x
# "" input
lines='a1;b1;c1;d1;e1;f1;--caca "KK"'
# no command (so echo)
lines_out='--host1 a1 --user1 b1 --password1 c1 --host2 d1 --user2 e1 --password2 f1 --caca "KK"'
run_test test "$lines_out" = "`run_on_each_line "$lines"`"
# command = echo imapsync
lines_out='imapsync --host1 a1 --user1 b1 --password1 c1 --host2 d1 --user2 e1 --password2 f1 --caca "KK"'
run_test test "$lines_out" = "`run_on_each_line "$lines" echo imapsync`"
}
remove_double_quotes()
{
echo "$1" | tr -d '"'
}
tests_remove_double_quotes()
{
echo 'Entering tests_remove_double_quotes()'
run_test test -z `remove_double_quotes`
run_test test 'abc' = `remove_double_quotes 'abc'`
run_test test -z `remove_double_quotes '"'`
run_test test -z `remove_double_quotes '""'`
run_test test 'abc' = `remove_double_quotes '"ab"c'`
echo 'Leaving tests_remove_double_quotes()'
}
hashsync()
{
#set -x
mystring=${1:-''}
mykey=${2:-''}
mystring=`remove_double_quotes ${1:-''}`
mykey=${2:-''}
# impressive! is not it? quoting shit!
perl -MDigest::HMAC_SHA1 -e 'print Digest::HMAC_SHA1::hmac_sha1_hex( "'"$mystring"'", "'"$mykey"'" )'
#set +x
@ -385,11 +462,16 @@ hashsync()
tests_hashsync()
{
echo 'Entering tests_hashsync()'
run_test test 'fbdb1d1b18aa6c08324b7d64b71fb76370690e1d' = `hashsync`
run_test test 'fbdb1d1b18aa6c08324b7d64b71fb76370690e1d' = `hashsync ''`
run_test test 'fbdb1d1b18aa6c08324b7d64b71fb76370690e1d' = `hashsync '' ''`
run_test test 'e86a28a3611c1e7bbaf8057cd00ae122781a11fe' = `hashsync 'zzz' ''`
run_test test '6a7b451ac99eab1531ad8e6cd544b32420c552ac' = `hashsync 'zzz' 'A'`
run_test test 'fbdb1d1b18aa6c08324b7d64b71fb76370690e1d' = `hashsync '""'`
run_test test 'e86a28a3611c1e7bbaf8057cd00ae122781a11fe' = `hashsync '"zzz"'`
echo 'Leaving tests_hashsync()'
}
tests_caca()
@ -480,7 +562,9 @@ tests()
tests_run_on_each_line \
tests_hashsync \
tests_is_blank_or_comment \
tests_logfailures
tests_logfailures \
tests_remove_double_quotes \
}
@ -595,7 +679,7 @@ justlogin()
date
test -f abort_$$.txt && { echo Abort demanded so not doing normal stuff ; return ; }
echo Now run imapsync --justlogin to check all credentials are ok
if run_on_each_line "$csv_data_unescaped" "" \
if run_on_each_line "$csv_data_unescaped" \
imapsync --no-modulesversion --justlogin --tmpdir .
then
echo success of the just login check round
@ -612,8 +696,8 @@ justfoldersizes()
######################## just folders sizes counting round #####################'
date
test -f abort_$$.txt && { echo Abort demanded so not doing normal stuff ; return ; }
echo Now run imapsync --justlogin to check all credentials are ok
run_on_each_line "$csv_data_unescaped" "" \
echo Now run imapsync --justfoldersizes to show the volume to be synced
run_on_each_line "$csv_data_unescaped" \
imapsync --no-modulesversion --justfoldersizes --tmpdir . \
|| return 1
}
@ -625,8 +709,8 @@ sync_all()
######################## now sync them all round ###############################'
date
test -f abort_$$.txt && { echo Abort demanded so not doing normal stuff ; return ; }
echo Now run imapsync --justlogin to check all credentials are ok
run_on_each_line "$csv_data_unescaped" "" \
echo Now run imapsync on the data given
run_on_each_line "$csv_data_unescaped" \
imapsync --no-modulesversion --tmpdir . \
|| return 1
}
@ -647,11 +731,13 @@ main()
# All stderr to stdin, yeah I am like that
exec 2>&1
# Some tests
# Some tests, uncomment which one you work with and also the return one
#run_tests tests_is_blank_or_comment
#run_tests tests_run_on_each_line
#run_tests tests_remove_blanks_and_comments
#tests_hashsync
#run_tests tests_logfailures
#tests_remove_double_quotes
#return
tests_all_verbose_if_failure || return 1
@ -662,7 +748,9 @@ main()
getcsvdata
hashsync=`hashsync $csv_data_pure`
hashsync=`hashsync "$csv_data_pure"`
test -z $hashsync && return 1
change_working_directory_if_under_cgi /var/tmp/imapsync_cgi/$hashsync/
@ -678,9 +766,8 @@ main()
unset SERVER_SOFTWARE
# Now the real stuff
justlogin || return 1
justfoldersizes
#justlogin || return 1
#justfoldersizes
sync_all || return 1
@ -694,6 +781,3 @@ main()
tests_initialisation
main
return 0

View File

@ -1,6 +1,6 @@
/* $Id: imapsync_form.css,v 1.9 2020/06/15 11:55:50 gilles Exp gilles $ */
/* $Id: imapsync_form.css,v 1.10 2021/09/21 09:25:53 gilles Exp gilles $ */
body {
color: black;
@ -29,6 +29,10 @@ body {
height: 50px ;
}
#imapsync_log_bottom {
scroll-margin-top: 300px ;
}
.progress {
/* text-align: center ; */
/* font-size: 1.4em ; */

View File

@ -1,5 +1,5 @@
// $Id: imapsync_form.js,v 1.20 2021/05/29 10:25:53 gilles Exp gilles $
// $Id: imapsync_form.js,v 1.28 2022/04/16 16:51:07 gilles Exp gilles $
/*jslint browser: true*/ /*global $*/
@ -55,7 +55,30 @@ $(document).ready(
var note = function note( message )
{
$("#tests").append( message ) ;
}
} ;
var tests_last_x_lines = function tests_last_x_lines()
{
is( "", last_x_lines(), "last_x_lines: no args => empty string" ) ;
is( "", last_x_lines(""), "last_x_lines: empty string => empty string" ) ;
is( "abc", last_x_lines("abc"), "last_x_lines: abc => abc" ) ;
is( "abc\ndef", last_x_lines("abc\ndef"), "last_x_lines: abc\ndef => abc\ndef" ) ;
is( "def", last_x_lines("abc\ndef", -1), "last_x_lines: abc\ndef -1 => def\n" ) ;
is( "", last_x_lines("abc\ndef", 0), "last_x_lines: abc\ndef 0 => empty string" ) ;
is( "abc\ndef", last_x_lines("abc\ndef", -10), "last_x_lines: last 10 of 2 lines => 2 lines" ) ;
is( "4\n5\n", last_x_lines("1\n2\n3\n4\n5\n", -3), "last_x_lines: last 3 lines of 5 lines" ) ;
is( "3\n4\n5", last_x_lines("1\n2\n3\n4\n5", -3), "last_x_lines: last 3 lines of 5 lines" ) ;
} ;
var last_x_lines = function last_x_lines( string, num )
{
if ( undefined === string || 0 === num )
{
return "" ;
}
return string.split(/\r?\n/).slice(num).join("\n") ;
} ;
var last_eta = function last_eta( string )
{
@ -82,6 +105,8 @@ $(document).ready(
return "ETA: unknown" ;
}
}
var tests_last_eta = function tests_last_eta()
{
@ -257,7 +282,7 @@ $(document).ready(
}
else
{
slice_length = -240 ;
slice_length = -2400 ;
}
slice_log = xhr.responseText.slice( slice_length ) ;
eta_str = last_eta( slice_log ) ;
@ -297,24 +322,24 @@ $(document).ready(
if ( xhr.readyState === 4 )
{
// end of sync
$("#progress-txt").text(
$("#progress-txt").text(
"Ended. It remains "
+ eta_obj.msgs_left + " messages to be synced" ) ;
$( "#output" ).text( xhr.responseText ) ;
}
else
{
eta_str = eta_obj.str + " (refresh every " + refresh_interval_s + " s)" ;
eta_str = eta_str.replace(/(\r\n|\n|\r)/gm, "") ; // trim newline
//$("#tests").append( "refreshLog eta_str: " + eta_str + "\n" ) ;
$("#progress-txt").text( eta_str ) ;
eta_str = eta_obj.str + " (refresh every " + refresh_interval_s + " s)" ;
eta_str = eta_str.replace(/(\r\n|\n|\r)/gm, "") ; // trim newlines
//$("#tests").append( "refreshLog eta_str: " + eta_str + "\n" ) ;
$( "#progress-txt" ).text( eta_str ) ;
var last_lines = last_x_lines( xhr.responseText.slice(-2000), -10)
$( "#output" ).text( last_lines ) ;
}
$( "#output" ).text( xhr.responseText ) ;
}
var handleRun = function handleRun(xhr, timerRefreshLog)
{
@ -326,7 +351,6 @@ $(document).ready(
// var headers = xhr.getAllResponseHeaders();
// $("#console").append(headers);
// $("#console").append("See the completed log\n");
$("#link_to_bottom").show() ;
clearInterval( timerRefreshLog ) ;
refreshLog( xhr ) ; // a last time
// back to enable state for next run
@ -650,7 +674,6 @@ $(document).ready(
// in case of a manual refresh, start with
$("#bt-sync").prop("disabled", false);
$("#bt-abort").prop("disabled", false);
$("#link_to_bottom").hide();
$("#progress-bar-left").css( "width", 100 + "%" ).attr( "aria-valuenow", 100 ) ;
$("#showpassword1").click(
@ -678,7 +701,6 @@ $(document).ready(
$( "#imapsync_current" ).load( "imapsync_current.txt" ) ;
$("#bt-sync").prop("disabled", true) ;
$("#bt-abort").prop("disabled", false) ;
$("#link_to_bottom").hide() ;
$("#progress-txt").text( "ETA: coming soon" ) ;
store_form() ;
imapsync() ;
@ -778,6 +800,7 @@ $(document).ready(
tests_store_retrieve( ) ;
tests_last_eta( ) ;
tests_decompose_eta_line( ) ;
tests_last_x_lines( ) ;
// tests_cryptojs( ) ;
// The following test can be used to check that if a test fails
@ -785,15 +808,16 @@ $(document).ready(
//is( 0, 1, "this test always fails" ) ;
tests_bilan( nb_attended_test ) ;
// If you want to always see the tests, uncomment the following
// line
// $("#tests").collapse("show") ;
//$("#tests").collapse("show") ;
}
}
init( ) ;
tests( 29 ) ;
tests( 38 ) ;
retrieve_form( ) ;
}

View File

@ -1,6 +1,6 @@
<!DOCTYPE html>
<!-- $Id: imapsync_form_extra.html,v 1.18 2021/05/30 05:45:15 gilles Exp gilles $ -->
<!-- $Id: imapsync_form_extra.html,v 1.28 2022/05/07 13:51:28 gilles Exp gilles $ -->
<html lang="en" id="top">
@ -103,6 +103,9 @@
<datalist id="servers1">
<option value="imap.gmail.com">
<option value="outlook.office365.com">
<option value="imap.hostinger.com">
<option value="ssl0.ovh.net">
<option value="email-ssl.com.br">
<option value="imap.mail.yahoo.com">
</datalist>
</div>
@ -231,6 +234,9 @@
<datalist id="servers2">
<option value="imap.gmail.com">
<option value="outlook.office365.com">
<option value="imap.hostinger.com">
<option value="ssl0.ovh.net">
<option value="email-ssl.com.br">
<option value="imap.mail.yahoo.com">
</datalist>
</div>
@ -273,7 +279,12 @@
<a id="buttons"></a>
<hr>
<!-- Classical button to go to the log only -->
<div class="text-center center-block">
If you <b>close</b> this <b>window</b> (or tab) <b>during</b> the synchronization,
it will <b>abort</b> the synchronization, it's like <b>hitting</b> the red button <b>"Abort!"</b> below.
</div>
<!-- Classical button to go to the log only, when javascript is turned off -->
<noscript>
<div class="row">
<div class="col-sm-12 padd0" >
@ -312,8 +323,8 @@
<div class="row scripton" id="consoles" >
<span id="imapsync_current" class="center-block text-center"></span>
<pre id="imapsync_current" class="center-block text-center"></pre>
<span id="imapsync_advice_hours" class="text-center collapse">
Best <a href="#local_bandwidth"><b>bandwidth available hours</b></a> are from <b>11h PM to 11h AM UTC</b> on Mondays to Fridays, <b>all hours</b> on Saturdays and <b>Sundays</b>.
</span>
@ -336,7 +347,6 @@
</pre>
<a id="link_to_bottom" href="#bottom">Bottom of imapsync log</a>
</div>
<div class="col-sm-6 well">
@ -351,7 +361,10 @@
</div>
<h2 class="text-center scripton">Log of imapsync run</h2>
<h2 id="imapsync_log_beginning" class="text-center scripton">Log of imapsync run</h2>
<div class="text-center scripton">
<a href="#imapsync_log_bottom">Link to the <b>bottom</b> of the imapsync log file</a>
</div>
<pre id="output" class="scripton">
@ -374,6 +387,10 @@
</pre>
<div id="imapsync_log_bottom" class="text-center scripton">
<a href="#imapsync_log_beginning">Link to the <b>beginning</b> of the imapsync log file</a>
</div>
<div id="local_bandwidth" class="collapse">
<hr>
<p class="text-center">
@ -390,46 +407,19 @@
<hr>
<p class="text-center">
Imapsync <b>Online Status</b> over the <b>last 24h</b><br>
<img class="img-responsive center-block" alt="Imapsync Online Status" src="https://lstu.fr/imapsync_online_status_24h_1200x70">
<a href="imapsync_online_status.html"><img id="status_24h" class="img-responsive center-block" alt="Imapsync Online Status over the last 24h" src="https://sup.lamiral.info/dbmon/cgi-bin/rrdview.cgi?child=yes&rrdfile=%2Fvar%2Ftmp%2Fdbmon%2Ftests%2Frrdbases%2Flocalhost~2583~LAMIRAL~Imapsync_Online~LAMIRAL%2CImapsync_Online~opstatus~300~.rrd;interval_vue=p86400;date_given_by=now;date_means=end;dsname=opstatus;width=1200;hight=70;lower=0;upper=100;rigid=on;Beautiful%20Image%21.x=128;Beautiful%20Image%21.y=30;title=Service%20Status;owner=Imapsync_Online;caption=Status%20in%20%25;monitor=https.rrdrt.monitor%20--rrdrt%20imapsync.lamiral.info%2Fcgi-bin%2Fimapsync%20%3B%3B">
</a>
</p>
<p class="text-center">
Imapsync <b>Online Status</b> over the <b>last week</b><br>
<img class="img-responsive center-block" alt="Imapsync Online Status" src="https://lstu.fr/imapsync_online_status_7d">
</p>
<p class="text-center">
Imapsync <b>Online Status</b> over the <b>last two months</b><br>
<img class="img-responsive center-block" alt="Imapsync Online Status" src="https://lstu.fr/imapsync_online_status_2months_1200x70"><br>
</p>
<!--
Uncomment the following when the data are available
-->
<!--
<p class="text-center">
Imapsync <b>Online Status</b> over the <b>last year</b><br>
<img class="img-responsive center-block" alt="Imapsync Online Status" src="https://lstu.fr/imapsync_online_status_1year_1200x70"><br>
</p>
<p class="text-center">
Imapsync <b>Online Status</b> over the <b>last 10 years</b><br>
<img class="img-responsive center-block" alt="Imapsync Online Status" src="https://lstu.fr/imapsync_online_status_10years_1200x70-2"><br>
</p>
-->
</div>
<div id="local_status_hetrix" class="collapse in">
<div id="local_status_hetrix" class="collapse">
<hr>
<p class="text-center">
The service is down? For how long? How often? Take also a look at the
<a href="https://hetrixtools.com/report/uptime/7908dea8f3ff86eabdef6146307afd5f/414322.html">Imapsync Online Status</a>
monitor page powered by the <a href="https://hetrixtools.com/uptime-monitor/414322.html">HetrixTools</a> company.
<a href="https://hetrixtools.com/report/uptime/873a2356aea43055204b59f562b5ad52/414322.html">Imapsync Online Status</a>
monitor page powered by the <a href="https://hetrixtools.com/414322.html">HetrixTools</a> company.
</p>
</div>
@ -452,7 +442,7 @@ monitor page powered by the <a href="https://hetrixtools.com/uptime-monitor/4143
<!-- <a href="#buttons" class="btn btn-info scripton" role="button">Consoles</a> -->
<a href="#bottom" title="Bottom of the page" class="btn btn-info active" role="button">Bottom</a>
<br>
<small> ($Id: imapsync_form_extra.html,v 1.18 2021/05/30 05:45:15 gilles Exp gilles $) </small><br>
<small> ($Id: imapsync_form_extra.html,v 1.28 2022/05/07 13:51:28 gilles Exp gilles $) </small><br>
Terms and conditions for anything: <a href="https://imapsync.lamiral.info/LICENSE">No limits to do anything with this work and this license!</a><br>
</div>
</div>
@ -482,7 +472,5 @@ src="imapsync_form.js"
>
</script>
<img src="https://static.scarf.sh/a.png?x-pxid=28b508c3-c51f-4109-9b88-29f3f6e4cf2f" alt="Scarf Tracker"/>
</body>
</html>

View File

@ -1,6 +1,6 @@
<!DOCTYPE html>
<!-- $Id: imapsync_form_extra_free.html,v 1.18 2021/05/30 05:45:00 gilles Exp gilles $ -->
<!-- $Id: imapsync_form_extra_free.html,v 1.30 2022/05/07 13:51:28 gilles Exp gilles $ -->
<html lang="en" id="top">
@ -161,6 +161,9 @@ It's <b>ok</b> if you <b>don't</b> have a VAT number.<br />
<datalist id="servers1">
<option value="imap.gmail.com">
<option value="outlook.office365.com">
<option value="imap.hostinger.com">
<option value="ssl0.ovh.net">
<option value="email-ssl.com.br">
<option value="imap.mail.yahoo.com">
</datalist>
</div>
@ -289,6 +292,9 @@ It's <b>ok</b> if you <b>don't</b> have a VAT number.<br />
<datalist id="servers2">
<option value="imap.gmail.com">
<option value="outlook.office365.com">
<option value="imap.hostinger.com">
<option value="ssl0.ovh.net">
<option value="email-ssl.com.br">
<option value="imap.mail.yahoo.com">
</datalist>
</div>
@ -332,7 +338,12 @@ It's <b>ok</b> if you <b>don't</b> have a VAT number.<br />
<a id="buttons"></a>
<hr>
<!-- Classical button to go to the log only -->
<div class="text-center center-block">
If you <b>close</b> this <b>window</b> (or tab) <b>during</b> the synchronization,
it will <b>abort</b> the synchronization, it's like <b>hitting</b> the red button <b>"Abort!"</b> below.
</div>
<!-- Classical button to go to the log only, when javascript is turned off -->
<noscript>
<div class="row">
<div class="col-sm-12 padd0" >
@ -371,7 +382,7 @@ It's <b>ok</b> if you <b>don't</b> have a VAT number.<br />
<div class="row scripton" id="consoles" >
<span id="imapsync_current" class="center-block text-center"></span>
<pre id="imapsync_current" class="center-block text-center"></pre>
<span id="imapsync_advice_hours" class="text-center collapse">
Best <a href="#local_bandwidth"><b>bandwidth available hours</b></a> are from <b>11h PM to 11h AM UTC</b> on Mondays to Fridays, <b>all hours</b> on Saturdays and <b>Sundays</b>.
@ -395,7 +406,7 @@ It's <b>ok</b> if you <b>don't</b> have a VAT number.<br />
</pre>
<a id="link_to_bottom" href="#bottom">Bottom of imapsync log</a>
</div>
<div class="col-sm-6 well">
@ -410,8 +421,10 @@ It's <b>ok</b> if you <b>don't</b> have a VAT number.<br />
</div>
<h2 class="text-center scripton">Log of imapsync run</h2>
<h2 id="imapsync_log_beginning" class="text-center scripton">Log of imapsync run</h2>
<div class="text-center scripton">
<a href="#imapsync_log_bottom">Link to the <b>bottom</b> of the imapsync log file</a>
</div>
<pre id="output" class="scripton">
@ -433,6 +446,10 @@ It's <b>ok</b> if you <b>don't</b> have a VAT number.<br />
</pre>
<div id="imapsync_log_bottom" class="text-center scripton">
<a href="#imapsync_log_beginning">Link to the <b>beginning</b> of the imapsync log file</a>
</div>
<div id="local_bandwidth" class="collapse">
<hr>
<p class="text-center">
@ -449,46 +466,19 @@ It's <b>ok</b> if you <b>don't</b> have a VAT number.<br />
<hr>
<p class="text-center">
Imapsync <b>Online Status</b> over the <b>last 24h</b><br>
<img class="img-responsive center-block" alt="Imapsync Online Status" src="https://lstu.fr/imapsync_online_status_24h_1200x70">
<a href="imapsync_online_status.html"><img id="status_24h" class="img-responsive center-block" alt="Imapsync Online Status over the last 24h" src="https://sup.lamiral.info/dbmon/cgi-bin/rrdview.cgi?child=yes&rrdfile=%2Fvar%2Ftmp%2Fdbmon%2Ftests%2Frrdbases%2Flocalhost~2583~LAMIRAL~Imapsync_Online~LAMIRAL%2CImapsync_Online~opstatus~300~.rrd;interval_vue=p86400;date_given_by=now;date_means=end;dsname=opstatus;width=1200;hight=70;lower=0;upper=100;rigid=on;Beautiful%20Image%21.x=128;Beautiful%20Image%21.y=30;title=Service%20Status;owner=Imapsync_Online;caption=Status%20in%20%25;monitor=https.rrdrt.monitor%20--rrdrt%20imapsync.lamiral.info%2Fcgi-bin%2Fimapsync%20%3B%3B">
</a>
</p>
<p class="text-center">
Imapsync <b>Online Status</b> over the <b>last week</b><br>
<img class="img-responsive center-block" alt="Imapsync Online Status" src="https://lstu.fr/imapsync_online_status_7d">
</p>
<p class="text-center">
Imapsync <b>Online Status</b> over the <b>last two months</b><br>
<img class="img-responsive center-block" alt="Imapsync Online Status" src="https://lstu.fr/imapsync_online_status_2months_1200x70"><br>
</p>
<!--
Uncomment the following when the data are available
-->
<!--
<p class="text-center">
Imapsync <b>Online Status</b> over the <b>last year</b><br>
<img class="img-responsive center-block" alt="Imapsync Online Status" src="https://lstu.fr/imapsync_online_status_1year_1200x70"><br>
</p>
<p class="text-center">
Imapsync <b>Online Status</b> over the <b>last 10 years</b><br>
<img class="img-responsive center-block" alt="Imapsync Online Status" src="https://lstu.fr/imapsync_online_status_10years_1200x70-2"><br>
</p>
-->
</div>
<div id="local_status_hetrix" class="collapse in">
<div id="local_status_hetrix" class="collapse">
<hr>
<p class="text-center">
The service is down? For how long? How often? Take also a look at the
<a href="https://hetrixtools.com/report/uptime/7908dea8f3ff86eabdef6146307afd5f/414322.html">Imapsync Online Status</a>
monitor page powered by the <a href="https://hetrixtools.com/uptime-monitor/414322.html">HetrixTools</a> company.
<a href="https://hetrixtools.com/report/uptime/873a2356aea43055204b59f562b5ad52/414322.html">Imapsync Online Status</a>
monitor page powered by the <a href="https://hetrixtools.com/414322.html">HetrixTools</a> company.
</p>
</div>
@ -511,7 +501,7 @@ monitor page powered by the <a href="https://hetrixtools.com/uptime-monitor/4143
<!-- <a href="#buttons" class="btn btn-info scripton" role="button">Consoles</a> -->
<a href="#bottom" title="Bottom of the page" class="btn btn-info active" role="button">Bottom</a>
<br>
<small> ($Id: imapsync_form_extra_free.html,v 1.18 2021/05/30 05:45:00 gilles Exp gilles $) </small><br>
<small> ($Id: imapsync_form_extra_free.html,v 1.30 2022/05/07 13:51:28 gilles Exp gilles $) </small><br>
Terms and conditions for anything: <a href="https://imapsync.lamiral.info/LICENSE">No limits to do anything with this work and this license!</a><br>
</div>
</div>
@ -541,7 +531,6 @@ src="imapsync_form.js"
>
</script>
<img src="https://static.scarf.sh/a.png?x-pxid=28b508c3-c51f-4109-9b88-29f3f6e4cf2f" alt="Scarf Tracker"/>
</body>
</html>

View File

@ -0,0 +1,50 @@
<!DOCTYPE html>
<!-- $Id: imapsync_online_status.html,v 1.1 2022/02/18 17:07:03 gilles Exp gilles $ -->
<html lang="en" id="top">
<head>
<title>Imapsync Online Status</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<h2>Imapsync Online Status over the last 24h</h2>
<p>
<img id="status_24h" class="img-responsive center-block" alt="Imapsync Online Status over the last 24h" src="https://sup.lamiral.info/dbmon/cgi-bin/rrdview.cgi?child=yes&rrdfile=%2Fvar%2Ftmp%2Fdbmon%2Ftests%2Frrdbases%2Flocalhost~2583~LAMIRAL~Imapsync_Online~LAMIRAL%2CImapsync_Online~opstatus~300~.rrd;interval_vue=p86400;date_given_by=now;date_means=end;dsname=opstatus;width=1200;hight=70;lower=0;upper=100;rigid=on;Beautiful%20Image%21.x=128;Beautiful%20Image%21.y=30;title=Service%20Status;owner=Imapsync%20Online;caption=Status%20in%20%25;monitor=https.rrdrt.monitor%20--rrdrt%20imapsync.lamiral.info%2Fcgi-bin%2Fimapsync%20%3B%3B">
</p>
<h2>Imapsync Online Status over the last week</h2>
<p>
<img id="status_7d" class="img-responsive center-block" alt="Imapsync Online Status over the last week" src="https://sup.lamiral.info/dbmon/cgi-bin/rrdview.cgi?child=yes&rrdfile=%2Fvar%2Ftmp%2Fdbmon%2Ftests%2Frrdbases%2Flocalhost~2583~LAMIRAL~Imapsync_Online~LAMIRAL%2CImapsync_Online~opstatus~300~.rrd;interval_vue=p604800;year=2021;mon=%205;mday=%209;hour=13;min=15;date_given_by=now;date_means=end;dsname=opstatus;width=1200;hight=70;lower=0;upper=100;rigid=on;Beautiful%20Image%21.x=571;Beautiful%20Image%21.y=67;title=Service%20Status;owner=Imapsync%20Online;caption=Status%20in%20%25;start=1619954142;end=1620558942;width_old=1200;hight_old=70;monitor=https.rrdrt.monitor%20--rrdrt%20imapsync.lamiral.info%2Fcgi-bin%2Fimapsync%20%3B%3B">
</p>
<h2>Imapsync Online Status over the last two months</h2>
<p>
<img id="status_2m" class="img-responsive center-block" alt="Imapsync Online Status over the last two months" src="https://sup.lamiral.info/dbmon/cgi-bin/rrdview.cgi?child=yes&rrdfile=%2Fvar%2Ftmp%2Fdbmon%2Ftests%2Frrdbases%2Flocalhost~2583~LAMIRAL~Imapsync_Online~LAMIRAL%2CImapsync_Online~opstatus~300~.rrd;interval_vue=p5270400;year=2021;mon=%205;mday=%209;hour=15;min=47;date_given_by=now;date_means=end;dsname=opstatus;width=1200;hight=70;lower=0;upper=100;rigid=on;Beautiful%20Image%21.x=156;Beautiful%20Image%21.y=83;title=Service%20Status;owner=Imapsync%20Online;caption=Status%20in%20%25;start=1615297666;end=1620568066;width_old=1200;hight_old=70;monitor=https.rrdrt.monitor%20--rrdrt%20imapsync.lamiral.info%2Fcgi-bin%2Fimapsync%20%3B%3B"><br>
</p>
<h2>Imapsync Online Status over the last year</h2>
<p>
<img id="status_1y" class="img-responsive center-block" alt="Imapsync Online Status" src="https://sup.lamiral.info/dbmon/cgi-bin/rrdview.cgi?child=yes&rrdfile=%2Fvar%2Ftmp%2Fdbmon%2Ftests%2Frrdbases%2Flocalhost~2583~LAMIRAL~Imapsync_Online~LAMIRAL%2CImapsync_Online~opstatus~300~.rrd;interval_vue=p31622400;year=2021;mon=%205;mday=%209;hour=15;min=50;date_given_by=now;date_means=end;dsname=opstatus;width=1200;hight=70;lower=0;upper=100;rigid=on;Beautiful%20Image%21.x=212;Beautiful%20Image%21.y=59;title=Service%20Status;owner=Imapsync%20Online;caption=Status%20in%20%25;start=1588945852;end=1620568252;width_old=1200;hight_old=70;monitor=https.rrdrt.monitor%20--rrdrt%20imapsync.lamiral.info%2Fcgi-bin%2Fimapsync%20%3B%3B"><br>
</p>
<!--
Uncomment the following when the data are available
-->
<!--
<p class="text-center">
Imapsync <b>Online Status</b> over the <b>last 10 years</b><br>
<img id="status_10y" class="img-responsive center-block" alt="Imapsync Online Status" src="https://lstu.fr/imapsync_online_status_10years_1200x70-2"><br>
</p>
-->
</body>
</html>

View File

@ -1 +1 @@
imapsync_form_extra_free.html
proximapsync_form_extra_free.html

View File

@ -1,5 +1,5 @@
// $Id: imapsync_form_new.js,v 1.12 2019/07/29 22:42:19 gilles Exp gilles $
// $Id: proximapsync_form.js,v 1.2 2022/05/04 00:40:46 gilles Exp gilles $
/*jslint browser: true*/ /*global $*/
@ -19,7 +19,7 @@ $(document).ready(
"4": "Finished and response is ready"
} ;
var refresh_interval_ms = 5000 ;
var refresh_interval_ms = 6000 ;
var refresh_interval_s = refresh_interval_ms / 1000 ;
var test = {
counter_all : 0 ,
@ -51,8 +51,36 @@ $(document).ready(
}
$("#tests").append( message ) ;
} ;
var note = function note( message )
{
$("#tests").append( message ) ;
} ;
function last_eta( string )
var tests_last_x_lines = function tests_last_x_lines()
{
is( "", last_x_lines(), "last_x_lines: no args => empty string" ) ;
is( "", last_x_lines(""), "last_x_lines: empty string => empty string" ) ;
is( "abc", last_x_lines("abc"), "last_x_lines: abc => abc" ) ;
is( "abc\ndef", last_x_lines("abc\ndef"), "last_x_lines: abc\ndef => abc\ndef" ) ;
is( "def", last_x_lines("abc\ndef", -1), "last_x_lines: abc\ndef -1 => def\n" ) ;
is( "", last_x_lines("abc\ndef", 0), "last_x_lines: abc\ndef 0 => empty string" ) ;
is( "abc\ndef", last_x_lines("abc\ndef", -10), "last_x_lines: last 10 of 2 lines => 2 lines" ) ;
is( "4\n5\n", last_x_lines("1\n2\n3\n4\n5\n", -3), "last_x_lines: last 3 lines of 5 lines" ) ;
is( "3\n4\n5", last_x_lines("1\n2\n3\n4\n5", -3), "last_x_lines: last 3 lines of 5 lines" ) ;
} ;
var last_x_lines = function last_x_lines( string, num )
{
if ( undefined === string || 0 === num )
{
return "" ;
}
return string.split(/\r?\n/).slice(num).join("\n") ;
} ;
var last_eta = function last_eta( string )
{
// return the last occurrence of the substring "ETA: ...\n"
// or "ETA: unknown" or ""
@ -77,8 +105,10 @@ $(document).ready(
return "ETA: unknown" ;
}
}
function tests_last_eta()
var tests_last_eta = function tests_last_eta()
{
is( "", last_eta( ), "last_eta: no args => empty string" ) ;
@ -252,7 +282,7 @@ $(document).ready(
}
else
{
slice_length = -240 ;
slice_length = -2400 ;
}
slice_log = xhr.responseText.slice( slice_length ) ;
eta_str = last_eta( slice_log ) ;
@ -278,11 +308,13 @@ $(document).ready(
return ;
} ;
function refreshLog( xhr )
var refreshLog = function refreshLog( xhr )
{
var eta_obj ;
var eta_str ;
$( "#imapsync_current" ).load( "imapsync_current.txt" ) ;
eta_obj = extract_eta( xhr ) ;
progress_bar_update( eta_obj ) ;
@ -290,25 +322,25 @@ $(document).ready(
if ( xhr.readyState === 4 )
{
// end of sync
$("#progress-txt").text(
$("#progress-txt").text(
"Ended. It remains "
+ eta_obj.msgs_left + " messages to be synced" ) ;
$( "#output" ).text( xhr.responseText ) ;
}
else
{
eta_str = eta_obj.str + " (refresh every " + refresh_interval_s + " s)" ;
eta_str = eta_str.replace(/(\r\n|\n|\r)/gm, "") ; // trim newline
//$("#tests").append( "refreshLog eta_str: " + eta_str + "\n" ) ;
$("#progress-txt").text( eta_str ) ;
eta_str = eta_obj.str + " (refresh every " + refresh_interval_s + " s)" ;
eta_str = eta_str.replace(/(\r\n|\n|\r)/gm, "") ; // trim newlines
//$("#tests").append( "refreshLog eta_str: " + eta_str + "\n" ) ;
$( "#progress-txt" ).text( eta_str ) ;
var last_lines = last_x_lines( xhr.responseText.slice(-2000), -10)
$( "#output" ).text( last_lines ) ;
}
$( "#output" ).text( xhr.responseText ) ;
}
function handleRun(xhr, timerRefreshLog)
var handleRun = function handleRun(xhr, timerRefreshLog)
{
$("#console").text(
@ -319,15 +351,17 @@ $(document).ready(
// var headers = xhr.getAllResponseHeaders();
// $("#console").append(headers);
// $("#console").append("See the completed log\n");
$("#link_to_bottom").show() ;
clearInterval( timerRefreshLog ) ;
refreshLog( xhr ) ; // a last time
// back to enable state for next run
$("#bt-sync").prop("disabled", false) ;
$( "#imapsync_current" ).load( "imapsync_current.txt" ) ;
}
}
function imapsync()
var imapsync = function imapsync()
{
var querystring = $("#form").serialize() ;
$("#abort").text("\n\n") ; // clean abort console
@ -351,6 +385,8 @@ $(document).ready(
{
querystring = querystring + "&office2=on" ;
}
// querystring = querystring + "&tmphash=" + tmphash( ) ;
var xhr ;
@ -366,14 +402,14 @@ $(document).ready(
handleRun( xhr, timerRefreshLog ) ;
} ;
xhr.open( "POST", "/cgi-bin/imapsync", true ) ;
xhr.open( "POST", "/cgi-bin/proximapsync", true ) ;
xhr.setRequestHeader( "Content-type",
"application/x-www-form-urlencoded" ) ;
xhr.send( querystring ) ;
}
function handleAbort( xhr )
var handleAbort = function handleAbort( xhr )
{
$( "#abort" ).text(
@ -388,7 +424,7 @@ $(document).ready(
}
}
function abort()
var abort = function abort()
{
var querystring = $("#form").serialize() + "&abort=on";
var xhr;
@ -397,12 +433,12 @@ $(document).ready(
{
handleAbort(xhr);
};
xhr.open("POST", "/cgi-bin/imapsync", true);
xhr.open("POST", "/cgi-bin/proximapsync", true);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send(querystring);
}
function store( id )
var store = function store( id )
{
var stored ;
//$( "#tests" ).append( "Eco: " + id + " type is " + $( id ).attr( "type" ) + "\n" ) ;
@ -420,7 +456,7 @@ $(document).ready(
return stored ;
}
function retrieve( id )
var retrieve = function retrieve( id )
{
var retrieved ;
//$( "#tests" ).append( "Eco: " + id + " type is " + $( id ).attr( "type" ) + " length is " + $( id ).length + "\n" ) ;
@ -438,7 +474,7 @@ $(document).ready(
return retrieved ;
}
function tests_store_retrieve()
var tests_store_retrieve = function tests_store_retrieve()
{
if ( $("#tests").length !== 0 )
{
@ -479,7 +515,7 @@ $(document).ready(
}
function store_form()
var store_form = function store_form()
{
if ( Storage !== "undefined")
{
@ -506,7 +542,7 @@ $(document).ready(
}
}
function show_extra_if_needed()
var show_extra_if_needed = function show_extra_if_needed()
{
if ( $("#subfolder1").length && $("#subfolder1").val().length > 0 )
{
@ -518,7 +554,7 @@ $(document).ready(
}
}
function retrieve_form()
var retrieve_form = function retrieve_form()
{
if ( Storage !== "undefined" )
{
@ -555,14 +591,14 @@ $(document).ready(
localStorage.account2_background_color ) ;
}
// Show the extra parameters if they are not empty because it would be dangerous
// to retrieve them without knowing
// Show the extra parameters if they are not empty because it would
// be dangerous to retrieve them without showing them
show_extra_if_needed() ;
}
}
function showpassword( id, button )
var showpassword = function showpassword( id, button )
{
var x = document.getElementById( id );
if ( button.checked )
@ -573,16 +609,73 @@ $(document).ready(
}
}
function init()
var tests_cryptojs = function tests_cryptojs()
{
if ( $("#tests").length !== 0 )
{
if (typeof CryptoJS === 'undefined')
{
is( true, typeof CryptoJS !== 'undefined', "CryptoJS is available" ) ;
note( "CryptoJS is not available on this site. Ask the admin to fix this.\n" ) ;
}
else if (typeof CryptoJS.SHA256 !== "function")
{
is( "function", typeof CryptoJS.SHA256, "CryptoJS.SHA256 is a function" ) ;
note( "CryptoJS.SHA256 function is not available on this site. Ask the admin to fix this.\n" ) ;
}
else
{
// safe to use the function
is( "function", typeof CryptoJS.SHA256, "CryptoJS.SHA256 is a function" ) ;
is( "2f77668a9dfbf8d5848b9eeb4a7145ca94c6ed9236e4a773f6dcafa5132b2f91", sha256("Message"), "sha256 Message" ) ;
is( "26429a356b1d25b7d57c0f9a6d5fed8a290cb42374185887dcd2874548df0779", sha256("caca"), "sha256 caca" ) ;
is( "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", sha256(""), "sha256 ''" ) ;
is( tmphash(), tmphash(), "tmphash" ) ;
$("#user1").val("test1") ;
$("#password1").val("secret1") ;
$("#host1").val("test1.lamiral.info") ;
$("#user2").val("test2") ;
$("#password2").val("secret2") ;
$("#host2").val("test2.lamiral.info") ;
is( "20d2b4917cf69114876b4c8779af543e89c5871c6ada68107619722e55af1101", tmphash(), "tmphash like testslive" ) ;
$("#user1").val("") ;
$("#password1").val("") ;
$("#host1").val("") ;
$("#user2").val("") ;
$("#password2").val("") ;
$("#host2").val("") ;
}
}
}
var sha256 = function sha256( string )
{
var hash = CryptoJS.SHA256( string ) ;
var hash_hex = hash.toString( CryptoJS.enc.Hex ) ;
return( hash_hex ) ;
}
var tmphash = function tmphash()
{
var string = "" ;
string = string.concat(
$("#user1").val(), $("#password1").val(), $("#host1").val(),
$("#user2").val(), $("#password2").val(), $("#host2").val(),
)
return( sha256( string ) ) ;
}
var init = function init()
{
// in case of a manual refresh, start with
$("#bt-sync").prop("disabled", false);
$("#bt-abort").prop("disabled", false);
$("#link_to_bottom").hide();
$("#progress-bar-left").css( "width", 100 + "%" ).attr( "aria-valuenow", 100 ) ;
retrieve_form();
$("#showpassword1").click(
function ( event )
{
@ -605,9 +698,9 @@ $(document).ready(
$("#bt-sync").click(
function ()
{
$( "#imapsync_current" ).load( "imapsync_current.txt" ) ;
$("#bt-sync").prop("disabled", true) ;
$("#bt-abort").prop("disabled", false) ;
$("#link_to_bottom").hide() ;
$("#progress-txt").text( "ETA: coming soon" ) ;
store_form() ;
imapsync() ;
@ -617,9 +710,11 @@ $(document).ready(
$("#bt-abort").click(
function ()
{
$( "#imapsync_current" ).load( "imapsync_current.txt" ) ;
$("#bt-sync").prop("disabled", true);
$("#bt-abort").prop("disabled", true);
abort();
$( "#imapsync_current" ).load( "imapsync_current.txt" ) ;
}
);
@ -653,12 +748,29 @@ $(document).ready(
showpassword( "password2", $("#showpassword2")[0] ) ;
}
) ;
if ( "imapsync.lamiral.info" === location.hostname )
{
$( "#local_bandwidth" ).collapse( "show" ) ;
$( "#local_status_dbmon" ).collapse( "show" ) ;
$( "#local_status_hetrix" ).collapse( "show" ) ;
$( "#imapsync_advice_hours" ).collapse( "show" ) ;
$( "#imapsync_current" ).load( "imapsync_current.txt" ) ;
}
else if ( "lamiral.info" === location.hostname )
{
$( "#local_bandwidth" ).collapse( "show" ) ;
$( "#local_status_dbmon" ).collapse( "show" ) ;
$( "#local_status_hetrix" ).collapse( "show" ) ;
$( "#imapsync_advice_hours" ).collapse( "show" ) ;
$( "#imapsync_current" ).load( "imapsync_current.txt" ) ;
}
}
var tests_bilan = function tests_bilan()
var tests_bilan = function tests_bilan( nb_attended_test )
{
// attended number of tests
var nb_attended_test = 29 ;
// attended number of tests: nb_attended_test
$("#tests").append( "1.." + test.counter_all + "\n" ) ;
if ( test.counter_nok > 0 )
{
@ -681,22 +793,32 @@ $(document).ready(
}
} ;
function tests()
var tests = function tests( nb_attended_test )
{
if ( $("#tests").length !== 0 )
{
tests_store_retrieve( ) ;
tests_last_eta( ) ;
tests_decompose_eta_line( ) ;
tests_last_x_lines( ) ;
// tests_cryptojs( ) ;
// The following test can be used to check that if a test fails
// then all the tests are shown to the user.
//is( 0, 1, "this test always fails" ) ;
tests_bilan( ) ;
tests_bilan( nb_attended_test ) ;
// If you want to always see the tests, uncomment the following
// line
//$("#tests").collapse("show") ;
}
}
init( ) ;
tests( ) ;
tests( 38 ) ;
retrieve_form( ) ;
}

View File

@ -0,0 +1,476 @@
<!DOCTYPE html>
<!-- $Id: proximapsync_form_extra.html,v 1.2 2022/05/07 13:53:00 gilles Exp gilles $ -->
<html lang="en" id="top">
<head>
<!--
<script
data-ad-client="ca-pub-3325993554161060"
async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js">
</script>
-->
<title>Imapsync Online Unlimited</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css"
integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">
<link rel="stylesheet" href="imapsync_form.css">
<link rel="stylesheet" href="../S/style.css" type="text/css" />
<link rel="license" href="https://imapsync.lamiral.info/NOLIMIT">
<noscript>
<link rel="stylesheet" href="noscript.css">
</noscript>
</head>
<body>
<div class="scripton">
<!-- will appear if some tests fail -->
<pre id="tests" class="collapse"></pre>
<!-- hidden stuff that must exit for the tests -->
<div class="hidden">
<input type="checkbox" id="test_checkbox">
<input type="text" id="test_text">
<input type="radio" id="test_radio1" name="test_radio" value="first" >
<input type="radio" id="test_radio2" name="test_radio" value="second" >
</div>
</div>
<div class="container-fluid" >
<div class="row">
<div class="text-center">
<a href="https://imapsync.lamiral.info/">
<img alt="Imapsync home" title="Imapsync home page" src="https://imapsync.lamiral.info/X/logo_imapsync_Xn.png" height="38" width="60">
</a>
<a href="#top" title="Top of the page" class="btn btn-info " role="button">Top</a>
<a href="#bottom" title="Bottom of the page" class="btn btn-info active" role="button">Bottom</a>
</div>
</div>
<h1 class="text-center">Imapsync Online Unlimited</h1>
<p class="text-center larger"> <strong>Copy</strong>/synchronize a <strong>complete</strong> Mailbox to another, without <strong>duplicates!</strong></p>
<form id="form" action="/cgi-bin/proximapsync" method="post" autocomplete="on">
<div id="form_row" class="row">
<div id="account1" class="col-md-5" >
<fieldset>
<legend class="text-center h2">IMAP source Mailbox</legend>
<label for="user1">Login</label> (usually an email address)
<div class="input-group form-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-user"> </i></span>
<input
data-toggle="tooltip" data-placement="bottom" title="It is usually an email address or its left part before @"
type="text" class="form-control input-lg" id="user1" name="user1" tabindex="1"
placeholder="Enter login name">
</div>
<label for="password1">Password</label>
<label class="checkbox-inline out">
<input type="checkbox" id="showpassword1"> show password
</label>
<div class="input-group form-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-lock"></i></span>
<input
data-toggle="tooltip" data-placement="bottom" title="Passwords are not stored on the server"
type="password" class="form-control input-lg" id="password1" name="password1" tabindex="2"
placeholder="Enter password">
</div>
<label for="host1">IMAP Server hostname</label> (or its IP address)
<div class="input-group form-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-cloud"></i></span>
<input
data-toggle="tooltip" data-placement="bottom" title="IMAP transfers are done with encryption if the servers support it."
list="servers1" type="text" class="form-control input-lg" id="host1" name="host1" tabindex="3"
placeholder="Enter IMAP source server name or IP address">
<datalist id="servers1">
<option value="imap.gmail.com">
<option value="outlook.office365.com">
<option value="imap.hostinger.com">
<option value="ssl0.ovh.net">
<option value="email-ssl.com.br">
<option value="imap.mail.yahoo.com">
</datalist>
</div>
<div class="form-group collapse extra_param">
<label class="checkbox-inline">
<input
data-toggle="tooltip" data-placement="bottom" title="Be careful with this option"
type="checkbox" id="delete1" name="delete1">Move sync. Deletes messages on source mailbox after a successful transfer.
</label>
</div>
<div class="form-group collapse extra_param" >
<label for="subfolder1">Sub-folder</label>
<div class="input-group form-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-folder-open"></i></span>
<input
data-toggle="tooltip" data-placement="bottom" title="A subfolder where all the source mailbox comes from."
type="text" class="form-control input-lg" id="subfolder1" name="subfolder1"
placeholder="Enter sub-folder name">
</div>
</div>
<div>
<br>
</div>
</fieldset>
</div>
<div id="parameters" class="col-md-2" >
<div>
<br>
</div>
<div>
<label class="checkbox-inline">
<input
data-toggle="tooltip" data-placement="bottom" title="Shows what would be done without really doing it."
type="checkbox" id="dry" name="dry" >Just verbose, no real sync.
</label>
</div>
<div>
<label class="checkbox-inline">
<input
data-toggle="tooltip" data-placement="bottom" title="Checks credentials without syncing anything."
type="checkbox" id="justlogin" name="justlogin" >Just checks credentials.
</label>
</div>
<div>
<label class="checkbox-inline">
<input
data-toggle="tooltip" data-placement="bottom" title="Shows folders sizes and exits."
type="checkbox" id="justfoldersizes" name="justfoldersizes" >Just presents folders sizes.
</label>
</div>
<div>
<label class="checkbox-inline">
<input
data-toggle="tooltip" data-placement="bottom" title="Just create the folder hierarchy, messages are not synced."
type="checkbox" id="justfolders" name="justfolders" >Just create folders.
</label>
</div>
<div>
<br>
</div>
<div id="button_extra_param" class="text-center scripton">
<button type="button" class="btn btn-default btn-block" data-toggle="collapse"
data-target=".extra_param">Show / Hide extra parameters</button>
</div>
<div>
<br>
</div>
<div id="button_swap" class="text-center scripton">
<button type="button" class="btn btn-default btn-block" id="swap">
Swap Source <span class="glyphicon glyphicon-transfer"></span> Destination
</button>
</div>
<div>
<br>
</div>
</div>
<div id="account2" class="col-md-5" >
<fieldset>
<legend class="text-center h2">IMAP destination Mailbox</legend>
<label for="user2">Login</label> (usually an email address)
<div class="input-group form-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span>
<input
data-toggle="tooltip" data-placement="bottom" title="It is usually an email address or its left part before @"
type="text" class="form-control input-lg" id="user2" name="user2" tabindex="6"
placeholder="Enter login name">
</div>
<label for="password2">Password</label>
<label class="checkbox-inline out">
<input type="checkbox" id="showpassword2"> show password
</label>
<div class="input-group form-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-lock"></i></span>
<input
data-toggle="tooltip" data-placement="bottom" title="Passwords are not stored on the server"
type="password" class="form-control input-lg" id="password2" name="password2" tabindex="7"
placeholder="Enter password">
</div>
<label for="host2">IMAP Server hostname</label> (or its IP address)
<div class="input-group form-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-cloud"></i></span>
<input
data-toggle="tooltip" data-placement="bottom" title="IMAP transfers are done with encryption if the servers support it."
list="servers2" type="text" class="form-control input-lg" id="host2" name="host2" tabindex="8"
placeholder="Enter IMAP destination server name or IP address">
<datalist id="servers2">
<option value="imap.gmail.com">
<option value="outlook.office365.com">
<option value="imap.hostinger.com">
<option value="ssl0.ovh.net">
<option value="email-ssl.com.br">
<option value="imap.mail.yahoo.com">
</datalist>
</div>
<!-- -->
<div class="form-group collapse extra_param">
<label class="checkbox-inline">
<input
data-toggle="tooltip" data-placement="bottom" title="Be careful with this option"
type="checkbox" id="delete2" name="delete2" tabindex="9">Strict sync. Deletes messages on destination mailbox that are not at the source mailbox.
</label>
</div>
<div class="form-group collapse extra_param" id="extra_subfolder2" >
<label for="subfolder2">Sub-folder</label>
<div class="input-group form-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-folder-open"></i></span>
<input
data-toggle="tooltip" data-placement="bottom" title="A subfolder where all the source mailbox will go."
type="text" class="form-control input-lg" id="subfolder2" name="subfolder2"
placeholder="Enter sub-folder name">
</div>
</div>
<!-- -->
<div>
<br>
</div>
</fieldset>
</div>
</div>
<input type="hidden" name="automap" value="on">
<input type="hidden" name="addheader" value="on">
<!-- -#->
<input type="hidden" name="simulong" value="360">
<!-#- -->
<a id="buttons"></a>
<hr>
<div class="text-center center-block">
If you <b>close</b> this <b>window</b> (or tab) <b>during</b> the synchronization,
it will <b>abort</b> the synchronization, it's like <b>hitting</b> the red button <b>"Abort!"</b> below.
</div>
<!-- Classical button to go to the log only, when javascript is turned off -->
<noscript>
<div class="row">
<div class="col-sm-12 padd0" >
<button type="submit" class="btn btn-success btn-lg center-block btn-block">Go sync!</button>
</div>
</div>
</noscript>
<!-- Javascript buttons using xhr -->
<div class="row scripton">
<div class="col-sm-6 padd0" >
<button id="bt-sync" type="button"
class="btn btn-success btn-lg center-block btn-block"
tabindex="11"
data-toggle="tooltip" data-placement="top"
title="Launch the sync! You can abort the sync with the red Abort button nearby or by closing the tab/window."
>
Sync or resync!<br>
<span class="glyphicon glyphicon-envelope"></span>
<span class="glyphicon glyphicon-arrow-right"></span>
<span class="glyphicon glyphicon-envelope"></span>
</button>
</div>
<div class="col-sm-6 padd0" >
<button id="bt-abort" type="button"
class="btn btn-danger btn-lg center-block btn-block" tabindex="12"
data-toggle="tooltip" data-placement="top"
title="Abort the sync! You can restart the sync later, no duplicates should happen."
>
Abort!<br>
<span class="glyphicon glyphicon-scissors"></span>
</button>
</div>
</div>
</form>
<div class="row scripton" id="consoles" >
<pre id="imapsync_current" class="center-block text-center"></pre>
<span id="imapsync_advice_hours" class="text-center collapse">
Best <a href="#local_bandwidth"><b>bandwidth available hours</b></a> are from <b>11h PM to 11h AM UTC</b> on Mondays to Fridays, <b>all hours</b> on Saturdays and <b>Sundays</b>.
</span>
<pre id="progress-txt">ETA: Estimation Time of Arrival</pre>
<div class="progress">
<div id="progress-bar-done" class="progress-bar progress-bar-success" role="progressbar">
Progress bar
</div>
<div id="progress-bar-left" class="progress-bar progress-bar-info" role="progressbar">
Progress bar
</div>
</div>
<div class="col-sm-6 well">
<h2 class="text-center">Console of imapsync launch</h2>
<pre id="console">
</pre>
</div>
<div class="col-sm-6 well">
<h2 class="text-center">Console of abort</h2>
<pre id="abort">
</pre>
</div>
</div>
</div>
<h2 id="imapsync_log_beginning" class="text-center scripton">Log of imapsync run</h2>
<div class="text-center scripton">
<a href="#imapsync_log_bottom">Link to the <b>bottom</b> of the imapsync log file</a>
</div>
<pre id="output" class="scripton">
</pre>
<div id="imapsync_log_bottom" class="text-center scripton">
<a href="#imapsync_log_beginning">Link to the <b>beginning</b> of the imapsync log file</a>
</div>
<div id="local_bandwidth" class="collapse">
<hr>
<p class="text-center">
<b>Local bandwidth statistics</b><br>
<a href="/vnstat/vnstati.html">
<img alt="Local bandwidth statistics" src="/vnstat/vnstat_vs.png" >
</a>
</p>
</div>
<div id="local_status_dbmon" class="collapse">
<hr>
<p class="text-center">
Imapsync <b>Online Status</b> over the <b>last 24h</b><br>
<a href="imapsync_online_status.html"><img id="status_24h" class="img-responsive center-block" alt="Imapsync Online Status over the last 24h" src="https://sup.lamiral.info/dbmon/cgi-bin/rrdview.cgi?child=yes&rrdfile=%2Fvar%2Ftmp%2Fdbmon%2Ftests%2Frrdbases%2Flocalhost~2583~LAMIRAL~Imapsync_Online~LAMIRAL%2CImapsync_Online~opstatus~300~.rrd;interval_vue=p86400;date_given_by=now;date_means=end;dsname=opstatus;width=1200;hight=70;lower=0;upper=100;rigid=on;Beautiful%20Image%21.x=128;Beautiful%20Image%21.y=30;title=Service%20Status;owner=Imapsync_Online;caption=Status%20in%20%25;monitor=https.rrdrt.monitor%20--rrdrt%20imapsync.lamiral.info%2Fcgi-bin%2Fimapsync%20%3B%3B">
</a>
</p>
</div>
<div id="local_status_hetrix" class="collapse">
<hr>
<p class="text-center">
The service is down? For how long? How often? Take also a look at the
<a href="https://hetrixtools.com/report/uptime/873a2356aea43055204b59f562b5ad52/414322.html">Imapsync Online Status</a>
monitor page powered by the <a href="https://hetrixtools.com/414322.html">HetrixTools</a> company.
</p>
</div>
<a id="bottom"></a>
<hr>
<p class="text-center">Feel free to contact
<strong><a href="https://imapsync.lamiral.info/#AUTHOR" target="_blank">Gilles LAMIRAL</a></strong>
</p>
<div class="container-fluid" >
<div class="row">
<div class="text-center">
<a href="https://imapsync.lamiral.info/">
<img alt="Imapsync home page" src="https://imapsync.lamiral.info/X/logo_imapsync_Xn.png" height="38" width="60">
</a>
<a href="#top" title="Top of the page" class="btn btn-info " role="button">Top</a>
<!-- <a href="#buttons" class="btn btn-info scripton" role="button">Consoles</a> -->
<a href="#bottom" title="Bottom of the page" class="btn btn-info active" role="button">Bottom</a>
<br>
<small> ($Id: proximapsync_form_extra.html,v 1.2 2022/05/07 13:53:00 gilles Exp gilles $) </small><br>
Terms and conditions for anything: <a href="https://imapsync.lamiral.info/LICENSE">No limits to do anything with this work and this license!</a><br>
</div>
</div>
</div>
<script
src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"
integrity="sha384-xBuQ/xzmlsLoJpyjoggmTEz8OWUFM0/RC5BsqQBDX2v5cMvDHcMakNTNrHIW2I5f"
crossorigin="anonymous"
>
</script>
<script
src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"
integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa"
crossorigin="anonymous"
>
</script>
<!--
<script src="crypto-js/core.js"></script>
<script src="crypto-js/sha256.js"></script>
-->
<script
src="proximapsync_form.js"
>
</script>
</body>
</html>

View File

@ -0,0 +1,536 @@
<!DOCTYPE html>
<!-- $Id: proximapsync_form_extra_free.html,v 1.3 2022/05/07 13:53:00 gilles Exp gilles $ -->
<html lang="en" id="top">
<head>
<!--
<script
data-ad-client="ca-pub-3325993554161060"
async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js">
</script>
-->
<title>Mailbox Imapsync Online</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css"
integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">
<link rel="stylesheet" href="imapsync_form.css">
<link rel="stylesheet" href="../S/style.css" type="text/css" />
<link rel="license" href="https://imapsync.lamiral.info/NOLIMIT">
<noscript>
<link rel="stylesheet" href="noscript.css">
</noscript>
</head>
<body>
<div class="scripton">
<!-- will appear if some tests fail -->
<pre id="tests" class="collapse"></pre>
<!-- hidden stuff that must exit for the tests -->
<div class="hidden">
<input type="checkbox" id="test_checkbox">
<input type="text" id="test_text">
<input type="radio" id="test_radio1" name="test_radio" value="first" >
<input type="radio" id="test_radio2" name="test_radio" value="second" >
</div>
</div>
<div class="container-fluid" >
<div class="row">
<div class="text-center">
<a href="https://imapsync.lamiral.info/">
<img alt="Imapsync home" title="Imapsync home page" src="https://imapsync.lamiral.info/X/logo_imapsync_Xn.png" height="38" width="60">
</a>
<a href="#top" title="Top of the page" class="btn btn-info " role="button">Top</a>
<a href="#payment" class="btn btn-success" data-toggle="collapse">Pricing</a>
<!-- <a href="#buttons" class="btn btn-info scripton" role="button">Consoles</a> -->
<a href="#bottom" title="Bottom of the page" class="btn btn-info active" role="button">Bottom</a>
</div>
</div>
<h1 class="text-center">Mailbox Imapsync Online</h1>
<p class="text-center larger"><strong>Copy/synchronize</strong> a <strong>Mailbox</strong> (below 3 GB) to another,
without <strong>duplicates!</strong><br>
<strong>Buying</strong> gives <strong>unlimited</strong> syncs of <strong>any size</strong>.</p>
<!-- Paypal part start
new: NDGMR6TLFZ926
old: H2YTURNFT4XT4
-->
<!-- A button above the pricing form, not very beautiful...
I should give it a try anyway because nearly no one buy this service...
<div class="text-center">
<a href="#payment" class="btn btn-warning btn-lg" data-toggle="collapse">Pricing</a>
</div>
-->
<!-- the "in" makes the form not collapsed by default
Remove the "in" in order to mask the pricing section
<div id="payment" class="well text-center collapse in" >
<div id="payment" class="well text-center collapse out" > -->
<div id="payment" class="well text-center collapse out" >
<p class="lead">Pay by usage type</p>
<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_blank">
<input type="hidden" name="cmd" value="_s-xclick" />
<input type="hidden" name="hosted_button_id" value="H2YTURNFT4XT4" />
<input type="hidden" name="on0" value="imapsync choice" />
<fieldset>
<!--
<label data-toggle="tooltip" data-placement="top" title="Fair enough"
class="radio-inline"><input type="radio" name="os0" value="Tiny" > €1,00 </label>
<label data-toggle="tooltip" data-placement="top" title="A big mailbox"
class="radio-inline"><input type="radio" name="os0" value="Small" checked > €6,00 </label>
-->
<label data-toggle="tooltip" data-placement="top" title="Many mailboxes to migrate"
class="radio-inline"><input type="radio" name="os0" value="High" checked > €120,00 </label>
<label data-toggle="tooltip" data-placement="top" title="Some big mailboxes to migrate"
class="radio-inline"><input type="radio" name="os0" value="Normal" > €30,00 </label>
<br>
<input type="hidden" name="currency_code" value="EUR" />
<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_buynowCC_LG.gif" name="submit" alt="PayPal - A safe, easy way to pay online!" />
</fieldset>
<p>
<strong>30-day money back guarantee!</strong> <br>
<em><b>No question</b> nor condition to get a <b>refund</b>, really, <b>just request</b> it and you'll <b>sure</b> get a refund!</em>
</p>
<p>
<input type="hidden" value="VAT if professional in Europe" name="on1" />
If you're a <b>European professional</b> buyer, please enter your <b>VAT number</b>:
<input type="text" maxlength="17" size="17" name="os1" />
It's for the <b>invoice</b> and customs declaration.<br />
It's <b>ok</b> if you <b>don't</b> have a VAT number.<br />
</p>
</form>
</div>
<!-- Paypal part end -->
<form id="form" action="/cgi-bin/proximapsync" method="post" autocomplete="on">
<div id="form_row" class="row">
<div id="account1" class="col-md-5" >
<fieldset>
<legend class="text-center h2">IMAP source Mailbox</legend>
<label for="user1">Login</label> (usually an email address)
<div class="input-group form-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-user"> </i></span>
<input
data-toggle="tooltip" data-placement="bottom" title="It is usually an email address or its left part before @"
type="text" class="form-control input-lg" id="user1" name="user1" tabindex="1"
placeholder="Enter login name">
</div>
<label for="password1">Password</label>
<label class="checkbox-inline out">
<input type="checkbox" id="showpassword1"> show password
</label>
<div class="input-group form-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-lock"></i></span>
<input
data-toggle="tooltip" data-placement="bottom" title="Passwords are not stored on the server"
type="password" class="form-control input-lg" id="password1" name="password1" tabindex="2"
placeholder="Enter password">
</div>
<label for="host1">IMAP Server hostname</label> (or its IP address)
<div class="input-group form-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-cloud"></i></span>
<input
data-toggle="tooltip" data-placement="bottom" title="IMAP transfers are done with encryption if the servers support it."
list="servers1" type="text" class="form-control input-lg" id="host1" name="host1" tabindex="3"
placeholder="Enter IMAP source server name or IP address">
<datalist id="servers1">
<option value="imap.gmail.com">
<option value="outlook.office365.com">
<option value="imap.hostinger.com">
<option value="ssl0.ovh.net">
<option value="email-ssl.com.br">
<option value="imap.mail.yahoo.com">
</datalist>
</div>
<div class="form-group collapse extra_param">
<label class="checkbox-inline">
<input
data-toggle="tooltip" data-placement="bottom" title="Be careful with this option"
type="checkbox" id="delete1" name="delete1">Move sync. Deletes messages on source mailbox after a successful transfer.
</label>
</div>
<div class="form-group collapse extra_param" >
<label for="subfolder1">Sub-folder</label>
<div class="input-group form-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-folder-open"></i></span>
<input
data-toggle="tooltip" data-placement="bottom" title="A subfolder where all the source mailbox comes from."
type="text" class="form-control input-lg" id="subfolder1" name="subfolder1"
placeholder="Enter sub-folder name">
</div>
</div>
<div>
<br>
</div>
</fieldset>
</div>
<div id="parameters" class="col-md-2" >
<div>
<br>
</div>
<div>
<label class="checkbox-inline">
<input
data-toggle="tooltip" data-placement="bottom" title="Shows what would be done without really doing it."
type="checkbox" id="dry" name="dry" >Just verbose, no real sync.
</label>
</div>
<div>
<label class="checkbox-inline">
<input
data-toggle="tooltip" data-placement="bottom" title="Checks credentials without syncing anything."
type="checkbox" id="justlogin" name="justlogin" >Just checks credentials.
</label>
</div>
<div>
<label class="checkbox-inline">
<input
data-toggle="tooltip" data-placement="bottom" title="Shows folders sizes and exits."
type="checkbox" id="justfoldersizes" name="justfoldersizes" >Just presents folders sizes.
</label>
</div>
<div>
<label class="checkbox-inline">
<input
data-toggle="tooltip" data-placement="bottom" title="Just create the folder hierarchy, messages are not synced."
type="checkbox" id="justfolders" name="justfolders" >Just create folders.
</label>
</div>
<div>
<br>
</div>
<div id="button_extra_param" class="text-center scripton">
<button type="button" class="btn btn-default btn-block" data-toggle="collapse"
data-target=".extra_param">Show / Hide extra parameters</button>
</div>
<div>
<br>
</div>
<div id="button_swap" class="text-center scripton">
<button type="button" class="btn btn-default btn-block" id="swap">
Swap Source <span class="glyphicon glyphicon-transfer"></span> Destination
</button>
</div>
<div>
<br>
</div>
</div>
<div id="account2" class="col-md-5" >
<fieldset>
<legend class="text-center h2">IMAP destination Mailbox</legend>
<label for="user2">Login</label> (usually an email address)
<div class="input-group form-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span>
<input
data-toggle="tooltip" data-placement="bottom" title="It is usually an email address or its left part before @"
type="text" class="form-control input-lg" id="user2" name="user2" tabindex="6"
placeholder="Enter login name">
</div>
<label for="password2">Password</label>
<label class="checkbox-inline out">
<input type="checkbox" id="showpassword2"> show password
</label>
<div class="input-group form-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-lock"></i></span>
<input
data-toggle="tooltip" data-placement="bottom" title="Passwords are not stored on the server"
type="password" class="form-control input-lg" id="password2" name="password2" tabindex="7"
placeholder="Enter password">
</div>
<label for="host2">IMAP Server hostname</label> (or its IP address)
<div class="input-group form-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-cloud"></i></span>
<input
data-toggle="tooltip" data-placement="bottom" title="IMAP transfers are done with encryption if the servers support it."
list="servers2" type="text" class="form-control input-lg" id="host2" name="host2" tabindex="8"
placeholder="Enter IMAP destination server name or IP address">
<datalist id="servers2">
<option value="imap.gmail.com">
<option value="outlook.office365.com">
<option value="imap.hostinger.com">
<option value="ssl0.ovh.net">
<option value="email-ssl.com.br">
<option value="imap.mail.yahoo.com">
</datalist>
</div>
<!-- -->
<div class="form-group collapse extra_param">
<label class="checkbox-inline">
<input
data-toggle="tooltip" data-placement="bottom" title="Be careful with this option"
type="checkbox" id="delete2" name="delete2" tabindex="9">Strict sync. Deletes messages on destination mailbox that are not at the source mailbox.
</label>
</div>
<div class="form-group collapse extra_param" id="extra_subfolder2" >
<label for="subfolder2">Sub-folder</label>
<div class="input-group form-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-folder-open"></i></span>
<input
data-toggle="tooltip" data-placement="bottom" title="A subfolder where all the source mailbox will go."
type="text" class="form-control input-lg" id="subfolder2" name="subfolder2"
placeholder="Enter sub-folder name">
</div>
</div>
<!-- -->
<div>
<br>
</div>
</fieldset>
</div>
</div>
<input type="hidden" name="automap" value="on">
<input type="hidden" name="addheader" value="on">
<input type="hidden" name="exitwhenover" value="3000000000">
<!-- -#->
<input type="hidden" name="simulong" value="360">
<!-#- -->
<a id="buttons"></a>
<hr>
<div class="text-center center-block">
If you <b>close</b> this <b>window</b> (or tab) <b>during</b> the synchronization,
it will <b>abort</b> the synchronization, it's like <b>hitting</b> the red button <b>"Abort!"</b> below.
</div>
<!-- Classical button to go to the log only, when javascript is turned off -->
<noscript>
<div class="row">
<div class="col-sm-12 padd0" >
<button type="submit" class="btn btn-success btn-lg center-block btn-block">Go sync!</button>
</div>
</div>
</noscript>
<!-- Javascript buttons using xhr -->
<div class="row scripton">
<div class="col-sm-6 padd0" >
<button id="bt-sync" type="button"
class="btn btn-success btn-lg center-block btn-block"
tabindex="11"
data-toggle="tooltip" data-placement="top"
title="Launch the sync! You can abort the sync with the red Abort button nearby or by closing the tab/window."
>
Sync or resync!<br>
<span class="glyphicon glyphicon-envelope"></span>
<span class="glyphicon glyphicon-arrow-right"></span>
<span class="glyphicon glyphicon-envelope"></span>
</button>
</div>
<div class="col-sm-6 padd0" >
<button id="bt-abort" type="button"
class="btn btn-danger btn-lg center-block btn-block" tabindex="12"
data-toggle="tooltip" data-placement="top"
title="Abort the sync! You can restart the sync later, no duplicates should happen."
>
Abort!<br>
<span class="glyphicon glyphicon-scissors"></span>
</button>
</div>
</div>
</form>
<div class="row scripton" id="consoles" >
<pre id="imapsync_current" class="center-block text-center"></pre>
<span id="imapsync_advice_hours" class="text-center collapse">
Best <a href="#local_bandwidth"><b>bandwidth available hours</b></a> are from <b>11h PM to 11h AM UTC</b> on Mondays to Fridays, <b>all hours</b> on Saturdays and <b>Sundays</b>.
</span>
<pre id="progress-txt">ETA: Estimation Time of Arrival</pre>
<div class="progress">
<div id="progress-bar-done" class="progress-bar progress-bar-success" role="progressbar">
Progress bar
</div>
<div id="progress-bar-left" class="progress-bar progress-bar-info" role="progressbar">
Progress bar
</div>
</div>
<div class="col-sm-6 well">
<h2 class="text-center">Console of imapsync launch</h2>
<pre id="console">
</pre>
</div>
<div class="col-sm-6 well">
<h2 class="text-center">Console of abort</h2>
<pre id="abort">
</pre>
</div>
</div>
</div>
<h2 id="imapsync_log_beginning" class="text-center scripton">Log of imapsync run</h2>
<div class="text-center scripton">
<a href="#imapsync_log_bottom">Link to the <b>bottom</b> of the imapsync log file</a>
</div>
<pre id="output" class="scripton">
</pre>
<div id="imapsync_log_bottom" class="text-center scripton">
<a href="#imapsync_log_beginning">Link to the <b>beginning</b> of the imapsync log file</a>
</div>
<div id="local_bandwidth" class="collapse">
<hr>
<p class="text-center">
<b>Local bandwidth statistics</b><br>
<a href="/vnstat/vnstati.html">
<img alt="Local bandwidth statistics" src="/vnstat/vnstat_vs.png" >
</a>
</p>
</div>
<div id="local_status_dbmon" class="collapse">
<hr>
<p class="text-center">
Imapsync <b>Online Status</b> over the <b>last 24h</b><br>
<a href="imapsync_online_status.html"><img id="status_24h" class="img-responsive center-block" alt="Imapsync Online Status over the last 24h" src="https://sup.lamiral.info/dbmon/cgi-bin/rrdview.cgi?child=yes&rrdfile=%2Fvar%2Ftmp%2Fdbmon%2Ftests%2Frrdbases%2Flocalhost~2583~LAMIRAL~Imapsync_Online~LAMIRAL%2CImapsync_Online~opstatus~300~.rrd;interval_vue=p86400;date_given_by=now;date_means=end;dsname=opstatus;width=1200;hight=70;lower=0;upper=100;rigid=on;Beautiful%20Image%21.x=128;Beautiful%20Image%21.y=30;title=Service%20Status;owner=Imapsync_Online;caption=Status%20in%20%25;monitor=https.rrdrt.monitor%20--rrdrt%20imapsync.lamiral.info%2Fcgi-bin%2Fimapsync%20%3B%3B">
</a>
</p>
</div>
<div id="local_status_hetrix" class="collapse">
<hr>
<p class="text-center">
The service is down? For how long? How often? Take also a look at the
<a href="https://hetrixtools.com/report/uptime/873a2356aea43055204b59f562b5ad52/414322.html">Imapsync Online Status</a>
monitor page powered by the <a href="https://hetrixtools.com/414322.html">HetrixTools</a> company.
</p>
</div>
<a id="bottom"></a>
<hr>
<p class="text-center">Feel free to contact
<strong><a href="https://imapsync.lamiral.info/#AUTHOR" target="_blank">Gilles LAMIRAL</a></strong>
</p>
<div class="container-fluid" >
<div class="row">
<div class="text-center">
<a href="https://imapsync.lamiral.info/">
<img alt="Imapsync home page" src="https://imapsync.lamiral.info/X/logo_imapsync_Xn.png" height="38" width="60">
</a>
<a href="#top" title="Top of the page" class="btn btn-info " role="button">Top</a>
<!-- <a href="#buttons" class="btn btn-info scripton" role="button">Consoles</a> -->
<a href="#bottom" title="Bottom of the page" class="btn btn-info active" role="button">Bottom</a>
<br>
<small> ($Id: proximapsync_form_extra_free.html,v 1.3 2022/05/07 13:53:00 gilles Exp gilles $) </small><br>
Terms and conditions for anything: <a href="https://imapsync.lamiral.info/LICENSE">No limits to do anything with this work and this license!</a><br>
</div>
</div>
</div>
<script
src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"
integrity="sha384-xBuQ/xzmlsLoJpyjoggmTEz8OWUFM0/RC5BsqQBDX2v5cMvDHcMakNTNrHIW2I5f"
crossorigin="anonymous"
>
</script>
<script
src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"
integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa"
crossorigin="anonymous"
>
</script>
<!--
<script src="crypto-js/core.js"></script>
<script src="crypto-js/sha256.js"></script>
-->
<script
src="proximapsync_form.js"
>
</script>
</body>
</html>

View File

@ -1,57 +1,77 @@
<!DOCTYPE html>
<html>
<html lang="en">
<head>
<title>Imapsync CSV online</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<link rel="stylesheet" href="../S/style.css" type="text/css" />
<link rel="license" href="https://imapsync.lamiral.info/NOLIMIT">
<!-- -->
</head>
<body>
<h1>Imapsync online</h1>
<h1>Imapsync CSV online</h1>
<p>
This file is a sandbox to play with, to learn, understand what happens, what can be done etc.<br/>
<a href="#BOTTOM">Bottom of this page</a>
This Imapsync CSV online service is a prototype, a working prototype.<br/>
</p>
Some explanations about this service:
<ul>
<li>The input textarea is multi-lines, each line describe a synchronization from the source account to the destination account.</li>
<li>Blank lines are ignored. Blanks lines have only spaces or tabs or nothing but a CR</li>
<li>Lines beginning with # are also ignored, use that for commenting.</li>
<li>A basic line will sync all messages in all folders from the source account to the destination account.</li>
<li>Each line has seven columns, six for the credentials, and one extra to add one or several parameters to the imapsync command.</li>
<li>Each line has seven semi-colons characters ";", each one delimiting a column. The last column can be empty.</li>
<li>Each line is processed serially, one synchronization at a time.</li>
<li>At the end of the log, the lines that failed are listed.</li>
<li>The input textarea is prefilled with values, as an example, replace them with yours or remove them.</li>
<li></li>
<li></li>
<li></li>
</ul>
<form id="form" action="/cgi-bin/imapsync_csv_wrapper" method="post" autocomplete="on">
<textarea name="csv_data" rows="10" cols="120">
# This example is a real one, ie, truly working in the real world.
test1.lamiral.info;test1;secret1;test2.lamiral.info;test2;secret2;
<textarea id="csv_data" name="csv_data" rows="10" cols="120">
# This example is a real one, ie, a truly working in the real world.
test1.lamiral.info;test1;secret1;test2.lamiral.info;test2;secret2;;
# The reverse
test2.lamiral.info;test2;secret2;test1.lamiral.info;test1;secret1;
# The first again but this time with an authentication failure
test1.lamiral.info;test1;secret1;test2.lamiral.info;test2;wrong_secret;;
# The first again but with authentication failure
test1.lamiral.info;test1;secret1;test2.lamiral.info;test2;wrong;
# The first again but this time with extra parameters
test1.lamiral.info;test1;secret1;test2.lamiral.info;test2;secret2;--justfoldersizes --dry --minage 55 ;
</textarea>
<br/>
</form>
<button type="button"
onclick="imapsync( handleRun )"
>Run imapsync on all csv data
<p>
<button id="bt-sync" type="button">
Run imapsync on all csv data!
</button>
<button type="button"
onclick="abort( )"
>Abort imapsync
<button id="bt-abort" type="button">
Abort the run!
</button>
</p>
<p>
<a href="#BOTTOM">Link to the bottom of this page (end of the log)</a>
</p>
<h2>Console of imapsync runs</h2>
@ -63,13 +83,11 @@ test1.lamiral.info;test1;secret1;test2.lamiral.info;test2;wrong;
<pre id="abort">
</pre>
<h2>Log of imapsync runs</h2>
<h2>Log of all imapsync runs</h2>
<pre id="output" >
</pre>
<h2>Links</h2>
<div id="BOTTOM">
@ -78,89 +96,11 @@ test1.lamiral.info;test1;secret1;test2.lamiral.info;test2;wrong;
</p>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script>
var readyStateStr = {
0: "Request not initialized",
1: "Server connection established",
2: "Response headers received",
3: "Processing request",
4: "Finished and response is ready"
} ;
function imapsync( cFunction ) {
var xhr ;
xhr = new XMLHttpRequest( ) ;
var timerRefreshLog = setInterval( function() { refreshLog( xhr ) }, 3000 ) ;
xhr.onreadystatechange = function( ) {
cFunction( this, timerRefreshLog ) ;
} ;
var form_querystring = $("#form").serialize() ;
$("#form_querystring").text( form_querystring ) ;
xhr.open( "POST", "/cgi-bin/imapsync_csv_wrapper", true ) ;
xhr.setRequestHeader( "Content-type",
"application/x-www-form-urlencoded" ) ;
xhr.send( form_querystring ) ;
$("#output").text("Here comes the log!\n\n") ;
xhr.send( ) ;
}
function handleRun( xhr, timerRefreshLog ) {
$( "#console" ).text( "Status: " + xhr.status + " " + xhr.statusText + ".\n"
+ "State: " + readyStateStr[ xhr.readyState ] + "\n" ) ;
if ( xhr.status == 200 && xhr.readyState == 4 ) {
var headers = xhr.getAllResponseHeaders( ) ;
clearInterval( timerRefreshLog ) ;
refreshLog( xhr ) ; // a last time
}
}
function refreshLog( xhr ) {
$( "#output" ).text( xhr.responseText ) ;
}
function abort()
{
var querystring = $("#form").serialize() + "&abort=on";
var xhr;
xhr = new XMLHttpRequest();
xhr.onreadystatechange = function ()
{
handleAbort(xhr);
};
xhr.open("POST", "/cgi-bin/imapsync_csv_wrapper", true);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send(querystring);
}
function handleAbort( xhr ) {
$( "#abort" ).text( "Status: " + xhr.status + " " + xhr.statusText + ".\n"
+ "State: " + readyStateStr[ xhr.readyState ] + "\n" ) ;
if ( xhr.status == 200 && xhr.readyState == 4 ) {
var headers = xhr.getAllResponseHeaders( ) ;
// $( "#abort" ).append( "\n" + headers + "\n" ) ;
$( "#abort" ).append( xhr.responseText ) ;
}
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js">
</script>
<script src="sandbox_csv.js">
</script>
</body>
</html>

112
X/sandbox_csv.js Executable file
View File

@ -0,0 +1,112 @@
$(document).ready(
function ()
{
var readyStateStr = {
0: "Request not initialized",
1: "Server connection established",
2: "Response headers received",
3: "Processing request",
4: "Finished and response is ready"
} ;
function imapsync( cFunction ) {
var xhr ;
xhr = new XMLHttpRequest( ) ;
var timerRefreshLog = setInterval( function() { refreshLog( xhr ) }, 6000 ) ;
xhr.onreadystatechange = function( ) {
cFunction( this, timerRefreshLog ) ;
} ;
var form_querystring = $("#form").serialize() ;
$("#form_querystring").text( form_querystring ) ;
xhr.open( "POST", "/cgi-bin/imapsync_csv_wrapper", true ) ;
xhr.setRequestHeader( "Content-type",
"application/x-www-form-urlencoded" ) ;
xhr.send( form_querystring ) ;
$("#output").text("Here comes the log!\n\n") ;
}
function handleRun( xhr, timerRefreshLog ) {
$( "#console" ).text( "Status: " + xhr.status + " " + xhr.statusText + ".\n"
+ "State: " + readyStateStr[ xhr.readyState ] + "\n" ) ;
if ( xhr.status == 200 && xhr.readyState == 4 ) {
var headers = xhr.getAllResponseHeaders( ) ;
clearInterval( timerRefreshLog ) ;
refreshLog( xhr ) ; // a last time
$("#bt-sync").prop("disabled", false) ;
$("#csv_data").prop('readonly', false);
}
}
function refreshLog( xhr ) {
$( "#output" ).text( xhr.responseText ) ;
}
function abort()
{
var querystring = $("#form").serialize() + "&abort=on";
var xhr;
xhr = new XMLHttpRequest();
xhr.onreadystatechange = function ()
{
handleAbort(xhr);
};
xhr.open("POST", "/cgi-bin/imapsync_csv_wrapper", true);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send(querystring);
}
function handleAbort( xhr ) {
$( "#abort" ).text( "Status: " + xhr.status + " " + xhr.statusText + ".\n"
+ "State: " + readyStateStr[ xhr.readyState ] + "\n" ) ;
if ( xhr.status == 200 && xhr.readyState == 4 ) {
var headers = xhr.getAllResponseHeaders( ) ;
// $( "#abort" ).append( "\n" + headers + "\n" ) ;
$( "#abort" ).append( xhr.responseText ) ;
$("#csv_data").prop('readonly', false);
$( "#bt-sync" ).prop("disabled", false);
$( "#bt-abort" ).prop("disabled", false);
}
}
$("#bt-sync").click(
function ()
{
$("#bt-sync").prop("disabled", true) ;
$("#csv_data").prop('readonly', true);
$("#bt-abort").prop("disabled", false) ;
$("#abort").text("") ;
imapsync( handleRun ) ;
}
);
$("#bt-abort").click(
function ()
{
$("#bt-sync").prop("disabled", true);
$("#csv_data").prop('readonly', true);
$("#bt-abort").prop("disabled", true);
abort();
}
);
// in case of a manual refresh, start with
$("#csv_data").prop('readonly', false);
$("#bt-sync").prop("disabled", false);
$("#bt-abort").prop("disabled", false);
}
) ;

View File

@ -1,6 +1,5 @@
^Here is imapsync
^Load end is
^Load is
^Load .*is
^Server is on heavy load
^Temp directory is
^Current directory is
@ -36,6 +35,7 @@
^Message rate
^Average bandwidth rate
^Biggest message transferred
^Biggest message:
^Detected.*errors
^Ended by a signal
^Exiting with return value

View File

@ -1 +1 @@
imapsync_form_extra.html
proximapsync_form_extra.html

View File

@ -17,6 +17,7 @@ small { font-size: 8px; color: #cbcbcb; }
<body bgcolor="#ffffff">
<img src="vnstat_s.png" border="0" alt="summary"><br>
<img src="vnstat_5g.png" border="0" alt="5 minutes graphic"><br>
<img src="vnstat_5.png" border="0" alt="5 minutes"><br>
<img src="vnstat_h.png" border="0" alt="hourly"><br>
<img src="vnstat_d.png" border="0" alt="daily"><br>

1542
aa Normal file

File diff suppressed because it is too large Load Diff

View File

@ -7,7 +7,7 @@
<CENTER>
<H1>Imapsync tutorial</H1>
<FONT SIZE="4"><I>Gilles LAMIRAL gilles@lamiral.info</I></FONT><BR>
<FONT SIZE="4">$Id: TUTORIAL_Unix.t2t,v 1.26 2019/02/10 12:33:17 gilles Exp gilles $ </FONT>
<FONT SIZE="4">$Id: TUTORIAL_Unix.t2t,v 1.27 2022/01/14 12:42:51 gilles Exp gilles $ </FONT>
</CENTER>
<P></P>
@ -18,14 +18,14 @@
<LI><A HREF="#toc1">1. Good practices overview</A>
<LI><A HREF="#toc2">2. Basic steps</A>
<UL>
<LI><A HREF="#toc3">2.1. Verifying imapsync works well on its own</A>
<LI><A HREF="#toc3">2.1. Verifying imapsync works well</A>
<LI><A HREF="#toc4">2.2. Working with your data</A>
<LI><A HREF="#toc5">2.3. Prepare your credentials</A>
<LI><A HREF="#toc6">2.4. Take a real user account as source</A>
<LI><A HREF="#toc7">2.5. Take a test user account as destination</A>
<LI><A HREF="#toc6">2.4. Take a real user account as a source</A>
<LI><A HREF="#toc7">2.5. Take a test user account as a destination</A>
<LI><A HREF="#toc8">2.6. Edit your own script mysync</A>
</UL>
<LI><A HREF="#toc9">3. Background knowledge about emailboxes</A>
<LI><A HREF="#toc9">3. Background knowledge about mailboxes</A>
<LI><A HREF="#toc10">4. Imapsync presentation</A>
<LI><A HREF="#toc11">5. Conventions</A>
<LI><A HREF="#toc12">6. Why start with a test account on destination host2?</A>
@ -53,24 +53,24 @@ without much pain. So try imapsync with a real account at the source, aka host1,
and a test account at the destination, aka host2.
<P></P>
<LI>Next, once familiar and satisfied by the result on the host2 test account,
change to a real user account on host2 or just stop consider it a test one.
change to a real user account on host2 or just stop considering it a test one.
</UL>
<A NAME="toc2"></A>
<H1>2. Basic steps</H1>
<A NAME="toc3"></A>
<H2>2.1. Verifying imapsync works well on its own</H2>
<H2>2.1. Verifying imapsync works well</H2>
<P>
Open a terminal and go to the imapsync directory.
The imapsync directory is the directory created by extraction
of the tarball (.tgz), its name is <CODE>imapsync-1.xxx</CODE> where <CODE>1.xxx</CODE>
is imapsync release number (1.882 at the time of this writing).
The imapsync directory is the directory created by the extraction
of the tarball (.tgz), its name is <CODE>imapsync-2.xxx</CODE> where <CODE>2.xxx</CODE>
is imapsync release number (2.178 at the time of this proofread).
</P>
<PRE>
cd imapsync-1.xxx/
cd imapsync-2.xxx/
</PRE>
<P>
@ -86,14 +86,14 @@ It should output the help message.
</P>
<P>
If the previous command fails then there is an installation issue.
Go back to <A HREF="https://imapsync.lamiral.info/#install">https://imapsync.lamiral.info/#install</A> then
and read and apply the installation file corresponding to your
Go back to the <A HREF="https://imapsync.lamiral.info/#install">https://imapsync.lamiral.info/#install</A> section, then
read and apply the installation file corresponding to your
system and drop me an email about your issue.
</P>
<P>
Next, verify imapsync runs live tests. This check needs an Internet
Next, verify imapsync runs well with live tests. This check needs Internet
access. It does a simple sync between two real dedicated
imap maiboxes located at the host test.lamiral.info
imap mailboxes located at the host test.lamiral.info
</P>
<PRE>
@ -109,7 +109,7 @@ Now verify that the script examples/imapsync_example.sh runs fine:
</PRE>
<P>
This script does the same thing than "<CODE>imapsync --testslive</CODE>" but it
This script does the same thing as "<CODE>imapsync --testslive</CODE>" but it
uses explicitly the 6 parameters so it will be a good start
for your future own script.
</P>
@ -148,28 +148,28 @@ An IMAP account is accessed with 3 parameters,
</P>
<UL>
<LI>the imap server <B>host</B>. It's a server name or an ip address
<LI>the imap server <B>host</B>. It's a server name or an IP address
<LI>the <B>user</B> name
<LI>the <B>password</B>
</UL>
<P>
Since imapsync job is to sync two imap accounts we need 3 + 3 = 6 parameters:
Since imapsync job is to sync two imap accounts, we need 3 + 3 = 6 parameters:
</P>
<UL>
<LI>Three parameters in order to read data from the source account: <B>host1</B>, <B>user1</B> and <B>password1</B>
<LI>Three parameters in order to copy this data to the destination account: <B>host2</B>, <B>user2</B> and <B>password2</B>
<LI>Three parameters to read data from the source account: <B>host1</B>, <B>user1</B> and <B>password1</B>
<LI>Three parameters to copy this data to the destination account: <B>host2</B>, <B>user2</B> and <B>password2</B>
</UL>
<A NAME="toc6"></A>
<H2>2.4. Take a real user account as source</H2>
<H2>2.4. Take a real user account as a source</H2>
<P>
Even during the learning time with imapsync, you can take a
real user account as a source. There is also no problem if this account is
currently used by a user. By default, this account will only be read, no change will
be made by imapsync on it.
be made by imapsync on it. It's safe to use a normal and live account as a source, even to learn imapsync.
</P>
<P>
Assuming that the imap source server name host1 is <B>origin.example.com</B>,
@ -184,13 +184,13 @@ we now have the first three parameters.
</UL>
<A NAME="toc7"></A>
<H2>2.5. Take a test user account as destination</H2>
<H2>2.5. Take a test user account as a destination</H2>
<P>
Unlike the source side, the destination side will be modified by
imapsync. Therefore, for learning, checking and adjusting,
it is not a very good idea to use a real user imap account
the first times you play with imapsync.
imapsync. Therefore, for learning, checking, and adjusting,
it is not a good idea to use a real user imap account
the first time you play with imapsync.
</P>
<P>
If you really can't afford a test account on host2, it's ok,
@ -213,7 +213,7 @@ we now have the next three parameters.
<H2>2.6. Edit your own script mysync</H2>
<P>
Now edit the script <CODE>mysync</CODE> and replace the test values by yours.
Now edit the script <CODE>mysync</CODE> and replace the test values with yours.
</P>
<P>
You're ready for a dry test on your accounts.
@ -227,22 +227,21 @@ You're ready for a dry test on your accounts.
Since the <CODE>mysync</CODE> script is a copy of <CODE>examples/imapsync_example.sh</CODE>,
your first run with your data should include three other options
<CODE>--automap</CODE> <CODE>--justfolders</CODE> <CODE>--dry</CODE>.
With <CODE>--dry</CODE> option, nothing will really be done on host2
With <CODE>--dry</CODE> option, nothing will be done for real on host2
but yet it will test whether the credentials are ok on both sides.
You'll encounter two successful logins, or one failure on host1,
or a successful login on host1 but a failure on host2.
If the login are ok, you will also observe if the folders mapping is ok.
You'll encounter two successful logins, or one login failure on host1 or host2, or two failures on host1 and host2.
If the logins are ok, you will be able to observe that the folders mapping is ok.
</P>
<P>
If a login fails then double-check all three values that identify
If login fails then double-check all three values that identify
the account, which are the host, the login name, and the password.
</P>
<P>
If the folders mapping proposed is not ok then you can fix it with
option <CODE>--f1f2</CODE>. The following example maps the source folder
the option <CODE>--f1f2</CODE>. The following example maps the source folder
"Sent Messages" to the destination folder "Sent". The double-quotes
are not part of the folders names but they should be used when special
characters like blanks are in the folders names:
are not part of the names of the folders but they should be used when special
characters like blanks are in the names of the folders:
</P>
<PRE>
@ -250,7 +249,7 @@ characters like blanks are in the folders names:
</PRE>
<P>
As explained in the inline help or in the README:
As explained in the inline help or the README:
</P>
<PRE>
@ -267,7 +266,7 @@ folders. Remove <CODE>--dry</CODE> from the <CODE>mysync</CODE> script and rerun
</PRE>
<A NAME="toc9"></A>
<H1>3. Background knowledge about emailboxes</H1>
<H1>3. Background knowledge about mailboxes</H1>
<P>
Three Internet protocols are used to access almost all email accounts:
@ -289,7 +288,7 @@ they are unavailable from any other system located elsewhere.
<P>
The second protocol to deal with email messages is IMAP, Internet Message Access Protocol.
IMAP gives access to a hierarchy of mailboxes also called folders. Other IMAP features are
concurrent accesses, tagging with flags, search by many criterium like date, subject, size etc.
concurrent accesses, tagging with flags, search by many criteriums like date, subject, size, etc.
</P>
<P>
The IMAP protocol presents most of the features POP lacks.
@ -304,11 +303,11 @@ HTTP is the protocol to browse the web.
Web browsers like Google Chrome, Mozilla Firefox, Internet Explorer and Safari
are HTTP client software tools. You already know that so what's the point with HTTP mailboxes?
HTTP mailboxes are called webmails.
Webmails often offer the same features than imap servers
Webmails often offer the same features as imap servers
because webmails underlying storage systems are often imap servers.
</P>
<P>
Webmails systems like Gmail, Yahoo, Exchange, Zimbra or Office365 are also accessible via imap.
Webmails systems like Gmail, Yahoo, Exchange, Zimbra, or Office365 are also accessible via imap.
</P>
<P>
The conclusion of this protocol review is that mailboxes can be
@ -318,19 +317,19 @@ Here comes imapsync.
<P>
In case the source mailbox is only accessible by the POP protocol,
you can use the tool <CODE>pop2imap</CODE> to sync them.
<CODE>pop2imap</CODE> is located at <A HREF="http://www.linux-france.org/prj/pop2imap/">http://www.linux-france.org/prj/pop2imap/</A>
<CODE>pop2imap</CODE> is located at <A HREF="https://pop2imap.lamiral.info/">https://pop2imap.lamiral.info/</A>
</P>
<A NAME="toc10"></A>
<H1>4. Imapsync presentation</H1>
<P>
Software imapsync is a command line tool to
copy, migrate, backup or synchronize IMAP mailboxes.
Software imapsync is a command-line tool to
copy, migrate, backup, or synchronize IMAP mailboxes.
</P>
<P>
Command line means imapsync is not graphical, it is textual.
Usually with command line tools you have to type characters
Usually, with command-line tools, you have to type characters
on your keyboard. But your fingers won't suffer much pain
typing on the keyboard because script examples are given,
nearly ready to run. Most of the time you only have to change
@ -343,25 +342,25 @@ select/copy/paste complete examples,
and run the little script with a double-click.
</P>
<P>
Imapsync runs on Linux, Windows and OS X (Macintosh world).
Imapsync runs on Linux, Windows, and OS X (Macintosh/Darwin world).
Imapsync is written in the Perl language and, thanks to the
Perl developers, Perl runs mostly everywhere. So does imapsync.
</P>
<P>
While operating systems have a lot in common, they sometimes differ,
especially within their syntax. I won't blame anyone, historically Windows
came after Unix. The marvelous designers in this old times
decided it would be very cool to not share exactly the same syntax
came after Unix. The marvelous designers in these old times
decided it would be very cool to not share the same syntax
for doing the same things.
</P>
<P>
To designate an end of line, Unix uses the character \n
To designate an end of the line, Unix uses the character \n
Windows uses two characters \r\n and Mac use \r.
Thanks guys, great great thinking!
Thanks to you guys, great thinking!
Fifty years later, we still suffer from this...daily.
</P>
<P>
To avoid you some headaches with systems no one masters
To avoid some headaches with systems that no one masters
I will give examples in both worlds, Unix and Windows.
OS X users are in the Unix world nowadays so they must follow
the Unix examples.
@ -371,7 +370,7 @@ the Unix examples.
<H1>5. Conventions</H1>
<P>
In order to simplify display or print,
To simplify display or print,
each imapsync command line is usually written in several lines
but it could be written in one single line.
</P>
@ -379,11 +378,11 @@ but it could be written in one single line.
If you prefer to use the whole command written in one single line then
just remove the last visible character of each line ( \ or ^ ) and
also the carriage return character.
The last visible character means "command continues on next line";
it is the backslash \ character on Unix and the caret ^ character on Windows.
The last visible character \ or ^ means "command continues on next line";
it's the backslash \ character on Unix and the caret ^ character on Windows.
</P>
<P>
For example, on Unix, a command like the following
For example, on Unix, a command like the following:
</P>
<PRE>
@ -395,7 +394,7 @@ For example, on Unix, a command like the following
</PRE>
<P>
is equivalent to
is equivalent to:
</P>
<PRE>
@ -403,7 +402,7 @@ is equivalent to
</PRE>
<P>
and on Windows
and on Windows, a command like the following:
</P>
<PRE>
@ -415,7 +414,7 @@ and on Windows
</PRE>
<P>
is equivalent to
is equivalent to:
</P>
<PRE>
@ -435,16 +434,16 @@ messages that couldn't be transferred stay on host1.
</P>
<P>
It's not the same for destination accounts as imapsync writes on host2 accounts.
Imapsync creates folders on them, add messages, set flags on messages.
It isn't a safe behavior on a real account. So don't use a real user account
Imapsync creates folders on them, adds messages, and sets flags on messages.
It isn't safe on a real account. So don't use a real user account
to test imapsync. Learn to use it and see what it does on a test account at host2.
</P>
<P>
What can badly happen? The most common bad behavior is
the folders mapping won't be what you expect because it is strictly
reproduced from host1 to host2. The second bad behavior is
duplicates on second run and after, it's rare but it can happen
when a imap server software changes headers "<CODE>Message-Id</CODE>" or "<CODE>Received</CODE>".
that folders mapping won't be what you expect because it is strictly
reproduced from host1 to host2. The second bad behavior is getting
duplicates on the second run and after; it's rare but it can happen
when an imap server software changes the headers "<CODE>Message-Id</CODE>" or "<CODE>Received</CODE>".
Solutions to avoid duplicates are often easy (There's a FAQ called <CODE>FAQ.Duplicates.txt</CODE> about that).
It's also possible to remove the duplicates on host2 but it's better to avoid them on user accounts at first,
users won't like that you mess up their mailboxes.

View File

@ -1,6 +1,6 @@
Imapsync tutorial
Gilles LAMIRAL gilles@lamiral.info
$Id: TUTORIAL_Unix.t2t,v 1.26 2019/02/10 12:33:17 gilles Exp gilles $
$Id: TUTORIAL_Unix.t2t,v 1.27 2022/01/14 12:42:51 gilles Exp gilles $
+ Good practices overview +
@ -16,20 +16,20 @@ without much pain. So try imapsync with a real account at the source, aka host1,
and a test account at the destination, aka host2.
- Next, once familiar and satisfied by the result on the host2 test account,
change to a real user account on host2 or just stop consider it a test one.
change to a real user account on host2 or just stop considering it a test one.
+ Basic steps +
++ Verifying imapsync works well on its own ++
++ Verifying imapsync works well ++
Open a terminal and go to the imapsync directory.
The imapsync directory is the directory created by extraction
of the tarball (.tgz), its name is ``imapsync-1.xxx`` where ``1.xxx``
is imapsync release number (1.882 at the time of this writing).
The imapsync directory is the directory created by the extraction
of the tarball (.tgz), its name is ``imapsync-2.xxx`` where ``2.xxx``
is imapsync release number (2.178 at the time of this proofread).
```
cd imapsync-1.xxx/
cd imapsync-2.xxx/
```
Verify imapsync runs on your system
@ -39,13 +39,13 @@ Verify imapsync runs on your system
It should output the help message.
If the previous command fails then there is an installation issue.
Go back to https://imapsync.lamiral.info/#install then
and read and apply the installation file corresponding to your
Go back to the https://imapsync.lamiral.info/#install section, then
read and apply the installation file corresponding to your
system and drop me an email about your issue.
Next, verify imapsync runs live tests. This check needs an Internet
Next, verify imapsync runs well with live tests. This check needs Internet
access. It does a simple sync between two real dedicated
imap maiboxes located at the host test.lamiral.info
imap mailboxes located at the host test.lamiral.info
```
./imapsync --testslive
```
@ -54,7 +54,7 @@ Now verify that the script examples/imapsync_example.sh runs fine:
```
sh examples/imapsync_example.sh
```
This script does the same thing than "``imapsync --testslive``" but it
This script does the same thing as "``imapsync --testslive``" but it
uses explicitly the 6 parameters so it will be a good start
for your future own script.
@ -76,22 +76,22 @@ So far so good, now we're going to work with your data.
++ Prepare your credentials ++
An IMAP account is accessed with 3 parameters,
- the imap server **host**. It's a server name or an ip address
- the imap server **host**. It's a server name or an IP address
- the **user** name
- the **password**
Since imapsync job is to sync two imap accounts we need 3 + 3 = 6 parameters:
- Three parameters in order to read data from the source account: **host1**, **user1** and **password1**
- Three parameters in order to copy this data to the destination account: **host2**, **user2** and **password2**
Since imapsync job is to sync two imap accounts, we need 3 + 3 = 6 parameters:
- Three parameters to read data from the source account: **host1**, **user1** and **password1**
- Three parameters to copy this data to the destination account: **host2**, **user2** and **password2**
++ Take a real user account as source ++
++ Take a real user account as a source ++
Even during the learning time with imapsync, you can take a
real user account as a source. There is also no problem if this account is
currently used by a user. By default, this account will only be read, no change will
be made by imapsync on it.
be made by imapsync on it. It's safe to use a normal and live account as a source, even to learn imapsync.
Assuming that the imap source server name host1 is **origin.example.com**,
the user1 account name is **myuser1** and its password is **mysecret1**,
@ -102,12 +102,12 @@ we now have the first three parameters.
- --password1 **mysecret1**
++ Take a test user account as destination ++
++ Take a test user account as a destination ++
Unlike the source side, the destination side will be modified by
imapsync. Therefore, for learning, checking and adjusting,
it is not a very good idea to use a real user imap account
the first times you play with imapsync.
imapsync. Therefore, for learning, checking, and adjusting,
it is not a good idea to use a real user imap account
the first time you play with imapsync.
If you really can't afford a test account on host2, it's ok,
imapsync is not that bad but you may have some work to do to fix some unwanted behavior.
@ -124,7 +124,7 @@ we now have the next three parameters.
++ Edit your own script mysync ++
Now edit the script ``mysync`` and replace the test values by yours.
Now edit the script ``mysync`` and replace the test values with yours.
You're ready for a dry test on your accounts.
@ -135,27 +135,26 @@ sh mysync
Since the ``mysync`` script is a copy of ``examples/imapsync_example.sh``,
your first run with your data should include three other options
``--automap`` ``--justfolders`` ``--dry``.
With ``--dry`` option, nothing will really be done on host2
With ``--dry`` option, nothing will be done for real on host2
but yet it will test whether the credentials are ok on both sides.
You'll encounter two successful logins, or one failure on host1,
or a successful login on host1 but a failure on host2.
If the login are ok, you will also observe if the folders mapping is ok.
You'll encounter two successful logins, or one login failure on host1 or host2, or two failures on host1 and host2.
If the logins are ok, you will be able to observe that the folders mapping is ok.
If a login fails then double-check all three values that identify
If login fails then double-check all three values that identify
the account, which are the host, the login name, and the password.
If the folders mapping proposed is not ok then you can fix it with
option ``--f1f2``. The following example maps the source folder
the option ``--f1f2``. The following example maps the source folder
"Sent Messages" to the destination folder "Sent". The double-quotes
are not part of the folders names but they should be used when special
characters like blanks are in the folders names:
are not part of the names of the folders but they should be used when special
characters like blanks are in the names of the folders:
```
./imapsync ... --f1f2 "Sent Messages=Sent"
```
As explained in the inline help or in the README:
As explained in the inline help or the README:
```
--f1f2 str1=str2 : Force folder str1 to be synced to str2.
```
@ -169,7 +168,7 @@ sh mysync
+ Background knowledge about emailboxes +
+ Background knowledge about mailboxes +
Three Internet protocols are used to access almost all email accounts:
POP3, IMAP, HTTP.
@ -187,7 +186,7 @@ they are unavailable from any other system located elsewhere.
The second protocol to deal with email messages is IMAP, Internet Message Access Protocol.
IMAP gives access to a hierarchy of mailboxes also called folders. Other IMAP features are
concurrent accesses, tagging with flags, search by many criterium like date, subject, size etc.
concurrent accesses, tagging with flags, search by many criteriums like date, subject, size, etc.
The IMAP protocol presents most of the features POP lacks.
Messages stay on the imap server so any client on the network can access them
@ -199,10 +198,10 @@ HTTP is the protocol to browse the web.
Web browsers like Google Chrome, Mozilla Firefox, Internet Explorer and Safari
are HTTP client software tools. You already know that so what's the point with HTTP mailboxes?
HTTP mailboxes are called webmails.
Webmails often offer the same features than imap servers
Webmails often offer the same features as imap servers
because webmails underlying storage systems are often imap servers.
Webmails systems like Gmail, Yahoo, Exchange, Zimbra or Office365 are also accessible via imap.
Webmails systems like Gmail, Yahoo, Exchange, Zimbra, or Office365 are also accessible via imap.
The conclusion of this protocol review is that mailboxes can be
accessed using the IMAP protocol, most of the time.
@ -210,16 +209,16 @@ Here comes imapsync.
In case the source mailbox is only accessible by the POP protocol,
you can use the tool ``pop2imap`` to sync them.
``pop2imap`` is located at http://www.linux-france.org/prj/pop2imap/
``pop2imap`` is located at https://pop2imap.lamiral.info/
+ Imapsync presentation +
Software imapsync is a command line tool to
copy, migrate, backup or synchronize IMAP mailboxes.
Software imapsync is a command-line tool to
copy, migrate, backup, or synchronize IMAP mailboxes.
Command line means imapsync is not graphical, it is textual.
Usually with command line tools you have to type characters
Usually, with command-line tools, you have to type characters
on your keyboard. But your fingers won't suffer much pain
typing on the keyboard because script examples are given,
nearly ready to run. Most of the time you only have to change
@ -230,22 +229,22 @@ You can still use the mouse to launch an editor,
select/copy/paste complete examples,
and run the little script with a double-click.
Imapsync runs on Linux, Windows and OS X (Macintosh world).
Imapsync runs on Linux, Windows, and OS X (Macintosh/Darwin world).
Imapsync is written in the Perl language and, thanks to the
Perl developers, Perl runs mostly everywhere. So does imapsync.
While operating systems have a lot in common, they sometimes differ,
especially within their syntax. I won't blame anyone, historically Windows
came after Unix. The marvelous designers in this old times
decided it would be very cool to not share exactly the same syntax
came after Unix. The marvelous designers in these old times
decided it would be very cool to not share the same syntax
for doing the same things.
To designate an end of line, Unix uses the character \n
To designate an end of the line, Unix uses the character \n
Windows uses two characters \r\n and Mac use \r.
Thanks guys, great great thinking!
Thanks to you guys, great thinking!
Fifty years later, we still suffer from this...daily.
To avoid you some headaches with systems no one masters
To avoid some headaches with systems that no one masters
I will give examples in both worlds, Unix and Windows.
OS X users are in the Unix world nowadays so they must follow
the Unix examples.
@ -253,17 +252,17 @@ the Unix examples.
+ Conventions +
In order to simplify display or print,
To simplify display or print,
each imapsync command line is usually written in several lines
but it could be written in one single line.
If you prefer to use the whole command written in one single line then
just remove the last visible character of each line ( \ or ^ ) and
also the carriage return character.
The last visible character means "command continues on next line";
it is the backslash \ character on Unix and the caret ^ character on Windows.
The last visible character \ or ^ means "command continues on next line";
it's the backslash \ character on Unix and the caret ^ character on Windows.
For example, on Unix, a command like the following
For example, on Unix, a command like the following:
```
imapsync \
@ -272,12 +271,12 @@ For example, on Unix, a command like the following
--password1 secret1 \
...
```
is equivalent to
is equivalent to:
```
imapsync --host1 test.lamiral.info --user1 test1 --password1 secret1 ...
```
and on Windows
and on Windows, a command like the following:
```
imapsync.exe ^
--host1 test.lamiral.info ^
@ -285,7 +284,7 @@ and on Windows
--password1 secret1 ^
...
```
is equivalent to
is equivalent to:
```
imapsync --host1 test.lamiral.info --user1 test1 --password1 secret1 ...
```
@ -301,15 +300,15 @@ messages that couldn't be transferred stay on host1.
It's not the same for destination accounts as imapsync writes on host2 accounts.
Imapsync creates folders on them, add messages, set flags on messages.
It isn't a safe behavior on a real account. So don't use a real user account
Imapsync creates folders on them, adds messages, and sets flags on messages.
It isn't safe on a real account. So don't use a real user account
to test imapsync. Learn to use it and see what it does on a test account at host2.
What can badly happen? The most common bad behavior is
the folders mapping won't be what you expect because it is strictly
reproduced from host1 to host2. The second bad behavior is
duplicates on second run and after, it's rare but it can happen
when a imap server software changes headers "``Message-Id``" or "``Received``".
that folders mapping won't be what you expect because it is strictly
reproduced from host1 to host2. The second bad behavior is getting
duplicates on the second run and after; it's rare but it can happen
when an imap server software changes the headers "``Message-Id``" or "``Received``".
Solutions to avoid duplicates are often easy (There's a FAQ called ``FAQ.Duplicates.txt`` about that).
It's also possible to remove the duplicates on host2 but it's better to avoid them on user accounts at first,
users won't like that you mess up their mailboxes.

Some files were not shown because too many files have changed in this diff Show More