This commit is contained in:
Nick Bebout 2021-08-04 14:14:36 -05:00
parent 4ce248c075
commit f26b2573c3
370 changed files with 14441 additions and 136699 deletions

323
ChangeLog
View file

@ -1,17 +1,332 @@
RCS file: RCS/imapsync,v
Working file: imapsync
head: 1.977
head: 2.140
branch:
locks: strict
gilles: 1.977
gilles: 2.140
access list:
symbolic names:
keyword substitution: kv
total revisions: 977; selected revisions: 977
total revisions: 1040; selected revisions: 1040
description:
----------------------------
revision 1.977 locked by: gilles;
revision 2.140 locked by: gilles;
date: 2021/07/05 20:14:18; author: gilles; state: Exp; lines: +14 -10
Fixed perlcrit 4 severity 4 violations.
----------------------------
revision 2.139
date: 2021/07/04 21:03:28; author: gilles; state: Exp; lines: +14 -14
Adapted to oauth2/generate_gmail_token
----------------------------
revision 2.138
date: 2021/07/01 08:40:50; author: gilles; state: Exp; lines: +13 -10
Moved oauthgenerateaccess() call.
----------------------------
revision 2.137
date: 2021/07/01 08:13:52; author: gilles; state: Exp; lines: +32 -10
Bugfix. imapsync did nothing with the previous change.
----------------------------
revision 2.136
date: 2021/06/30 23:16:13; author: gilles; state: Exp; lines: +295 -176
Review the README part.
Added option --filterbuggyflags to filter the well known buggy flags that generate errors "BAD Invalid system flag" or "NO APPEND Invalid flag list".
1734 unit tests.
Some refactoring.
----------------------------
revision 2.135
date: 2021/06/29 20:38:40; author: gilles; state: Exp; lines: +58 -46
Reviewed README section until flags options.
----------------------------
revision 2.134
date: 2021/06/29 12:14:49; author: gilles; state: Exp; lines: +40 -14
Avoid unit tests on polarhome macosx where "ssl3_get_server_certificate:certificate verify failed". No clue to fix that.
----------------------------
revision 2.133
date: 2021/06/28 08:07:25; author: gilles; state: Exp; lines: +13 -12
Fixed some unit tests for polarhome macosx
----------------------------
revision 2.132
date: 2021/06/26 23:19:40; author: gilles; state: Exp; lines: +40 -17
Added tests to test cpu_number() on Windows MacOS
----------------------------
revision 2.131
date: 2021/06/25 16:20:38; author: gilles; state: Exp; lines: +57 -13
Bugfix. cpu_number was accurate only on Linux. Added Freebsd
----------------------------
revision 2.130
date: 2021/06/25 11:11:03; author: gilles; state: Exp; lines: +108 -36
Added percentage of all cpu in stats
----------------------------
revision 2.129
date: 2021/06/24 16:59:49; author: gilles; state: Exp; lines: +8 -8
Removed a debug print
----------------------------
revision 2.128
date: 2021/06/24 16:54:00; author: gilles; state: Exp; lines: +8 -8
1702 tests
----------------------------
revision 2.127
date: 2021/06/24 15:42:11; author: gilles; state: Exp; lines: +46 -16
Added statistic line "CPU time and %cpu"
----------------------------
revision 2.126
date: 2021/06/24 09:37:47; author: gilles; state: Exp; lines: +87 -33
Added --loglogfile option. Append ../list_all_logs_auto.txt with the logfile name. On by default in CGI context.
Some refactoring, file_to_array file_to_string functions.
----------------------------
revision 2.125
date: 2021/06/20 16:50:46; author: gilles; state: Exp; lines: +66 -25
Do not check selectable folders for huge accounts with more than 152 folders. 98percentile of /X
----------------------------
revision 2.124
date: 2021/06/17 12:29:22; author: gilles; state: Exp; lines: +8 -8
Testfix. Sometimes GMT is output UTC.
----------------------------
revision 2.123
date: 2021/06/17 11:56:20; author: gilles; state: Exp; lines: +30 -27
CGI context. Sync duplicates by default in cgi context.
----------------------------
revision 2.122
date: 2021/06/16 19:36:21; author: gilles; state: Exp; lines: +15 -17
Stats. Final line "Biggest message" was in fact "Biggest message" to be transferred. Now it is "Biggest message transferred".
----------------------------
revision 2.121
date: 2021/06/15 22:43:18; author: gilles; state: Exp; lines: +150 -89
Refactor. Splited sub myGetOptions() into sub setvalfromcgikey sub setvalfromlist sub setvalfromhash sub setvalfromcheckbox. Not very clean but better than the huge old one.
----------------------------
revision 2.120
date: 2021/06/15 22:32:28; author: gilles; state: Exp; lines: +54 -38
Change time presentation on ETA and in final stats. Example: Wednesday 16 June 2021-06-16 00:32:05 +0200 CEST
Added the timezone and full day
----------------------------
revision 2.119
date: 2021/06/06 10:21:34; author: gilles; state: Exp; lines: +162 -109
Added localtimez function to replace localtime, date and time with the timezone added. Not replaced yet.
Remove a useless warning "File xxx.pid does not exist" in tail function.
Made oauth2 tests dependent on oauth2_string_for_oauthdirect.txt oauth2_access_token.txt presence.
Added info "Exiting because of --justbanner" with --justbanner
----------------------------
revision 2.118
date: 2021/05/31 22:18:16; author: gilles; state: Exp; lines: +16 -11
In CGI context, the log directory is no longer ./LOG_imapsync/ but simply ./ It should fasten the searches and grep
----------------------------
revision 2.117
date: 2021/05/27 18:04:12; author: gilles; state: Exp; lines: +20 -16
Load limit 3x => 6x
----------------------------
revision 2.116
date: 2021/05/21 16:41:12; author: gilles; state: Exp; lines: +39 -53
load limit upped to 3
----------------------------
revision 2.115
date: 2021/05/05 23:41:12; author: gilles; state: Exp; lines: +11 -8
Advantage of a file when using --oauthaccesstoken1 str
----------------------------
revision 2.114
date: 2021/05/05 19:03:24; author: gilles; state: Exp; lines: +48 -21
Documented --oauthaccesstoken1 and --oauthdirect1 and the 2 sisters.
----------------------------
revision 2.113
date: 2021/05/03 20:47:18; author: gilles; state: Exp; lines: +118 -35
Implemented --oauthaccesstoken1 and --oauthaccesstoken2
1691 unit tests
----------------------------
revision 2.112
date: 2021/04/30 17:55:05; author: gilles; state: Exp; lines: +257 -248
Added --noabletosearch README
Removed trailing blanks, perlcrit "Found "\N{SPACE}" at the end of the line"
----------------------------
revision 2.111
date: 2021/04/30 07:40:41; author: gilles; state: Exp; lines: +615 -408
Added options --oauthdirect1 and --oauthdirect2
to support OAUTH2 authentication.
The parameter value is the direct string given to the XOAUTH2 imap command.
Added option --syncduplicates to sync duplicates.
Added option --trylogin on by default.
After a login failure of any king, imapsync tries to login
with the LOGIN command. Use --notrylogin to avoid that.
Reduced sub login_imap() number of parameters from 19 to 10.
Added options --oauthaccesstoken1 and --oauthaccesstoken2, not implemented yet.
Removed old OAUTH1 support. I hope no one will be touched by this removal, if
yes, I'll bring it back.
----------------------------
revision 2.110
date: 2021/03/28 17:34:29; author: gilles; state: Exp; lines: +25 -16
--timeout can now be a float (was only integer). Same for --timeout1 --timeout2
Warning about a timeout by the webserver in CGI mode.
$timeout no longer a variable (global).
----------------------------
revision 2.109
date: 2021/03/13 19:39:37; author: gilles; state: Exp; lines: +59 -25
Added message ""No log file because of option --nolog".
Added possibility of no logging in cgi context, with log=0 or log= in the parameters
Added possibility of float number for --simulong instead of integer.
1672 unit tests.
----------------------------
revision 2.108
date: 2021/02/25 10:35:33; author: gilles; state: Exp; lines: +27 -23
Bugfix. In sub delete_messages_on_any, the uidexpunge_or_expunge call was
always done with an empty array so no expunge was done there.
Fortunately, expunge was done elsewhere so this bug was not disastrous.
There is functionnal tests to check expunge behaviour anyway.
----------------------------
revision 2.107
date: 2021/02/09 20:02:55; author: gilles; state: Exp; lines: +9 -9
Back from Message-Id to Message-Id Received in cgisetcontext
----------------------------
revision 2.106
date: 2021/02/09 19:59:13; author: gilles; state: Exp; lines: +222 -16
Added some tests in sub tests_regexmess to remove a buggy header on multi-lines not all starting with a blank. 's{X-Spam-Report:.*?\n(^[^\n]+:|^\r?\n)}{$1}xms'
----------------------------
revision 2.105
date: 2021/02/02 11:17:15; author: gilles; state: Exp; lines: +30 -14
Added tests "Add a final \r\n if missing" in sub tests_regexmess
----------------------------
revision 2.104
date: 2021/01/27 15:14:09; author: gilles; state: Exp; lines: +76 -70
Added test to "Change 8bit characters in whole email to X characters" in sub tests_regexmess
----------------------------
revision 2.103
date: 2021/01/20 16:28:06; author: gilles; state: Exp; lines: +46 -20
Removed the exit_clean call when "Can not go to tls encryption on" in sub login_imap()
1652 tests
----------------------------
revision 2.102
date: 2020/12/13 23:48:30; author: gilles; state: Exp; lines: +43 -20
Bugfix. EXIT_ERR_APPEND_VIRUS had no message upon exit.
Bugfix. In --dry mode the final "Messages transferred : 0 (could be 1264 without dry mode)" is ok when the folders does not exist yet.
----------------------------
revision 2.101
date: 2020/12/08 23:47:13; author: gilles; state: Exp; lines: +171 -40
Added EXIT_CONNECTION_FAILURE_HOST1 101 return code
Added EXIT_CONNECTION_FAILURE_HOST2 102 return code
Added EXIT_AUTHENTICATION_FAILURE_USER1 161 return code
Added EXIT_AUTHENTICATION_FAILURE_USER2 162 return code
Do both side login and authentication before exiting on falure.
----------------------------
revision 2.100
date: 2020/12/07 00:45:50; author: gilles; state: Exp; lines: +24 -9
New numbering from 1.999 directly to 2.100 I want to avoid 1.1000 and sorting issues in directory listing.
Added option --dry1 it avoids to fetch the message on host1. --dry1 is on when --dry is on. It speeds up --dry very much.
----------------------------
revision 1.999
date: 2020/12/02 20:41:50; author: gilles; state: Exp; lines: +69 -34
Added a section "How do you know a sync is finished and well done?"
When creating a directory, now the current directory is also printed.
It helps when the directory created is relative.
Bugfix. resolv: imapsync.lamiral.info => 2001:41d0:2:84e0::1 (was 91.121.221.224)
----------------------------
revision 1.998
date: 2020/08/17 10:18:25; author: gilles; state: Exp; lines: +302 -108
1638 regression tests.
Added option --abortbyfile to be able to be aborted by a file presence (context: webserver on windows)
Reviewed and fixed sub acls_sync(). Did not work and made bad things.
Added exit value EXIT_BY_FILE => 7
Added exit value EXIT_TRANSFER_EXCEEDED => 118
----------------------------
revision 1.997
date: 2020/07/16 10:58:14; author: gilles; state: Exp; lines: +20 -17
Gmail update
gmail12: maxbytespersecond 20_000 maxbytesafter 1_000_000_000
gmail1 : maxbytespersecond 40_000 maxbytesafter 3_000_000_000 (was 2_500_000_000)
gmail2 : maxbytespersecond 20_000 maxbytesafter 1_000_000_000
----------------------------
revision 1.996
date: 2020/06/19 09:53:38; author: gilles; state: Exp; lines: +69 -20
Added exit 118 EXIT_TRANSFER_EXCEEDED when "Maximum bytes transferred reached" with option --exitwhenover
Added error type ERR_TRANSFER_EXCEEDED.
----------------------------
revision 1.995
date: 2020/06/17 18:55:01; author: gilles; state: Exp; lines: +9 -8
Added exitwhenover as an option in cgi context.
----------------------------
revision 1.994
date: 2020/06/14 12:10:30; author: gilles; state: Exp; lines: +76 -22
Bugfix. Fixed some "Exiting with return value ()". Added ERR_NOTHING_REPORTED error and exit EXIT_CATCH_ALL ie 1 in case.
----------------------------
revision 1.993
date: 2020/06/12 09:10:20; author: gilles; state: Exp; lines: +10 -8
Docfix. Fixed issue https://github.com/imapsync/imapsync/issues/213
Precision about --delete2duplicates
----------------------------
revision 1.992
date: 2020/05/29 12:14:53; author: gilles; state: Exp; lines: +156 -34
Bugfix. fatal string causing "Wide character in subroutine entry"
----------------------------
revision 1.991
date: 2020/05/12 20:37:48; author: gilles; state: Exp; lines: +86 -25
Bugfix. --checknoabletosearch was not adaptive.
Fix. tests sslheck now use test1.lamiral.info instead of imapsync.lamiral.info
Fix. tests_resolv now use ks6ipv6.lamiral.info instead of ks2ipv6.lamiral.info
Bugfix. Better closing of logfile at the end in order to avoid in Apache error log "AH01215: print() on closed filehandle $logfile_handle"
----------------------------
revision 1.990
date: 2020/05/03 17:07:36; author: gilles; state: Exp; lines: +7 -7
Bugfix. Forgot to map ERR_Host1_FETCH to EXIT_ERR_FETCH,
----------------------------
revision 1.989
date: 2020/05/03 17:07:17; author: gilles; state: Exp; lines: +8 -7
*** empty log message ***
----------------------------
revision 1.988
date: 2020/04/29 21:52:20; author: gilles; state: Exp; lines: +37 -8
Sanitize host1 and host2 values. Remove blanks and / characters.
----------------------------
revision 1.987
date: 2020/04/29 02:34:00; author: gilles; state: Exp; lines: +253 -18
Added an analyse and classification of the errors encountered.
Most common error encountered is printed at the end.
Exit value 112 is now replaced by the most common error encountered exit value
113 is EXIT_OVERQUOTA
114 is EXIT_ERR_APPEND
115 is EXIT_ERR_FETCH
116 is EXIT_ERR_CREATE
117 is EXIT_ERR_SELECT
111 is EXIT_WITH_ERRORS ERR_UNCLASSIFIED
----------------------------
revision 1.986
date: 2020/04/26 11:05:55; author: gilles; state: Exp; lines: +37 -36
Changed filter_forbidden_characters() to replace non-ascii and control characters and spaces by character _
----------------------------
revision 1.985
date: 2020/04/25 14:50:30; author: gilles; state: Exp; lines: +48 -23
Added unit tests to prepare "Wide character in subroutine entry".
----------------------------
revision 1.984
date: 2020/04/22 10:35:44; author: gilles; state: Exp; lines: +30 -15
Bugfix. Empty subject https://github.com/imapsync/imapsync/pull/216 added unit test regression.
----------------------------
revision 1.983
date: 2020/03/19 02:08:12; author: gilles; state: Exp; lines: +96 -13
Filter flags \PRIORITY \READRCPT in cgi context.
Now check if SEARCH ALL works on both accounts and then add --noabletosearch if one can not. Use --nochecknoabletosearch to avoid that behavior.
----------------------------
revision 1.982
date: 2020/03/16 15:17:02; author: gilles; state: Exp; lines: +60 -29
Rewrote tests in tests_msgs_from_maxmin() (same ones anyway)
----------------------------
revision 1.981
date: 2020/02/14 12:10:13; author: gilles; state: Exp; lines: +18 -8
Bugfix. CGI not fatal with imapsync --tests
----------------------------
revision 1.980
date: 2020/01/18 20:37:27; author: gilles; state: Exp; lines: +9 -9
Updated @regexflag in cgi context.
----------------------------
revision 1.979
date: 2020/01/14 22:26:11; author: gilles; state: Exp; lines: +47 -30
Added regex --regexflag from /X analyse in cgi context.
----------------------------
revision 1.978
date: 2020/01/08 21:56:12; author: gilles; state: Exp; lines: +11 -11
Added single quote ' filtering in filter_forbidden_characters()
----------------------------
revision 1.977
date: 2019/12/23 20:18:02; author: gilles; state: Exp; lines: +10 -10
No tests_resolv( ) since resolv is not really used and tests_resolv( ) fails on mac (I do not have write to /etc/hosts)
----------------------------

View file

@ -1,19 +1,19 @@
#!/bin/cat
$Id: FAQ.APPEND_errors.txt,v 1.12 2021/02/10 19:42:42 gilles Exp gilles $
$Id: FAQ.APPEND_errors.txt,v 1.13 2021/05/29 07:58:44 gilles Exp gilles $
This document is also available online at
https://imapsync.lamiral.info/FAQ.d/
https://imapsync.lamiral.info/FAQ.d/FAQ.APPEND_errors.txt
=======================================================================
======================================================================
Dealing with Imapsync APPEND errors.
=======================================================================
======================================================================
Questions answered in this FAQ are:
Q. I have an "could not append" error with "Message contains invalid header" at
the end, like:
Q. I have an "could not append" error with
"Message contains invalid header" at the end, like:
Err 1/20: - msg INBOX/6 {40666} could not append ... NO Message contains invalid header
What can I do to transfer these emails?
@ -23,15 +23,20 @@ Q. For some messages, the imapsync log says
useful message "socket closed while reading data from server"
What can I do?
Q. The append error message is "NO Message contains NUL characters"
What can I do?
Now the questions again with their answers.
=======================================================================
Q. I have an "could not append" error with "Message contains invalid header"
at the end, like:
======================================================================
Q. I have an "could not append" error with
"Message contains invalid header" at the end, like:
Err 1/20: - msg INBOX/6 {40666} could not append ... NO Message contains invalid header
What can I do to transfer these emails?
R0. Append in the IMAP protocol is the command to add a message in the folder.
The error string "NO. Message contains invalid header" comes from the
destination IMAP server at host2, it doesn't like the message and rejects it.
@ -40,12 +45,16 @@ R1. Header lines must be in 7bit encoding.
If they aren't in 7bit the IMAP server can refuse them as they break
the IMAP RFC specification.
A solution is to transform all 8bit characters to the X character with:
A solution is to transform all 8bit characters to the Z character with:
imapsync ... --regexmess 'tr [\x80-\xff] [X]'
imapsync ... --regexmess "tr [\x80-\xff] [Z]"
Caveat: this transformation transforms both the email header and its body.
It's not perfect but I guess it's better than no message transferred.
So consider using it in a second pass, not the first, as 8-bit
characters in the body message are allowed and changing them when
not needed is not a good thing.
R2. Some crappy email systems, like virus checkers or any other crappy
software tool dealing with your messages, can add headers to tell
@ -61,7 +70,7 @@ R2. Some crappy email systems, like virus checkers or any other crappy
Thanks to Damien SAUTEREAU for reporting and solving this issue.
=======================================================================
======================================================================
Q. For some messages, the imapsync log says
"could not append", sometimes followed by an explicit message
describing what went wrong, or sometimes followed by a not very
@ -136,5 +145,22 @@ OPTIONS
R3. Look for the quota limit on host2. If it is the current mailbox size, don't
search elsewhere. Increase the quota on the destination account.
=======================================================================
=======================================================================
======================================================================
Q. The append error message is "NO Message contains NUL characters"
What can I do?
R. Use:
imapsync ... --skipmess "m/(\x00)+\Z/"
The option --skipmess skips messages matching a pattern, the
messages are not synced, you just avoid the error messages concerning
those messages.
If you want to sync them, use instead:
imapsync ... --regexmess "s/(\x00)+\Z//g"
======================================================================
======================================================================

View file

@ -1,5 +1,5 @@
#!/bin/cat
$Id: FAQ.Archiving.txt,v 1.24 2021/04/18 09:11:32 gilles Exp gilles $
$Id: FAQ.Archiving.txt,v 1.25 2021/05/04 16:56:59 gilles Exp gilles $
This documentation is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -138,8 +138,8 @@ R5. There is a free online service (French language) allowing you to do
a Maildir or EML or HTML backup at
https://www.powermail.fr/sauvegarder-une-boite-mail/
Prefer Maildir or EML format if you want to be able to restore the
archive. HTML format will be ok to only view the messages, not
restore them to so imap server account.
archive. HTML format will be ok to only view the messages, not to
restore them to an imap server account.
I have never used any of this tools so asking me for support with them
won't go far away.

View file

@ -1,5 +1,5 @@
$Id: FAQ.Bandwidth.txt,v 1.2 2021/04/19 11:46:47 gilles Exp gilles $
$Id: FAQ.Bandwidth.txt,v 1.3 2021/05/20 11:46:07 gilles Exp gilles $
This documentation is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -20,27 +20,29 @@ Now the questions again with their answers.
=======================================================================
Q. What is the bandwidth used by imapsync?
R. From the host where imapsync runs, it opens two imap connections,
one with the source account at host1, one with the destination
account at host2.
R. From the host where imapsync runs, imapsync opens two imap
connections, one with the source account at host1, one with the
destination account at host2.
So, the global bandwidth used is twice the volume of the source
account, one volume to download the messages from host1,
one volume to upload those messages to host2.
So, the global bandwidth used by an imapsync transfer is twice the
volume of the source account, one volume to download the messages from
host1, one volume to upload those messages to host2.
If the host2 is already filled with the messages, imapsync doesn't
transfer them and then the volume transferred is small, this volume is
just made up of the IMAP commands needed to identify the messages on
both sides.
If the host2 is already filled with the messages, imapsync doesn't
transfer them and then the volume transferred is small, this volume
is just the IMAP commands needed to identify the messages on both sides.
There is no local cache of the email messages, except when a message
is very big; it is then temporarily saved locally between the download
and the upload.
There is no local cache of the email messages, except when the
message is very big, it is temporarily saved locally.
The biggest message seen so far on online /X is 3.08 GiB
while the biggest message transferred is 1.51 GiB so
I suspect a bug here. Drop me a note if you encounter the same
issue, I'll then dig into it, ie, I'll create a 2 or 3 GiB message
and play with it :-)
The biggest message seen so far on the online service I call /X is
3.08 GiB while the biggest message transferred is 1.51 GiB. So I
suspect a bug here. Drop me a note if you encounter the same issue,
I'll then dig into it, ie, I'll create a 2 or 3 GiB big message and
play with it :-)
=======================================================================
=======================================================================
=======================================================================

View file

@ -1,5 +1,5 @@
#!/bin/cat
# $Id: FAQ.Docker.txt,v 1.7 2020/01/08 05:02:55 gilles Exp gilles $
# $Id: FAQ.Docker.txt,v 1.8 2021/05/04 16:57:09 gilles Exp gilles $
This document is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -23,6 +23,10 @@ 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?
@ -80,6 +84,22 @@ 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?
R. In Docker context, writing the log is disabled by default because you
don't have an easy access to the logfile after the sync. The logfile is
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
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?

View file

@ -1,5 +1,5 @@
#!/bin/cat
$Id: FAQ.Duplicates.txt,v 1.23 2021/04/22 13:28:41 gilles Exp gilles $
$Id: FAQ.Duplicates.txt,v 1.24 2021/07/04 22:59:56 gilles Exp gilles $
This documentation is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -17,7 +17,7 @@ Q. How does imapsync identify messages and duplicates?
Q. How can I know if imapsync will generate duplicates on a second run?
Q: I found multiple copies, duplicates, when I run imapsync twice or
more. What is hell is happening?
more. What the hell is happening?
Q. imapsync calculates 479 messages in a folder but only transfers 400
messages. What is happening?
@ -65,7 +65,7 @@ Messages skipped : 1555
=======================================================================
Q: I found multiple copies, duplicates, when I run imapsync twice or
more. What is hell is happening?
more. What the hell is happening?
R0. First, some explanations to understand the issue.
Normally and by default, imapsync doesn't generate duplicates.
@ -96,7 +96,7 @@ of all messages already transferred.
If you end with:
Messages skipped : 0
don't go on, it means imapsync is still suffering to
then don't go on, it means imapsync is still suffering to
identify messages.
If you end with many messages skipped then it's very
@ -227,7 +227,9 @@ R2. With option --useuid imapsync doesn't use headers to identify
Q. imapsync doesn't synchronize duplicates by default but I want to.
How can I synchronize duplicates?
R. Use the option --useuid
R1. Use the option --syncduplicates
R2. Use the option --useuid
If you have already synchronized two mailboxes without --useuid then
using it right away will generate duplicates on host2. To avoid that
behavior, you have to perform a first run with --usecache to build
@ -251,10 +253,6 @@ R. Use the option --useuid
If the two mailboxes haven't been already synchronized then the
first run with --usecache is useless.
I shall add an option --syncduplicates that syncs duplicates
without any cache needed and make it the default but it's not
coded yet.
=======================================================================
Q. How can I remove duplicates in a lone account?
@ -263,6 +261,5 @@ R. In order to remove duplicates in a lone account, just run imapsync
option --delete2duplicates, ie, with
host1 == host2, user1 == user2, password1 == password2
=======================================================================
=======================================================================

View file

@ -1,5 +1,5 @@
$Id: FAQ.Exchange.txt,v 1.74 2021/03/23 14:53:33 gilles Exp gilles $
$Id: FAQ.Exchange.txt,v 1.75 2021/05/25 10:23:33 gilles Exp gilles $
This documentation is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -7,9 +7,9 @@ https://imapsync.lamiral.info/FAQ.d/FAQ.Exchange.txt
=======================================================================
======================================================================
Imapsync tips for Exchange 2000 2003 2007 2010 2013 2016 2019
=======================================================================
======================================================================
Questions answered in this FAQ are:
@ -65,7 +65,7 @@ Q. How to sync from Microsoft Exchange 2000 IMAP4rev1 server?
Now the questions again with their answers.
=======================================================================
======================================================================
Q. Can I use imapsync to transfer from or to Exchange accounts?
R. Yes. But IMAP access to an Exchange account is not always
@ -74,7 +74,7 @@ R. Yes. But IMAP access to an Exchange account is not always
Exchange: https://docs.microsoft.com/en-us/exchange/enable-imap4-in-exchange-2013-exchange-2013-help
=======================================================================
======================================================================
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:
@ -133,7 +133,7 @@ Use it like this:
It often does some miracles on messages.
=======================================================================
======================================================================
Q. For Exchange I have double and triple checked the username and
password spelling but I still get a "LOGIN failed". Any clue?
@ -185,7 +185,7 @@ R4. Are there special characters in the password?
https://imapsync.lamiral.info/FAQ.d/FAQ.Passwords_on_Mac.txt
=======================================================================
======================================================================
Q. Exchange fails with "User is authenticated but not connected".
R1. "The message User is authenticated but not connected is due to a
@ -201,7 +201,7 @@ 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?
@ -249,7 +249,7 @@ in order to remove the imapsync Exchange error message
"NO Maximum size of appendable message has been exceeded"
=======================================================================
======================================================================
Q. Exchange throttles the sync and says:
"Request is throttled. Suggested Backoff Time: 299961 milliseconds".
What can I do with that?
@ -284,7 +284,7 @@ R2. For Exchange, in case throttle appears anyway, fix them with:
Sometimes restarting the Exchange server is needed to take
into account the change in the configuration.
=======================================================================
======================================================================
Q. Exchange fails with "BAD Command received in Invalid state".
R1. This message might happen when authenticating without ssl nor tls,
@ -298,7 +298,7 @@ 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. From XXX to Exchange 2013, read receipts are all resent again
after a sync. Even for old messages. How can I fix that?
@ -332,7 +332,7 @@ X-Disposition-Notification-To: blabla
Thanks to David Karnowski for pointing and solving this issue.
=======================================================================
======================================================================
Q. DEBUG: IO/Socket/SSL.pm:1043: local error: SSL read error
DEBUG: IO/Socket/SSL.pm:1043: local error: SSL read error
@ -348,7 +348,7 @@ R2. Another solution is to remove --tls or --ssl options for Exchange
R3. See also the FAQ FAQ.SSL_errors.txt
https://imapsync.lamiral.info/FAQ.d/FAQ.SSL_errors.txt
=======================================================================
======================================================================
Q. From XXX to Exchange 2010/2013 I get this error message
sometimes: "BAD Command Argument Error 11". What does it mean?
@ -372,8 +372,7 @@ R. This error message comes from Exchange IMAP server when it
* Some messages have some lines too long. Use option --maxlinelength
to skip messages whose max line length is over a number of bytes.
--maxlinelength 1000 is a RFC2822 must but most server support
higher values.
Exchange supports 9900 characters line length:
higher values. Exchange supports 9900 characters line length:
imapsync ... --maxlinelength 9900
@ -400,7 +399,7 @@ Use it like this:
It often does some miracles on messages.
=======================================================================
======================================================================
Q. From XXX to Exchange 2010 or 2013, the flag Flagged does
not seem to be well synced. What can I do?
@ -549,7 +548,7 @@ In case you are not aware:
omitted in our case
- Use --debugimap when testing initial connectivity, if necessary
=======================================================================
======================================================================
Q. Couldn't create folder [trash] "Mailbox already exists".
R. Some servers take care about character case in folder names,
@ -617,7 +616,7 @@ R2. Other solution
Two users succeeded by using "MS Transporter Suite" (which is closed
expensive non-free software).
=======================================================================
======================================================================
Q. Exchange 2007 folders ending with a space cause an imapsync crash.
"Could not select: socket closed while reading data from server"
@ -632,5 +631,5 @@ Q. How to sync from Microsoft Exchange 2000 IMAP4rev1 server?
R. imapsync ... --prefix1 "INBOX."
=======================================================================
=======================================================================
======================================================================
======================================================================

View file

@ -1,5 +1,5 @@
#!/bin/cat
$Id: FAQ.Folders_Sizes.txt,v 1.4 2021/01/26 13:05:21 gilles Exp gilles $
$Id: FAQ.Folders_Sizes.txt,v 1.5 2021/07/04 23:02:32 gilles Exp gilles $
This documentation is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -59,10 +59,7 @@ R. There are several reasons to explain the different counts between
4) There are duplicate messages on host1. Imapsync doesn't sync
duplicates by default. But it counts them and presents the number
found at the end on the line "Messages found duplicate on host1".
To sync duplicates, use option --useuid
--useuid has some caveats. See the documant FAQ.Duplicates.txt
for details about it at
https://imapsync.lamiral.info/FAQ.d/FAQ.Duplicates.txt
To sync duplicates, use the option --syncduplicates
5) There are duplicate messages on host2 so host2 is
bigger than host1. Solution: use --delete2duplicates to delete

View file

@ -1,5 +1,5 @@
#!/bin/cat
$Id: FAQ.Gmail.txt,v 1.79 2021/03/31 16:20:28 gilles Exp gilles $
$Id: FAQ.Gmail.txt,v 1.80 2021/07/06 02:30:11 gilles Exp gilles $
This document is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -95,13 +95,13 @@ either:
1) "Access for less secure apps"
2) "2-step verification"
3) XOauth2 (not ready for individual Gmail authentication, only for groups)
3) XOauth2 ready for groups on any OS or
for individual Gmail authentication on Linux.
For the last 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.
@ -335,6 +335,7 @@ imapsync --host1 mail.oldhost.com \
--expunge1 \
--addheader \
--maxsleep 2 \
--maxsize 35_651_584
--exclude "\[Gmail\]$" \
--regextrans2 's,\[Gmail\].,,' \
--regextrans2 's,^ +| +$,,g'
@ -411,7 +412,7 @@ On Windows:
--regextrans2 "s/[\^]/_/g" is mandatory. It converts, since
not accepted by gmail, character ^ to character _ underscore.
--regextrans2 "s/['\"\\\\]/_/g" is optional. It converts
--regextrans2 's/['"'"'\\^"]/_/g' is optional. It converts
characters ' or " or \ to character _ underscore.
You can select folders exported to imap within the gmail preferences.
@ -443,7 +444,7 @@ imapsync \
--user2 tata \
--password2 tatasecret \
--maxbytespersecond 40_000 \
--maxbytesafter 2_500_000_000 \
--maxbytesafter 3_000_000_000 \
--automap \
--maxsleep 2 \
--skipcrossduplicates \

23
FAQ.d/FAQ.GoDaddy.txt Normal file
View file

@ -0,0 +1,23 @@
$Id: FAQ.GoDaddy.txt,v 1.1 2021/05/21 18:19:29 gilles Exp gilles $
This documentation is also available online at
https://imapsync.lamiral.info/FAQ.d/
https://imapsync.lamiral.info/FAQ.d/FAQ.GoDaddy.txt
=======================================================================
Imapsync tips for GoDaddy
=======================================================================
Questions answered in this FAQ are:
Q. What are the GoDaddy settings for imapsync?
Now the questions again with their answers.
=======================================================================
Q. What are the GoDaddy settings for imapsync?
R. The imap server is imap.secureserver.net

View file

@ -1,5 +1,5 @@
#!/bin/cat
$Id: FAQ.Messages_Selection.txt,v 1.17 2021/01/23 13:01:00 gilles Exp gilles $
$Id: FAQ.Messages_Selection.txt,v 1.18 2021/07/04 23:05:24 gilles Exp gilles $
This document is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -34,8 +34,9 @@ Q. What are the selection criteria available with --search option?
Q. What messages imapsync syncs by default?
R1. By default, Imapsync syncs all messages, except duplicates.
If you want to sync duplicates, add the option --syncduplicates
R2. You can alter the default all messages selection by using one or
R2. You can alter the default "all messages selected" by using one or
more of the following options:
Extract from the README https://imapsync.lamiral.info/README

View file

@ -1,5 +1,5 @@
#!/bin/cat
$Id: FAQ.Messages_Too_Big.txt,v 1.4 2020/10/21 09:21:48 gilles Exp gilles $
$Id: FAQ.Messages_Too_Big.txt,v 1.5 2021/06/22 15:31:39 gilles Exp gilles $
This document is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -21,59 +21,67 @@ Now the questions again with their answers.
=======================================================================
Q. What does imapsync with big messages?
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.
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 messages no matter their sizes.
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.
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.
* Gmail announces APPENDLIMIT=35651584 (October 2020).
* Gmail announces APPENDLIMIT=35651584 (June 2021).
* Office365 announces nothing.
* Dovecot announces nothing.
* Dovecot announces nothing.
* Usually imap servers announce nothing.
=======================================================================
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 depends
on the software tool reading the email message.
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.
For example,
Gmail currently limits messages to 35651584 bytes (October 2020),
For example, Gmail currently limits messages to 35651584 bytes,
aka 34 MiB (June 2021),
Starting with imapsync release 1.938 option --truncmess xxxx truncates
messages bigger than the given size xxxx.
messages bigger than the given size xxxx, size given in bytes.
imapsync --truncmess 35651584 --appendlimit 1000000000000
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:
On windows, use (I'm not sure of, not tested yet):
I'm not sure of (not tested yet):
imapsync ... --pipemess "perl -0ne 'print substr $_,0,35651584' "
R2. A not so dirty solution would be to transform the message and
include links to the big attachments, instead of the attachments.
Well, not done yet and too much complicted compared to the simple
solution which is to allow big messages on the destination account.
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.
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.
=======================================================================
=======================================================================
=======================================================================

View file

@ -1,14 +1,14 @@
$Id: FAQ.Office365.txt,v 1.20 2021/03/17 20:42:35 gilles Exp gilles $
$Id: FAQ.Office365.txt,v 1.23 2021/07/06 02:30:01 gilles Exp gilles $
This documentation is also available online at
https://imapsync.lamiral.info/FAQ.d/
https://imapsync.lamiral.info/FAQ.d/FAQ.Office365.txt
=======================================================================
======================================================================
Imapsync tips for Office365.
=======================================================================
======================================================================
Questions answered in this FAQ are:
@ -65,7 +65,7 @@ Q. Couldn't create folder [trash] "Mailbox already exists".
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
@ -74,12 +74,12 @@ R. Yes. But IMAP access to Office365 account is not always allowed by default
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
=======================================================================
======================================================================
Q. Does imapsync support OAUTH2 authentication for Office365 accounts?
R. No. But I plan to add it during the year 2021.
=======================================================================
======================================================================
Q. How to sync from Office365 to XXX?
R. On Windows, use:
@ -90,13 +90,13 @@ On Unix, use:
imapsync ... --office1
Option --office1 is like (release 1.970):
Option --office1 is like (release 1.970 or higher):
imapsync ... --host1 outlook.office365.com \
--ssl1 \
--exclude "^Files$"
=======================================================================
======================================================================
Q. How to sync from XXX to Office365
R0. IMAP is not enabled by default on Office365, see how to enable it:
@ -112,7 +112,7 @@ R. Here is a command-line resume that solves most encountered issues when
imapsync ... --office2
which is equivalent to (in imapsync release 1.870):
which is equivalent to (in imapsync release 1.870 or higher):
imapsync ... \
--host2 outlook.office365.com \
@ -140,7 +140,7 @@ 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?
@ -172,7 +172,7 @@ R5. Triple check the hostname then. Try all of these:
* imap-mail.outlook.com
* imap.outlook.com
=======================================================================
======================================================================
Q. I see "NO Maximum size of appendable message has been exceeded"
What can I do with that?
@ -198,7 +198,7 @@ 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. The imap connection to Office365 is not working very efficiently,
is there a solution to fix that?
@ -206,7 +206,7 @@ R. Yes. Try DavMail
http://davmail.sourceforge.net/
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?
@ -215,7 +215,7 @@ R. The --debugimap option can show you more details, especially some
"BAD Request is throttled. Suggested Backoff Time: 178755 milliseconds"
In that case, see the next faq item and its fixes.
=======================================================================
======================================================================
Q. Office365 throttles the sync and says:
"Request is throttled. Suggested Backoff Time: 299961 milliseconds".
What can I do with that?
@ -249,14 +249,14 @@ 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. Office365 refuses to create the folder named "Files" with the error
"NO Folder name is reserved". What happens?
R. The folder Files is a standard folder in Office365.
It should not be synced in IMAP. See the next question.
=======================================================================
======================================================================
Q. Office365 users complain that a folder named "Files" contains
messages with no sender.
@ -296,7 +296,7 @@ https://answers.microsoft.com/en-us/msoffice/forum/msoffice_o365admin-mso_dep365
(This question/answer is taken quasi verbatim from Perttu Aaltonen)
=======================================================================
======================================================================
Q. From XXX to Office365, read receipts are all resent again after sync.
Even for old messages. How can I fix that?
@ -330,7 +330,7 @@ X-Disposition-Notification-To: blabla
Thanks to David Karnowski for pointing and solving this issue.
=======================================================================
======================================================================
Q. DEBUG: IO/Socket/SSL.pm:1043: local error: SSL read error
DEBUG: IO/Socket/SSL.pm:1043: local error: SSL read error
@ -346,7 +346,7 @@ R2. Another solution is to remove --tls or --ssl options for Exchange
R3. See also the FAQ FAQ.SSL_errors.txt
https://imapsync.lamiral.info/FAQ.d/FAQ.SSL_errors.txt
=======================================================================
======================================================================
Q. From XXX Office365 I get this error message sometimes:
"BAD Command Argument Error 11". What does it mean?
@ -371,26 +371,22 @@ R. This error message comes from the Office365 IMAP server when it
* Some messages have some lines too long. Use option --maxlinelength
to skip messages whose max line length is over some bytes.
--maxlinelength 1000 is an RFC2822 must but most servers support
higher values. Exchange supports 9900 characters line length:
imapsync ... --maxlinelength 9900
Office365 supports 10500 characters line length:
higher values. Office365 supports 10500 characters line length:
imapsync ... --maxlinelength 10500
In case you prefer fixing messages with long lines the hard way,
instead of skipping them with --maxlinelength 9900, just use:
instead of skipping them with --maxlinelength 10500, just use:
On Windows
imapsync ... --regexmess "s,(.{9900}),$1\r\n,g"
imapsync ... --regexmess "s,(.{10500}),$1\r\n,g"
On Unix
imapsync ... --regexmess 's,(.{9900}),$1\r\n,g'
imapsync ... --regexmess 's,(.{10500}),$1\r\n,g'
Have also in mind that Exchange closes the connection after 10 errors
Have also in mind that Office365 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 says goodbye,
Office365, which means Office365 leaves the session and says goodbye,
come back later. Redo some sync then.
On Linux, there is a good Python script in the tarball that can
@ -404,7 +400,7 @@ It often does some miracles on messages.
It's called fix_email_for_exchange because Office365 is Exchange,
or at least started to be an Exchange server with the same issues.
=======================================================================
======================================================================
Q. From XXX to Office365 the flag Flagged does not seem to be well synced.
What can I do?
@ -419,7 +415,7 @@ does in detail with flags.
The magic of this trick is on ignoring the \Flagged flag on the first
sync and setting it on the second sync, with STORE instead of APPEND.
This Exchange bug seems that Exchange gets and sets well the Flagged
This Office365 bug seems that Office365 gets and sets well the Flagged
flag with APPEND in IMAP but then it forgets it with other protocols;
With STORE it sets and gets the "\Flagged" flag everywhere.
@ -473,7 +469,7 @@ Subject: RE: [imapsync] Office 365 - 'Master User'?
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,
@ -506,5 +502,5 @@ R. Some servers take care of character cases in folder names,
on host1 but are considered the same on destination host2 because of
case sensitivities and insensitivities, use --nomixfolders
=======================================================================
=======================================================================
======================================================================
======================================================================

View file

@ -1,5 +1,5 @@
#!/bin/cat
$Id: FAQ.OnlineUI.txt,v 1.27 2021/04/24 16:57:50 gilles Exp gilles $
$Id: FAQ.OnlineUI.txt,v 1.29 2021/05/05 21:38:32 gilles Exp gilles $
This document is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -15,17 +15,17 @@ Questions answered in this FAQ are:
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. Shall I have issues when the browser times out? What happens
if the browser connection is closed for whatever reason?
Q. Shall I have issues when the browser times out?
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 webserver 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?
Now the questions again with their answers.
@ -33,8 +33,8 @@ Now the questions again with their answers.
Q. How secure is the online visual user interface /X?
R0. 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.
service is secure or not would be of any interest.
Let's do it anyway, you'll be the judge.
R1. Some figures
@ -43,11 +43,11 @@ Date of this report: 22 April 2021.
The online imapsync service /X started 9 January 2017
(1564 days of service).
On average, /X has 51 users per day lunching in mean 6
different migrations, from just one launch to many (hundreds).
On average, /X has 51 users per day, each user lunches on average
6 account migrations, from just one launch to many (hundreds).
The total volume /X transferred is around 210 TiB from nearly
450 000 imap account migrations and 700 million email messages.
The total volume /X transferred so far is around 210 TiB coming
from nearly 450 000 imap account migrations and 700 million email messages.
R2. Pros & Cons
@ -59,17 +59,17 @@ 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: It tries SSL first on port 993, then TLS on port 143
if the servers announce TLS, then no encryption at all.
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 try
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.
your acts. Drop me a note before will be fair play.
As the owner of the service, it could have been 450 000 pairs of
credentials collected and nearly 210 terabytes of email messages.
@ -77,7 +77,7 @@ 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.
The imap server certificates are not checked for authenticity
(by default) because too many imap servers are crappy configured
(by default) because too many imap servers are crappy configured
regarding certified certificates.
This default behavior is chosen like this because users of /X
@ -94,7 +94,7 @@ 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
unsecure for any imap software client.
unsecured for any imap software client.
Last point, who could be sure that no cracker cracked the online
@ -106,24 +106,25 @@ the sync is a safe and recommended practice!
=====================================================================
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 there without having to re-enter them.
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 good password,
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 the sync won't be done,
will be saved in your browser and no sync will be done,
since a good login is mandatory to do anything on your mailboxes.
=====================================================================
Q. Shall I have issues with the browser timing out? What happens
if the browser connection is closed for whatever reason?
Q. Shall I have issues with the browser timing out?
What happens if the browser connection is closed for whatever reason?
R. It stops the imapsync process, ie, the sync is ended right away.
R. A browser connection closed closes also the imapsync process,
ie, the sync is ended right away.
Further comments on this behavior.
@ -157,29 +158,29 @@ 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 webserver 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 kills
imapsync process and the imap connections as well.
To fix this issue, see the document INSTALL.OnlineUI.txt
and search for "Timeout" in it.
R. 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 webserver timeout.
Apache 2.2 timeout is 300 seconds.
Apache 2.4 timeout is 60 seconds.
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.
=====================================================================
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?
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.
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.
=====================================================================
=====================================================================

View file

@ -1,23 +0,0 @@
#!/bin/cat
$Id: FAQ.Oracle-UCS.txt,v 1.5 2018/05/24 11:34:30 gilles Exp gilles $
This document is also available online at
https://imapsync.lamiral.info/FAQ.d/
https://imapsync.lamiral.info/FAQ.d/FAQ.Oracle-UCS.txt
=======================================================================
Imapsync tips for Oracle-UCS. Specific issues.
=======================================================================
Oracle-UCS was previously Sun JES, IPlanet, etc.
"NO Message contains NUL characters"
--skipmess 'm/(\x00)+\Z/'
"Message contains invalid header"
--skipmess 'm/[\x80-\xff]/'
=======================================================================
=======================================================================

View file

@ -1,5 +1,5 @@
#!/bin/cat
$Id: FAQ.Release_Checklist.txt,v 1.18 2020/01/06 10:47:02 gilles Exp gilles $
$Id: FAQ.Release_Checklist.txt,v 1.20 2021/07/06 02:29:51 gilles Exp gilles $
This documentation is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -23,10 +23,14 @@ Checklist before release a new release:
- Review the newsletter by running:
m4 -P W/ml_announce.in.txt
- Update W/rsync_exclude_dist.txt
- Update .gitignore
- Review the TODO file and mark done what is done.
- Review the general FAQ.d/FAQ.General.txt
- Report values of --gmail1 --gmail2 to FAQ.Gmail.txt
- Report values of --exchange* --office* to FAQ.Exchange.txt
- Report values of --exchange* to FAQ.Exchange.txt
- Report values of --office* to FAQ.Office365.txt
- /X verify direct cgi
- /X verify under noscript with firefox

View file

@ -1,5 +1,5 @@
#!/bin/cat
$Id: FAQ.SSL_errors.txt,v 1.14 2021/04/19 11:47:44 gilles Exp gilles $
$Id: FAQ.SSL_errors.txt,v 1.15 2021/06/22 15:35:10 gilles Exp gilles $
This document is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -192,7 +192,9 @@ EnRlc3QxLmxhbWlyYWwuaW5mbzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
ggEBAMUTJVdrTl86nDI2yO6Vz5l1qxMMPqJylQcgi9vDHpwsnUq5HGPv+qZNhM69
...
After an complete server update ("apt update && apt upgrade"):
After an complete server update ("apt update && apt upgrade && /etc/init.d/dovecot restart"):
echo | openssl s_client -crlf -connect test1.lamiral.info:993
CONNECTED(00000003)

View file

@ -1,5 +1,5 @@
#!/bin/cat
# $Id: FAQ.Security.txt,v 1.22 2020/06/30 17:32:39 gilles Exp gilles $
# $Id: FAQ.Security.txt,v 1.23 2021/06/22 15:32:10 gilles Exp gilles $
This document is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -16,26 +16,6 @@ SSL: going to encryption before the imap session start.
TLS: going to encryption after the imap session start but before
the credential are sent. It is on port 143.
Explanation:
To transfer emails over an encrypted connection, the imapsync parameters --ssl1 and ssl2 are preferred over the parameters --tls1 and --tls2.
This might be confusing because the terms "SSL" and "TLS" can have different meanings in the contexts of IT security and email. Imapsync uses both terms in the context of email, not of IT security.
In IT security, SSL refers to the deprecated Secure Sockets Layer protocols. SSL 2.0 has been depreated in 2011 based on RFC 6176 (see https://datatracker.ietf.org/doc/rfc6176/ ) and SSL 3.0 has been deprecated in 2015 based on RFC 7568 (see https://datatracker.ietf.org/doc/rfc7568/ ). TLS refers to the more modern Transport Layer Security protocols. TLS 1.0 and TLS 1.1 have been deprecated in 2020 with RFC 8996 (see https://datatracker.ietf.org/doc/rfc8996/ ). Current versions of TLS are TLS 1.2 (published in 2008) and TLS 1.3 (published in 2018).
SSL should not be used anymore. When using TLS, only the non-deprecated versions should be used. Given this information, it might be confusing why the --ssl1 and --ssl2 parameters are preferred over the --tls1 and --tls2 parameters. The reason is that imapsync uses the terms in the context of email and not of IT security.
In an email context, the parameters --ssl1 and --ssl2 refer to the protocol family of both SSL and (!) TLS. In contrast, the parameters --tls1 and --tls2 refer to the STARTTLS command based on opportunistic encryption. Opportunistic encryption means that the system attempts to encrypt the communications channel but falls back to unencrypted communications if the encryption cannot be established.
The problem is that the parameters --tls1 and --tls2 seem to offer more security by seemingly referring the more modern TLS protocols, when these parameters are in fact less secure (than --ssl1 and --ssl2) because they are actually referring to STARTTLS with opportunistic enryption. Therefore the parameters --ssl1 and ssl2 are preferred over the parameters --tls1 and --tls2.
Summary:
Parameters --ssl1 and --ssl2: Force an encrypted connection based on the SSL/TLS protocol family. Fails if an encryption cannot be established. More secure than --tls1 and --tls2. Can be specified with --sslargs1 and --sslargs2.
Parameters --tls1 and --tls2: Try to establish an encrypted connection based on STARTTLS. Does not fail if an encryption cannot be established meaning an encrypted connection cannot be garanteed [UNSURE]. Less secure than --ssl1 and --ssl2.
=======================================================================
Q. Is running this program a secure method of transferring emails?
Are there any security concerns?

View file

@ -1,4 +1,4 @@
$Id: FAQ.Two_Ways_Sync.txt,v 1.4 2021/02/01 15:43:33 gilles Exp gilles $
$Id: FAQ.Two_Ways_Sync.txt,v 1.5 2021/06/10 11:21:09 gilles Exp gilles $
This documentation is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -13,14 +13,14 @@ https://imapsync.lamiral.info/FAQ.d/FAQ.Two_Ways_Sync.txt
Questions answered in this FAQ are:
Q. Can Imapsync do a good "two ways" sync?
No. Why?
Short answer: no, not a good one. Why?
Now the questions again with their answers.
=======================================================================
Q. Can Imapsync do a good "two ways" sync?
No. Why?
Short answer: no, not a good one. Why?
R. Imapsync can't do good two ways syncs.
@ -40,10 +40,10 @@ deletions, or movings, messages movings across folders, folders
movings, and also folders renamings. Deletions and moves are ambiguous
changes when combined with creations on the opposite side.
For example, when a message is deleted from A by a user, imapsync
For example, if a message is deleted from A by a user, then imapsync
cannot know whether it is a message deleted from A that has to be
deleted in B (what the user did) or a missing message from B that has
to be copied to A.
deleted in B (what the user actually did) or a missing message on A
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
@ -52,13 +52,16 @@ run a sync with the --delete2 option from A to B.
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 it's a mixed scenario then you are in trouble and so you
end up with a not very good "two ways" sync. I suggest avoiding
deletions in that case, which is the default imapsync behavior.
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.
With a two ways sync, the mailbox user is very surprised and
With a two ways sync, the account user is very surprised and
disapointed when his actions (deletions, renamings, or movings) come
back.
back: the deletions are cancelled, the renamings and movings end up
with duplicates.
=======================================================================
=======================================================================

37
FAQ.d/FAQ.UCS.txt Normal file
View file

@ -0,0 +1,37 @@
#!/bin/cat
$Id: FAQ.UCS.txt,v 1.8 2021/05/29 08:06:51 gilles Exp gilles $
This document is also available online at
https://imapsync.lamiral.info/FAQ.d/
https://imapsync.lamiral.info/FAQ.d/FAQ.UCS.txt
=======================================================================
Imapsync tips for UCS. Specific issues.
=======================================================================
UCS: Univention Corporate Server
https://www.univention.com/
UCS was previously Oracle-UCS, Sun JES, IPlanet, etc.
The underlying code was the free open source imap software server Cyrus.
Now UCS uses Dovecot since UCS 4.0-2 (July 2015)
Quoting the page
https://docs.software-univention.de/cyrus-4.2.html
"Since Univention Corporate Server version 4.0-2 Dovecot is used as
the default IMAP and POP3 server."
So, when you deal with UCS issues, follow
https://imapsync.lamiral.info/FAQ.d/FAQ.Cyrus.txt
https://imapsync.lamiral.info/FAQ.d/FAQ.Dovecot.txt
Also:
https://imapsync.lamiral.info/FAQ.d/FAQ.APPEND_errors.txt
=======================================================================
=======================================================================

View file

@ -1,5 +1,5 @@
$Id: FAQ.Yahoo.txt,v 1.10 2021/04/20 21:47:02 gilles Exp gilles $
$Id: FAQ.Yahoo.txt,v 1.12 2021/05/04 11:04:51 gilles Exp gilles $
This document is also available online at
https://imapsync.lamiral.info/FAQ.d/
@ -10,6 +10,31 @@ https://imapsync.lamiral.info/FAQ.d/FAQ.Yahoo.txt
Imapsync tips for Yahoo.
=======================================================================
Questions answered in this FAQ are:
Q. Synchronizing from Yahoo to XXX
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
@ -20,11 +45,11 @@ Example:
./imapsync \
--host1 imap.mail.yahoo.com \
--user1 billy \
--password1 secret \
--user1 Billy@yahoo.com \
--password1 billysecreta \
--host2 XXX \
--user2 billy \
--password2 secret \
--user2 Billy@other.com \
--password2 billysecretb \
--noabletosearch
@ -53,6 +78,28 @@ Another solution:
since it is not in the predefined apps.
* Use this password with imapsync.
=======================================================================
Q. Synchronizing from XXX to Yahoo
R. Example:
./imapsync \
--host1 XXX \
--user1 Billy@other.com \
--password1 billysecreta \
--host2 imap.mail.yahoo.com \
--user2 Billy@yahoo.com \
--password2 billysecretb \
--noabletosearch --regexmess "s{(?<![\n])\z}{\r\n}gxms"
You wonder why there is this ugly regex, what it does and where does it
come from?
It's there to get rid of the errors
"BAD [CLIENTBUG] Additional arguments found after last expected argument"
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
=======================================================================
=======================================================================

View file

@ -1,20 +1,28 @@
# $Id: htaccess.txt,v 1.29 2020/10/01 10:40:23 gilles Exp gilles $
# $Id: htaccess.txt,v 1.31 2021/05/29 08:09:11 gilles Exp gilles $
AddDescription "<b>Back</b> to Imapsync main page." ..
AddDescription "<b>Where this Description column comes from</b>." htaccess.txt
AddDescription "<b>Private</b>." memo
AddDescription "<b>APPEND errors</b>." FAQ.Admin_Authentication.txt
AddDescription "<b>Authenticate via an admin account</b>." FAQ.APPEND_errors.txt
AddDescription "<b>Archiving</b> tips." FAQ.Archiving.txt
AddDescription "<b>Authentication failures</b>." FAQ.Authentication_failure.txt
AddDescription "<b>Bandwidth questions</b> tips." FAQ.Bandwidth.txt
AddDescription "<b>Big mailboxes</b> tips." FAQ.Big_Mailbox.txt
AddDescription "<b>Changing folders names</b>." FAQ.Folders_Mapping.txt
AddDescription "<b>Connection issues</b>." FAQ.Connection.txt
AddDescription "<b>Contacts & Calendars & Chat issues</b>." FAQ.Contacts_Calendars.txt
AddDescription "<b>Cyrus</b> accounts." FAQ.Cyrus.txt
AddDescription "<b>Dates issues</b>." FAQ.Dates.txt
AddDescription "<b>David Tobit</b> accounts." FAQ.David_Tobit.txt
AddDescription "<b>DBmail</b> accounts." FAQ.DBmail.txt
AddDescription "<b>Docker</b> usage." FAQ.Docker.txt
AddDescription "<b>Domino</b> accounts." FAQ.Domino.txt
AddDescription "<b>Dovecot</b> accounts." FAQ.Dovecot.txt
@ -25,15 +33,21 @@ AddDescription "<b>Selecting folders</b>." FAQ.Fold
AddDescription "<b>Folders sizes with Imapsync</b>." FAQ.Folders_Sizes.txt
AddDescription "<b>FirstClass</b> accounts." FAQ.FirstClass.txt
AddDescription "<b>Flags tips and issues</b>." FAQ.Flags.txt
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>IceWarp</b> accounts." FAQ.IceWarp.txt
AddDescription "<b>ISP tips</b>." FAQ.ISP.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>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
AddDescription "<b>Password & special characters on Unix</b>." FAQ.Passwords_on_Unix.txt
@ -43,7 +57,7 @@ AddDescription "<b>Principles & design decisions</b>." FAQ.Prin
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 "<b>Oracle-UCS</b> accounts." FAQ.Oracle-UCS.txt
AddDescription "<b>UCS</b> accounts." FAQ.UCS.txt
AddDescription "<b>Checklist before release a new release</b>." FAQ.Release_Checklist.txt
AddDescription "<b>Guidelines to report bugs</b>." FAQ.Reporting_Bugs.txt

107
INSTALL.d/Dockerfile Normal file → Executable file
View file

@ -3,65 +3,83 @@
# $Id: Dockerfile,v 1.30 2020/03/26 07:15:04 gilles Exp gilles $
# I use the following command to build the image:
#
# docker build -t gilleslamiral/imapsync .
# docker build -t gilleslamiral/imapsync .
#
# where this Dockerfile is in the current directory
#
#
# I thank you very much
# I like thanks
# I like stars
# I also like (and need) money
# Number of imapsync images pulled so far (2020_03_26): 84354
# Number of imapsync images pulled so far (2021_05_29): 368881
# Command used:
# curl -s https://hub.docker.com/v2/repositories/gilleslamiral/imapsync/ | jq '.pull_count'
# Ubuntu latest points to current LTS release
# Debian Buster is Debian 10
FROM debian:buster
FROM debian:buster
LABEL maintainer="Gilles LAMIRAL <gilles@lamiral.info>" \
description="Imapsync" \
documentation="https://imapsync.lamiral.info/#doc"
RUN set -xe && \
apt-get update && \
apt-get install -y \
libauthen-ntlm-perl \
libcgi-pm-perl \
libcrypt-openssl-rsa-perl \
libdata-uniqid-perl \
libencode-imaputf7-perl \
libfile-copy-recursive-perl \
libfile-tail-perl \
libio-socket-inet6-perl \
libio-socket-ssl-perl \
libio-tee-perl \
libhtml-parser-perl \
libjson-webtoken-perl \
libmail-imapclient-perl \
libparse-recdescent-perl \
libmodule-scandeps-perl \
libreadonly-perl \
libregexp-common-perl \
libsys-meminfo-perl \
libterm-readkey-perl \
libtest-mockobject-perl \
libtest-pod-perl \
libunicode-string-perl \
liburi-perl \
libwww-perl \
libtest-nowarnings-perl \
libtest-deep-perl \
libtest-warn-perl \
make \
cpanminus \
procps \
wget
# Put a copy of the Dockerfile in the image itself
# It can help future maintenance, isn't it?
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
RUN set -xe && \
apt-get update \
&& apt-get install -y \
libauthen-ntlm-perl \
libcgi-pm-perl \
libcrypt-openssl-rsa-perl \
libdata-uniqid-perl \
libencode-imaputf7-perl \
libfile-copy-recursive-perl \
libfile-tail-perl \
libio-socket-ssl-perl \
libio-socket-inet6-perl \
libio-tee-perl \
libhtml-parser-perl \
libjson-webtoken-perl \
libmail-imapclient-perl \
libparse-recdescent-perl \
libmodule-scandeps-perl \
libpar-packer-perl \
libreadonly-perl \
libregexp-common-perl \
libsys-meminfo-perl \
libterm-readkey-perl \
libtest-mockobject-perl \
libtest-pod-perl \
libunicode-string-perl \
liburi-perl \
libwww-perl \
procps \
wget \
make \
cpanminus \
lsof \
ncat \
openssl \
&& rm -rf /var/lib/apt/lists/*
RUN set -xe \
&& 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
RUN wget -N https://imapsync.lamiral.info/imapsync && \
mv imapsync /usr/bin/imapsync && \
chmod +x /usr/bin/imapsync
USER nobody:nogroup
@ -73,5 +91,6 @@ STOPSIGNAL SIGINT
CMD ["/usr/bin/imapsync"]
#
# End of imapsync Dockerfile
#
# End of imapsync Dockerfile

View file

@ -1,4 +1,4 @@
# $Id: INSTALL.ANY.txt,v 1.60 2019/11/28 14:37:40 gilles Exp gilles $
# $Id: INSTALL.ANY.txt,v 1.62 2020/06/03 07:11:10 gilles Exp gilles $
#
# This is the main INSTALL file for imapsync.
# imapsync : IMAP sync and migrate tool.
@ -42,6 +42,10 @@ 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
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).
If you are not on one of these systems then read the last section
below called "Installing imapsync on other Unixes".
@ -50,6 +54,7 @@ below called "Installing imapsync on other Unixes".
=======================================================================
Easy.
Read the file INSTALL.d/INSTALL.Darwin.txt
This document is also available at
https://imapsync.lamiral.info/INSTALL.d/INSTALL.Darwin.txt
@ -59,6 +64,7 @@ https://imapsync.lamiral.info/INSTALL.d/INSTALL.Darwin.txt
=======================================================================
Easy.
Read the file INSTALL.d/INSTALL.FreeBSD.txt
This document is also available at
https://imapsync.lamiral.info/INSTALL.d/INSTALL.FreeBSD.txt
@ -69,6 +75,7 @@ https://imapsync.lamiral.info/INSTALL.d/INSTALL.FreeBSD.txt
=======================================================================
Easy.
Read the file INSTALL.d/INSTALL.Centos.txt
This document is also available at
https://imapsync.lamiral.info/INSTALL.d/INSTALL.Centos.txt
@ -79,34 +86,38 @@ https://imapsync.lamiral.info/INSTALL.d/INSTALL.Centos.txt
=======================================================================
Easy.
Read the file INSTALL.d/INSTALL.CPanel.txt
This document is also available at
https://imapsync.lamiral.info/INSTALL.d/INSTALL.CPanel.txt
=======================================================================
Installing imapsync on Debian 6 or 7
Installing imapsync on Debian
=======================================================================
Not so easy.
See the file INSTALL.d/INSTALL.Debian.txt
This document is also available at
https://imapsync.lamiral.info/INSTALL.d/INSTALL.Debian.txt
=======================================================================
Installing imapsync on Ubuntu 12 or 14
Installing imapsync on Ubuntu
=======================================================================
Not so easy.
See the file INSTALL.d/INSTALL.Ubuntu.txt
This document is also available at
https://imapsync.lamiral.info/INSTALL.d/INSTALL.Ubuntu.txt
=======================================================================
Installing imapsync on AWS EC2
Installing imapsync on AWS
=======================================================================
Not so easy.
See the file INSTALL.d/INSTALL.AWS_EC2.txt
This document is also available at
https://imapsync.lamiral.info/INSTALL.d/INSTALL.AWS_EC2.txt
@ -116,6 +127,7 @@ https://imapsync.lamiral.info/INSTALL.d/INSTALL.AWS_EC2.txt
=======================================================================
Not so easy.
See the file INSTALL.d/INSTALL.ArchLinux.txt
This document is also available at
https://imapsync.lamiral.info/INSTALL.d/INSTALL.ArchLinux.txt
@ -124,6 +136,8 @@ https://imapsync.lamiral.info/INSTALL.d/INSTALL.ArchLinux.txt
Installing imapsync online like /X
=======================================================================
Not easy.
Follow the document INSTALL.d/INSTALL.OnlineUI.txt
This document is also available at
https://imapsync.lamiral.info/INSTALL.d/INSTALL.OnlineUI.txt
@ -133,6 +147,7 @@ https://imapsync.lamiral.info/INSTALL.d/INSTALL.OnlineUI.txt
Installing imapsync on other Unixes
=======================================================================
Not easy.
Purchase imapsync at
https://imapsync.lamiral.info/

View file

@ -1,5 +1,5 @@
#!/bin/cat
# $Id: INSTALL.AWS_EC2.txt,v 1.7 2019/11/28 14:37:23 gilles Exp gilles $
# $Id: INSTALL.AWS_EC2.txt,v 1.8 2020/04/14 20:56:47 gilles Exp gilles $
This documentation is also located online at
https://imapsync.lamiral.info/INSTALL.d/
@ -9,8 +9,55 @@ https://imapsync.lamiral.info/INSTALL.d/INSTALL.AWS_EC2.txt
Installing imapsync on AWS EC2
=======================================================================
AWS: Amazon Web Service
A) cat /etc/system-release
Amazon Linux release 2 (Karoo)
sudo yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
sudo yum install imapsync
imapsync --version
1.727
To install a more recent imapsync
sudo yum install perl-App-cpanminus \
perl-Dist-CheckConflicts \
perl-HTML-Parser \
perl-libwww-perl \
perl-Module-Implementation \
perl-Module-ScanDeps \
perl-Package-Stash \
perl-Package-Stash-XS \
perl-PAR-Packer \
perl-Regexp-Common \
perl-Sys-MemInfo \
perl-Test-Fatal \
perl-Test-Mock-Guard \
perl-Test-Requires \
perl-Test-Deep \
perl-File-Tail \
perl-Unicode-String \
perl-Test-NoWarnings \
perl-Test-Simple \
perl-Test-Warn \
perl-Sub-Uplevel
sudo cpanm Encode::IMAPUTF7
wget -N https://imapsync.lamiral.info/imapsync
chmod +x imapsync
./imapsync --testslive
./imapsync --version # command typed on 14 April 2020
1.983
sudo cpanm CGI
B) Old Amazon Linux AMI release 2017.03
cat /etc/system-release
Amazon Linux AMI release 2017.03

View file

@ -1,5 +1,5 @@
#!/bin/cat
# $Id: INSTALL.Centos.txt,v 1.14 2019/11/28 14:37:02 gilles Exp gilles $
# $Id: INSTALL.Centos.txt,v 1.25 2021/02/02 17:08:46 gilles Exp gilles $
This documentation is also located online at
https://imapsync.lamiral.info/INSTALL.d/
@ -9,7 +9,37 @@ https://imapsync.lamiral.info/INSTALL.d/INSTALL.Centos.txt
Installing imapsync on CentOS
=======================================================================
There is one section for Centos 7 and one for Centos 6.
There is one section for Centos 8,
one for Centos 7,
and one for Centos 6.
=======================================================================
Centos 8
=======================================================================
How to install the latest imapsync on Centos 8
dnf install wget perl-App-cpanminus gcc
# then
cpanm lazy Test::MockObject
wget https://imapsync.lamiral.info/imapsync
perl -Mlazy 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
=======================================================================
Centos 7
@ -30,8 +60,8 @@ A good test that shows also the basic example:
A live test:
imapsync --testslive
imapsync --testslive --tls1 --ssl2
Unit tests:
imapsync --tests
@ -40,8 +70,9 @@ Unit tests:
Centos 7 and latest imapsync
=======================================================================
At the time of this writing (April 2018), the epel repository contains
imapsync release 1.727, which is not the latest available release.
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)
In order to install the latest imapsync I suggest the following process:
@ -67,15 +98,20 @@ Then:
perl-Test-Requires \
perl-Test-Deep \
perl-File-Tail \
perl-Unicode-String
perl-Unicode-String \
perl-Test-NoWarnings \
perl-Test-Simple \
perl-Test-Warn \
perl-Sub-Uplevel
cpanm Encode::IMAPUTF7 # this module is not available as a rpm package
Also, run the following commands:
cpanm Encode::IMAPUTF7
wget -N https://imapsync.lamiral.info/imapsync
chmod +x imapsync
./imapsync --testslive
Now you should shave the latest imapsync locally working on Centos 7.
Now you should have the latest imapsync locally working on Centos 7.
If you want to install it and replace the old one:
@ -85,7 +121,7 @@ If you want to install it and replace the old one:
imapsync --version
should give the latest release number instead of 1.727
(It is 1.964 at the time of this writing)
(It is 1.979 at the time of this writing)
If you want to install an online imapsync service
like /X then you also need a recent decent CGI.pm,

View file

@ -1,46 +1,63 @@
#!/bin/cat
# $Id: INSTALL.Darwin.txt,v 1.24 2019/11/28 14:42:52 gilles Exp gilles $
# $Id: INSTALL.Darwin.txt,v 1.34 2021/06/15 10:02:37 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
of reading B) before if you use a Catalina system.
A) Installing imapsync binary on Darwin / Mac OS X
B) Installing imapsync on Catalina
C) Installing imapsync script on Darwin / Mac OS X with brew
D) Installing imapsync script on Darwin / Mac OS X the way I do
E) Building imapsync binary on Darwin / Mac OS X
=======================================================================
Installing imapsync binary on Darwin / Mac OS X
A) Installing imapsync binary on Darwin / Mac OS X
=======================================================================
Caveat Catalina: The binary imapsync_bin_Darwin is detected as a malware
or similar on the latest Mac OS X named Catalina.
It's Catalina new security policy. I'm working on it.
All other Mac OS X releases are ok.
So far I found
https://www.quora.com/What-does-Can-t-be-opened-because-it-s-integrity-cannot-be-verified-mean-on-OSX-Catalina
https://github.com/fastlane/fastlane/issues/15186#issuecomment-532047545
https://github.com/neovim/neovim/issues/11011#issuecomment-531369505
Other way, on the binary: Control + Right Click -> Open
(I don't know if it adds imapsync in the ok apps)
See also the last section of https://support.apple.com/en-us/HT202491
"How to open an app that hasnt been notarized or is from an unidentified developer"
Now, let's forget Catalina for the rest of this document
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.xxx.tgz
where 1.xxx is the version number. I suppose this tarball is put
under your $HOME directory, let say /Users/gilles/, but you can
put it anywhere.
available in the compressed tarball called imapsync-1.977.tgz
where 1.977 is the imapsync version number.
In case you haven't buy 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
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.
Open a terminal: /Applications/Utilities/Terminal double-click on Terminal.
Untar the tarball where you want:
Untar the tarball:
cd
tar xzvf /Users/gilles/imapsync-1.xxx.tgz
pwd
tar xzvf imapsync-1.977.tgz
Go into the directory imapsync-1.xxx
In case the previous command fails, it means the tarball file called imapsync-1.977.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:
cd imapsync-1.xxx
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:
cd imapsync-1.977
First let's have a simple run to see if imapsync_bin_Darwin works.
@ -71,35 +88,66 @@ you have to use:
--host1 test1.lamiral.info --user1 test1 --password1 secret1 \
--host2 test2.lamiral.info --user2 test2 --password2 secret2
You also may have to edit the examples you use, like
examples/imapsync_example.sh
and replace in there the command ./imapsync by ./imapsync_bin_Darwin
in case it is not already done.
Be careful the way you edit the files, use a text editor.
Do not use a word processor because word processors add
or use special formating characters that will break the shell
scripts. If you use TextEdit, use the text mode.
The script examples/imapsync_example_darwin.sh is ready to use,
it is a copy of examples/imapsync_example.sh adapted to Mac users.
The script examples/sync_loop_darwin.sh is also ready to use.
Try:
sh examples/sync_loop_darwin.sh
Be careful the way you edit the script files, use a text editor.
Do not use a word processor because word processors add
or use special formating characters that will break the shell
scripts. If you use TextEdit, use the text mode.
or
In the terminal, try:
cp examples/sync_loop_darwin.sh mysync.sh
sh examples/imapsync_example_darwin.sh
or copy it and run your copy instead:
cp examples/imapsync_example_darwin.sh mysync.sh
sh mysync.sh
Now read on the tutorial
https://imapsync.lamiral.info/doc/TUTORIAL_Unix.html
in order to complete your formation on imapsync.
If you need to sync or migrate many accounts,
the script examples/sync_loop_darwin.sh is also ready to use.
=======================================================================
Installing imapsync script on Darwin / Mac OS X with brew
B) Installing imapsync on Catalina
=======================================================================
Caveat Catalina: The binary imapsync_bin_Darwin is detected as a 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.
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
and then run it again or any of the .sh files, it should run ok
without any notice any more.
Sources of this tip:
https://www.quora.com/What-does-Can-t-be-opened-because-it-s-integrity-cannot-be-verified-mean-on-OSX-Catalina
https://github.com/fastlane/fastlane/issues/15186#issuecomment-532047545
https://github.com/neovim/neovim/issues/11011#issuecomment-531369505
Other way, on the binary: Control + Right Click -> Open
See also the last section of https://support.apple.com/en-us/HT202491
"How to open an app that hasn't been notarized or is from an unidentified developer"
I don't own a Catalina computer so I can't experiment on this nor make
imapsync directly ok with Catalina. You're richer than me :-)
=======================================================================
C) Installing imapsync script on Darwin / Mac OS X with brew
=======================================================================
In case you have brew installed on your system ( see https://brew.sh/ ),
@ -110,16 +158,23 @@ install imapsync with the command:
Do a real test with imap server test.lamiral.info:
imapsync --testslive
If you encouter an error like "String.c: loadable library and perl binaries
are mismatched (got handshake key 0xc500080, needed 0xc400080)",
then install imapsync from source with the command:
brew install -s imapsync
Thanks to Alessandro for this tip!
=======================================================================
Installing imapsync script on Darwin / Mac OS X the way I do
D) Installing imapsync script on Darwin / Mac OS X the way I do
=======================================================================
This part is only for advanced Unix users, or brave users.
The "make" command is a prerequisite to build some Perl modules.
Install make in case it is not already installed.
Install the "make" command in case it is not already installed.
First let us install cpanminus locally in ~/perl5
@ -173,7 +228,7 @@ Now imapsync should work on your system.
./imapsync --testslive
=======================================================================
Building imapsync binary on Darwin / Mac OS X
E) Building imapsync binary on Darwin / Mac OS X
=======================================================================
cpanm Module::ScanDeps
@ -187,12 +242,5 @@ pp -o imapsync.bin imapsync
./imapsync.bin --module
=======================================================================
Installing imapsync Mac OS X Leopard
=======================================================================
Mac OS X Leopard has perl 5.8.8 and an old openssl version.
=======================================================================
=======================================================================

View file

@ -1,5 +1,5 @@
#!/bin/cat
# $Id: INSTALL.Debian.txt,v 1.30 2019/11/28 14:36:18 gilles Exp gilles $
# $Id: INSTALL.Debian.txt,v 1.32 2020/12/11 09:27:29 gilles Exp gilles $
This documentation is also located online at
https://imapsync.lamiral.info/INSTALL.d/
@ -7,9 +7,25 @@ https://imapsync.lamiral.info/INSTALL.d/INSTALL.Debian.txt
There is three install sections in this document,
one for Debian 9 Stretch and Debian 10 Buster
one for Debian 8 Jessie
one for Debian 7 Wheezy
1) one for Debian 9 Stretch and Debian 10 Buster
2) one for Debian 8 Jessie
3) one for Debian 7 Wheezy
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"
What is your Debian release?
Type on a terminal:
cat /etc/debian_version
10.x => Buster
9.x => Stretch
8.x => Jessie
7.x => Wheezy
where x is any number between 0 and 9, x is minor and to be forgotten.
First a call to Debian packagers
Why imapsync is not in Debian as a package?
@ -24,7 +40,7 @@ https://lists.debian.org/debian-user/2016/11/msg00849.html
=======================================================================
Installing imapsync on Debian 9 Stretch or Debian 10 Buster
1) Installing imapsync on Debian 9 Stretch or Debian 10 Buster
=======================================================================
How to install imapsync dependencies on a Debian system?
@ -76,12 +92,12 @@ apt install -y \
After installing the dependencies, imapsync should be working,
go to the section "After installing the dependencies" below.
go to the section "4) After installing the dependencies" below.
=======================================================================
Installing imapsync on Debian 8 Jessie
=======================================================================
=============================================
2) Installing imapsync on Debian 8 Jessie
=============================================
How to install imapsync dependencies on a Debian system?
@ -114,9 +130,9 @@ apt install \
libtest-nowarnings-perl \
libtest-deep-perl \
libtest-warn-perl \
gcc \
make \
cpanminus \
time
cpanminus
The package libdata-uniqid-perl is in the jessie-backports repository
https://packages.debian.org/fr/jessie-backports/libdata-uniqid-perl
@ -149,11 +165,11 @@ the module JSON::WebToken with the command:
cpanm JSON::WebToken
After installing the dependencies, imapsync should be working,
go to the section "After installing the dependencies" below.
go to the section "4) After installing the dependencies" below.
=======================================================================
Installing imapsync on Debian 7 Wheezy
3) Installing imapsync on Debian 7 Wheezy
=======================================================================
How to install imapsync dependencies on a Debian system?
@ -189,6 +205,7 @@ apt-get install \
libtest-simple-perl \
libunicode-string-perl \
liburi-perl \
gcc \
make \
cpanminus
@ -216,11 +233,12 @@ the module JSON::WebToken with the command:
cpanm JSON::WebToken
After installing the dependencies, imapsync should be working.
After installing the dependencies, imapsync should be working,
then go to the section "4) After installing the dependencies" below.
=======================================================================
After installing the dependencies
=======================================================================
=======================================
4) After installing the dependencies
=======================================
You don't have to be root to test and use imapsync.
@ -249,7 +267,7 @@ on the system:
imapsync
Now go to read http://imapsync.lamiral.info/#doc
start with the tutorial.
and start with the tutorial.
=======================================================================
=======================================================================

View file

@ -1,5 +1,5 @@
#!/bin/cat
# $Id: INSTALL.OnlineUI.txt,v 1.32 2019/11/28 14:42:17 gilles Exp gilles $
# $Id: INSTALL.OnlineUI.txt,v 1.49 2021/03/19 09:39:01 gilles Exp gilles $
This documentation is also located online at
https://imapsync.lamiral.info/INSTALL.d/
@ -9,9 +9,10 @@ https://imapsync.lamiral.info/INSTALL.d/INSTALL.OnlineUI.txt
Installing imapsync online
=======================================================================
Please consider this as relatively experimental.
However, to a certain extent, I'm now confident with /X
since the /X service is up and running quite well since January 2017.
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
online, you take responsibility for it.
=======================================================================
Hardware consideration
@ -22,39 +23,41 @@ 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. Linux is also a
preferred platform (I run /X service on Linux and FreeBSD).
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 yet this visual interface on Mac. It works
but for now it demands some skills few Mac users have.
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 hard coded Unix paths.
I'm working on it to be Windows ok but it's not done yet (october 2019).
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.
The web visual user interface frontend /X is compounded in four
files: a html5 file, a css file, a javascript file and
files: a html5 file, a CSS file, a javascript file, and
a logo image:
* https://i005.lamiral.info/X/imapsync_form_extra.html
* https://i005.lamiral.info/X/imapsync_form.css
* https://i005.lamiral.info/X/imapsync_form.js
* https://i005.lamiral.info/X/logo_imapsync_Xn.png
* https://imapsync.lamiral.info/X/imapsync_form_extra.html
* https://imapsync.lamiral.info/X/imapsync_form.css
* https://imapsync.lamiral.info/X/imapsync_form.js
* https://imapsync.lamiral.info/X/logo_imapsync_Xn.png
You can do a "view source" to see the html file as
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 wget.
with a command named "wget". I 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
@ -63,7 +66,7 @@ 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 changing the image logo as an exercise, it's safe if you fail.
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
@ -71,8 +74,8 @@ 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 cpanm to upgrade CGI.pm to its last version,
it's the easiest way.
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:
@ -91,14 +94,14 @@ To check and fix the Perl modules dependencies, run:
wget -N https://imapsync.lamiral.info/prerequisites_imapsync
sh prerequisites_imapsync
In order to make imapsync work as a cgi, there is two conditions.
To make imapsync work as a CGI script, there are two conditions.
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.
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 web server. Detailed examples to
the Unix user running the webserver. Detailed examples to
verify that will be provided further in this document.
The imapsync_form_extra.html file in action calls the CGI location
@ -108,85 +111,116 @@ which has to be imapsync itself, the file script (not the directory).
The very latest and relatively stable imapsync is at
https://imapsync.lamiral.info/imapsync
This file is the program file used verbatim for the service given at
https://i005.lamiral.info/X/
https://imapsync.lamiral.info/X/
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 own imapsync visual interface
and service. The cgi-bin/ directory is usually outside the
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.
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 know just a little of the
linux distributions.
process is easier in case you don't know very much any of the
Linux distributions.
=============================================================================
A) Concrete example on a Debian server with Apache:
Imapsync script place on the server disk:
Imapsync script place on the server disk is
/usr/lib/cgi-bin/imapsync
Get and install latest imapsync:
cd
wget -N -O /usr/lib/cgi-bin/imapsync https://imapsync.lamiral.info/imapsync
chmod +x /usr/lib/cgi-bin/imapsync
Check it like this:
cd
/usr/lib/cgi-bin/imapsync --testslive
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
wget -nv -S -O- http://localhost/cgi-bin/imapsync?testslive=1
It should print something like:
Status: 200 OK to sync IMAP boxes. Load on bar is ...
...
This classical /cgi-bin directory is already configured
This classical /cgi-bin directory is usually already configured
in the Apache configuration file
/etc/apache2/sites-available/default-ssl
or
/etc/apache2/sites-available/default
The configuration file contains the following section
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:
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
# Next line "no-gzip 1" is to avoid output buffering,
# clients can then see the log along the sync
# clients can then see the log during the sync
SetEnv no-gzip 1
Options +ExecCGI -MultiViews
Order allow,deny
Allow from all
# Choose either one or the other, depending on your Apache version
# Lines beginning with # are ignored
# For Apache 2.2
#Order allow, deny
#Allow from all
# Apache 2.4
Require all granted
</Directory>
That's all for the Apache configuration side.
Now get, test, and install the latest imapsync:
cd
wget -N https://imapsync.lamiral.info/imapsync
chmod +x imapsync
# some basic tests
./imapsync
./imapsync --testslive
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:
su -s /bin/sh -c 'SERVER_SOFTWARE=foo /usr/lib/cgi-bin/imapsync' www-data
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 ...
...
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 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
/var/www/html/X/imapsync_form_extra.html
but it can be placed it anywhere on disk, the important
thing is that it has to be served by the web server.
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/
wget -N \
https://i005.lamiral.info/X/imapsync_form_extra.html \
https://i005.lamiral.info/X/imapsync_form.css \
https://i005.lamiral.info/X/imapsync_form.js \
https://i005.lamiral.info/X/logo_imapsync_Xn.png
https://imapsync.lamiral.info/X/imapsync_form_extra.html \
https://imapsync.lamiral.info/X/imapsync_form.css \
https://imapsync.lamiral.info/X/imapsync_form.js \
https://imapsync.lamiral.info/X/logo_imapsync_Xn.png
ln -s imapsync_form_extra.html index.html
The imapsync process working directory in cgi mode is
@ -204,15 +238,26 @@ or the safer
That's all for installing a /X service on Debian.
=============================================================================
B) Concrete example on a Centos 7 server with httpd Apache:
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
Then:
yum install httpd
systemctl restart httpd
cpanm CGI
mkdir /var/www/html/X/
cd /var/www/html/X/
wget -N \
https://i005.lamiral.info/X/imapsync_form_extra.html \
https://i005.lamiral.info/X/imapsync_form.css \
https://i005.lamiral.info/X/imapsync_form.js \
https://i005.lamiral.info/X/logo_imapsync_Xn.png
https://imapsync.lamiral.info/X/imapsync_form_extra.html \
https://imapsync.lamiral.info/X/imapsync_form.css \
https://imapsync.lamiral.info/X/imapsync_form.js \
https://imapsync.lamiral.info/X/logo_imapsync_Xn.png
ln -s imapsync_form_extra.html index.html
cd
@ -223,17 +268,228 @@ B) Concrete example on a Centos 7 server with httpd Apache:
./imapsync --testslive
cp imapsync /var/www/cgi-bin/
Assuming that the Unix account running Apache is "apache",
which is the default Apache user on Centos system,
check that it will work under Apache with this command:
# a real synchronization but not in cgi context
cd /tmp
su -s /bin/sh -c '/var/www/cgi-bin/imapsync --testslive' apache
# in cgi context but just the imapsync command with no parameter
cd
su -s /bin/sh -c 'SERVER_SOFTWARE=foo /var/www/cgi-bin/imapsync' apache
# a real synchronization in cgi context
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 ...
...
Check
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.
Now check
http://yourhost/X/imapsync_form_extra.html
or the safer
https://yourhost/X/imapsync_form_extra.html
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:
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
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
To go back to the previous state:
setenforce 1
sestatus
Nota bene
=========
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
/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
https://imapsync.lamiral.info/vnstat/vnstati.html
Those stats are generated by vnstat
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
=======================================================================
====================== Troubleshooting ============================
=======================================================================
The log says the temporary directory is
/var/tmp/imapsync_cgi/
but it is not in the system.
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
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
or
/usr/lib/systemd/system/httpd.service
with:
PrivateTmp=false
Then reload the systemd daemon and restart the apache2 service
Debian:
systemctl daemon-reload
systemctl restart apache2
systemctl status apache2
Centos:
systemctl daemon-reload
systemctl restart httpd
systemctl status httpd
Then retry
wget -nv -S -O- http://localhost/cgi-bin/imapsync?testslive=1
Look now if /var/tmp/imapsync_cgi/ is there.
=======================================================================
If you encounter this issue:
Failed to find a valid digest in the 'integrity' attribute for resource
'https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js'
with computed SHA-256 integrity 'kZMXypKF3if9/5v2tP9UHBvS/535tSyH7vjszruyCso='.
The resource has been blocked.
It may be because of AdBlock.
Verification:
wget https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js
cat jquery.min.js | openssl dgst -sha384 -binary | openssl base64 -A
gives exactly what is in imapsync_form_extra.html
more imapsync_form_extra.html
...
src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"
integrity="sha384-xBuQ/xzmlsLoJpyjoggmTEz8OWUFM0/RC5BsqQBDX2v5cMvDHcMakNTNrHIW2I5f"
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!
=======================================================================
=======================================================================
This part is for hackers only.
If you want to use the UI but make it more complicated things than
just run imapsync then use the following files:
imapsync_shell_wrapper instead of imapsync itself
imapsync_form_wrapper.js instead of imapsync_form.js
imapsync_form_wrapper.html instead of imapsync_form.html
How to get those files:
wget -N https://imapsync.lamiral.info/X/imapsync_shell_wrapper \
https://imapsync.lamiral.info/X/imapsync_form_wrapper.js \
https://imapsync.lamiral.info/X/imapsync_form_wrapper.html
Centos:
chmod +x imapsync_shell_wrapper
cp imapsync_shell_wrapper /var/www/cgi-bin/
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.
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.
=======================================================================
=======================================================================
@ -245,7 +501,7 @@ 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've try the standard way, telling how any cgi perl script
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!

View file

@ -1,7 +1,8 @@
#!/bin/sh
echo imapsync_docker_timestamp_dockerfile
imapsync_docker_timestamp_dockerfile() {
imapsync_docker_timestamp_dockerfile()
{
DATE_CURRENT=`date +%Y_%m_%d_%H_%M_%S`
echo $DATE_CURRENT
sed -i -e "/just_a_comment_to_force_update/s/comment_to_force_update.*/comment_to_force_update $DATE_CURRENT/" Dockerfile
@ -9,7 +10,8 @@ imapsync_docker_timestamp_dockerfile() {
}
echo imapsync_docker_build
imapsync_docker_build() {
imapsync_docker_build()
{
docker build -t gilleslamiral/imapsync . \
&& imapsync_docker_add_tag_version && echo Build SUCCEEDED || echo Build FAILED
@ -19,11 +21,18 @@ imapsync_docker_build() {
# docker run gilleslamiral/imapsync imapsync --testslive6 --nossl2
}
echo imapsync_docker_version
imapsync_docker_version()
{
docker run gilleslamiral/imapsync imapsync --version
}
echo imapsync_docker_add_tag_version
imapsync_docker_add_tag_version() {
imapsync_docker_add_tag_version()
{
docker images gilleslamiral/imapsync
echo
version=`docker run gilleslamiral/imapsync imapsync --version`
version=`imapsync_docker_version`
echo $version
docker tag gilleslamiral/imapsync:latest gilleslamiral/imapsync:$version
docker images gilleslamiral/imapsync
@ -32,25 +41,37 @@ imapsync_docker_add_tag_version() {
echo imapsync_docker_testslive
imapsync_docker_testslive() {
imapsync_docker_testslive()
{
echo docker run gilleslamiral/imapsync imapsync --testslive
docker run gilleslamiral/imapsync imapsync --testslive
}
echo imapsync_docker_testslive6
imapsync_docker_testslive6() {
imapsync_docker_testslive6()
{
echo docker run gilleslamiral/imapsync imapsync --testslive6 --ssl1 --ssl2
docker run gilleslamiral/imapsync imapsync --testslive6 --ssl1 --ssl2
}
echo imapsync_docker_tests
imapsync_docker_tests() {
imapsync_docker_tests()
{
echo docker run gilleslamiral/imapsync imapsync --tests
docker run gilleslamiral/imapsync imapsync --tests
}
echo imapsync_docker_envfile
imapsync_docker_envfile()
{
docker run --env-file ./secret.txt gilleslamiral/imapsync imapsync \
--host1 test1.lamiral.info --user1 test1 \
--host2 test2.lamiral.info --user2 test2 --justlogin
}
echo docker_delete_all_images
docker_delete_all_images() {
docker_delete_all_images()
{
docker rm `docker ps -a -q`
docker rmi `docker images -q`
}
@ -62,7 +83,8 @@ docker_system_prune()
}
echo docker_delete_dandling_images
docker_delete_dandling_images() {
docker_delete_dandling_images()
{
docker images
dandling_images=`docker images -f dangling=true -q`
exited_containers=`docker ps -a -f status=exited -q`
@ -73,23 +95,28 @@ docker_delete_dandling_images() {
echo imapsync_docker_rebuild_from_scratch
imapsync_docker_rebuild_from_scratch() {
imapsync_docker_rebuild_from_scratch()
{
delete_all_images
docker images
imapsync_docker_build
}
echo imapsync_docker_upload
imapsync_docker_upload() {
# upload only after successful tests
set -x \
&& imapsync_docker_testslive \
&& imapsync_docker_tests \
&& docker run gilleslamiral/imapsync true \
&& docker login --username=gilleslamiral --password=`cat $HOME/var/pass/secret.docker` \
&& docker push gilleslamiral/imapsync:latest \
&& set +x && echo imapsync push SUCCEEDED || echo imapsync push FAILED
set +x
imapsync_docker_upload()
{
version=`imapsync_docker_version`
# upload only after successful tests
set -x \
&& rcsdiff imapsync \
&& imapsync_docker_testslive \
&& imapsync_docker_tests \
&& docker run gilleslamiral/imapsync true \
&& docker login --username=gilleslamiral --password=`cat $HOME/var/pass/secret.docker` \
&& docker push gilleslamiral/imapsync:latest \
&& docker push gilleslamiral/imapsync:$version \
&& set +x && echo imapsync push SUCCEEDED || echo imapsync push FAILED
set +x
}

2
INSTALL.d/secret.txt Normal file
View file

@ -0,0 +1,2 @@
IMAPSYNC_PASSWORD1=secret1
IMAPSYNC_PASSWORD2=secret2

234
Makefile
View file

@ -1,5 +1,5 @@
# $Id: Makefile,v 1.320 2020/01/03 22:50:27 gilles Exp gilles $
# $Id: Makefile,v 1.335 2021/07/06 02:00:46 gilles Exp gilles $
.PHONY: help usage all doc
@ -15,9 +15,9 @@ usage:
@echo "make testf # run tests"
@echo "make testv # run tests verbosely"
@echo "make test_quick # few tests verbosely"
@echo "make W/test.bat # run --tests and W/test.bat on win32"
@echo "make W/test_tests.bat # run --tests on win32"
@echo "make W/test_testsdebug.bat # run --testsdebug on win32"
@echo "make win32testsbat # run --tests and W/test.bat on win32"
@echo "make win32tests # run --tests on win32"
@echo "make win32testsdebug # run --testsdebug on win32"
@echo "make W/test2.bat # run W/test2.bat on win32"
@echo "make W/test3.bat # run W/test3.bat on win32"
@echo "make W/test_reg.bat # run W/test_reg.bat on win32"
@ -52,9 +52,9 @@ usage:
@echo "make mactestsdebug # run ./imapsync --testsdebug on Mac"
@echo "make mactests # run ./imapsync --tests on Mac"
@echo "make mactestslive # run ./imapsync --testslive on Mac"
@echo "make ks2testsdebug # run ./imapsync --testsdebug on ks2"
@echo "make ks2tests # run ./imapsync --tests on ks2"
@echo "make ks2testslive # run ./imapsync --testslive on ks2"
@echo "make ks5testsdebug # run ./imapsync --testsdebug on ks5"
@echo "make ks5tests # run ./imapsync --tests on ks5"
@echo "make ks5testslive # run ./imapsync --testslive on ks5"
PREFIX ?= /usr
@ -62,9 +62,6 @@ DIST_PATH := dist2/
VERSION := $(shell perl ./imapsync --version 2>/dev/null || cat VERSION)
VERSION_PREVIOUS := $(shell perl ./$(DIST_PATH)/imapsync --version 2>/dev/null || echo ERROR)
IMAPClient_3xx := ./W/Mail-IMAPClient-3.42/lib
IMAPClient := $(IMAPClient_3xx)
DIST_NAME := imapsync-$(VERSION)
DIST_FILE := $(DIST_NAME).tgz
@ -85,7 +82,6 @@ hello:
@echo "VERSION $(VERSION)"
@echo "DIST_NAME $(DIST_NAME)"
@echo "VERSION_PREVIOUS $(VERSION_PREVIOUS)"
@echo "IMAPClient $(IMAPClient)"
@echo "HOSTNAME $(HOSTNAME)"
@echo "ARCH $(ARCH)"
@echo "KERNEL $(KERNEL)"
@ -93,9 +89,9 @@ hello:
@echo "DISTRO $(DISTRO)"
all: doc VERSION biz prereq allcritic bin
all: doc VERSION biz prereq allcritic
testp :
testp:
sh INSTALL.d/prerequisites_imapsync
@perl -c imapsync || { echo; echo "Read the INSTALL file to solve Perl module dependencies!"; exit 1; }
@ -108,7 +104,7 @@ README: imapsync
VERSION: imapsync
rcsdiff imapsync
perl -I./$(IMAPClient) ./imapsync --version > ./VERSION
./imapsync --version > ./VERSION
touch -r ./imapsync ./VERSION
@ -128,9 +124,9 @@ doc/TUTORIAL_Unix.html: doc/TUTORIAL_Unix.t2t
doc: README ChangeLog doc/TUTORIAL_Unix.html doc/GOOD_PRACTICES.html W/imapsync.1
.PHONY: clean clean_tilde clean_test doc clean_log clean_bak clean_permissions
.PHONY: clean clean_tilde clean_test doc clean_log clean_bak clean_permissions clean_oauth2
clean: clean_tilde clean_man clean_log clean_bak clean_permissions
clean: clean_tilde clean_man clean_log clean_bak clean_permissions clean_oauth2
clean_permissions:
chmod a-x Makefile FAQ.d/FAQ.*.txt README_Windows.txt
@ -153,6 +149,9 @@ clean_log:
clean_bak:
rm -f index.shtml.bak ./S/style.css.bak
clean_oauth2:
rm oauth2/typescript oauth2/D_*txt
.PHONY: install dist man
man: W/imapsync.1
@ -178,32 +177,50 @@ install: testp W/imapsync.1
# Local goals
###############
.PHONY: prereq test tests unitests testp testf test3xx testv3 perlcritic allcritic crit compok dev cover tidy nytprof
.PHONY: prereq test tests unitests testp testf test3xx perlcritic allcritic crit compok dev cover tidy nytprof functree
dev: test functree crit cover nytprof bin
docker:
ssh ks3 'cd docker/imapsync && . memo_docker'
@echo "make docker_copy_to_ks3 # copy imapsync Dockerfile memo_docker to ks3"
@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:
ssh vp3 'cd docker/imapsync && . memo_docker && imapsync_docker_build'
docker_copy_to_ks3:
rsync -av imapsync INSTALL.d/Dockerfile INSTALL.d/memo_docker INSTALL.d/prerequisites_imapsync ks3:docker/imapsync/
rsync -av RCS/imapsync,v INSTALL.d/RCS/Dockerfile,v INSTALL.d/RCS/memo_docker,v ks3:docker/imapsync/RCS/
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:
ssh ks3 'cd docker/imapsync && . memo_docker && imapsync_docker_upload'
ssh vp3 'cd docker/imapsync && . memo_docker && imapsync_docker_upload'
functree:
functree: W/imapsync_functions_tree_ppi.txt W/imapsync_functions_tree.txt
W/imapsync_functions_tree_ppi.txt: imapsync
perl ./W/learn/function_calls_ppi ./imapsync > W/imapsync_functions_tree_ppi.txt
rcsdiff W/imapsync_functions_tree_ppi.txt || { echo 'rcsdiff detected a diff' | ci -l W/imapsync_functions_tree_ppi.txt ; }
W/imapsync_functions_tree.txt: imapsync
perl ./W/learn/function_calls ./imapsync > W/imapsync_functions_tree.txt
rcsdiff W/imapsync_functions_tree.txt || { echo 'rcsdiff detected a diff' | ci -l W/imapsync_functions_tree.txt ; }
nytprof:
nytprof: nytprof_clean
sh tests.sh ll_nytprof
nytprofhtml
nytprof_clean:
rm -rfv nytprof/
cover:
perl -c ./imapsync
perl -MDevel::Cover ./imapsync --tests --testslive
@ -240,17 +257,17 @@ 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 -1 imapsync > W/perlcritic_1.txt.tmp || :
perlcritic --statistics-only -1 imapsync > W/perlcritic_1.txt.tmp || :
mv W/perlcritic_1.txt.tmp W/perlcritic_1.txt
echo | ci -l W/perlcritic_1.txt
W/perlcritic_2.txt: imapsync W/.compok
perlcritic --statistics -2 imapsync > W/perlcritic_2.txt.tmp || :
perlcritic --statistics-only -2 imapsync > W/perlcritic_2.txt.tmp || :
mv W/perlcritic_2.txt.tmp W/perlcritic_2.txt
echo | ci -l W/perlcritic_2.txt
W/perlcritic_3.txt: imapsync W/.compok
perlcritic --statistics -3 imapsync > W/perlcritic_3.txt.tmp || :
perlcritic --statistics-only -3 imapsync > W/perlcritic_3.txt.tmp || :
mv W/perlcritic_3.txt.tmp W/perlcritic_3.txt
echo | ci -l W/perlcritic_3.txt
@ -260,32 +277,27 @@ W/perlcritic_4.txt: imapsync W/.compok
echo | ci -l W/perlcritic_4.txt
test_quick : test_quick_3xx
test_quick: imapsync tests.sh
/usr/bin/time sh -x tests.sh locallocal
test_quick_3xx: imapsync tests.sh
CMD_PERL='perl -I./$(IMAPClient_3xx)' /usr/bin/time sh -x tests.sh locallocal
testv3: imapsync tests.sh
CMD_PERL='perl -I./$(IMAPClient_3xx)' /usr/bin/time sh tests.sh
testv: testv3
test: .test_3xx
testv: imapsync tests.sh
/usr/bin/time sh tests.sh
tests: test
unitests:
perl -I./$(IMAPClient_3xx) ./imapsync --tests
test: .test_3xx
# .test_3xx is created by tests.sh with success at all mandatory tests
.test_3xx: imapsync tests.sh
CMD_PERL='perl -I./$(IMAPClient_3xx)' /usr/bin/time sh tests.sh 1>/dev/null
/usr/bin/time sh tests.sh 1>/dev/null
unitests:
./imapsync --tests
testf: clean_test test
.PHONY: lfo upload_lfo dosify_bat public imapsync_cidone
.PHONY: dosify_bat
dosify_bat:
unix2dos W/*.bat examples/*.bat
@ -293,7 +305,9 @@ dosify_bat:
copy_win32:
scp imapsync Admin@c:'C:/msys/1.0/home/Admin/imapsync/'
W/test.bat:
.PHONY: win32testsbat win32tests win32testsdebug
win32testsbat:
unix2dos W/test.bat
scp imapsync W/test.bat Admin@c:'C:/msys/1.0/home/Admin/imapsync/'
# ssh Admin@c 'perl C:/msys/1.0/home/Admin/imapsync/imapsync --testsdebug'
@ -303,21 +317,19 @@ W/test.bat:
# ssh Admin@c 'tasklist /NH /FO CSV'
W/test_tests.bat:
win32tests:
unix2dos W/test_tests.bat
scp imapsync W/test_tests.bat Admin@c:'C:/msys/1.0/home/Admin/imapsync/'
ssh Admin@c 'C:/msys/1.0/home/Admin/imapsync/test_tests.bat'
./W/check_winerr test_tests.bat
W/test_testsdebug.bat:
win32testsdebug:
unix2dos W/test_testsdebug.bat
scp imapsync W/test_testsdebug.bat Admin@c:'C:/msys/1.0/home/Admin/imapsync/'
ssh Admin@c 'C:/msys/1.0/home/Admin/imapsync/test_testsdebug.bat'
./W/check_winerr test_testsdebug.bat
.PHONY: W/*.bat examples/*
@ -440,13 +452,13 @@ imapsync_32bit.exe: imapsync
p24tests:
win64tests:
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
p24testsdebug:
win64testsdebug:
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'
@ -472,6 +484,11 @@ W/test_ipv6.bat:
scp W/test_ipv6.bat pc_HP_DV7_p24:'Desktop/imapsync_build'
ssh 'pc HP DV7'@p24 'Desktop/imapsync_build/test_ipv6.bat'
W/test_namespace.bat:
unix2dos W/test_namespace.bat
scp W/test_namespace.bat ../../var/pass/secret.outlook.com pc_HP_DV7_p24:'Desktop/imapsync_build'
ssh 'pc HP DV7'@p24 'Desktop/imapsync_build/test_namespace.bat'
W/test4.bat:
unix2dos W/test4.bat
scp W/test4.bat pc_HP_DV7_p24:'Desktop/imapsync_build'
@ -517,7 +534,7 @@ win64build:
./W/check_win64err build_exe.bat
imapsync.exe: imapsync_64bit.exe
cp imapsync_64bit.exe imapsync.exe
cp -a imapsync_64bit.exe imapsync.exe
imapsync_64bit.exe: imapsync
@ -554,13 +571,13 @@ zip: dosify_bat
# C:\Users\mansour\Desktop\imapsync
.PHONY: mac bin win lin win64
.PHONY: mac 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:
gilleslamira@gate.polarhome.com:
rsync -av -p -e 'ssh -4 -p 995' X/ gilleslamira@gate.polarhome.com:X/
@ -590,25 +607,25 @@ 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'
.PHONY: bin win lin win32 win64
bin: mac win64 win32
bin: mac win
lin: $(BIN_NAME)
win: win64 win32 imapsync.exe
win64: imapsync_64bit.exe
win32: imapsync_32bit.exe
win64: imapsync_64bit.exe
$(BIN_NAME): imapsync
rcsdiff imapsync
{ pp -x -o $(BIN_NAME) -I $(IMAPClient_3xx) \
-M Mail::IMAPClient \
{ pp -x -o $(BIN_NAME) \
imapsync ; \
}
# Maybe add -M Test2::Event::Info \
# Maybe add -M Test2::Event::Info Mail::IMAPClient \
#-M Net::SSLeay -M IO::Socket -M IO::Socket::INET6 -M IO::Socket::SSL \
#-M Digest::MD5 -M Digest::HMAC_MD5 -M Term::ReadKey \
#-M Authen::NTLM -M HTML::Entities -M JSON::WebToken \
@ -619,7 +636,6 @@ $(BIN_NAME): imapsync
./$(BIN_NAME) --justbanner
lfo: upload_lfo
.PHONY: tarball cidone ci
@ -636,9 +652,10 @@ tarball: cidone
ci: cidone
cidone: auto_ci
rcsdiff X/cgi_memo X/*.txt X/imapsync_form.* X/noscript.css
rcsdiff W/*.bat W/*.sh W/*.txt W/*.txt W/*.htaccess
rcsdiff X/cgi_memo X/stat_patterns.txt X/server_survey_patterns.txt X/imapsync_form.* X/imapsync_form_extra.html X/noscript.css
rcsdiff W/*.bat W/*.sh W/*.txt W/*.htaccess
cd W && rcsdiff RCS/*
cd oauth2 && rcsdiff RCS/*
rcsdiff doc/*.t2t
rcsdiff INSTALL.d/*.txt INSTALL.d/prerequisites_imapsync
rcsdiff FAQ.d/*.txt
@ -649,7 +666,7 @@ cidone: auto_ci
rcsdiff RCS/*
dist: cidone test clean all perlcritic dist_prepa dist_zip README_dist
dist: cidone test clean all dist_prepa dist_zip README_dist
md5:
@ -658,7 +675,7 @@ md5:
sha:
cd $(DIST_PATH)/ && sha512sum *
.PHONY: moveoldrelease ks2testsdebug ks2tests README_dist docker_pull_count
.PHONY: moveoldrelease ks5testsdebug ks5tests README_dist docker_pull_count
moveoldrelease:
./W/tools/backup_old_dist $(DIST_PATH)
@ -681,7 +698,7 @@ README_dist:
sh W/tools/gen_README_dist > $(DIST_PATH)/README.txt
unix2dos $(DIST_PATH)/README.txt
.PHONY: publish upload_ks ks valid_index biz ks2tests_gilles ks2tests_root auto_ci
.PHONY: publish upload_ks ks valid_index biz ks5tests_gilles ks5tests_root auto_ci
biz: S/imapsync_sold_by_country.txt docker_pull_count
@ -690,7 +707,7 @@ auto_ci: docker_pull_count
docker_pull_count:
cd W/ && rcsdiff docker_pull_count.txt || { echo | ci -l docker_pull_count.txt ; }
S/imapsync_sold_by_country.txt: imapsync
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
@ -708,37 +725,40 @@ ks3:
rsync -avHz --delete -P \
. gilles@ks3.lamiral.info:public_html/imapsync/
ks6:
rsync -avHz --delete -P --exclude 'dist2' \
. gilles@ks6.lamiral.info:public_html/imapsync/
upload_tests: tests.sh
rsync -avHz --delete -P \
tests.sh \
gilles@ks.lamiral.info:public_html/imapsync/
ks2testsdebug:
ks5testsdebug:
rsync -aP imapsync gilles@ks.lamiral.info:public_html/imapsync/imapsync
ssh gilles@ks.lamiral.info 'public_html/imapsync/imapsync --testsdebug'
ks2tests: ks2tests_gilles ks2tests_root
ks5tests: ks5tests_gilles ks5tests_root
ks2tests_gilles:
rsync -aP imapsync gilles@ks.lamiral.info:public_html/imapsync/imapsync
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'
ks2tests_root:
rsync -aP imapsync root@ks.lamiral.info:
ssh root@ks.lamiral.info './imapsync --tests'
i005tests_root:
rsync -P imapsync INSTALL.d/prerequisites_imapsync root@i005.lamiral.info:
ssh root@i005.lamiral.info './imapsync --tests'
i005prerequisites:
rsync -P imapsync INSTALL.d/prerequisites_imapsync root@i005.lamiral.info:
ssh root@i005.lamiral.info 'sh prerequisites_imapsync'
ks5tests_root:
rsync -P imapsync oauth2_access_token.txt oauth2_string_for_oauthdirect.txt root@ks5.lamiral.info:
ssh root@ks5.lamiral.info './imapsync --tests'
ks2testslive:
ks5prerequisites:
rsync -P imapsync INSTALL.d/prerequisites_imapsync root@ks5.lamiral.info:
ssh root@ks5.lamiral.info 'sh prerequisites_imapsync'
ks5testslive:
rsync -aP imapsync gilles@ks.lamiral.info:public_html/imapsync/imapsync
ssh gilles@ks.lamiral.info 'public_html/imapsync/imapsync --testslive'
@ -752,9 +772,6 @@ centos:
PUBLIC = ./ChangeLog ./NOLIMIT ./LICENSE ./CREDITS ./FAQ \
./index.shtml ./INSTALL ./README_Windows.txt \
./VERSION ./imapsync \
@ -766,6 +783,7 @@ ml:
m4 -P W/ml_announce.in.txt | mutt -H-
mailq
lfo: upload_lfo
upload_lfo:
#rm -rf /home/gilles/public_html/www.linux-france.org/html/prj/imapsync/
@ -777,8 +795,13 @@ upload_lfo:
/home/gilles/public_html/www.linux-france.org/html/prj/imapsync/.htaccess
sh ~/memo/lfo-rsync
.PHONY: valid_index va
valid_index: W/.valid.index.shtml
va: valid_index
cl: ./W/checklink.txt
./W/checklink.txt: index.shtml
@ -794,15 +817,18 @@ cle: ./W/checklinkext.txt
http://lamiral.info/~gilles/imapsync/S/imapservers.shtml \
| tee ./W/checklinkext.txt
W/.valid.index.shtml: index.shtml
W/.valid.index.shtml: index.shtml S/*.shtml
for f in index.shtml S/*.shtml; do echo tidy -e -q $$f; tidy -e -q $$f ; done
./W/tools/validate_xml_html5 index.shtml S/*.shtml
./W/tools/validate index.shtml S/donate.shtml S/external.shtml S/imapservers.shtml \
S/news.shtml S/no_download.shtml S/paypal_return.shtml S/poll.shtml \
S/template_xhtml1.shtml
touch W/.valid.index.shtml
.PHONY: upload_index upload_FAQ ci_imapsync upload_bin
upload_index: W/.valid.index.shtml clean_permissions
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
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/
@ -812,35 +838,37 @@ upload_index: W/.valid.index.shtml clean_permissions
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 -aHvz --delete ../imapsync_website/ root@ks.lamiral.info:/var/www/imapsync/
rsync -aHvz --delete ../imapsync_website/ root@ks5.lamiral.info:/usr/local/www/apache24/data/imapsync/
ci_imapsync:
rcsdiff imapsync
upload_latest: unitests ci_imapsync bin
rsync -a imapsync imapsync_bin_Darwin imapsync.exe imapsync_32bit.exe ./INSTALL.d/prerequisites_imapsync ../imapsync_website/
rsync -aHvz --delete ../imapsync_website/ root@ks.lamiral.info:/var/www/imapsync/
rsync -av imapsync imapsync_bin_Darwin imapsync.exe imapsync_32bit.exe ./INSTALL.d/prerequisites_imapsync ../imapsync_website/
rsync -aHvzP --delete ../imapsync_website/ root@ks5.lamiral.info:/usr/local/www/apache24/data/imapsync/
upload_cgi: unitests ks2tests i005tests_root ci_imapsync
upload_cgi: unitests ks5tests ks5tests_root ci_imapsync
rsync -a imapsync ./INSTALL.d/prerequisites_imapsync ../imapsync_website/
rsync -aHvz --delete ../imapsync_website/ root@ks.lamiral.info:/var/www/imapsync/
rsync -P imapsync root@i005.lamiral.info:/home/www/apache24/cgi-bin/imapsync
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
upload_cgi_memo:
dos2unix X/stat_patterns.txt X/server_survey_patterns.txt
rsync -av X/cgi_memo X/stat_patterns.txt X/server_survey_patterns.txt root@ks2:/var/tmp/imapsync_cgi/
rsync -av X/cgi_memo X/stat_patterns.txt X/server_survey_patterns.txt root@i005:/var/tmp/imapsync_cgi/
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_X:
./W/tools/validate_xml_html5 X/index.html X/imapsync_form.html X/imapsync_form_extra.html
rcsdiff X/imapsync_form.html X/imapsync_form_extra.html X/imapsync_form.css X/noscript.css
rcsdiff X/imapsync_form.js
./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
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@ks.lamiral.info:/var/www/imapsync/
rsync -av --delete X/ root@i005:/home/www/apache24/data/X/
rsync -aHvz --delete ../imapsync_website/ root@ks5.lamiral.info:/usr/local/www/apache24/data/imapsync/
upload_FAQ:
rcsdiff FAQ.d/*.txt LICENSE CREDITS TODO INSTALL.d/*.txt
@ -848,7 +876,7 @@ upload_FAQ:
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 -aHvz --delete ../imapsync_website/ root@ks.lamiral.info:/var/www/imapsync/
rsync -aHvz --delete ../imapsync_website/ root@ks5.lamiral.info:/usr/local/www/apache24/data/imapsync/
upload_ks_W_memo:
@ -863,7 +891,7 @@ 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 -aHvz --delete ../imapsync_website/ root@ks.lamiral.info:/var/www/imapsync/
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'

237
README
View file

@ -6,7 +6,7 @@ NAME
VERSION
This documentation refers to Imapsync $Revision: 1.977 $
This documentation refers to Imapsync $Revision: 2.140 $
USAGE
@ -27,52 +27,76 @@ DESCRIPTION
Imapsync command is a tool allowing incremental and recursive imap
transfers from one mailbox to another. If you don't understand the
previous sentence, it's normal, it's pedantic computer oriented jargon.
previous sentence, it's normal, it's pedantic computer-oriented jargon.
All folders are transferred, recursively, meaning the whole folder
hierarchy is taken, all messages in them, and all messages flags (\Seen
hierarchy is taken, all messages in them, and all message flags (\Seen
\Answered \Flagged etc.) are synced too.
Imapsync reduces the amount of data transferred by not transferring a
given message if it already resides on the destination side. Messages
that are on the destination side but not on the source side stay as they
are (see the --delete2 option to have a strict sync).
are. See the --delete2 option to have strict sync and delete them.
How imapsync knows a message is already on both sides? Same specific
How 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.
choice can be changed with the --useheader option, most often a
duplicate problem is solved by using --useheader "Message-Id"
All flags are preserved, unread messages will stay unread, read ones
will stay read, deleted will stay deleted.
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
commands.
You can abort the transfer at any time and restart it later, imapsync
works well with bad connections and interruptions, by design. On a
terminal hit Ctr-c twice within two seconds in order to abort the
program. Hit Ctr-c just once makes imapsync reconnect to both imap
servers.
terminal hit Ctr-c twice within two seconds to abort the program. Hit
Ctr-c just once makes imapsync reconnect to both imap servers.
How do you know the sync is finished and well done? When imapsync ends
by itself it mentions it with lines like those:
Exiting with return value 0 (EX_OK: successful termination) 0/50 nb_errors/max_errors PID 301
Removing pidfile /tmp/imapsync.pid
Log file is LOG_imapsync/2020_11_17_15_59_22_761_test1_test2.txt ( to change it, use --logfile filepath ; or use --nolog to turn off logging )
If you don't have those lines it means that either the sync process is
still running (or eventually hanging indefinitely) or that it ended
without a whisper, a strong kill -9 on Linux for example.
If you have those final lines then it means the sync process is properly
finished. It may have encountered problems though.
A good synchronization is mentioned by some lines above the last ones,
especially those three lines:
The sync looks good, all 1745 identified messages in host1 are on host2.
There is no unidentified message on host1.
Detected 0 errors
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 has to be used, it deletes messages in host2
folder B that are not in host1 folder A. If you also need to destroy
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 destroy, it's a mandatory folder
in IMAP.
folders to destroy. INBOX will never be destroyed, it's a mandatory
folder in IMAP so imapsync doesn't even try to remove it.
A different scenario is to delete the messages from the source mailbox
after a successful transfer, it can be a good feature when migrating
mailboxes since messages will be only on one side. The source account
will only have messages that are not on the destination yet, ie,
messages that arrived after a sync or that failed to be copied.
messages that arrived after a sync or that failed to be transferred.
In that case, use the --delete1 option. Option --delete1 implies also
option --expunge1 so all messages marked deleted on host1 will be really
deleted. In IMAP protocol deleting a message does not really delete it,
it marks it with the flag \Deleted, allowing an undelete. Expunging a
the option --expunge1 so all messages marked deleted on host1 will be
deleted. In IMAP protocol deleting a message does not delete it, it
marks it with the flag \Deleted, allowing an undelete. Expunging a
folder removes, definitively, all the messages marked as \Deleted in
this folder.
@ -90,17 +114,18 @@ OPTIONS
usage: imapsync [options]
The standard options are the six values forming the credentials. Three
values on each side are needed in order to log in into the IMAP servers.
These six values are a host, a username, and a password, two times.
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.
Conventions used in the following descriptions of the options:
str means string
int means integer
int means integer number
flo means float number
reg means regular expression
cmd means command
--dry : Makes imapsync doing nothing for real, just print what
--dry : Makes imapsync doing nothing for real; it just print what
would be done without --dry.
OPTIONS/credentials
@ -110,18 +135,18 @@ OPTIONS
Optional since default ports are the
well known ports imap/143 or imaps/993.
--user1 str : User to login on host1.
--password1 str : Password for the user1.
--password1 str : Password of user1.
--host2 str : "destination" imap server.
--port2 int : Port to connect on host2. Optional
--user2 str : User to login on host2.
--password2 str : Password for the user2.
--password2 str : Password of user2.
--showpasswords : Shows passwords on output instead of "MASKED".
Useful to restart a complete run by just reading
the command line used in the log,
or to debug passwords.
It's not a secure practice at all.
It's not a secure practice at all!
--passfile1 str : Password file for the user1. It must contain the
password on the first line. This option avoids showing
@ -129,7 +154,10 @@ OPTIONS
--passfile2 str : Password file for the user2.
You can also pass the passwords in the environment variables
IMAPSYNC_PASSWORD1 and IMAPSYNC_PASSWORD2
IMAPSYNC_PASSWORD1 and IMAPSYNC_PASSWORD2. If you don't pass the user1
password via --password1 nor --passfile1 nor $IMAPSYNC_PASSWORD1 then
imapsync will prompt to enter the password on the terminal. Same thing
for user2 password.
OPTIONS/encryption
@ -154,11 +182,16 @@ OPTIONS
--sslargs2 str : Pass any ssl parameter for host2 ssl or tls connection.
See --sslargs1
--timeout1 int : Connection timeout in seconds for host1.
--timeout1 flo : Connection timeout in seconds for host1.
Default is 120 and 0 means no timeout at all.
--timeout2 int : Connection timeout in seconds for host2.
--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:
@ -178,6 +211,28 @@ OPTIONS
--domain1 str : Domain on host1 (NTLM authentication).
--domain2 str : Domain on host2 (NTLM authentication).
--oauthaccesstoken1 str : The access token to authenticate with OAUTH2.
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.
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
and take this line as the access token. The advantage
of the file is that if the access token changes then
imapsync can read it again when it needs to reconnect
during a run.
--oauthaccesstoken2 str : same thing as --oauthaccesstoken1
--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.
--oauthdirect2 str : same thing as oauthdirect1
OPTIONS/folders
--folder str : Sync this folder.
@ -212,6 +267,9 @@ OPTIONS
--f1f2 str1=str2 : Force folder str1 to be synced to str2,
--f1f2 overrides --automap and --regextrans2.
Use several --f1f2 options to map several folders.
Option --f1f2 is a one to one only folder mapping,
str1 and str2 have to be full path folder names.
--subfolder2 str : Syncs the whole host1 folders hierarchy under the
host2 folder named str.
@ -256,7 +314,7 @@ OPTIONS
--regextrans2 reg : and this one. etc.
When you play with the --regextrans2 option, first
add also the safe options --dry --justfolders
Then, when happy, remove --dry for a run, then
Then, when happy, remove --dry for a run, then
remove --justfolders for the next ones.
Have in mind that --regextrans2 is applied after
the automatic prefix and separator inversion.
@ -278,9 +336,11 @@ OPTIONS
Default is system specific, Unix is /tmp but
/tmp is often too small and deleted at reboot.
--tmpdir /var/tmp should be better.
--pidfile str : The file where imapsync pid is written,
it can be dirname/filename.
Default name is imapsync.pid in tmpdir.
it can be dirname/filename complete path.
The default name is imapsync.pid in tmpdir.
--pidfilelocking : Abort if pidfile already exists. Useful to avoid
concurrent transfers on the same mailbox.
@ -297,7 +357,7 @@ OPTIONS
where:
2019_12_22_23_57_59_532 is nearly the date of the start
YYYY_MM_DD_HH_MM_SS_mmm
YYYY_MM_DD_HH_MM_SS_mmm
year_month_day_hour_minute_seconde_millisecond
and user1 user2 are the --user1 --user2 values.
@ -305,18 +365,18 @@ OPTIONS
OPTIONS/messages
--skipmess reg : Skips messages matching the regex.
Example: 'm/[\x80-ff]/' # to avoid 8bits messages.
Example: 'm/[\x80-\xff]/' # to avoid 8bits messages.
--skipmess is applied before --regexmess
--skipmess reg : or this one, etc.
--skipcrossduplicates : Avoid copying messages that are already copied
in another folder, good from Gmail to X when
X is not also Gmail.
in another folder, good from Gmail to XYZ when
XYZ is not also Gmail.
Activated with --gmail1 unless --noskipcrossduplicates
--debugcrossduplicates : Prints which messages (UIDs) are skipped with
--skipcrossduplicates (and in what other folders
they are).
--skipcrossduplicates and in what other folders
they are.
--pipemess cmd : Apply this cmd command to each message content
before the copy.
@ -332,19 +392,20 @@ OPTIONS
--disarmreadreceipts : Disarms read receipts (host2 Exchange issue)
--regexmess reg : Apply the whole regex to each message before transfer.
Example: 's/\000/ /g' # to replace null by space.
Example: 's/\000/ /g' # to replace null characters
by spaces.
--regexmess reg : and this one, etc.
OPTIONS/labels
Gmail present labels as folders in imap. Imapsync can accelerate the
sync by syncing X-GM-LABELS, it will avoid to transfer messages when
they are already on host2.
they are already on host2 in another folder.
--synclabels : Syncs also Gmail labels when a message is copied to host2.
Activated by default with --gmail1 --gmail2 unless
--nosynclabels is added.
--resynclabels : Resyncs Gmail labels when a message is already on host2.
Activated by default with --gmail1 --gmail2 unless
--noresynclabels is added.
@ -367,6 +428,9 @@ OPTIONS
May be useful when a user has already started to play
with its host2 account.
--filterbuggyflags : Filter flags known to be buggy and generators of errors
"BAD Invalid system flag" or "NO APPEND Invalid flag list".
OPTIONS/deletions
--delete1 : Deletes messages on host1 server after a successful
@ -391,16 +455,18 @@ OPTIONS
Useful with --delete1 since what remains on host1
is only what failed to be synced.
--delete2 : Delete messages in host2 that are not in
host1 server. Useful for backup or pre-sync.
--delete2 : Delete messages in the host2 account that are not in
the host1 account. Useful for backup or pre-sync.
--delete2 implies --uidexpunge2
--delete2duplicates : Delete messages in host2 that are duplicates.
--delete2duplicates : Deletes messages in host2 that are duplicates in host2.
Works only without --useuid since duplicates are
detected with an header part of each message.
NB: --delete2duplicates is far less violent than --delete2
since it removes only duplicates.
--delete2folders : Delete folders in host2 that are not in host1 server.
For safety, first try it like this (it is safe):
--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.
@ -421,16 +487,17 @@ OPTIONS
If you encounter problems with dates, see also:
https://imapsync.lamiral.info/FAQ.d/FAQ.Dates.txt
--syncinternaldates : Sets the internal dates on host2 same as host1.
--syncinternaldates : Sets the internal dates on host2 as the same as host1.
Turned on by default. Internal date is the date
a message arrived on a host (Unix mtime).
--idatefromheader : Sets the internal dates on host2 same as the
a message arrived on a host (Unix mtime usually).
--idatefromheader : Sets the internal dates on host2 as same as the
ones in "Date:" headers.
OPTIONS/message selection
--maxsize int : Skip messages larger (or equal) than int bytes
--minsize int : Skip messages smaller (or equal) than int bytes
--maxage int : Skip messages older than int days.
final stats (skipped) don't count older messages
see also --minage
@ -451,18 +518,30 @@ OPTIONS
--search2 str : Same as --search but for selecting host2 messages only.
So --search CRIT equals --search1 CRIT --search2 CRIT
--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
--noabletosearch1 : Like --noabletosearch but for host1 only.
--noabletosearch2 : Like --noabletosearch but for host2 only.
--maxlinelength int : skip messages with a line length longer than int bytes.
RFC 2822 says it must be no more than 1000 bytes but
real life servers and email clients do more.
--useheader str : Use this header to compare messages on both sides.
Ex: Message-ID or Subject or Date.
Example: "Message-Id" or "Received" or "Date".
--useheader str and this one, etc.
--usecache : Use cache to speed up next syncs. Not set by default.
--syncduplicates : Sync also duplicates. Off by default.
--usecache : Use cache to speed up next syncs. Off by default.
--nousecache : Do not use cache. Caveat: --useuid --nousecache creates
duplicates on multiple runs.
--useuid : Use UIDs instead of headers as a criterion to recognize
messages. Option --usecache is then implied unless
--nousecache is used.
@ -479,6 +558,7 @@ OPTIONS
--addheader adds a "Message-Id" header,
like "Message-Id: 12345@imapsync", where 12345
is the imap UID of the message on the host1 folder.
Useful to sync folders "Sent" or "Draft".
OPTIONS/debugging
@ -496,7 +576,7 @@ OPTIONS
--tests : Run local non-regression tests. Exit code 0 means all ok.
--testslive : Run a live test with test1.lamiral.info imap server.
Useful to check the basics. Needs internet connection.
--testslive6 : Run a live test with ks2ipv6.lamiral.info imap server.
--testslive6 : Run a live test with ks6ipv6.lamiral.info imap server.
Useful to check the ipv6 connectivity. Needs internet.
OPTIONS/specific
@ -504,8 +584,8 @@ OPTIONS
--gmail1 : sets --host1 to Gmail and other options. See FAQ.Gmail.txt
--gmail2 : sets --host2 to Gmail and other options. See FAQ.Gmail.txt
--office1 : sets --host1 to Office365 and other options. See FAQ.Exchange.txt
--office2 : sets --host2 to Office365 and other options. See FAQ.Exchange.txt
--office1 : sets --host1 to Office365 and other options. See FAQ.Office365.txt
--office2 : sets --host2 to Office365 and other options. See FAQ.Office365.txt
--exchange1 : sets options for Exchange. See FAQ.Exchange.txt
--exchange2 : sets options for Exchange. See FAQ.Exchange.txt
@ -515,13 +595,14 @@ OPTIONS
OPTIONS/behavior
--maxmessagespersecond int : limits the number of messages transferred per second.
--maxmessagespersecond flo : limits the average number of messages
transferred per second.
--maxbytespersecond int : limits the average transfer rate per second.
--maxbytesafter int : starts --maxbytespersecond limitation only after
--maxbytesafter amount of data transferred.
--maxsleep int : do not sleep more than int seconds.
--maxsleep flo : do not sleep more than int seconds.
On by default, 2 seconds max, like --maxsleep 2
--abort : terminates a previous call still running.
@ -530,13 +611,13 @@ OPTIONS
--exitwhenover int : Stop syncing and exits when int total bytes
transferred is reached.
--version : Print only software version.
--version : Print only the software version.
--noreleasecheck : Do not check for any new imapsync release.
--releasecheck : Check for new imapsync release.
it's an http request to
http://imapsync.lamiral.info/prj/imapsync/VERSION
--noid : Do not send/receive ID command to imap servers.
--noid : Do not send/receive IMAP "ID" command to imap servers.
--justconnect : Just connect to both servers and print useful
information. Need only --host1 and --host2 options.
@ -561,7 +642,7 @@ OPTIONS
SECURITY
You can use --passfile1 instead of --password1 to give the password
You can use --passfile1 instead of --password1 to mention the password
since it is safer. With --password1 option, on Linux, any user on your
host can see the password by using the 'ps auxwwww' command. Using a
variable (like IMAPSYNC_PASSWORD1) is also dangerous because of the 'ps
@ -576,7 +657,7 @@ SECURITY
on the imap servers. If the imaps port is closed then it open a normal
(clear) connection on port 143 but it looks for TLS support in the
CAPABILITY list of the servers. If TLS is supported then imapsync goes
to encryption.
to encryption with STARTTLS.
If the automatic ssl and the tls detections fail then imapsync will not
protect against sniffing activities on the network, especially for
@ -592,7 +673,10 @@ EXIT STATUS
Imapsync will exit with a 0 status (return code) if everything went
good. Otherwise, it exits with a non-zero status. That's classical Unix
behavior. Here is the list of the exit code values (an integer between 0
and 255). The names reflect their meaning:
and 255). In Bourne Shells, this exit code value can be retrieved within
the variable value "$?" if you read it just after the imapsync call.
The names reflect their meaning:
EX_OK => 0 ; #/* successful termination */
EX_USAGE => 64 ; #/* command line usage error */
@ -601,6 +685,7 @@ EXIT STATUS
EX_SOFTWARE => 70 ; #/* internal software error */
EXIT_CATCH_ALL => 1 ; # Any other error
EXIT_BY_SIGNAL => 6 ; # Should be 128+n where n is the sig_num
EXIT_BY_FILE => 7 ;
EXIT_PID_FILE_ERROR => 8 ;
EXIT_CONNECTION_FAILURE => 10 ;
EXIT_TLS_FAILURE => 12 ;
@ -608,7 +693,18 @@ EXIT STATUS
EXIT_SUBFOLDER1_NO_EXISTS => 21 ;
EXIT_WITH_ERRORS => 111 ;
EXIT_WITH_ERRORS_MAX => 112 ;
EXIT_OVERQUOTA => 113 ;
EXIT_ERR_APPEND => 114 ;
EXIT_ERR_FETCH => 115 ;
EXIT_ERR_CREATE => 116 ;
EXIT_ERR_SELECT => 117 ;
EXIT_TRANSFER_EXCEEDED => 118 ;
EXIT_ERR_APPEND_VIRUS => 119 ;
EXIT_TESTS_FAILED => 254 ; # Like Test::More API
EXIT_CONNECTION_FAILURE_HOST1 => 101 ;
EXIT_CONNECTION_FAILURE_HOST2 => 102 ;
EXIT_AUTHENTICATION_FAILURE_USER1 => 161 ;
EXIT_AUTHENTICATION_FAILURE_USER2 => 162 ;
LICENSE AND COPYRIGHT
@ -632,10 +728,10 @@ AUTHOR
Good feedback is always welcome. Bad feedback is very often welcome.
Gilles LAMIRAL earns his living by writing, installing, configuring and
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, a good way to maintain and support free open public
software over decades.
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.
BUGS AND LIMITATIONS
@ -686,8 +782,8 @@ INSTALL
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 64bit binary called imapsync_64bit.exe
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
@ -721,7 +817,7 @@ SIMILAR SOFTWARE
See also https://imapsync.lamiral.info/S/external.shtml
for a better up to date list.
Last updated and verified on Sun Dec 8, 2019.
List verified on Friday July 1, 2021.
imapsync: https://github.com/imapsync/imapsync (this is an imapsync copy, sometimes delayed, with --noreleasecheck by default since release 1.592, 2014/05/22)
imap_tools: https://web.archive.org/web/20161228145952/http://www.athensfbc.com/imap_tools/. The imap_tools code is now at https://github.com/andrewnimmo/rick-sanders-imap-tools
@ -729,6 +825,7 @@ SIMILAR SOFTWARE
Doveadm-Sync: https://wiki2.dovecot.org/Tools/Doveadm/Sync ( Dovecot sync tool )
davmail: http://davmail.sourceforge.net/
offlineimap: http://offlineimap.org/
fdm: https://github.com/nicm/fdm
mbsync: http://isync.sourceforge.net/
mailsync: http://mailsync.sourceforge.net/
mailutil: https://www.washington.edu/imap/ part of the UW IMAP toolkit. (well, seems abandoned now)
@ -750,6 +847,8 @@ SIMILAR SOFTWARE
imapbackup: https://github.com/rcarmo/imapbackup (A Python script for incremental backups of IMAP mailboxes)
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/
CodeTwo: https://www.codetwo.com/ but CodeTwo does imap source to Office365 only.
HISTORY
@ -767,6 +866,6 @@ HISTORY
tarball source (more precisely in the examples/ directory of the
Mail-IMAPClient tarball).
So many happened since then that I wonder if it remains any lines of the
original copy_folder.pl in imapsync source code.
So many changes happened since then that I wonder if it remains any
lines of the original copy_folder.pl in imapsync source code.

789
README.md
View file

@ -1,789 +0,0 @@
# Imapsync sponsoring
You are a great imapsync user or perhaps a future one! I thank you for that, very much.
The paradox to get imapsync stay free and gratis for anyone is that the imapsync author needs to be paid for maintening and improving it.
In case you're using imapsync in a professional context,
then consider buying imapsync and support at https://imapsync.lamiral.info/#buy_all,
you will get also a regular invoice for your company.
If it's too much, then consider a smaller donation:
[![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=TUENPW59U9LL2) or on regular monthly donation via the new github sponsoring campaign https://github.com/sponsors/gilleslamiral
**Thanks in any case, even no money, I'm ok with that!**
# README
````
NAME
imapsync - Email IMAP tool for syncing, copying, migrating and archiving
email mailboxes between two imap servers, one way, and without
duplicates.
VERSION
This documentation refers to Imapsync $Revision: 1.977 $
USAGE
To synchronize the source imap account
"test1" on server "test1.lamiral.info" with password "secret1"
to the destination imap account
"test2" on server "test2.lamiral.info" with password "secret2"
do:
imapsync \
--host1 test1.lamiral.info --user1 test1 --password1 secret1 \
--host2 test2.lamiral.info --user2 test2 --password2 secret2
DESCRIPTION
We sometimes need to transfer mailboxes from one imap server to one
another.
Imapsync command is a tool allowing incremental and recursive imap
transfers from one mailbox to another. If you don't understand the
previous sentence, it's normal, it's pedantic computer oriented jargon.
All folders are transferred, recursively, meaning the whole folder
hierarchy is taken, all messages in them, and all messages flags (\Seen
\Answered \Flagged etc.) are synced too.
Imapsync reduces the amount of data transferred by not transferring a
given message if it already resides on the destination side. Messages
that are on the destination side but not on the source side stay as they
are (see the --delete2 option to have a strict sync).
How imapsync knows 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.
All flags are preserved, unread messages will stay unread, read ones
will stay read, deleted will stay deleted.
You can abort the transfer at any time and restart it later, imapsync
works well with bad connections and interruptions, by design. On a
terminal hit Ctr-c twice within two seconds in order to abort the
program. Hit Ctr-c just once makes imapsync reconnect to both imap
servers.
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 has to be used, it deletes messages in host2
folder B that are not in 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 destroy, it's a mandatory folder
in IMAP.
A different scenario is to delete the messages from the source mailbox
after a successful transfer, it can be a good feature when migrating
mailboxes since messages will be only on one side. The source account
will only have messages that are not on the destination yet, ie,
messages that arrived after a sync or that failed to be copied.
In that case, use the --delete1 option. Option --delete1 implies also
option --expunge1 so all messages marked deleted on host1 will be really
deleted. In IMAP protocol deleting a message does not really delete it,
it marks it with the flag \Deleted, allowing an undelete. Expunging a
folder removes, definitively, all the messages marked as \Deleted in
this folder.
You can also decide to remove empty folders once all of their messages
have been transferred. Add --delete1emptyfolders to obtain this
behavior.
Imapsync is not adequate for maintaining two active imap accounts in
synchronization when the user plays independently on both sides. Use
offlineimap (written by John Goerzen) or mbsync (written by Michael R.
Elkins) for a 2 ways synchronization.
OPTIONS
usage: imapsync [options]
The standard options are the six values forming the credentials. Three
values on each side are needed in order to log in into the IMAP servers.
These six values are a host, a username, and a password, two times.
Conventions used in the following descriptions of the options:
str means string
int means integer
reg means regular expression
cmd means command
--dry : Makes imapsync doing nothing for real, just print what
would be done without --dry.
OPTIONS/credentials
--host1 str : Source or "from" imap server.
--port1 int : Port to connect on host1.
Optional since default ports are the
well known ports imap/143 or imaps/993.
--user1 str : User to login on host1.
--password1 str : Password for the user1.
--host2 str : "destination" imap server.
--port2 int : Port to connect on host2. Optional
--user2 str : User to login on host2.
--password2 str : Password for the user2.
--showpasswords : Shows passwords on output instead of "MASKED".
Useful to restart a complete run by just reading
the command line used in the log,
or to debug passwords.
It's not a secure practice at all.
--passfile1 str : Password file for the user1. It must contain the
password on the first line. This option avoids showing
the password on the command line like --password1 does.
--passfile2 str : Password file for the user2.
You can also pass the passwords in the environment variables
IMAPSYNC_PASSWORD1 and IMAPSYNC_PASSWORD2
OPTIONS/encryption
--nossl1 : Do not use a SSL connection on host1.
--ssl1 : Use a SSL connection on host1. On by default if possible.
--nossl2 : Do not use a SSL connection on host2.
--ssl2 : Use a SSL connection on host2. On by default if possible.
--notls1 : Do not use a TLS connection on host1.
--tls1 : Use a TLS connection on host1. On by default if possible.
--notls2 : Do not use a TLS connection on host2.
--tls2 : Use a TLS connection on host2. On by default if possible.
--debugssl int : SSL debug mode from 0 to 4.
--sslargs1 str : Pass any ssl parameter for host1 ssl or tls connection. Example:
--sslargs1 SSL_verify_mode=1 --sslargs1 SSL_version=SSLv3
See all possibilities in the new() method of IO::Socket::SSL
http://search.cpan.org/perldoc?IO::Socket::SSL#Description_Of_Methods
--sslargs2 str : Pass any ssl parameter for host2 ssl or tls connection.
See --sslargs1
--timeout1 int : Connection timeout in seconds for host1.
Default is 120 and 0 means no timeout at all.
--timeout2 int : Connection timeout in seconds for host2.
Default is 120 and 0 means no timeout at all.
OPTIONS/authentication
--authmech1 str : Auth mechanism to use with host1:
PLAIN, LOGIN, CRAM-MD5 etc. Use UPPERCASE.
--authmech2 str : Auth mechanism to use with host2. See --authmech1
--authuser1 str : User to auth with on host1 (admin user).
Avoid using --authmech1 SOMETHING with --authuser1.
--authuser2 str : User to auth with on host2 (admin user).
--proxyauth1 : Use proxyauth on host1. Requires --authuser1.
Required by Sun/iPlanet/Netscape IMAP servers to
be able to use an administrative user.
--proxyauth2 : Use proxyauth on host2. Requires --authuser2.
--authmd51 : Use MD5 authentication for host1.
--authmd52 : Use MD5 authentication for host2.
--domain1 str : Domain on host1 (NTLM authentication).
--domain2 str : Domain on host2 (NTLM authentication).
OPTIONS/folders
--folder str : Sync this folder.
--folder str : and this one, etc.
--folderrec str : Sync this folder recursively.
--folderrec str : and this one, etc.
--folderfirst str : Sync this folder first. Ex. --folderfirst "INBOX"
--folderfirst str : then this one, etc.
--folderlast str : Sync this folder last. --folderlast "[Gmail]/All Mail"
--folderlast str : then this one, etc.
--nomixfolders : Do not merge folders when host1 is case-sensitive
while host2 is not (like Exchange). Only the first
similar folder is synced (example: with folders
"Sent", "SENT" and "sent"
on host1 only "Sent" will be synced to host2).
--skipemptyfolders : Empty host1 folders are not created on host2.
--include reg : Sync folders matching this regular expression
--include reg : or this one, etc.
If both --include --exclude options are used, then
include is done before.
--exclude reg : Skips folders matching this regular expression
Several folders to avoid:
--exclude 'fold1|fold2|f3' skips fold1, fold2 and f3.
--exclude reg : or this one, etc.
--automap : guesses folders mapping, for folders well known as
"Sent", "Junk", "Drafts", "All", "Archive", "Flagged".
--f1f2 str1=str2 : Force folder str1 to be synced to str2,
--f1f2 overrides --automap and --regextrans2.
--subfolder2 str : Syncs the whole host1 folders hierarchy under the
host2 folder named str.
It does it internally by adding three
--regextrans2 options before all others.
Add --debug to see what's really going on.
--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
when doing it in the reverse order.
Backup/Restore scenario:
Use --subfolder2 str for a backup to the folder str
on host2. Then use --subfolder1 str for restoring
from the folder str, after inverting
host1/host2 user1/user2 values.
--subscribed : Transfers subscribed folders.
--subscribe : Subscribe to the folders transferred on the
host2 that are subscribed on host1. On by default.
--subscribeall : Subscribe to the folders transferred on the
host2 even if they are not subscribed on host1.
--prefix1 str : Remove prefix str to all destination folders,
usually "INBOX." or "INBOX/" or an empty string "".
imapsync guesses the prefix if host1 imap server
does not have NAMESPACE capability. So this option
should not be used most of the time.
--prefix2 str : Add prefix to all host2 folders. See --prefix1
--sep1 str : Host1 separator. This option should not be used
most of the time.
Imapsync gets the separator from the server itself,
by using NAMESPACE, or it tries to guess it
from the folders listing (it counts
characters / . \\ \ in folder names and choose the
more frequent, or finally / if nothing is found.
--sep2 str : Host2 separator. See --sep1
--regextrans2 reg : Apply the whole regex to each destination folders.
--regextrans2 reg : and this one. etc.
When you play with the --regextrans2 option, first
add also the safe options --dry --justfolders
Then, when happy, remove --dry for a run, then
remove --justfolders for the next ones.
Have in mind that --regextrans2 is applied after
the automatic prefix and separator inversion.
For examples see:
https://imapsync.lamiral.info/FAQ.d/FAQ.Folders_Mapping.txt
OPTIONS/folders sizes
--nofoldersizes : Do not calculate the size of each folder at the
beginning of the sync. Default is to calculate them.
--nofoldersizesatend: Do not calculate the size of each folder at the
end of the sync. Default is to calculate them.
--justfoldersizes : Exit after having printed the initial folder sizes.
OPTIONS/tmp
--tmpdir str : Where to store temporary files and subdirectories.
Will be created if it doesn't exist.
Default is system specific, Unix is /tmp but
/tmp is often too small and deleted at reboot.
--tmpdir /var/tmp should be better.
--pidfile str : The file where imapsync pid is written,
it can be dirname/filename.
Default name is imapsync.pid in tmpdir.
--pidfilelocking : Abort if pidfile already exists. Useful to avoid
concurrent transfers on the same mailbox.
OPTIONS/log
--nolog : Turn off logging on file
--logfile str : Change the default log filename (can be dirname/filename).
--logdir str : Change the default log directory. Default is LOG_imapsync/
The default logfile name is for example
LOG_imapsync/2019_12_22_23_57_59_532_user1_user2.txt
where:
2019_12_22_23_57_59_532 is nearly the date of the start
YYYY_MM_DD_HH_MM_SS_mmm
year_month_day_hour_minute_seconde_millisecond
and user1 user2 are the --user1 --user2 values.
OPTIONS/messages
--skipmess reg : Skips messages matching the regex.
Example: 'm/[\x80-ff]/' # to avoid 8bits messages.
--skipmess is applied before --regexmess
--skipmess reg : or this one, etc.
--skipcrossduplicates : Avoid copying messages that are already copied
in another folder, good from Gmail to X when
X is not also Gmail.
Activated with --gmail1 unless --noskipcrossduplicates
--debugcrossduplicates : Prints which messages (UIDs) are skipped with
--skipcrossduplicates (and in what other folders
they are).
--pipemess cmd : Apply this cmd command to each message content
before the copy.
--pipemess cmd : and this one, etc.
With several --pipemess, the output of each cmd
command (STDOUT) is given to the input (STDIN)
of the next command.
For example,
--pipemess cmd1 --pipemess cmd2 --pipemess cmd3
is like a Unix pipe:
"cat message | cmd1 | cmd2 | cmd3"
--disarmreadreceipts : Disarms read receipts (host2 Exchange issue)
--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.
OPTIONS/labels
Gmail present labels as folders in imap. Imapsync can accelerate the
sync by syncing X-GM-LABELS, it will avoid to transfer messages when
they are already on host2.
--synclabels : Syncs also Gmail labels when a message is copied to host2.
Activated by default with --gmail1 --gmail2 unless
--nosynclabels is added.
--resynclabels : Resyncs Gmail labels when a message is already on host2.
Activated by default with --gmail1 --gmail2 unless
--noresynclabels is added.
For Gmail syncs, see also:
https://imapsync.lamiral.info/FAQ.d/FAQ.Gmail.txt
OPTIONS/flags
If you encounter flag problems see also:
https://imapsync.lamiral.info/FAQ.d/FAQ.Flags.txt
--regexflag reg : Apply the whole regex to each flags list.
Example: 's/"Junk"//g' # to remove "Junk" flag.
--regexflag reg : then this one, etc.
--resyncflags : Resync flags for already transferred messages.
On by default.
--noresyncflags : Do not resync flags for already transferred messages.
May be useful when a user has already started to play
with its host2 account.
OPTIONS/deletions
--delete1 : Deletes messages on host1 server after a successful
transfer. Option --delete1 has the following behavior:
it marks messages as deleted with the IMAP flag
\Deleted, then messages are really deleted with an
EXPUNGE IMAP command. If expunging after each message
slows down too much the sync then use
--noexpungeaftereach to speed up, expunging will then be
done only twice per folder, one at the beginning and
one at the end of a folder sync.
--expunge1 : Expunge messages on host1 just before syncing a folder.
Expunge is done per folder.
Expunge aims is to really delete messages marked deleted.
An expunge is also done after each message copied
if option --delete1 is set (unless --noexpungeaftereach).
--noexpunge1 : Do not expunge messages on host1.
--delete1emptyfolders : Deletes empty folders on host1, INBOX excepted.
Useful with --delete1 since what remains on host1
is only what failed to be synced.
--delete2 : Delete messages in host2 that are not in
host1 server. Useful for backup or pre-sync.
--delete2 implies --uidexpunge2
--delete2duplicates : Delete messages in host2 that are duplicates.
Works only without --useuid since duplicates are
detected with an header part of each message.
--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
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
--noexpunge2 : Do not expunge messages on host2.
--nouidexpunge2 : Do not uidexpunge messages on the host2 account
that are not on the host1 account.
OPTIONS/dates
If you encounter problems with dates, see also:
https://imapsync.lamiral.info/FAQ.d/FAQ.Dates.txt
--syncinternaldates : Sets the internal dates on host2 same as host1.
Turned on by default. Internal date is the date
a message arrived on a host (Unix mtime).
--idatefromheader : Sets the internal dates on host2 same as the
ones in "Date:" headers.
OPTIONS/message selection
--maxsize int : Skip messages larger (or equal) than int bytes
--minsize int : Skip messages smaller (or equal) than int bytes
--maxage int : Skip messages older than int days.
final stats (skipped) don't count older messages
see also --minage
--minage int : Skip messages newer than int days.
final stats (skipped) don't count newer messages
You can do (+ zone are the messages selected):
past|----maxage+++++++++++++++>now
past|+++++++++++++++minage---->now
past|----maxage+++++minage---->now (intersection)
past|++++minage-----maxage++++>now (union)
--search str : Selects only messages returned by this IMAP SEARCH
command. Applied on both sides.
For a complete set of what can be search see
https://imapsync.lamiral.info/FAQ.d/FAQ.Messages_Selection.txt
--search1 str : Same as --search but for selecting host1 messages only.
--search2 str : Same as --search but for selecting host2 messages only.
So --search CRIT equals --search1 CRIT --search2 CRIT
--maxlinelength int : skip messages with a line length longer than int bytes.
RFC 2822 says it must be no more than 1000 bytes but
real life servers and email clients do more.
--useheader str : Use this header to compare messages on both sides.
Ex: Message-ID or Subject or Date.
--useheader str and this one, etc.
--usecache : Use cache to speed up next syncs. Not set by default.
--nousecache : Do not use cache. Caveat: --useuid --nousecache creates
duplicates on multiple runs.
--useuid : Use UIDs instead of headers as a criterion to recognize
messages. Option --usecache is then implied unless
--nousecache is used.
OPTIONS/miscellaneous
--syncacls : Synchronizes acls (Access Control Lists).
Acls in IMAP are not standardized, be careful
since one acl code on one side may signify something
else on the other one.
--nosyncacls : Does not synchronize acls. This is the default.
--addheader : When a message has no headers to be identified,
--addheader adds a "Message-Id" header,
like "Message-Id: 12345@imapsync", where 12345
is the imap UID of the message on the host1 folder.
OPTIONS/debugging
--debug : Debug mode.
--debugfolders : Debug mode for the folders part only.
--debugcontent : Debug content of the messages transferred. Huge output.
--debugflags : Debug mode for flags.
--debugimap1 : IMAP debug mode for host1. Very verbose.
--debugimap2 : IMAP debug mode for host2. Very verbose.
--debugimap : IMAP debug mode for host1 and host2. Twice very verbose.
--debugmemory : Debug mode showing memory consumption after each copy.
--errorsmax int : Exit when int number of errors is reached. Default is 50.
--tests : Run local non-regression tests. Exit code 0 means all ok.
--testslive : Run a live test with test1.lamiral.info imap server.
Useful to check the basics. Needs internet connection.
--testslive6 : Run a live test with ks2ipv6.lamiral.info imap server.
Useful to check the ipv6 connectivity. Needs internet.
OPTIONS/specific
--gmail1 : sets --host1 to Gmail and other options. See FAQ.Gmail.txt
--gmail2 : sets --host2 to Gmail and other options. See FAQ.Gmail.txt
--office1 : sets --host1 to Office365 and other options. See FAQ.Exchange.txt
--office2 : sets --host2 to Office365 and other options. See FAQ.Exchange.txt
--exchange1 : sets options for Exchange. See FAQ.Exchange.txt
--exchange2 : sets options for Exchange. See FAQ.Exchange.txt
--domino1 : sets options for Domino. See FAQ.Domino.txt
--domino2 : sets options for Domino. See FAQ.Domino.txt
OPTIONS/behavior
--maxmessagespersecond int : limits the number of messages transferred per second.
--maxbytespersecond int : limits the average transfer rate per second.
--maxbytesafter int : starts --maxbytespersecond limitation only after
--maxbytesafter amount of data transferred.
--maxsleep int : do not sleep more than int seconds.
On by default, 2 seconds max, like --maxsleep 2
--abort : terminates a previous call still running.
It uses the pidfile to know what process to abort.
--exitwhenover int : Stop syncing and exits when int total bytes
transferred is reached.
--version : Print only software version.
--noreleasecheck : Do not check for any new imapsync release.
--releasecheck : Check for new imapsync release.
it's an http request to
http://imapsync.lamiral.info/prj/imapsync/VERSION
--noid : Do not send/receive ID command to imap servers.
--justconnect : Just connect to both servers and print useful
information. Need only --host1 and --host2 options.
Obsolete since "imapsync --host1 imaphost" alone
implies --justconnect
--justlogin : Just login to both host1 and host2 with users
credentials, then exit.
--justfolders : Do only things about folders (ignore messages).
--help : print this help.
Example: to synchronize imap account "test1" on "test1.lamiral.info"
to imap account "test2" on "test2.lamiral.info"
with test1 password "secret1"
and test2 password "secret2"
imapsync \
--host1 test1.lamiral.info --user1 test1 --password1 secret1 \
--host2 test2.lamiral.info --user2 test2 --password2 secret2
SECURITY
You can use --passfile1 instead of --password1 to give the password
since it is safer. With --password1 option, on Linux, any user on your
host can see the password by using the 'ps auxwwww' command. Using a
variable (like IMAPSYNC_PASSWORD1) is also dangerous because of the 'ps
auxwwwwe' command. So, saving the password in a well protected file (600
or rw-------) is the best solution.
Imapsync activates ssl or tls encryption by default, if possible.
What detailed behavior is under this "if possible"?
Imapsync activates ssl if the well known port imaps port (993) is open
on the imap servers. If the imaps port is closed then it open a normal
(clear) connection on port 143 but it looks for TLS support in the
CAPABILITY list of the servers. If TLS is supported then imapsync goes
to encryption.
If the automatic ssl and the tls detections fail then imapsync will not
protect against sniffing activities on the network, especially for
passwords.
If you want to force ssl or tls just use --ssl1 --ssl2 or --tls1 --tls2
See also the document FAQ.Security.txt in the FAQ.d/ directory or at
https://imapsync.lamiral.info/FAQ.d/FAQ.Security.txt
EXIT STATUS
Imapsync will exit with a 0 status (return code) if everything went
good. Otherwise, it exits with a non-zero status. That's classical Unix
behavior. Here is the list of the exit code values (an integer between 0
and 255). The names reflect their meaning:
EX_OK => 0 ; #/* successful termination */
EX_USAGE => 64 ; #/* command line usage error */
EX_NOINPUT => 66 ; #/* cannot open input */
EX_UNAVAILABLE => 69 ; #/* service unavailable */
EX_SOFTWARE => 70 ; #/* internal software error */
EXIT_CATCH_ALL => 1 ; # Any other error
EXIT_BY_SIGNAL => 6 ; # Should be 128+n where n is the sig_num
EXIT_PID_FILE_ERROR => 8 ;
EXIT_CONNECTION_FAILURE => 10 ;
EXIT_TLS_FAILURE => 12 ;
EXIT_AUTHENTICATION_FAILURE => 16 ;
EXIT_SUBFOLDER1_NO_EXISTS => 21 ;
EXIT_WITH_ERRORS => 111 ;
EXIT_WITH_ERRORS_MAX => 112 ;
EXIT_TESTS_FAILED => 254 ; # Like Test::More API
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:
"No limits to do anything with this work and this license."
In case it is not long enough, I repeat:
"No limits to do anything with this work and this license."
Look at https://imapsync.lamiral.info/LICENSE
AUTHOR
Gilles LAMIRAL <gilles@lamiral.info>
Good feedback is always welcome. Bad feedback is very often welcome.
Gilles LAMIRAL earns his living by writing, installing, configuring and
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, a good way to maintain and support free open public
software over decades.
BUGS AND LIMITATIONS
See https://imapsync.lamiral.info/FAQ.d/FAQ.Reporting_Bugs.txt
IMAP SERVERS supported
See https://imapsync.lamiral.info/S/imapservers.shtml
HUGE MIGRATION
If you have many mailboxes to migrate think about a little shell
program. Write a file called file.txt (for example) containing users and
passwords. The separator used in this example is ';'
The file.txt file contains:
user001_1;password001_1;user001_2;password001_2
user002_1;password002_1;user002_2;password002_2
user003_1;password003_1;user003_2;password003_2
user004_1;password004_1;user004_2;password004_2
user005_1;password005_1;user005_2;password005_2 ...
On Unix the shell program can be:
{ while IFS=';' read u1 p1 u2 p2; do
imapsync --host1 imap.side1.org --user1 "$u1" --password1 "$p1" \
--host2 imap.side2.org --user2 "$u2" --password2 "$p2" ...
done ; } < file.txt
On Windows the batch program can be:
FOR /F "tokens=1,2,3,4 delims=; eol=#" %%G IN (file.txt) DO imapsync ^
--host1 imap.side1.org --user1 %%G --password1 %%H ^
--host2 imap.side2.org --user2 %%I --password2 %%J ...
The ... have to be replaced by nothing or any imapsync option. Welcome
in shell or batch programming !
You will find already written scripts at
https://imapsync.lamiral.info/examples/
INSTALL
Imapsync works under any Unix with Perl.
Imapsync works under most Windows (2000, XP, Vista, Seven, Eight, Ten
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 64bit binary called imapsync_64bit.exe
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):
tar xzvf imapsync-x.xx.tgz
Go into the directory imapsync-x.xx and read the INSTALL file.
As mentioned at https://imapsync.lamiral.info/#install
the INSTALL file can also be found at
https://imapsync.lamiral.info/INSTALL.d/INSTALL.ANY.txt
It is now split in several files for each system
https://imapsync.lamiral.info/INSTALL.d/
CONFIGURATION
There is no specific configuration file for imapsync, everything is
specified by the command line parameters and the default behavior.
HACKING
Feel free to hack imapsync as the NOLIMIT license permits it.
SIMILAR SOFTWARE
See also https://imapsync.lamiral.info/S/external.shtml
for a better up to date list.
Last updated and verified on Sun Dec 8, 2019.
imapsync: https://github.com/imapsync/imapsync (this is an imapsync copy, sometimes delayed, with --noreleasecheck by default since release 1.592, 2014/05/22)
imap_tools: https://web.archive.org/web/20161228145952/http://www.athensfbc.com/imap_tools/. The imap_tools code is now at https://github.com/andrewnimmo/rick-sanders-imap-tools
imaputils: https://github.com/mtsatsenko/imaputils (very old imap_tools fork)
Doveadm-Sync: https://wiki2.dovecot.org/Tools/Doveadm/Sync ( Dovecot sync tool )
davmail: http://davmail.sourceforge.net/
offlineimap: http://offlineimap.org/
mbsync: http://isync.sourceforge.net/
mailsync: http://mailsync.sourceforge.net/
mailutil: https://www.washington.edu/imap/ part of the UW IMAP toolkit. (well, seems abandoned now)
imaprepl: https://bl0rg.net/software/ http://freecode.com/projects/imap-repl/
imapcopy (Pascal): http://www.ardiehl.de/imapcopy/
imapcopy (Java): https://code.google.com/archive/p/imapcopy/
imapsize: http://www.broobles.com/imapsize/
migrationtool: http://sourceforge.net/projects/migrationtool/
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)
exchange-away: http://exchange-away.sourceforge.net/
SyncBackPro: http://www.2brightsparks.com/syncback/sbpro.html
ImapSyncClient: https://github.com/ridaamirini/ImapSyncClient
MailStore: https://www.mailstore.com/en/products/mailstore-home/
mnIMAPSync: https://github.com/manusa/mnIMAPSync
imap-upload: http://imap-upload.sourceforge.net/ (A tool for uploading a local mbox file to IMAP4 server)
imapbackup: https://github.com/rcarmo/imapbackup (A Python script for incremental backups of IMAP mailboxes)
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.
HISTORY
I initially wrote imapsync in July 2001 because an enterprise, called
BaSystemes, paid me to install a new imap server without losing huge old
mailboxes located in a far away remote imap server, accessible by an
often broken low-bandwidth ISDN link.
I had to verify every mailbox was well transferred, all folders, all
messages, without wasting bandwidth or creating duplicates upon resyncs.
The imapsync design was made with the beautiful rsync command in mind.
Imapsync started its life as a patch of the copy_folder.pl script. The
script copy_folder.pl comes from the Mail-IMAPClient-2.1.3 perl module
tarball source (more precisely in the examples/ directory of the
Mail-IMAPClient tarball).
So many happened since then that I wonder if it remains any lines of the
original copy_folder.pl in imapsync source code.

View file

@ -1,112 +1,150 @@
# $Id: README_Windows.txt,v 1.18 2019/12/11 18:52:16 gilles Exp gilles $
# $Id: README_Windows.txt,v 1.24 2021/06/15 10:29:45 gilles Exp gilles $
#
# This is the README_Windows.txt file for imapsync
# imapsync : IMAP syncing and migration tool.
# imapsync: IMAP syncing and migration tool.
=====================
Imapsync on Windows
=====================
There is two ways to install and use imapsync on Windows systems: A) or B).
There are two ways to install and use imapsync on Windows systems: A) or B).
Standard users should take the A) way, the simplest way.
Developers, or powerful users that want to build their own imapsync.exe
Developers, or power users that want to build their own imapsync.exe
or modify it, have to consider the B) way, the complex and powerful way.
---------------
A) Simplest way
---------------
A.0) Preamble for visual users looking for a visual tool.
Imapsync itself is not a visual tool. The visual tool is Notepad
or any text editor. Many pure visual users have succeeded using imapsync
to transfer their email accounts. Only the ones that tried have succeeded,
so don't give up before trying once. Another assumption is that visual
users can read. So let's go further.
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.
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.
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.xxx.zip
where 1.xxx is the imapsync release number.
You'll then have access to a zip archive file named imapsync_1.977.zip
where 1.977 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.xxx (where 1.xxx is the imapsync
release number).
a unique folder named imapsync_1.977/
Do not unzip the archive in what is called a "system" directory since
you may encounter permission issues.
Two-point 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.
A.3) Check the folder
In the folder extracted imapsync_1.xxx you see 6 files and 2 directories:
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
following list:
* README_Windows.txt is the current file you are reading.
* imapsync_example.bat is a simple batch file example that you will copy and edit.
* README.txt is the imapsync general document.
* FAQ.d/* FAQs are a good read when something goes wrong.
* imapsync_example.bat is a simple batch file example you will copy and edit.
* sync_loop_windows.bat is a batch file example for syncing many accounts.
* file.txt is an input file example for syncing many accounts.
* imapsync.exe is the imapsync 64bit binary. You don't have to run it directly.
* imapsync_32bit.exe is the imapsync 32bit binary. You don't have to run it directly.
* Cook/ is the directory to build imapsync.exe from its source,
for the B) way and expert users.
for the B) way and expert users.
You can copy or rename the file imapsync_example.bat as you wish,
as long as its extension remains ".bat", for example mysync.bat
as long as its extension remains ".bat", for example, mysync.bat
On Windows systems .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 simple or at least simple to
modify. Think it like a cook recipe.
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.
The batch scripts have to stay in the same directory than
The batch scripts have to stay in the same directory as
imapsync.exe because of the way they call imapsync.exe.
They use ".\imapsync.exe", so let them be in the same directory.
They use the string ".\imapsync.exe", so let them be in the same directory.
Or you can change the path .\ to whatever you want if you understand what
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 imapsync_stuff.bat
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.
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
Edit the file imapsync_stuff.bat and change the values with yours.
In order to edit it you have do a right click on it and select "modify"
This section describes how to edit the file mysync.bat to change
the example values with yours.
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 editors to modify it.
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.
Office Word or any powerful text processor are not good for that job.
Text processors transform files in a special format that
are wrong to make them stay a good batch file, so don't use them!
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 server softwares like Exchange or Gmail.
needed by specific imap software servers like Exchange, Office365, or Gmail.
Those files 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 imapsync_stuff.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.
The run happens in a DOS window; usually, this window is black.
A.6) Look the sync running.
You can abort it at any time with a quick double ctrl-c,
hit ctrl-c twice within one second.
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.
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.
A single ctrl-c will reconnect to both imap servers.
You can also abort the sync by closing the DOS window.
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/
@ -114,30 +152,37 @@ A.6) Look the sync running.
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.
For example a file name can be
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 logfile created at each run.
The logfile 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 at the end of the imapsync run.
When there is a problem, the problem is very often described
at the end of the logfile.
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
* A.4) edit
* A.5) run
* A.6) look
* A.7) control
* A.4) edit the batch file
* A.5) run the batch file
* 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.
Congratulations!
A good sign that the sync went very well is when the nearly last lines are like:
" The sync looks good, all 123456 identified messages in host1 are on host2.
" There is no unidentified message
" Detected 0 errors
Congratulations!
------------
@ -154,7 +199,7 @@ B.1) Install Perl if it isn't already installed.
should work as well (Perl 5.18 to 5.26 do).
B.2) Go into the Cook/ directory
B.3) Double-clic build_exe.bat
B.3) Double-click build_exe.bat
It should create a binary imapsync.exe in the current Cook/ directory.

13
S/conversion_data.js Executable file
View file

@ -0,0 +1,13 @@
/* Google Code for Achat imapsync Conversion Page */
var google_conversion_id = 992916412;
var google_conversion_language = "en";
var google_conversion_format = "2";
var google_conversion_color = "ffffff";
var google_conversion_label = "hVVWCKzApQIQvOe62QM";
var google_conversion_value = "USD 1.00";
var google_conversion_currency = "USD";
var google_remarketing_only = false;

View file

@ -31,7 +31,14 @@
<body>
<h1>Imapsync donation</h1>
<p>Help the author to maintain imapsync and its online services:</p>
<p>Help the imapsync author, Gilles LAMIRAL, to maintain imapsync and its online services!</p>
<div id="right-tronche">
<img width="300" height="300" src="S/images/gilles_lamiral_400x400.jpeg" alt="Gilles LAMIRAL" />
</div>
<h2>Donate via Paypal</h2>
@ -46,6 +53,12 @@ value="-----BEGIN PKCS7-----MIIHRwYJKoZIhvcNAQcEoIIHODCCBzQCAQExggEwMIIBLAIBADCB
</p>
</form>
<h2>Donate via Github</h2>
<p>
<a href="https://github.com/sponsors/gilleslamiral">Become a Github sponsor to Gilles LAMIRAL</a>
</p>
<h2>Donate with Crypto</h2>
<p>
This donate button will ask your email address and your name but don't hesitate
@ -61,7 +74,9 @@ to give fake ones, like "Smith" and smith@example.com if you prefer to be anonym
</div>
<p>Thanks in advance!</p>
<p>Thanks!<br />
And remember, <b>no money donation is ok!</b><br />
Kind words are always sweets to me</p>
<hr />
<p>
@ -83,7 +98,7 @@ to give fake ones, like "Smith" and smith@example.com if you prefer to be anonym
<!--#config timefmt="%D" -->
<!--#config timefmt="%A %B %d, %Y" -->
<b>This document last modified on <!--#echo var="LAST_MODIFIED" --></b>
($Id: donate.shtml,v 1.16 2019/07/31 22:49:12 gilles Exp gilles $)
($Id: donate.shtml,v 1.20 2021/01/01 22:38:02 gilles Exp gilles $)
</p>
</body>

View file

@ -26,18 +26,23 @@
<body>
<h1>Similar software tools <a id="similar" href="../#TOP"><small>(back to menu)</small></a>
<h1>Imapsync similar software tools <a id="similar" href="../#TOP"><small>(back to menu)</small></a>
</h1>
<p>Here is a list of Imapsync alternative tools, list verified on Friday July 1, 2021:
</p>
<ol>
<li> <b>imapsync</b>: <a href="https://github.com/imapsync/imapsync">https://github.com/imapsync/imapsync</a> (this is an imapsync copy, sometimes delayed, with --noreleasecheck by default since release 1.592, 2014/05/22)</li>
<li> imap_tools: <a href="https://web.archive.org/web/20161228145952/http://www.athensfbc.com/imap_tools/">https://web.archive.org/web/20161228145952/http://www.athensfbc.com/imap_tools/</a>.
The imap_tools code is now at <a href="https://github.com/andrewnimmo/rick-sanders-imap-tools">https://github.com/andrewnimmo/rick-sanders-imap-tools</a></li>
<li> imaputils: <a href="https://github.com/mtsatsenko/imaputils">https://github.com/mtsatsenko/imaputils</a> (very old imap_tools fork)</li>
<li> Doveadm-Sync: <a href="https://wiki2.dovecot.org/Tools/Doveadm/Sync">https://wiki2.dovecot.org/Tools/Doveadm/Sync</a> ( Dovecot sync tool )</li>
<li> Doveadm-Sync: <a href="https://wiki2.dovecot.org/Tools/Doveadm/Sync/">https://wiki2.dovecot.org/Tools/Doveadm/Sync</a> ( Dovecot sync tool )</li>
<li> davmail: <a href="http://davmail.sourceforge.net/">http://davmail.sourceforge.net/</a></li>
<li> <b>offlineimap</b>: <a href="http://offlineimap.org/">http://offlineimap.org/</a></li>
<li> fdm: <a href="https://github.com/nicm/fdm">https://github.com/nicm/fdm</a></li>
<li> <b>mbsync</b>: <a href="http://isync.sourceforge.net/">http://isync.sourceforge.net/</a></li>
<li> mailsync: <a href="http://mailsync.sourceforge.net/">http://mailsync.sourceforge.net/</a></li>
<li> mailutil: <a href="https://web.archive.org/web/20191028114408/http://www.washington.edu/imap/">https://www.washington.edu/imap/</a>
@ -68,25 +73,65 @@
<li> ImportExportTools: <a href="https://addons.thunderbird.net/en-us/thunderbird/addon/importexporttools/">https://addons.thunderbird.net/en-us/thunderbird/addon/importexporttools/</a>
ImportExportTools for Mozilla Thunderbird by Paolo Kaosmos. ImportExportTools does not do IMAP.
</li>
</li>
<li> rximapmail: <a href="https://sourceforge.net/projects/rximapmail/">https://sourceforge.net/projects/rximapmail/</a></li>
<li> CodeTwo: <a href="https://www.codetwo.com/">https://www.codetwo.com/</a> but CodeTwo does
<a href="https://www.codetwo.com/userguide/office-365-migration/imap-source.htm"> imap source to Office365 </a> only.</li>
</ol>
<h1>External online IMAP migration services <a id="ONLINE_OTHERS" href="../#TOP"><small>(back to menu)</small></a>
</h1>
<p>I have no share in these free or paid services.
Some use Imapsync, most don't.
Prices are given par mailbox and may be outdated
(Last checked on Thu Apr 11, 2019).</p>
<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>
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).
</p>
<h2>Imapsync based</h2>
<!--
From https://lamiral.info/dokuwiki/doku.php?id=imapsync&#online_ui_x_copies
# * 1.810 https://tools.controlpanel.si/imapsync/ CGI https://tools.controlpanel.si/cgi-bin/imapsync
# * 1.882 https://tools.intertune.io/imapsync/X/ CGI https://tools.intertune.io/cgi-bin/imapsync
# * 1.882 https://imapsync.whc.ca/ CGI https://imapsync.whc.ca/cgi-bin/imapsync
# * 1.925 https://imapsync.boomhost.com/ CGI https://imapsync.boomhost.com/cgi-bin/imapsync
# * 1.977 https://imapcopy.webhosting4u.gr/ CGI https://imapcopy.webhosting4u.gr/cgi-bin/imapsync
# * 1.991 https://imapsync.nl/ CGI https://imapsync.nl/cgi-bin/imapsync
# * 1.998 https://mailsync.timetakernet.info/ CGI https://mailsync.timetakernet.info/cgi-bin/imapsync
# * 1.998 https://imapsync.keurigonline.nl/ CGI https://imapsync.keurigonline.nl/cgi-bin/imapsync
#
# * ?.??? https://app.migrationwizard.co.uk/ CGI 404, deep into https://app.migrationwizard.co.uk/sync.php
-->
<p>1.945 and upper use --useheader "Message-Id" as default in CGI mode and
this is a better choice to avoid duplicates with some imap servers.
</p>
<ol>
<li> Web Hosting Canada <b>0 USD</b>: <a href="https://imapsync.whc.ca/">https://imapsync.whc.ca/</a> (imapsync based)</li>
<li> BoomHost <b>0 USD</b>: <a href="https://imapsync.boomhost.com/">https://imapsync.boomhost.com/</a> (imapsync based)</li>
<li> <a href="https://tools.controlpanel.si/imapsync/">https://tools.controlpanel.si/imapsync/</a> (imapsync based)</li>
<li> <a href="https://www.cadeolink.com.br/">https://www.cadeolink.com.br/</a> (imapsync based)</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> 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>
@ -96,9 +141,20 @@ Prices are given par mailbox and may be outdated
<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>
</ol>
<h2>Imap to files services</h2>
<p>
This services allow you to backup/archive your imap email account to a zip file.
The most common and useful format to restore an imap account is the <b>Maildir</b> format.
</p>
<ol>
<li>PowerMail Backup (French language)
<a href="https://www.powermail.fr/sauvegarder-une-boite-mail/">https://www.powermail.fr/sauvegarder-une-boite-mail/</a>.
</li>
</ol>
<hr/>
<div>
@ -126,7 +182,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.45 2019/12/23 12:38:41 gilles Exp gilles $)<br/>
($Id: external.shtml,v 1.58 2021/06/30 20:34:23 gilles Exp gilles $)<br/>
<a href="#TOP">Top of the page</a>
</p>

BIN
S/fonts/LM-bold-italic.ttf Normal file

Binary file not shown.

BIN
S/fonts/LM-bold-italic.woff Normal file

Binary file not shown.

Binary file not shown.

BIN
S/fonts/LM-bold.ttf Normal file

Binary file not shown.

BIN
S/fonts/LM-bold.woff Normal file

Binary file not shown.

BIN
S/fonts/LM-bold.woff2 Normal file

Binary file not shown.

BIN
S/fonts/LM-italic.ttf Normal file

Binary file not shown.

BIN
S/fonts/LM-italic.woff Normal file

Binary file not shown.

BIN
S/fonts/LM-italic.woff2 Normal file

Binary file not shown.

BIN
S/fonts/LM-regular.ttf Normal file

Binary file not shown.

BIN
S/fonts/LM-regular.woff Normal file

Binary file not shown.

BIN
S/fonts/LM-regular.woff2 Normal file

Binary file not shown.

53
S/images/logo_imapsync.svg Executable file
View file

@ -0,0 +1,53 @@
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg" width="486px" height="309px" viewBox="0 0 4860 3090" preserveAspectRatio="xMidYMid meet">
<g id="layer101" fill="#010102" stroke="none">
<path d="M2818 3085 c-2 -2 -597 -58 -1323 -126 -726 -67 -1321 -123 -1322 -124 -2 -1 -3 -235 -3 -520 l-1 -518 588 -234 c323 -128 598 -238 610 -245 17 -8 26 -8 38 2 8 7 18 10 22 7 3 -4 -45 -153 -107 -332 -62 -179 -111 -327 -109 -329 2 -2 14 -6 26 -10 18 -6 23 -1 33 30 l12 36 18 -51 c21 -62 42 -80 93 -81 128 -1 277 338 225 512 -23 77 -98 102 -157 52 -17 -14 -31 -22 -31 -17 0 13 67 210 77 225 5 8 10 -10 13 -47 l5 -60 338 -133 337 -134 0 -36 c0 -31 -29 -80 -164 -287 -90 -137 -161 -253 -157 -256 3 -4 15 -9 26 -13 17 -5 38 23 145 190 68 108 126 192 128 186 1 -5 -6 -99 -18 -208 -26 -254 -26 -260 2 -267 12 -4 23 -5 24 -4 1 1 16 151 34 332 18 182 34 332 36 334 2 2 207 -76 455 -174 314 -125 454 -176 464 -169 7 5 389 360 848 789 l835 780 1 378 1 377 -22 0 c-13 0 -241 16 -507 35 -267 19 -487 33 -489 30 -3 -3 -11 0 -18 6 -15 12 -995 85 -1006 74z m-1274 -1991 c73 -72 -23 -384 -131 -425 -60 -23 -100 40 -88 138 13 103 75 246 123 284 30 23 75 25 96 3z"/>
<path d="M270 1657 c0 -2 -43 -127 -95 -277 -96 -275 -100 -295 -56 -287 8 1 51 110 107 272 51 148 92 270 91 271 -11 8 -47 24 -47 21z"/>
<path d="M341 1318 c-89 -257 -93 -272 -76 -285 27 -19 31 -17 45 30 l13 42 12 -50 c26 -99 97 -123 164 -56 l39 39 7 -51 c9 -65 47 -107 97 -107 39 0 76 30 112 93 32 55 158 416 152 434 -3 7 -14 13 -24 13 -16 0 -30 -30 -77 -166 -72 -209 -78 -225 -111 -263 -31 -37 -72 -41 -100 -10 -15 17 -19 35 -18 88 1 53 12 98 56 226 31 88 59 168 63 177 5 13 1 20 -16 27 -16 6 -26 5 -30 -3 -4 -6 -32 -85 -64 -176 -64 -186 -96 -255 -124 -270 -58 -30 -101 12 -101 99 0 43 14 98 62 239 54 156 61 184 48 192 -8 5 -19 10 -25 10 -5 0 -52 -122 -104 -272z"/>
<path d="M1026 1329 c-34 -27 -70 -98 -85 -168 -21 -98 15 -160 114 -199 58 -23 62 -43 20 -98 -45 -59 -104 -56 -171 8 l-32 30 -11 -32 c-13 -38 -4 -60 39 -90 68 -49 126 -46 183 8 41 39 67 94 137 296 50 144 60 180 49 187 -26 16 -37 9 -50 -28 -7 -22 -14 -31 -16 -23 -18 66 -38 102 -63 115 -40 21 -83 19 -114 -6z m109 -76 c35 -35 43 -86 25 -170 -17 -77 -20 -79 -76 -58 -67 25 -94 55 -94 102 0 46 31 117 57 132 27 16 69 13 88 -6z"/>
<path d="M1768 1063 c-14 -4 -38 -49 -38 -73 0 -4 22 -5 50 -2 97 9 151 -40 130 -118 -14 -53 -43 -70 -136 -79 -73 -7 -79 -9 -109 -44 -53 -61 -71 -166 -40 -226 18 -35 88 -71 139 -71 33 0 39 4 52 35 19 47 19 48 -21 41 -49 -10 -122 23 -131 58 -8 33 1 67 25 97 15 19 32 24 96 30 95 9 120 25 158 100 48 92 28 187 -49 230 -30 17 -96 28 -126 22z"/>
<path d="M29 963 c-23 -60 -23 -81 1 -88 12 -4 23 -5 24 -3 5 6 36 101 33 103 -1 2 -12 6 -24 9 -19 6 -25 2 -34 -21z"/>
<path d="M2362 538 c-88 -255 -93 -273 -76 -285 26 -19 30 -17 44 30 l13 42 13 -50 c16 -60 52 -95 98 -95 76 0 113 59 206 327 69 197 72 218 31 210 -8 -1 -32 -55 -57 -127 -87 -248 -96 -271 -124 -300 -35 -37 -72 -39 -105 -5 -43 42 -35 108 38 322 53 157 60 185 47 193 -8 5 -19 10 -25 10 -5 0 -52 -123 -103 -272z"/>
<path d="M2864 610 c-110 -70 -205 -345 -163 -471 22 -65 82 -109 148 -109 31 0 61 30 61 61 0 14 -9 17 -43 16 -51 -2 -93 22 -108 61 -38 96 48 334 134 376 45 21 78 13 117 -25 15 -16 31 -29 33 -29 3 0 10 14 16 32 10 28 8 34 -11 56 -51 54 -128 68 -184 32z"/>
</g>
<g id="layer102" fill="#373749" stroke="none">
<path d="M200 2312 l0 -500 568 -225 c312 -125 575 -229 585 -233 16 -6 17 12 15 326 l-3 331 -105 40 c-57 22 -156 64 -219 95 -63 30 -121 52 -129 49 -8 -3 -25 2 -38 10 -34 22 -33 71 2 87 29 14 53 3 68 -29 15 -32 205 -126 374 -184 l52 -18 0 277 0 277 -562 93 c-310 52 -573 96 -585 99 l-23 5 0 -500z m600 108 c0 -5 -20 -10 -45 -10 l-45 0 0 -151 0 -151 -24 6 c-42 10 -119 46 -113 52 3 4 21 1 38 -5 18 -6 37 -7 41 -3 5 5 7 62 6 128 l-3 119 -43 3 c-23 2 -40 7 -37 13 8 12 225 12 225 -1z m-338 -382 c83 -28 123 -45 115 -51 -7 -5 0 -6 18 -3 23 5 27 4 15 -5 -12 -8 -10 -9 11 -5 17 4 99 -19 245 -68 120 -41 214 -75 207 -75 -6 -1 -20 -4 -30 -7 -15 -5 -16 -4 -3 6 12 9 9 10 -15 6 -23 -5 -27 -4 -15 5 12 8 8 9 -15 5 -23 -5 -27 -4 -15 5 12 8 8 9 -15 5 -23 -5 -27 -4 -15 5 12 8 8 9 -15 5 -23 -5 -27 -4 -15 5 12 8 8 9 -15 5 -23 -5 -27 -4 -15 5 12 8 8 9 -15 5 -23 -5 -27 -4 -15 5 12 8 8 9 -15 5 -23 -5 -27 -4 -15 5 12 8 8 9 -15 5 -23 -5 -27 -4 -15 5 12 8 10 9 -11 5 -17 -4 -100 19 -250 69 -123 41 -227 75 -232 75 -4 0 -7 -28 -5 -61 l3 -62 113 -40 c62 -22 111 -41 109 -44 -2 -2 -56 15 -120 38 l-117 42 0 67 c0 37 3 70 7 73 12 13 36 7 165 -35z m156 -213 c29 -9 52 -19 49 -21 -5 -5 -127 36 -127 43 0 3 6 3 13 1 6 -3 36 -13 65 -23z m557 -18 l60 -22 3 -82 c3 -75 1 -82 -18 -88 -19 -6 -156 32 -147 41 2 2 30 -5 62 -16 32 -11 60 -20 62 -20 1 0 3 33 3 74 0 72 -1 75 -27 84 -23 9 -24 11 -8 12 12 1 -1 9 -30 20 -27 10 -43 19 -35 19 8 0 42 -10 75 -22z m-417 -32 c29 -9 52 -19 49 -21 -5 -5 -127 36 -127 43 0 3 6 3 13 1 6 -3 36 -13 65 -23z m137 -51 c24 -11 25 -13 5 -8 -14 4 -38 13 -55 20 -24 11 -25 13 -5 8 14 -4 39 -13 55 -20z m113 -39 c29 -9 52 -19 49 -21 -5 -5 -127 36 -127 43 0 3 6 3 13 1 6 -3 36 -13 65 -23z"/>
<path d="M694 1944 c39 -13 75 -24 80 -23 6 0 -20 11 -58 25 -39 13 -75 24 -80 23 -6 0 20 -11 58 -25z"/>
<path d="M1550 2297 l0 -286 38 -10 c20 -5 84 -19 142 -31 58 -12 116 -23 129 -26 23 -5 24 -3 19 41 -3 25 -3 45 1 43 31 -14 252 -141 256 -147 2 -5 -62 -21 -143 -36 -81 -15 -151 -30 -156 -33 -6 -3 0 10 12 30 12 19 22 39 22 44 0 5 -66 22 -147 37 -80 16 -152 31 -160 34 -11 4 -13 -52 -11 -338 l3 -344 320 -126 c261 -104 321 -124 324 -111 3 15 -26 46 -51 54 -9 3 -9 13 2 39 7 19 14 35 16 37 1 2 18 -3 37 -12 45 -18 57 -41 57 -108 l0 -53 423 -167 c232 -92 430 -170 440 -174 16 -6 17 38 17 827 l0 834 -768 128 c-422 71 -779 131 -794 134 l-28 5 0 -285z m1008 -269 c3 -16 -10 -18 -130 -20 l-133 -3 105 -70 c117 -79 142 -107 142 -159 0 -43 -15 -64 -59 -83 -33 -13 -178 -18 -207 -7 -22 8 -22 74 -1 74 8 0 15 -9 15 -20 0 -28 43 -43 104 -37 58 5 76 24 76 77 0 55 -34 96 -137 168 -64 43 -93 70 -93 83 0 19 7 19 157 17 140 -3 158 -5 161 -20z m-773 -409 c28 -10 45 -18 39 -18 -6 -1 -37 8 -69 19 -67 23 -65 23 -65 12 0 -5 27 -17 60 -27 33 -10 58 -20 56 -23 -4 -3 -68 15 -123 36 -10 3 -13 -13 -13 -61 l0 -65 51 -17 c28 -9 49 -19 47 -21 -2 -2 -27 4 -56 13 l-52 17 0 72 c0 59 3 75 18 83 18 11 26 9 107 -20z m265 -84 c19 -7 28 -13 20 -13 -8 0 -31 6 -50 13 -19 7 -28 13 -20 13 8 0 31 -6 50 -13z m-165 -121 c24 -11 25 -13 5 -8 -14 4 -38 13 -55 20 -24 11 -25 13 -5 8 14 -4 39 -13 55 -20z"/>
</g>
<g id="layer103" fill="#60607b" stroke="none">
<path d="M200 2312 l0 -500 568 -225 c312 -125 575 -229 585 -233 16 -6 17 12 15 326 l-3 331 -105 40 c-57 22 -156 64 -219 95 -63 30 -121 52 -129 49 -8 -3 -25 2 -38 10 -34 22 -33 71 2 87 29 14 53 3 68 -29 15 -32 205 -126 374 -184 l52 -18 0 277 0 277 -562 93 c-310 52 -573 96 -585 99 l-23 5 0 -500z m600 108 c0 -5 -20 -10 -45 -10 l-45 0 0 -151 0 -151 -24 6 c-42 10 -119 46 -113 52 3 4 21 1 38 -5 18 -6 37 -7 41 -3 5 5 7 62 6 128 l-3 119 -42 3 c-24 2 -43 7 -43 13 0 5 50 9 115 9 70 0 115 -4 115 -10z m-8 -487 l449 -147 -3 -86 c-3 -80 -4 -85 -26 -88 -16 -3 -716 240 -904 313 -15 6 -18 20 -18 81 0 73 0 74 26 74 15 0 229 -66 476 -147z"/>
<path d="M300 2001 c0 -46 4 -60 17 -65 9 -4 206 -75 437 -158 232 -83 427 -153 434 -156 10 -3 12 12 10 69 l-3 74 -440 147 c-242 81 -443 148 -447 148 -5 0 -8 -27 -8 -59z"/>
<path d="M1210 1694 c0 -47 4 -73 10 -69 6 3 10 37 10 76 0 39 -4 69 -10 69 -6 0 -10 -32 -10 -76z"/>
<path d="M1550 2297 l0 -286 38 -10 c20 -5 84 -19 142 -31 58 -12 116 -23 129 -26 23 -5 24 -3 19 41 -3 25 -3 45 1 43 31 -14 252 -141 256 -147 2 -5 -62 -21 -143 -36 -81 -15 -151 -30 -156 -33 -6 -3 0 10 12 30 12 19 22 39 22 44 0 5 -66 22 -147 37 -80 16 -152 31 -160 34 -11 4 -13 -52 -11 -338 l3 -344 320 -126 c261 -104 321 -124 324 -111 3 15 -26 46 -51 54 -9 3 -9 13 2 39 7 19 14 35 16 37 1 2 18 -3 37 -12 45 -18 57 -41 57 -108 l0 -53 423 -167 c232 -92 430 -170 440 -174 16 -6 17 38 17 827 l0 834 -768 128 c-422 71 -779 131 -794 134 l-28 5 0 -285z m1008 -269 c3 -16 -10 -18 -130 -20 l-133 -3 105 -70 c117 -79 142 -107 142 -159 0 -43 -15 -64 -59 -83 -33 -13 -178 -18 -207 -7 -22 8 -22 74 -1 74 8 0 15 -9 15 -20 0 -28 43 -43 104 -37 58 5 76 24 76 77 0 55 -34 96 -137 168 -64 43 -93 70 -93 83 0 19 7 19 157 17 140 -3 158 -5 161 -20z m-437 -515 c230 -75 417 -138 415 -140 -2 -3 -187 55 -410 126 -224 72 -414 131 -424 131 -9 0 163 -61 383 -134 220 -74 396 -135 391 -135 -7 -1 -745 238 -793 256 -10 4 -13 -12 -13 -59 l0 -65 405 -143 c223 -79 404 -145 402 -147 -3 -2 -187 60 -411 138 l-406 142 0 78 c0 65 3 78 18 82 9 3 19 5 21 6 2 0 192 -61 422 -136z m544 -177 c55 -19 95 -35 90 -35 -6 -1 -56 14 -110 33 -55 19 -95 35 -90 35 6 1 56 -14 110 -33z m243 -168 c-1 -95 -5 -83 -10 30 -2 34 0 62 5 62 4 0 6 -42 5 -92z m-325 2 c38 -12 66 -24 64 -26 -5 -5 -148 43 -156 53 -3 3 1 4 9 1 8 -3 46 -15 83 -28z"/>
</g>
<g id="layer104" fill="#8686bf" stroke="none">
<path d="M1540 2940 c-685 -65 -1242 -118 -1237 -119 4 -1 252 -41 550 -91 l542 -90 1145 184 c630 101 1134 185 1120 185 -14 1 -180 12 -370 26 -190 14 -381 24 -425 24 -44 -1 -640 -54 -1325 -119z"/>
<path d="M200 2312 l0 -500 568 -225 c312 -125 575 -229 585 -233 16 -6 17 12 15 326 l-3 331 -105 40 c-57 22 -156 64 -219 95 -63 30 -121 52 -129 49 -8 -3 -25 2 -38 10 -34 22 -33 71 2 87 29 14 53 3 68 -29 15 -32 205 -126 374 -184 l52 -18 0 277 0 277 -562 93 c-310 52 -573 96 -585 99 l-23 5 0 -500z m600 108 c0 -5 -20 -10 -45 -10 l-45 0 0 -151 0 -151 -24 6 c-42 10 -119 46 -113 52 3 4 21 1 38 -5 18 -6 37 -7 41 -3 5 5 7 62 6 128 l-3 119 -47 3 c-27 2 -48 7 -48 13 0 5 51 9 120 9 73 0 120 -4 120 -10z m98 -519 l342 -112 0 -88 c0 -79 -2 -89 -19 -94 -11 -3 -219 67 -473 158 l-453 162 -3 76 c-2 66 -1 76 15 79 19 4 71 -12 591 -181z"/>
<path d="M300 2003 l0 -60 438 -157 c240 -86 440 -156 445 -156 4 0 7 31 7 69 l0 68 -431 142 c-236 78 -437 145 -445 148 -11 4 -14 -7 -14 -54z"/>
<path d="M2000 2711 l-595 -96 -3 -282 -2 -282 42 -11 c24 -6 51 -13 60 -16 17 -5 18 15 20 293 l3 298 50 7 c54 7 1041 176 1065 182 8 2 2 4 -15 4 -16 0 -298 -44 -625 -97z"/>
<path d="M1550 2297 l0 -286 38 -10 c20 -5 84 -19 142 -31 58 -12 116 -23 129 -26 23 -5 24 -3 19 41 -3 25 -3 45 1 43 31 -14 252 -141 256 -147 2 -5 -62 -21 -143 -36 -81 -15 -151 -30 -156 -33 -6 -3 0 10 12 30 12 19 22 39 22 44 0 5 -66 22 -147 37 -80 16 -152 31 -160 34 -11 4 -13 -52 -11 -338 l3 -344 320 -126 c261 -104 321 -124 324 -111 3 15 -26 46 -51 54 -9 3 -9 13 2 39 7 19 14 35 16 37 1 2 18 -3 37 -12 45 -18 57 -41 57 -108 l0 -53 423 -167 c232 -92 430 -170 440 -174 16 -6 17 38 17 827 l0 834 -768 128 c-422 71 -779 131 -794 134 l-28 5 0 -285z m1008 -269 c3 -16 -10 -18 -130 -20 l-133 -3 105 -70 c117 -79 142 -107 142 -159 0 -43 -15 -64 -59 -83 -33 -13 -178 -18 -207 -7 -22 8 -22 74 -1 74 8 0 15 -9 15 -20 0 -28 43 -43 104 -37 58 5 76 24 76 77 0 55 -34 96 -137 168 -64 43 -93 70 -93 83 0 19 7 19 157 17 140 -3 158 -5 161 -20z m-602 -459 c137 -44 408 -132 602 -195 l352 -115 0 -90 c0 -83 -2 -90 -22 -100 -19 -8 -121 25 -598 191 -316 111 -590 208 -607 215 -33 14 -33 14 -33 84 0 70 10 90 46 91 7 0 124 -36 260 -81z"/>
<path d="M2280 1434 c322 -106 588 -194 593 -194 4 0 7 4 7 8 0 4 -30 18 -67 29 -38 12 -301 96 -585 187 -284 91 -520 166 -525 165 -4 0 255 -88 577 -195z"/>
<path d="M1670 1558 l0 -63 467 -165 c257 -91 527 -186 600 -212 l133 -47 0 79 0 79 -82 26 c-172 54 -1103 358 -1110 362 -5 2 -8 -24 -8 -59z"/>
<path d="M2880 1159 c0 -51 4 -78 10 -74 6 3 10 40 10 81 0 43 -4 74 -10 74 -6 0 -10 -34 -10 -81z"/>
</g>
<g id="layer105" fill="#afafde" stroke="none">
<path d="M1547 2942 c-683 -64 -1228 -120 -1215 -124 13 -4 257 -45 543 -92 l520 -86 1145 184 c630 101 1134 185 1120 185 -14 1 -180 12 -370 26 -190 14 -381 24 -425 24 -44 -1 -637 -53 -1318 -117z"/>
<path d="M2758 2792 c-598 -103 -1089 -189 -1092 -192 -2 -3 332 -62 744 -131 l748 -126 802 286 c440 157 797 287 793 288 -12 4 -865 63 -888 62 -11 0 -509 -85 -1107 -187z"/>
<path d="M3993 2608 l-813 -291 0 -824 c0 -454 4 -823 8 -821 4 2 376 347 825 767 l817 763 0 349 c0 273 -3 349 -12 348 -7 0 -379 -131 -825 -291z"/>
<path d="M2000 2711 l-595 -96 -3 -282 -2 -282 42 -11 c24 -6 51 -13 60 -16 17 -5 18 15 20 293 l3 298 50 7 c28 4 61 9 75 12 14 3 241 41 505 86 264 45 485 83 490 85 40 14 -128 -10 -645 -94z"/>
<path d="M300 2003 l0 -59 438 -157 c240 -87 440 -157 445 -157 4 0 7 31 7 68 l0 68 -432 143 c-238 79 -439 146 -445 148 -10 4 -13 -11 -13 -54z"/>
<path d="M1670 1558 l0 -63 598 -211 597 -211 3 75 c2 41 1 76 0 78 -2 1 -269 89 -593 194 -325 106 -593 194 -597 197 -5 2 -8 -24 -8 -59z"/>
</g>
<g id="layer106" fill="#d9d9ff" stroke="none">
<path d="M4790 2893 c-8 -3 -28 -11 -45 -18 -16 -7 -375 -135 -797 -285 l-768 -273 0 -824 c0 -454 4 -823 8 -821 4 2 376 347 825 767 l817 763 0 349 c0 363 1 357 -40 342z"/>
<path d="M1765 2670 c-93 -15 -213 -34 -265 -41 l-95 -14 -3 -282 -2 -282 42 -11 c24 -6 51 -13 60 -16 17 -5 18 15 20 293 l3 298 45 7 c148 24 420 76 395 76 -16 0 -106 -13 -200 -28z"/>
<path d="M310 1996 c0 -50 2 -55 28 -64 15 -5 210 -75 434 -156 224 -80 410 -146 413 -146 3 0 5 31 5 68 l0 68 -433 142 c-239 78 -437 142 -440 142 -4 0 -7 -24 -7 -54z"/>
<path d="M1400 1676 c0 -179 3 -326 6 -326 19 0 44 25 54 54 10 32 14 34 36 26 l24 -10 0 275 0 274 -42 11 c-24 6 -51 13 -60 16 -17 5 -18 -15 -18 -320z"/>
<path d="M1213 1700 c0 -41 2 -58 4 -37 2 20 2 54 0 75 -2 20 -4 3 -4 -38z"/>
<path d="M1672 1553 l3 -56 575 -204 c316 -111 583 -205 593 -209 15 -5 17 3 17 70 l0 74 -47 16 c-27 8 -290 94 -587 190 -296 97 -542 176 -548 176 -5 0 -8 -26 -6 -57z"/>
<path d="M2880 1160 c0 -40 4 -70 10 -70 6 0 10 30 10 70 0 40 -4 70 -10 70 -6 0 -10 -30 -10 -70z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 13 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 32 KiB

View file

@ -0,0 +1,53 @@
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg" width="486px" height="309px" viewBox="0 0 4860 3090" preserveAspectRatio="xMidYMid meet">
<g id="layer101" fill="#010102" stroke="none">
<path d="M2818 3085 c-2 -2 -597 -58 -1323 -126 -726 -67 -1321 -123 -1322 -124 -2 -1 -3 -235 -3 -520 l-1 -518 588 -234 c323 -128 598 -238 610 -245 17 -8 26 -8 38 2 8 7 18 10 22 7 3 -4 -45 -153 -107 -332 -62 -179 -111 -327 -109 -329 2 -2 14 -6 26 -10 18 -6 23 -1 33 30 l12 36 18 -51 c21 -62 42 -80 93 -81 128 -1 277 338 225 512 -23 77 -98 102 -157 52 -17 -14 -31 -22 -31 -17 0 13 67 210 77 225 5 8 10 -10 13 -47 l5 -60 338 -133 337 -134 0 -36 c0 -31 -29 -80 -164 -287 -90 -137 -161 -253 -157 -256 3 -4 15 -9 26 -13 17 -5 38 23 145 190 68 108 126 192 128 186 1 -5 -6 -99 -18 -208 -26 -254 -26 -260 2 -267 12 -4 23 -5 24 -4 1 1 16 151 34 332 18 182 34 332 36 334 2 2 207 -76 455 -174 314 -125 454 -176 464 -169 7 5 389 360 848 789 l835 780 1 378 1 377 -22 0 c-13 0 -241 16 -507 35 -267 19 -487 33 -489 30 -3 -3 -11 0 -18 6 -15 12 -995 85 -1006 74z m-1274 -1991 c73 -72 -23 -384 -131 -425 -60 -23 -100 40 -88 138 13 103 75 246 123 284 30 23 75 25 96 3z"/>
<path d="M270 1657 c0 -2 -43 -127 -95 -277 -96 -275 -100 -295 -56 -287 8 1 51 110 107 272 51 148 92 270 91 271 -11 8 -47 24 -47 21z"/>
<path d="M341 1318 c-89 -257 -93 -272 -76 -285 27 -19 31 -17 45 30 l13 42 12 -50 c26 -99 97 -123 164 -56 l39 39 7 -51 c9 -65 47 -107 97 -107 39 0 76 30 112 93 32 55 158 416 152 434 -3 7 -14 13 -24 13 -16 0 -30 -30 -77 -166 -72 -209 -78 -225 -111 -263 -31 -37 -72 -41 -100 -10 -15 17 -19 35 -18 88 1 53 12 98 56 226 31 88 59 168 63 177 5 13 1 20 -16 27 -16 6 -26 5 -30 -3 -4 -6 -32 -85 -64 -176 -64 -186 -96 -255 -124 -270 -58 -30 -101 12 -101 99 0 43 14 98 62 239 54 156 61 184 48 192 -8 5 -19 10 -25 10 -5 0 -52 -122 -104 -272z"/>
<path d="M1026 1329 c-34 -27 -70 -98 -85 -168 -21 -98 15 -160 114 -199 58 -23 62 -43 20 -98 -45 -59 -104 -56 -171 8 l-32 30 -11 -32 c-13 -38 -4 -60 39 -90 68 -49 126 -46 183 8 41 39 67 94 137 296 50 144 60 180 49 187 -26 16 -37 9 -50 -28 -7 -22 -14 -31 -16 -23 -18 66 -38 102 -63 115 -40 21 -83 19 -114 -6z m109 -76 c35 -35 43 -86 25 -170 -17 -77 -20 -79 -76 -58 -67 25 -94 55 -94 102 0 46 31 117 57 132 27 16 69 13 88 -6z"/>
<path d="M1768 1063 c-14 -4 -38 -49 -38 -73 0 -4 22 -5 50 -2 97 9 151 -40 130 -118 -14 -53 -43 -70 -136 -79 -73 -7 -79 -9 -109 -44 -53 -61 -71 -166 -40 -226 18 -35 88 -71 139 -71 33 0 39 4 52 35 19 47 19 48 -21 41 -49 -10 -122 23 -131 58 -8 33 1 67 25 97 15 19 32 24 96 30 95 9 120 25 158 100 48 92 28 187 -49 230 -30 17 -96 28 -126 22z"/>
<path d="M29 963 c-23 -60 -23 -81 1 -88 12 -4 23 -5 24 -3 5 6 36 101 33 103 -1 2 -12 6 -24 9 -19 6 -25 2 -34 -21z"/>
<path d="M2362 538 c-88 -255 -93 -273 -76 -285 26 -19 30 -17 44 30 l13 42 13 -50 c16 -60 52 -95 98 -95 76 0 113 59 206 327 69 197 72 218 31 210 -8 -1 -32 -55 -57 -127 -87 -248 -96 -271 -124 -300 -35 -37 -72 -39 -105 -5 -43 42 -35 108 38 322 53 157 60 185 47 193 -8 5 -19 10 -25 10 -5 0 -52 -123 -103 -272z"/>
<path d="M2864 610 c-110 -70 -205 -345 -163 -471 22 -65 82 -109 148 -109 31 0 61 30 61 61 0 14 -9 17 -43 16 -51 -2 -93 22 -108 61 -38 96 48 334 134 376 45 21 78 13 117 -25 15 -16 31 -29 33 -29 3 0 10 14 16 32 10 28 8 34 -11 56 -51 54 -128 68 -184 32z"/>
</g>
<g id="layer102" fill="#373749" stroke="none">
<path d="M200 2312 l0 -500 568 -225 c312 -125 575 -229 585 -233 16 -6 17 12 15 326 l-3 331 -105 40 c-57 22 -156 64 -219 95 -63 30 -121 52 -129 49 -8 -3 -25 2 -38 10 -34 22 -33 71 2 87 29 14 53 3 68 -29 15 -32 205 -126 374 -184 l52 -18 0 277 0 277 -562 93 c-310 52 -573 96 -585 99 l-23 5 0 -500z m600 108 c0 -5 -20 -10 -45 -10 l-45 0 0 -151 0 -151 -24 6 c-42 10 -119 46 -113 52 3 4 21 1 38 -5 18 -6 37 -7 41 -3 5 5 7 62 6 128 l-3 119 -43 3 c-23 2 -40 7 -37 13 8 12 225 12 225 -1z m-338 -382 c83 -28 123 -45 115 -51 -7 -5 0 -6 18 -3 23 5 27 4 15 -5 -12 -8 -10 -9 11 -5 17 4 99 -19 245 -68 120 -41 214 -75 207 -75 -6 -1 -20 -4 -30 -7 -15 -5 -16 -4 -3 6 12 9 9 10 -15 6 -23 -5 -27 -4 -15 5 12 8 8 9 -15 5 -23 -5 -27 -4 -15 5 12 8 8 9 -15 5 -23 -5 -27 -4 -15 5 12 8 8 9 -15 5 -23 -5 -27 -4 -15 5 12 8 8 9 -15 5 -23 -5 -27 -4 -15 5 12 8 8 9 -15 5 -23 -5 -27 -4 -15 5 12 8 8 9 -15 5 -23 -5 -27 -4 -15 5 12 8 8 9 -15 5 -23 -5 -27 -4 -15 5 12 8 10 9 -11 5 -17 -4 -100 19 -250 69 -123 41 -227 75 -232 75 -4 0 -7 -28 -5 -61 l3 -62 113 -40 c62 -22 111 -41 109 -44 -2 -2 -56 15 -120 38 l-117 42 0 67 c0 37 3 70 7 73 12 13 36 7 165 -35z m156 -213 c29 -9 52 -19 49 -21 -5 -5 -127 36 -127 43 0 3 6 3 13 1 6 -3 36 -13 65 -23z m557 -18 l60 -22 3 -82 c3 -75 1 -82 -18 -88 -19 -6 -156 32 -147 41 2 2 30 -5 62 -16 32 -11 60 -20 62 -20 1 0 3 33 3 74 0 72 -1 75 -27 84 -23 9 -24 11 -8 12 12 1 -1 9 -30 20 -27 10 -43 19 -35 19 8 0 42 -10 75 -22z m-417 -32 c29 -9 52 -19 49 -21 -5 -5 -127 36 -127 43 0 3 6 3 13 1 6 -3 36 -13 65 -23z m137 -51 c24 -11 25 -13 5 -8 -14 4 -38 13 -55 20 -24 11 -25 13 -5 8 14 -4 39 -13 55 -20z m113 -39 c29 -9 52 -19 49 -21 -5 -5 -127 36 -127 43 0 3 6 3 13 1 6 -3 36 -13 65 -23z"/>
<path d="M694 1944 c39 -13 75 -24 80 -23 6 0 -20 11 -58 25 -39 13 -75 24 -80 23 -6 0 20 -11 58 -25z"/>
<path d="M1550 2297 l0 -286 38 -10 c20 -5 84 -19 142 -31 58 -12 116 -23 129 -26 23 -5 24 -3 19 41 -3 25 -3 45 1 43 31 -14 252 -141 256 -147 2 -5 -62 -21 -143 -36 -81 -15 -151 -30 -156 -33 -6 -3 0 10 12 30 12 19 22 39 22 44 0 5 -66 22 -147 37 -80 16 -152 31 -160 34 -11 4 -13 -52 -11 -338 l3 -344 320 -126 c261 -104 321 -124 324 -111 3 15 -26 46 -51 54 -9 3 -9 13 2 39 7 19 14 35 16 37 1 2 18 -3 37 -12 45 -18 57 -41 57 -108 l0 -53 423 -167 c232 -92 430 -170 440 -174 16 -6 17 38 17 827 l0 834 -768 128 c-422 71 -779 131 -794 134 l-28 5 0 -285z m1008 -269 c3 -16 -10 -18 -130 -20 l-133 -3 105 -70 c117 -79 142 -107 142 -159 0 -43 -15 -64 -59 -83 -33 -13 -178 -18 -207 -7 -22 8 -22 74 -1 74 8 0 15 -9 15 -20 0 -28 43 -43 104 -37 58 5 76 24 76 77 0 55 -34 96 -137 168 -64 43 -93 70 -93 83 0 19 7 19 157 17 140 -3 158 -5 161 -20z m-773 -409 c28 -10 45 -18 39 -18 -6 -1 -37 8 -69 19 -67 23 -65 23 -65 12 0 -5 27 -17 60 -27 33 -10 58 -20 56 -23 -4 -3 -68 15 -123 36 -10 3 -13 -13 -13 -61 l0 -65 51 -17 c28 -9 49 -19 47 -21 -2 -2 -27 4 -56 13 l-52 17 0 72 c0 59 3 75 18 83 18 11 26 9 107 -20z m265 -84 c19 -7 28 -13 20 -13 -8 0 -31 6 -50 13 -19 7 -28 13 -20 13 8 0 31 -6 50 -13z m-165 -121 c24 -11 25 -13 5 -8 -14 4 -38 13 -55 20 -24 11 -25 13 -5 8 14 -4 39 -13 55 -20z"/>
</g>
<g id="layer103" fill="#60607b" stroke="none">
<path d="M200 2312 l0 -500 568 -225 c312 -125 575 -229 585 -233 16 -6 17 12 15 326 l-3 331 -105 40 c-57 22 -156 64 -219 95 -63 30 -121 52 -129 49 -8 -3 -25 2 -38 10 -34 22 -33 71 2 87 29 14 53 3 68 -29 15 -32 205 -126 374 -184 l52 -18 0 277 0 277 -562 93 c-310 52 -573 96 -585 99 l-23 5 0 -500z m600 108 c0 -5 -20 -10 -45 -10 l-45 0 0 -151 0 -151 -24 6 c-42 10 -119 46 -113 52 3 4 21 1 38 -5 18 -6 37 -7 41 -3 5 5 7 62 6 128 l-3 119 -42 3 c-24 2 -43 7 -43 13 0 5 50 9 115 9 70 0 115 -4 115 -10z m-8 -487 l449 -147 -3 -86 c-3 -80 -4 -85 -26 -88 -16 -3 -716 240 -904 313 -15 6 -18 20 -18 81 0 73 0 74 26 74 15 0 229 -66 476 -147z"/>
<path d="M300 2001 c0 -46 4 -60 17 -65 9 -4 206 -75 437 -158 232 -83 427 -153 434 -156 10 -3 12 12 10 69 l-3 74 -440 147 c-242 81 -443 148 -447 148 -5 0 -8 -27 -8 -59z"/>
<path d="M1210 1694 c0 -47 4 -73 10 -69 6 3 10 37 10 76 0 39 -4 69 -10 69 -6 0 -10 -32 -10 -76z"/>
<path d="M1550 2297 l0 -286 38 -10 c20 -5 84 -19 142 -31 58 -12 116 -23 129 -26 23 -5 24 -3 19 41 -3 25 -3 45 1 43 31 -14 252 -141 256 -147 2 -5 -62 -21 -143 -36 -81 -15 -151 -30 -156 -33 -6 -3 0 10 12 30 12 19 22 39 22 44 0 5 -66 22 -147 37 -80 16 -152 31 -160 34 -11 4 -13 -52 -11 -338 l3 -344 320 -126 c261 -104 321 -124 324 -111 3 15 -26 46 -51 54 -9 3 -9 13 2 39 7 19 14 35 16 37 1 2 18 -3 37 -12 45 -18 57 -41 57 -108 l0 -53 423 -167 c232 -92 430 -170 440 -174 16 -6 17 38 17 827 l0 834 -768 128 c-422 71 -779 131 -794 134 l-28 5 0 -285z m1008 -269 c3 -16 -10 -18 -130 -20 l-133 -3 105 -70 c117 -79 142 -107 142 -159 0 -43 -15 -64 -59 -83 -33 -13 -178 -18 -207 -7 -22 8 -22 74 -1 74 8 0 15 -9 15 -20 0 -28 43 -43 104 -37 58 5 76 24 76 77 0 55 -34 96 -137 168 -64 43 -93 70 -93 83 0 19 7 19 157 17 140 -3 158 -5 161 -20z m-437 -515 c230 -75 417 -138 415 -140 -2 -3 -187 55 -410 126 -224 72 -414 131 -424 131 -9 0 163 -61 383 -134 220 -74 396 -135 391 -135 -7 -1 -745 238 -793 256 -10 4 -13 -12 -13 -59 l0 -65 405 -143 c223 -79 404 -145 402 -147 -3 -2 -187 60 -411 138 l-406 142 0 78 c0 65 3 78 18 82 9 3 19 5 21 6 2 0 192 -61 422 -136z m544 -177 c55 -19 95 -35 90 -35 -6 -1 -56 14 -110 33 -55 19 -95 35 -90 35 6 1 56 -14 110 -33z m243 -168 c-1 -95 -5 -83 -10 30 -2 34 0 62 5 62 4 0 6 -42 5 -92z m-325 2 c38 -12 66 -24 64 -26 -5 -5 -148 43 -156 53 -3 3 1 4 9 1 8 -3 46 -15 83 -28z"/>
</g>
<g id="layer104" fill="#8686bf" stroke="none">
<path d="M1540 2940 c-685 -65 -1242 -118 -1237 -119 4 -1 252 -41 550 -91 l542 -90 1145 184 c630 101 1134 185 1120 185 -14 1 -180 12 -370 26 -190 14 -381 24 -425 24 -44 -1 -640 -54 -1325 -119z"/>
<path d="M200 2312 l0 -500 568 -225 c312 -125 575 -229 585 -233 16 -6 17 12 15 326 l-3 331 -105 40 c-57 22 -156 64 -219 95 -63 30 -121 52 -129 49 -8 -3 -25 2 -38 10 -34 22 -33 71 2 87 29 14 53 3 68 -29 15 -32 205 -126 374 -184 l52 -18 0 277 0 277 -562 93 c-310 52 -573 96 -585 99 l-23 5 0 -500z m600 108 c0 -5 -20 -10 -45 -10 l-45 0 0 -151 0 -151 -24 6 c-42 10 -119 46 -113 52 3 4 21 1 38 -5 18 -6 37 -7 41 -3 5 5 7 62 6 128 l-3 119 -47 3 c-27 2 -48 7 -48 13 0 5 51 9 120 9 73 0 120 -4 120 -10z m98 -519 l342 -112 0 -88 c0 -79 -2 -89 -19 -94 -11 -3 -219 67 -473 158 l-453 162 -3 76 c-2 66 -1 76 15 79 19 4 71 -12 591 -181z"/>
<path d="M300 2003 l0 -60 438 -157 c240 -86 440 -156 445 -156 4 0 7 31 7 69 l0 68 -431 142 c-236 78 -437 145 -445 148 -11 4 -14 -7 -14 -54z"/>
<path d="M2000 2711 l-595 -96 -3 -282 -2 -282 42 -11 c24 -6 51 -13 60 -16 17 -5 18 15 20 293 l3 298 50 7 c54 7 1041 176 1065 182 8 2 2 4 -15 4 -16 0 -298 -44 -625 -97z"/>
<path d="M1550 2297 l0 -286 38 -10 c20 -5 84 -19 142 -31 58 -12 116 -23 129 -26 23 -5 24 -3 19 41 -3 25 -3 45 1 43 31 -14 252 -141 256 -147 2 -5 -62 -21 -143 -36 -81 -15 -151 -30 -156 -33 -6 -3 0 10 12 30 12 19 22 39 22 44 0 5 -66 22 -147 37 -80 16 -152 31 -160 34 -11 4 -13 -52 -11 -338 l3 -344 320 -126 c261 -104 321 -124 324 -111 3 15 -26 46 -51 54 -9 3 -9 13 2 39 7 19 14 35 16 37 1 2 18 -3 37 -12 45 -18 57 -41 57 -108 l0 -53 423 -167 c232 -92 430 -170 440 -174 16 -6 17 38 17 827 l0 834 -768 128 c-422 71 -779 131 -794 134 l-28 5 0 -285z m1008 -269 c3 -16 -10 -18 -130 -20 l-133 -3 105 -70 c117 -79 142 -107 142 -159 0 -43 -15 -64 -59 -83 -33 -13 -178 -18 -207 -7 -22 8 -22 74 -1 74 8 0 15 -9 15 -20 0 -28 43 -43 104 -37 58 5 76 24 76 77 0 55 -34 96 -137 168 -64 43 -93 70 -93 83 0 19 7 19 157 17 140 -3 158 -5 161 -20z m-602 -459 c137 -44 408 -132 602 -195 l352 -115 0 -90 c0 -83 -2 -90 -22 -100 -19 -8 -121 25 -598 191 -316 111 -590 208 -607 215 -33 14 -33 14 -33 84 0 70 10 90 46 91 7 0 124 -36 260 -81z"/>
<path d="M2280 1434 c322 -106 588 -194 593 -194 4 0 7 4 7 8 0 4 -30 18 -67 29 -38 12 -301 96 -585 187 -284 91 -520 166 -525 165 -4 0 255 -88 577 -195z"/>
<path d="M1670 1558 l0 -63 467 -165 c257 -91 527 -186 600 -212 l133 -47 0 79 0 79 -82 26 c-172 54 -1103 358 -1110 362 -5 2 -8 -24 -8 -59z"/>
<path d="M2880 1159 c0 -51 4 -78 10 -74 6 3 10 40 10 81 0 43 -4 74 -10 74 -6 0 -10 -34 -10 -81z"/>
</g>
<g id="layer105" fill="#afafde" stroke="none">
<path d="M1547 2942 c-683 -64 -1228 -120 -1215 -124 13 -4 257 -45 543 -92 l520 -86 1145 184 c630 101 1134 185 1120 185 -14 1 -180 12 -370 26 -190 14 -381 24 -425 24 -44 -1 -637 -53 -1318 -117z"/>
<path d="M2758 2792 c-598 -103 -1089 -189 -1092 -192 -2 -3 332 -62 744 -131 l748 -126 802 286 c440 157 797 287 793 288 -12 4 -865 63 -888 62 -11 0 -509 -85 -1107 -187z"/>
<path d="M3993 2608 l-813 -291 0 -824 c0 -454 4 -823 8 -821 4 2 376 347 825 767 l817 763 0 349 c0 273 -3 349 -12 348 -7 0 -379 -131 -825 -291z"/>
<path d="M2000 2711 l-595 -96 -3 -282 -2 -282 42 -11 c24 -6 51 -13 60 -16 17 -5 18 15 20 293 l3 298 50 7 c28 4 61 9 75 12 14 3 241 41 505 86 264 45 485 83 490 85 40 14 -128 -10 -645 -94z"/>
<path d="M300 2003 l0 -59 438 -157 c240 -87 440 -157 445 -157 4 0 7 31 7 68 l0 68 -432 143 c-238 79 -439 146 -445 148 -10 4 -13 -11 -13 -54z"/>
<path d="M1670 1558 l0 -63 598 -211 597 -211 3 75 c2 41 1 76 0 78 -2 1 -269 89 -593 194 -325 106 -593 194 -597 197 -5 2 -8 -24 -8 -59z"/>
</g>
<g id="layer106" fill="#d9d9ff" stroke="none">
<path d="M4790 2893 c-8 -3 -28 -11 -45 -18 -16 -7 -375 -135 -797 -285 l-768 -273 0 -824 c0 -454 4 -823 8 -821 4 2 376 347 825 767 l817 763 0 349 c0 363 1 357 -40 342z"/>
<path d="M1765 2670 c-93 -15 -213 -34 -265 -41 l-95 -14 -3 -282 -2 -282 42 -11 c24 -6 51 -13 60 -16 17 -5 18 15 20 293 l3 298 45 7 c148 24 420 76 395 76 -16 0 -106 -13 -200 -28z"/>
<path d="M310 1996 c0 -50 2 -55 28 -64 15 -5 210 -75 434 -156 224 -80 410 -146 413 -146 3 0 5 31 5 68 l0 68 -433 142 c-239 78 -437 142 -440 142 -4 0 -7 -24 -7 -54z"/>
<path d="M1400 1676 c0 -179 3 -326 6 -326 19 0 44 25 54 54 10 32 14 34 36 26 l24 -10 0 275 0 274 -42 11 c-24 6 -51 13 -60 16 -17 5 -18 -15 -18 -320z"/>
<path d="M1213 1700 c0 -41 2 -58 4 -37 2 20 2 54 0 75 -2 20 -4 3 -4 -38z"/>
<path d="M1672 1553 l3 -56 575 -204 c316 -111 583 -205 593 -209 15 -5 17 3 17 70 l0 74 -47 16 c-27 8 -290 94 -587 190 -296 97 -542 176 -548 176 -5 0 -8 -26 -6 -57z"/>
<path d="M2880 1160 c0 -40 4 -70 10 -70 6 0 10 30 10 70 0 40 -4 70 -10 70 -6 0 -10 -30 -10 -70z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 13 KiB

View file

@ -0,0 +1,60 @@
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg" width="486px" height="309px" viewBox="0 0 4860 3090" preserveAspectRatio="xMidYMid meet">
<g id="layer101" fill="#010102" stroke="none">
<path d="M2818 3085 c-2 -2 -597 -58 -1323 -126 -726 -67 -1321 -123 -1322 -124 -2 -1 -3 -235 -3 -520 l-1 -518 588 -234 c323 -128 598 -238 610 -245 17 -8 26 -8 38 2 8 7 18 10 22 7 3 -4 -45 -153 -107 -332 -62 -179 -111 -327 -109 -329 2 -2 14 -6 26 -10 18 -6 23 -1 33 30 l12 36 18 -51 c21 -62 42 -80 93 -81 128 -1 277 338 225 512 -23 77 -98 102 -157 52 -17 -14 -31 -22 -31 -17 0 13 67 210 77 225 5 8 10 -10 13 -47 l5 -60 338 -133 337 -134 0 -36 c0 -31 -29 -80 -164 -287 -90 -137 -161 -253 -157 -256 3 -4 15 -9 26 -13 17 -5 38 23 145 190 68 108 126 192 128 186 1 -5 -6 -99 -18 -208 -26 -254 -26 -260 2 -267 12 -4 23 -5 24 -4 1 1 16 151 34 332 18 182 34 332 36 334 2 2 207 -76 455 -174 314 -125 454 -176 464 -169 7 5 389 360 848 789 l835 780 1 378 1 377 -22 0 c-13 0 -241 16 -507 35 -267 19 -487 33 -489 30 -3 -3 -11 0 -18 6 -15 12 -995 85 -1006 74z m472 -50 c190 -14 356 -25 370 -26 14 0 -490 -84 -1120 -185 l-1145 -184 -542 90 c-298 50 -546 90 -550 91 -24 3 2495 237 2562 238 44 0 235 -10 425 -24z m1025 -85 c236 -17 434 -32 438 -33 4 -1 -353 -131 -793 -288 l-802 -286 -748 126 c-412 69 -746 128 -744 131 6 5 2165 378 2199 379 11 1 213 -13 450 -29z m515 -399 l0 -349 -817 -763 c-449 -420 -821 -765 -825 -767 -4 -2 -8 367 -8 821 l0 824 813 291 c446 160 818 291 825 291 9 1 12 -75 12 -348z m-4022 157 l562 -93 0 -277 0 -277 -52 18 c-169 58 -359 152 -374 184 -15 32 -39 43 -68 29 -35 -16 -36 -65 -2 -87 13 -8 30 -13 38 -10 8 3 66 -19 129 -49 63 -31 162 -73 219 -95 l105 -40 3 -331 c2 -314 1 -332 -15 -326 -10 4 -273 108 -585 233 l-568 225 0 500 0 500 23 -5 c12 -3 275 -47 585 -99z m1832 96 c-24 -6 -1011 -175 -1065 -182 l-50 -7 -3 -298 c-2 -278 -3 -298 -20 -293 -9 3 -36 10 -60 16 l-42 11 2 282 3 282 595 96 c327 53 609 97 625 97 17 0 23 -2 15 -4z m-268 -361 l768 -128 0 -834 c0 -789 -1 -833 -17 -827 -10 4 -208 82 -440 174 l-423 167 0 53 c0 67 -12 90 -57 108 -19 9 -36 14 -37 12 -2 -2 -9 -18 -16 -37 -11 -26 -11 -36 -2 -39 25 -8 54 -39 51 -54 -3 -13 -63 7 -324 111 l-320 126 -3 344 c-2 286 0 342 11 338 8 -3 80 -18 160 -34 81 -15 147 -32 147 -37 0 -5 -10 -25 -22 -44 -12 -20 -18 -33 -12 -30 5 3 75 18 156 33 81 15 145 31 143 36 -4 6 -225 133 -256 147 -4 2 -4 -18 -1 -43 5 -44 4 -46 -19 -41 -13 3 -71 14 -129 26 -58 12 -122 26 -142 31 l-38 10 0 286 0 285 28 -5 c15 -3 372 -63 794 -134z m-894 -463 l42 -11 0 -274 0 -275 -24 10 c-22 8 -26 6 -36 -26 -10 -29 -35 -54 -54 -54 -3 0 -6 147 -6 326 0 305 1 325 18 320 9 -3 36 -10 60 -16z m66 -886 c73 -72 -23 -384 -131 -425 -60 -23 -100 40 -88 138 13 103 75 246 123 284 30 23 75 25 96 3z"/>
<path d="M575 2421 c-3 -6 14 -11 37 -13 l43 -3 3 -119 c1 -66 -1 -123 -6 -128 -4 -4 -23 -3 -41 3 -17 6 -35 9 -38 5 -6 -6 71 -42 113 -52 l24 -6 0 151 0 151 45 0 c25 0 45 5 45 10 0 13 -217 13 -225 1z"/>
<path d="M297 2073 c-4 -3 -7 -36 -7 -73 l0 -67 117 -42 c64 -23 118 -40 120 -38 2 3 -47 22 -109 44 l-113 40 -3 62 c-2 33 1 61 5 61 5 0 109 -34 232 -75 150 -50 233 -73 250 -69 21 4 23 3 11 -5 -12 -9 -8 -10 15 -5 23 4 27 3 15 -5 -12 -9 -8 -10 15 -5 23 4 27 3 15 -5 -12 -9 -8 -10 15 -5 23 4 27 3 15 -5 -12 -9 -8 -10 15 -5 23 4 27 3 15 -5 -12 -9 -8 -10 15 -5 23 4 27 3 15 -5 -12 -9 -8 -10 15 -5 23 4 27 3 15 -5 -12 -9 -8 -10 15 -5 23 4 27 3 15 -5 -12 -9 -8 -10 15 -5 24 4 27 3 15 -6 -13 -10 -12 -11 3 -6 10 3 24 6 30 7 7 0 -87 34 -207 75 -146 49 -228 72 -245 68 -21 -4 -23 -3 -11 5 12 9 8 10 -15 5 -18 -3 -25 -2 -18 3 8 6 -32 23 -115 51 -129 42 -153 48 -165 35z m419 -127 c38 -14 64 -25 58 -25 -5 -1 -41 10 -80 23 -38 14 -64 25 -58 25 5 1 41 -10 80 -23z"/>
<path d="M540 1847 c0 -7 122 -48 127 -43 3 2 -20 12 -49 21 -29 10 -59 20 -65 23 -7 2 -13 2 -13 -1z"/>
<path d="M1135 1810 c29 -11 42 -19 30 -20 -16 -1 -15 -3 8 -12 26 -9 27 -12 27 -84 0 -41 -2 -74 -3 -74 -2 0 -30 9 -62 20 -32 11 -60 18 -62 16 -9 -9 128 -47 147 -41 19 6 21 13 18 88 l-3 82 -60 22 c-33 12 -67 22 -75 22 -8 0 8 -9 35 -19z m95 -109 c0 -39 -4 -73 -10 -76 -6 -4 -10 22 -10 69 0 44 4 76 10 76 6 0 10 -30 10 -69z"/>
<path d="M680 1797 c0 -7 122 -48 127 -43 3 2 -20 12 -49 21 -29 10 -59 20 -65 23 -7 2 -13 2 -13 -1z"/>
<path d="M845 1736 c17 -7 41 -16 55 -20 20 -5 19 -3 -5 8 -16 7 -41 16 -55 20 -20 5 -19 3 5 -8z"/>
<path d="M930 1707 c0 -7 122 -48 127 -43 3 2 -20 12 -49 21 -29 10 -59 20 -65 23 -7 2 -13 2 -13 -1z"/>
<path d="M2240 2031 c0 -13 29 -40 93 -83 103 -72 137 -113 137 -168 0 -53 -18 -72 -76 -77 -61 -6 -104 9 -104 37 0 11 -7 20 -15 20 -21 0 -21 -66 1 -74 29 -11 174 -6 207 7 44 19 59 40 59 83 0 52 -25 80 -142 159 l-105 70 133 3 c120 2 133 4 130 20 -3 15 -21 17 -161 20 -150 2 -157 2 -157 -17z"/>
<path d="M1678 1639 c-15 -8 -18 -24 -18 -83 l0 -72 52 -17 c29 -9 54 -15 56 -13 2 2 -19 12 -47 21 l-51 17 0 65 c0 48 3 64 13 61 55 -21 119 -39 123 -36 2 3 -23 13 -56 23 -33 10 -60 22 -60 27 0 11 -2 11 65 -12 32 -11 63 -20 69 -19 10 0 -57 26 -109 42 -11 3 -28 2 -37 -4z"/>
<path d="M2020 1535 c19 -7 42 -13 50 -13 8 0 -1 6 -20 13 -19 7 -42 13 -50 13 -8 0 1 -6 20 -13z"/>
<path d="M1835 1426 c17 -7 41 -16 55 -20 20 -5 19 -3 -5 8 -16 7 -41 16 -55 20 -20 5 -19 3 5 -8z"/>
<path d="M270 1657 c0 -2 -43 -127 -95 -277 -96 -275 -100 -295 -56 -287 8 1 51 110 107 272 51 148 92 270 91 271 -11 8 -47 24 -47 21z"/>
<path d="M341 1318 c-89 -257 -93 -272 -76 -285 27 -19 31 -17 45 30 l13 42 12 -50 c26 -99 97 -123 164 -56 l39 39 7 -51 c9 -65 47 -107 97 -107 39 0 76 30 112 93 32 55 158 416 152 434 -3 7 -14 13 -24 13 -16 0 -30 -30 -77 -166 -72 -209 -78 -225 -111 -263 -31 -37 -72 -41 -100 -10 -15 17 -19 35 -18 88 1 53 12 98 56 226 31 88 59 168 63 177 5 13 1 20 -16 27 -16 6 -26 5 -30 -3 -4 -6 -32 -85 -64 -176 -64 -186 -96 -255 -124 -270 -58 -30 -101 12 -101 99 0 43 14 98 62 239 54 156 61 184 48 192 -8 5 -19 10 -25 10 -5 0 -52 -122 -104 -272z"/>
<path d="M1026 1329 c-34 -27 -70 -98 -85 -168 -21 -98 15 -160 114 -199 58 -23 62 -43 20 -98 -45 -59 -104 -56 -171 8 l-32 30 -11 -32 c-13 -38 -4 -60 39 -90 68 -49 126 -46 183 8 41 39 67 94 137 296 50 144 60 180 49 187 -26 16 -37 9 -50 -28 -7 -22 -14 -31 -16 -23 -18 66 -38 102 -63 115 -40 21 -83 19 -114 -6z m109 -76 c35 -35 43 -86 25 -170 -17 -77 -20 -79 -76 -58 -67 25 -94 55 -94 102 0 46 31 117 57 132 27 16 69 13 88 -6z"/>
<path d="M1768 1063 c-14 -4 -38 -49 -38 -73 0 -4 22 -5 50 -2 97 9 151 -40 130 -118 -14 -53 -43 -70 -136 -79 -73 -7 -79 -9 -109 -44 -53 -61 -71 -166 -40 -226 18 -35 88 -71 139 -71 33 0 39 4 52 35 19 47 19 48 -21 41 -49 -10 -122 23 -131 58 -8 33 1 67 25 97 15 19 32 24 96 30 95 9 120 25 158 100 48 92 28 187 -49 230 -30 17 -96 28 -126 22z"/>
<path d="M29 963 c-23 -60 -23 -81 1 -88 12 -4 23 -5 24 -3 5 6 36 101 33 103 -1 2 -12 6 -24 9 -19 6 -25 2 -34 -21z"/>
<path d="M2362 538 c-88 -255 -93 -273 -76 -285 26 -19 30 -17 44 30 l13 42 13 -50 c16 -60 52 -95 98 -95 76 0 113 59 206 327 69 197 72 218 31 210 -8 -1 -32 -55 -57 -127 -87 -248 -96 -271 -124 -300 -35 -37 -72 -39 -105 -5 -43 42 -35 108 38 322 53 157 60 185 47 193 -8 5 -19 10 -25 10 -5 0 -52 -123 -103 -272z"/>
<path d="M2864 610 c-110 -70 -205 -345 -163 -471 22 -65 82 -109 148 -109 31 0 61 30 61 61 0 14 -9 17 -43 16 -51 -2 -93 22 -108 61 -38 96 48 334 134 376 45 21 78 13 117 -25 15 -16 31 -29 33 -29 3 0 10 14 16 32 10 28 8 34 -11 56 -51 54 -128 68 -184 32z"/>
</g>
<g id="layer102" fill="#373749" stroke="none">
<path d="M2236 1441 c12 -11 234 -84 239 -79 2 2 -53 23 -122 46 -70 23 -122 38 -117 33z"/>
<path d="M2386 1421 c12 -11 144 -54 149 -49 3 2 -32 16 -77 31 -45 14 -77 23 -72 18z"/>
<path d="M2645 1334 c54 -19 104 -34 110 -33 5 0 -35 16 -90 35 -54 19 -104 34 -110 33 -5 0 35 -16 90 -35z"/>
<path d="M2280 1271 c0 -4 39 -20 88 -35 48 -16 94 -31 102 -34 8 -3 13 -3 10 1 -9 10 -200 75 -200 68z"/>
<path d="M2898 1198 c5 -113 9 -125 10 -30 1 50 -1 92 -5 92 -5 0 -7 -28 -5 -62z"/>
<path d="M2491 1197 c8 -10 151 -58 156 -53 2 2 -26 14 -64 26 -37 13 -75 25 -83 28 -8 3 -12 2 -9 -1z"/>
</g>
<g id="layer103" fill="#60607b" stroke="none">
<path d="M1220 1698 c-3 -42 -1 -73 3 -69 4 4 7 39 5 77 l-3 69 -5 -77z"/>
<path d="M1188 1690 c-2 -39 0 -70 5 -70 4 0 7 32 7 70 0 39 -2 70 -4 70 -2 0 -6 -32 -8 -70z"/>
<path d="M1653 1560 c0 -41 2 -58 4 -37 2 20 2 54 0 75 -2 20 -4 3 -4 -38z"/>
<path d="M2873 1155 c0 -44 2 -61 4 -37 2 23 2 59 0 80 -2 20 -4 1 -4 -43z"/>
</g>
<g id="layer104" fill="#8686bf" stroke="none">
<path d="M200 2312 l0 -500 568 -225 c312 -125 575 -229 585 -233 16 -6 17 12 15 326 l-3 331 -105 40 c-57 22 -156 64 -219 95 -63 30 -121 52 -129 49 -8 -3 -25 2 -38 10 -34 22 -33 71 2 87 29 14 53 3 68 -29 15 -32 205 -126 374 -184 l52 -18 0 277 0 277 -562 93 c-310 52 -573 96 -585 99 l-23 5 0 -500z m600 108 c0 -5 -20 -10 -45 -10 l-45 0 0 -151 0 -151 -24 6 c-42 10 -119 46 -113 52 3 4 21 1 38 -5 18 -6 37 -7 41 -3 5 5 7 62 6 128 l-3 119 -47 3 c-27 2 -48 7 -48 13 0 5 51 9 120 9 73 0 120 -4 120 -10z m98 -519 l342 -112 0 -88 c0 -79 -2 -89 -19 -94 -11 -3 -219 67 -473 158 l-453 162 -3 76 c-2 66 -1 76 15 79 19 4 71 -12 591 -181z"/>
<path d="M1550 2297 l0 -286 38 -10 c20 -5 84 -19 142 -31 58 -12 116 -23 129 -26 23 -5 24 -3 19 41 -3 25 -3 45 1 43 31 -14 252 -141 256 -147 2 -5 -62 -21 -143 -36 -81 -15 -151 -30 -156 -33 -6 -3 0 10 12 30 12 19 22 39 22 44 0 5 -66 22 -147 37 -80 16 -152 31 -160 34 -11 4 -13 -52 -11 -338 l3 -344 320 -126 c261 -104 321 -124 324 -111 3 15 -26 46 -51 54 -9 3 -9 13 2 39 7 19 14 35 16 37 1 2 18 -3 37 -12 45 -18 57 -41 57 -108 l0 -53 423 -167 c232 -92 430 -170 440 -174 16 -6 17 38 17 827 l0 834 -768 128 c-422 71 -779 131 -794 134 l-28 5 0 -285z m1008 -269 c3 -16 -10 -18 -130 -20 l-133 -3 105 -70 c117 -79 142 -107 142 -159 0 -43 -15 -64 -59 -83 -33 -13 -178 -18 -207 -7 -22 8 -22 74 -1 74 8 0 15 -9 15 -20 0 -28 43 -43 104 -37 58 5 76 24 76 77 0 55 -34 96 -137 168 -64 43 -93 70 -93 83 0 19 7 19 157 17 140 -3 158 -5 161 -20z m-602 -459 c137 -44 408 -132 602 -195 l352 -115 0 -90 c0 -83 -2 -90 -22 -100 -19 -8 -121 25 -598 191 -316 111 -590 208 -607 215 -33 14 -33 14 -33 84 0 70 10 90 46 91 7 0 124 -36 260 -81z"/>
<path d="M2228 1452 c294 -98 531 -180 527 -184 -4 -4 3 -4 16 -1 15 4 20 3 15 -5 -4 -7 -2 -10 6 -7 8 3 33 -1 57 -10 53 -18 56 -19 39 -2 -7 8 -43 23 -78 35 -455 147 -1100 352 -1107 351 -4 0 232 -80 525 -177z"/>
</g>
<g id="layer105" fill="#afafde" stroke="none">
<path d="M1547 2942 c-683 -64 -1228 -120 -1215 -124 13 -4 257 -45 543 -92 l520 -86 1145 184 c630 101 1134 185 1120 185 -14 1 -180 12 -370 26 -190 14 -381 24 -425 24 -44 -1 -637 -53 -1318 -117z"/>
<path d="M2758 2792 c-598 -103 -1089 -189 -1092 -192 -2 -3 332 -62 744 -131 l748 -126 802 286 c440 157 797 287 793 288 -12 4 -865 63 -888 62 -11 0 -509 -85 -1107 -187z"/>
<path d="M2158 2728 c9 -9 15 -9 24 0 9 9 7 12 -12 12 -19 0 -21 -3 -12 -12z"/>
<path d="M301 1998 c1 -68 6 -61 11 15 2 26 0 47 -4 47 -5 0 -7 -28 -7 -62z"/>
<path d="M2863 1150 c0 -47 2 -66 4 -42 2 23 2 61 0 85 -2 23 -4 4 -4 -43z"/>
</g>
<g id="layer106" fill="#d9d9ff" stroke="none">
<path d="M4790 2893 c-8 -3 -28 -11 -45 -18 -16 -7 -375 -135 -797 -285 l-768 -273 0 -824 c0 -454 4 -823 8 -821 4 2 376 347 825 767 l817 763 0 349 c0 363 1 357 -40 342z"/>
<path d="M1765 2670 c-93 -15 -213 -34 -265 -41 l-95 -14 -3 -282 -2 -282 42 -11 c24 -6 51 -13 60 -16 17 -5 18 15 20 293 l3 298 45 7 c148 24 420 76 395 76 -16 0 -106 -13 -200 -28z"/>
<path d="M310 1996 c0 -50 2 -55 28 -64 15 -5 210 -75 434 -156 224 -80 410 -146 413 -146 3 0 5 31 5 68 l0 68 -433 142 c-239 78 -437 142 -440 142 -4 0 -7 -24 -7 -54z"/>
<path d="M1400 1676 c0 -179 3 -326 6 -326 19 0 44 25 54 54 10 32 14 34 36 26 l24 -10 0 275 0 274 -42 11 c-24 6 -51 13 -60 16 -17 5 -18 -15 -18 -320z"/>
<path d="M1213 1700 c0 -41 2 -58 4 -37 2 20 2 54 0 75 -2 20 -4 3 -4 -38z"/>
<path d="M1672 1553 l3 -56 575 -204 c316 -111 583 -205 593 -209 15 -5 17 3 17 70 l0 74 -47 16 c-27 8 -290 94 -587 190 -296 97 -542 176 -548 176 -5 0 -8 -26 -6 -57z"/>
<path d="M2880 1160 c0 -40 4 -70 10 -70 6 0 10 30 10 70 0 40 -4 70 -10 70 -6 0 -10 -30 -10 -70z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 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 81 imap server software applications supported</title>
<title>Imapsync list of the 86 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,7 +27,8 @@
<body>
<h1>Imapsync list of the 81 imap server software applications supported (and the broken ones) <a id="imap_server_success" href="../#TOP"><small>(back to menu)</small></a>
<h1>Imapsync list of the 86 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,
@ -36,7 +37,7 @@ The short answer is that if you're not using the famous <b>Dovecot</b> then you'
</p>
<p>Let's start with the long reported <b>success stories</b> list: <b>
79 different imap server software tools supported!</b><br/>
83 different imap server software tools supported!</b><br/>
[host1] means "source server" and [host2] means "destination server":
</p>
@ -80,7 +81,7 @@ imapsync --host1 imap.gmail.com
<li>BigFoot 1.0 (Derek Snider)</li>
<li>BincImap 1.2.3 (GPL) (<a href="http://www.bincimap.org/">http://www.bincimap.org/</a>)</li>
<li>BlueMind <a href="https://www.bluemind.net/"></a>https://www.bluemind.net/</li>
<li>BlueMind <a href="https://www.bluemind.net/">https://www.bluemind.net/</a></li>
<li>ClearOS <a href="https://www.clearos.com/">https://www.clearos.com/</a> uses Cyrus as IMAP backend server.</li>
<li>CommuniGatePro server (Redhat 8.0) (Solaris), CommuniGate Pro 5.2.17[host2] (CentOS 5.4)
(<a href="http://www.communigate.com/">http://www.communigate.com/</a>) </li>
@ -108,6 +109,8 @@ imapsync --host1 imap.gmail.com
<li>Earthlink webhosting (<a href="https://www.earthlink.net/">https://www.earthlink.net/</a>) uses BigFoot imap server.</li>
<li>Emailchemy from weirdkid.com <a href="https://weirdkid.com/emailchemy/">https://weirdkid.com/emailchemy/</a>. Use option --noabletosearch </li>
<li>Eudora WorldMail v2 (<a href="http://www.eudora.com/worldmail/">http://www.eudora.com/worldmail/</a>) </li>
<li><b>Exchange Server</b> 5.5, 6.0.6249.0[host1], 6.0.6487.0[host1],
6.5.7638.1 [host2], 6.5 [host1], Exchange 2007 SP1 (with Update Rollup 2),
@ -117,17 +120,19 @@ imapsync --host1 imap.gmail.com
Exchange 2010 SP3 [host2],
(<a href="http://www.microsoft.com/exchange/">http://www.microsoft.com/exchange/</a>)
</li>
<li>FirtClass 12 [host1] hard so read the FAQ! (<a href="http://www.firstclass.com/">http://www.firstclass.com/</a>)</li>
<li>FirstClass 12 [host1]. FirstClass is hard to migrate so read the <a href="https://imapsync.lamiral.info/FAQ.d/FAQ.FirstClass.txt">FirtClass FAQ</a>! (<a href="http://www.firstclass.com/">http://www.firstclass.com/</a>)</li>
<li>FortiMail 100C in server mode [host1] (<a href="https://www.fortinet.com/products/application-security/fortimail.html">https://www.fortinet.com/.../fortimail.html</a>)</li>
<li>FTGate [host1][host2] (<a href="http://www.ftgate.com/">http://www.ftgate.com/</a>)</li>
<li>Fusemail imap.fusemail.net:143 (<a href="https://www.fusemail.com/">https://www.fusemail.com/</a>).</li>
<li><b>Gimap</b> (<b>Gmail</b> imap) [host1] [host2] (<a href="http://mail.google.com/">http://mail.google.com/</a>) </li>
<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>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>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]
(<a href="https://www.hmailserver.com/">https://www.hmailserver.com/</a>) </li>
<li>Hostgator, Hostgator imap server software is Dovecot. <a href="https://www.hostgator.com/">https://www.hostgator.com/</a></li>
<li><b>Hotmail</b> hotmail.com is outlook.com and live.com now.</li>
<li>IceWarp 10.4.5 [host1] 11.2.1.1 [host2] 11.4.1.0 [host2] (<a href="https://www.icewarp.com/">https://www.icewarp.com/</a>)</li>
<li>IdeaImapServer v0.80.1 [host1] </li>
@ -162,6 +167,8 @@ imapsync --host1 imap.gmail.com
<li>Perdition (<a href="https://projects.horms.net/projects/perdition/">https://projects.horms.net/projects/perdition/</a></li>
<li>PowerMail (French Email provider) (<a href="https://www.powermail.fr/">https://www.powermail.fr/</a></li>
<li>ProtoMail [host1] (<a href="https://protonmail.com/">https://protonmail.com/</a></li>
<li>Qualcomm Worldmail (NT) (<a href="http://www.eudora.com/worldmail/">http://www.eudora.com/worldmail/</a>) </li>
@ -182,6 +189,7 @@ imapsync --host1 imap.gmail.com
(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>
<li>VMS, Imap part of TCP/IP suite of VMS 7.3.2 (<a href="https://www.vmssoftware.com/">https://www.vmssoftware.com/</a>) </li>
<li>Amazon WorkMail (<a href="https://aws.amazon.com/fr/workmail/">https://aws.amazon.com/fr/workmail/</a>)</li>
<li>Xeams/Synametrics (<a href="http://www.xeams.com/">http://www.xeams.com/</a>) </li>
<li><b>Yahoo</b> [host1] (<a href="http://www.yahoo.com/">http://www.yahoo.com/</a>) </li>
<li>Zarafa 6,40,0,20653 [host1] (<a href="http://www.zarafa.com/">http://www.zarafa.com/</a>) </li>
@ -238,7 +246,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.44 2019/12/02 23:51:12 gilles Exp gilles $)<br/>
($Id: imapservers.shtml,v 1.56 2021/06/08 09:56:54 gilles Exp gilles $)<br/>
<a href="#TOP">Top of the page</a>
</p>

View file

@ -1,99 +1,100 @@
1 Arabie_Saoudite_________ 0.01 % 100 % 0 % 98
1 Bahrein_________________ 0.01 % 100 % 0 % 97
1 Bolivie_________________ 0.01 % 100 % 0 % 96
1 Bosnie-Herzegovine______ 0.01 % 100 % 0 % 95
1 Burkina_Faso____________ 0.01 % 100 % 0 % 94
1 Cameroun________________ 0.01 % 100 % 0 % 93
1 Coree_du_Sud____________ 0.01 % 100 % 0 % 92
1 Grenade_________________ 0.01 % 100 % 0 % 91
1 Ile_Maurice_____________ 0.01 % 100 % 0 % 90
1 Iles_Feroe______________ 0.01 % 100 % 0 % 89
1 Iles_Vierges_britanniques__ 0.01 % 100 % 0 % 88
1 Jamaique________________ 0.01 % 100 % 0 % 87
1 Jordanie________________ 0.01 % 100 % 0 % 86
1 Koweit__________________ 0.01 % 100 % 0 % 85
1 Maldives________________ 0.01 % 100 % 0 % 84
1 Moldavie________________ 0.01 % 100 % 0 % 83
1 Monaco__________________ 0.01 % 100 % 0 % 82
1 Mongolie________________ 0.01 % 100 % 0 % 81
1 Namibie_________________ 0.01 % 100 % 0 % 80
1 Panama__________________ 0.01 % 100 % 0 % 79
1 Qatar___________________ 0.01 % 100 % 0 % 78
1 Republique_d'Azerbaidjan__ 0.01 % 100 % 0 % 77
1 Saint_Christophe-Nevis-Anguilla__ 0.01 % 100 % 0 % 76
1 Senegal_________________ 0.01 % 100 % 0 % 75
1 Tanzanie________________ 0.01 % 100 % 0 % 74
1 Trinite-et-Tobago_______ 0.01 % 100 % 0 % 73
2 Albanie_________________ 0.03 % 100 % 0 % 72
2 Antilles_neerlandaises__ 0.03 % 100 % 0 % 71
2 Colombie________________ 0.03 % 100 % 0 % 70
2 Costa_Rica______________ 0.03 % 100 % 0 % 69
2 Isra 0.03 % 100 % 0 % 68
2 Maroc___________________ 0.03 % 100 % 0 % 67
2 Nouvelle-Caledonie______ 0.03 % 99 % 1 % 66
2 Perou___________________ 0.03 % 99 % 1 % 65
2 Taiwan__________________ 0.03 % 99 % 1 % 64
2 Ukraine_________________ 0.03 % 99 % 1 % 63
3 Nigeria_________________ 0.04 % 99 % 1 % 62
3 Uruguay_________________ 0.04 % 99 % 1 % 61
3 Venezuela_______________ 0.04 % 99 % 1 % 60
4 Indonesie_______________ 0.06 % 99 % 1 % 59
4 Philippines_____________ 0.06 % 99 % 1 % 58
4 Russie,_Federation______ 0.06 % 99 % 1 % 57
4 Serbie__________________ 0.06 % 99 % 1 % 56
4 Turquie_________________ 0.06 % 99 % 1 % 55
4 Vietnam_________________ 0.06 % 99 % 1 % 54
5 Bulgarie________________ 0.07 % 99 % 1 % 53
5 Egypte__________________ 0.07 % 99 % 1 % 52
5 Ireland_________________ 0.07 % 99 % 1 % 51
5 Lituanie________________ 0.07 % 99 % 1 % 50
6 Malte___________________ 0.08 % 99 % 1 % 49
7 Chypre__________________ 0.10 % 99 % 1 % 48
7 Estonie_________________ 0.10 % 98 % 2 % 47
7 Islande_________________ 0.10 % 98 % 2 % 46
10 Croatie_________________ 0.14 % 98 % 2 % 45
10 Emirats_Arabes_Unis_____ 0.14 % 98 % 2 % 44
10 Lettonie________________ 0.14 % 98 % 2 % 43
10 Thailande_______________ 0.14 % 98 % 2 % 42
13 Israel__________________ 0.18 % 98 % 2 % 41
16 Chine___________________ 0.22 % 98 % 2 % 40
16 Luxembourg______________ 0.22 % 97 % 3 % 39
17 Argentine_______________ 0.23 % 97 % 3 % 38
17 Malaisie________________ 0.23 % 97 % 3 % 37
17 Singapour_______________ 0.23 % 97 % 3 % 36
18 Chili___________________ 0.25 % 96 % 4 % 35
19 Mexique_________________ 0.26 % 96 % 4 % 34
19 Slovenie________________ 0.26 % 96 % 4 % 33
21 Slovaquie_______________ 0.29 % 96 % 4 % 32
23 Inde____________________ 0.32 % 95 % 5 % 31
24 Irlande_________________ 0.33 % 95 % 5 % 30
24 Roumanie________________ 0.33 % 95 % 5 % 29
25 Grece___________________ 0.34 % 94 % 6 % 28
25 Hong-Kong_______________ 0.34 % 94 % 6 % 27
27 Afrique_du_Sud__________ 0.37 % 94 % 6 % 26
31 Russie__________________ 0.43 % 93 % 7 % 25
32 Japon___________________ 0.44 % 93 % 7 % 24
33 Nouvelle-Zelande________ 0.45 % 92 % 8 % 23
34 Portugal________________ 0.47 % 92 % 8 % 22
37 Hongrie_________________ 0.51 % 92 % 8 % 21
40 ________________________ 0.55 % 91 % 9 % 20
51 Finlande________________ 0.70 % 90 % 10 % 19
52 Norvege_________________ 0.72 % 90 % 10 % 18
54 Republique_tcheque______ 0.74 % 89 % 11 % 17
67 Bresil__________________ 0.92 % 88 % 12 % 16
86 Pologne_________________ 1.18 % 87 % 13 % 15
96 Danemark________________ 1.32 % 86 % 14 % 14
115 Suede___________________ 1.58 % 85 % 15 % 13
117 Belgique________________ 1.61 % 83 % 17 % 12
155 Espagne_________________ 2.13 % 82 % 18 % 11
175 Autriche________________ 2.41 % 80 % 20 % 10
233 Australie_______________ 3.21 % 77 % 23 % 9
280 Suisse__________________ 3.85 % 74 % 26 % 8
296 Canada__________________ 4.07 % 70 % 30 % 7
316 Pays-Bas________________ 4.35 % 66 % 34 % 6
362 France__________________ 4.98 % 62 % 38 % 5
445 Italie__________________ 6.12 % 57 % 43 % 4
654 Royaume-Uni_____________ 9.00 % 51 % 49 % 3
1427 Allemagne_______________ 19.63 % 42 % 58 % 2
1594 Etats-Unis______________ 21.93 % 22 % 78 % 1
TOTAL = 7269 sales 360271 EUR over 98 countries on Fri Jan 3 23:44:21 CET 2020
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

View file

@ -4,11 +4,9 @@
<head>
<meta http-equiv="content-type" content="application/xhtml+xml; charset=UTF-8" />
<title>Imapsync News</title>
<meta content="Bluefish 2.2.2" name="generator" />
<meta content="Gilles LAMIRAL" name="author" />
<meta content="2016-01-22T01:56:39+0100" name="date" />
<meta content="None" name="copyright" />
<meta content="imap, transfer, migration, synchronization" name="keywords" />
<meta content="imapsync, imap, transfer, migration, synchronization" name="keywords" />
<meta content="imap migration tool" name="description" />
@ -30,72 +28,151 @@
next and previous releases <a href="../#TOP" id="latest"><small>(back to menu)</small></a>
</h1>
<p>imapsync <!--#exec cmd="cat ../VERSION" --> was written on <!--#flastmod file="VERSION" -->
</p>
<p>See <b><a href="../ChangeLog">ChangeLog</a></b> to read what has been done in details since 2001.</p>
<p>New features or bugfixes since previous releases:</p>
<h2>Roadmap</h2>
<!--
<ul>
<li><b>Roadmap</b>: </li>
</ul>
-->
<ul>
<li><b>1.964</b></li>
<li><b>Dependencies removed</b>: </li>
<li><b>Dependencies added</b>: Perl modules </li>
<p>
If you are very interrested in those projects, don't hesitate to solicit me!
</p>
<li><b>Enhancement</b>: </li>
<li><b>Enhancement</b>: </li>
<li><b>Enhancement</b>: </li>
<li><b>Enhancement</b>: </li>
<li><b>Enhancement</b>: </li>
<li><b>Usability</b>: </li>
<li><b>Usability</b>: </li>
<li><b>Usability</b>: </li>
<li><b>Usability</b>: </li>
<li><b>Usability</b>: </li>
<li><b>Usability</b>: </li>
<li><b>Usability</b>: </li>
<li><b>Bug fix</b>: </li>
<li><b>Bug fix</b>: </li>
<li><b>Bug fix</b>: </li>
<li><b>Bug fix</b>: </li>
<li><b>Bug fix</b>: </li>
<li><b>Bug fix</b>: </li>
<li><b>Refactoring</b>: </li>
<li><b>Refactoring</b>: </li>
<li><b>Refactoring</b>: </li>
<li><b>Refactoring</b>: </li>
<li><b>Security</b>: </li>
<li><b>Security</b>: </li>
<li><b>Portability</b>: </li>
<li><b>Portability</b>: </li>
</ul>
-->
<ul>
<li><b>Roadmap</b>: Build a docker image including everything, to have a complete online /X in a single command.</li>
<li><b>Roadmap</b>: Or better: Include a webserver in imapsync to have an online /X integrated.</li>
<li><b>Roadmap</b>: Or better: Include a webserver in imapsync to have an online /X integrated. (NB: proof of concept already coded and working)</li>
<li><b>Roadmap</b>: Add the sync of multiple accounts inside imapsync itself instead of via an external shell script doing the loop from a csv file.</li>
<li><b>Roadmap</b>: Build an online tool, like /X, for multiple accounts at once. (NB: proof of concept already coded and working)</li>
</ul>
<h2>New features or bugfixes since previous releases:</h2>
<p>imapsync <!--#exec cmd="cat ../VERSION" --> was written on <!--#flastmod file="VERSION" -->
</p>
<p>See <b><a href="../ChangeLog">ChangeLog</a></b> to read what has been done in details since 2001.</p>
<!--
<ul>
<li><b>2.xxx</b></li>
<li><b>General</b>: </li>
<li><b>Dependencies removed</b>: None </li>
<li><b>Dependencies added</b>: None </li>
<li><b>Enhancement</b>: </li>
<li><b>Enhancement</b>: </li>
<li><b>Usability</b>: </li>
<li><b>Usability</b>: </li>
<li><b>Bug fix</b>: </li>
<li><b>Bug fix</b>: </li>
<li><b>Refactoring</b>: </li>
<li><b>Refactoring</b>: </li>
<li><b>Security</b>: </li>
<li><b>Security</b>: </li>
<li><b>Portability</b>: </li>
<li><b>Portability</b>: </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>
<li><b>Dependencies removed</b>: None</li>
<li><b>Dependencies added</b>: None</li>
<li><b>Enhancement</b>: Check if SEARCH ALL works on both accounts and then add --noabletosearch if one can not. Use --nochecknoabletosearch to avoid that behavior.</li>
<li><b>Enhancement</b>: Added an analyse and classification of the errors encountered.
Most common error encountered is printed at the end.
Exit value 112 (EXIT_WITH_ERRORS_MAX) is now replaced by the most common error encountered exit value:
<pre>
EX_OK => 0 ; #/* successful termination */
EX_USAGE => 64 ; #/* command line usage error */
EX_NOINPUT => 66 ; #/* cannot open input */
EX_UNAVAILABLE => 69 ; #/* service unavailable */
EX_SOFTWARE => 70 ; #/* internal software error */
EXIT_CATCH_ALL => 1 ; # Any other error
EXIT_BY_SIGNAL => 6 ; # Should be 128+n where n is the sig_num
EXIT_BY_FILE => 7 ;
EXIT_PID_FILE_ERROR => 8 ;
EXIT_CONNECTION_FAILURE => 10 ;
EXIT_TLS_FAILURE => 12 ;
EXIT_AUTHENTICATION_FAILURE => 16 ;
EXIT_SUBFOLDER1_NO_EXISTS => 21 ;
EXIT_WITH_ERRORS => 111 ;
EXIT_WITH_ERRORS_MAX => 112 ;
EXIT_OVERQUOTA => 113 ;
EXIT_ERR_APPEND => 114 ;
EXIT_ERR_FETCH => 115 ;
EXIT_ERR_CREATE => 116 ;
EXIT_ERR_SELECT => 117 ;
EXIT_TRANSFER_EXCEEDED => 118 ;
EXIT_ERR_APPEND_VIRUS => 119 ;
EXIT_TESTS_FAILED => 254 ; # Like Test::More API
EXIT_CONNECTION_FAILURE_HOST1 => 101 ;
EXIT_CONNECTION_FAILURE_HOST2 => 102 ;
EXIT_AUTHENTICATION_FAILURE_USER1 => 161 ;
EXIT_AUTHENTICATION_FAILURE_USER2 => 162 ;
</pre>
</li>
<li><b>Enhancement</b>: Added option --dry1 it avoids to fetch the message on host1 in --dry mode. Option --dry1 is on when --dry is on.
It speeds up --dry very much. To get the old --dry behavior, use --dry --nodry1</li>
<li><b>Enhancement</b>: Do both sides login and authentication before exiting on failure.</li>
<li><b>Enhancement</b>: --timeout can now be a float (was only integer). Same for --timeout1 --timeout2</li>
<li><b>Enhancement</b>: Added option --syncduplicates to sync duplicates. On by default in CGI context. Off by default on command line.</li>
<li><b>Enhancement</b>: Added option --trylogin. After a login failure of any kind, imapsync tries to login
with the LOGIN command. Use --notrylogin to avoid that. --trylogin is on by default.
</li>
<li><b>Enhancement</b>: Added options --oauthaccesstoken1 and --oauthaccesstoken2 to support OAUTH2 authentication.</li>
<li><b>Enhancement</b>: Added options --oauthdirect1 and --oauthdirect2 to support OAUTH2 authentication.</li>
<li><b>Enhancement</b>: Added statistic line "CPU time and %cpu".
Example: "CPU time and %cpu : 9.2 sec 39.8 %cpu 19.9 %allcpus".</li>
<li><b>Enhancement</b>: Added option --filterbuggyflags to filter flags known to be buggy and
generators of errors "BAD Invalid system flag" or "NO APPEND Invalid flag list".</li>
<li><b>CGI context</b>: Back from Message-Id to Message-Id Received in cgisetcontext</li>
<li><b>CGI context</b>: In CGI context, the log directory is no longer ./LOG_imapsync/ but simply ./ It should fasten the searches and grep</li>
<li><b>CGI context</b>: Added --loglogfile option. Append ../list_all_logs_auto.txt with the logfile name. On by default in CGI context.</li>
<li><b>Usability</b>: Changed time presentation on ETA and in final stats. Example: Wednesday 16 June 2021-06-16 00:32:05 +0200 CEST</li>
<li><b>Usability</b>: Do not check selectable folders for huge accounts with more than 152 folders, 98 percentile of /X;
It could be very long and ended up with some users transformed in stone just by staring at the fixed output.</li>
<li><b>Bug fix</b>: The number of detected cpus (cores) was accurate only on Linux. Added Freebsd and fixed Darwin and Windows parts.</li>
<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>
<ul>
<li><b>1.977</b></li>
<li><b>Dependencies removed</b>: None.</li>
<li><b>Dependencies added</b>: Perl modules Encode::IMAPUTF7</li>
<li><b>Windows</b>: imapsync.exe is now 64 bits (it was a 32bit binary before).
If you use an old 32bit PC, use imapsync_32bit.exe instead.
</li>
<li><b>Enhancement</b>: Folders sizes are now presented per folder for host1 and host2,
as well as the differrences between them.
Comparing folders is now easier</li>
@ -877,7 +954,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.74 2020/01/01 21:07:13 gilles Exp gilles $)<br />
($Id: news.shtml,v 1.78 2021/07/05 20:22:15 gilles Exp gilles $)<br />
<a href="#TOP">Top of the page</a>
</p>
</body></html>

View file

@ -3,9 +3,8 @@
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>imapsync download</title>
<title>Imapsync download</title>
<meta name="author" content="Gilles LAMIRAL" />
<meta name="date" content="2016-08-16T19:20:38+0200" />
<meta name="copyright" content="None"/>
<meta name="keywords" content=""/>
<meta name="description" content=""/>
@ -14,63 +13,59 @@
<meta http-equiv="content-type" content="application/xhtml+xml; charset=UTF-8"/>
<meta http-equiv="content-style-type" content="text/css"/>
<meta http-equiv="expires" content="0"/>
<link rel="icon" type="image/png" href="S/images/logo_imapsync_s.png" />
<style type="text/css">
body {
color: black;
background-color: #ccdddd
}
div.center {
text-align: center;
}
img{
border:0px;
}
</style>
<link rel="canonical" href="https://imapsync.lamiral.info/" />
<link rel="icon" href="S/images/logo_imapsync_s.png" type="image/png" />
<link rel="apple-touch-icon" href="S/images/logo_imapsync_s.png" type="image/png" />
<link rel="stylesheet" href="S/style.css" type="text/css" />
<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" />
-->
</head>
<body>
<h1>imapsync download</h1>
<h1>Imapsync download</h1>
<p><b>I thank you for buying Imapsync!</b></p>
<p><b>I thank you very much for buying Imapsync!</b></p>
<p>The payment has been made and the transaction has been completed.<br/>
A receipt for your purchase has been emailed to you.<br/>
<p>The payment is done and the transaction is completed.<br/>
A receipt for your purchase was emailed to you.<br/>
You may log into your account at <a href="http://www.paypal.com/">www.paypal.com</a>
to view details of this transaction (if you have a Paypal account).
</p>
<p>You will find <b>imapsync</b> release <!--#exec cmd="cat ../VERSION" --> at this
<a href="../dist2/"><b>download page</b></a>.
<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>.
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>
release <!--#exec cmd="cat ../VERSION" --> on this <a href="../dist2/"><b>download page</b></a>.
</p>
<p>
Next step is imapsync <a href="../#install" >installation</a>
and then your first runs following the <a href="../#doc" >tutorial</a>.
The next step for you is reading and following the imapsync <a href="../#install" >installation</a>
process and then doing your first syncs following the <a href="../#doc" >tutorial</a>.
</p>
<p>You will receive an invoice soon, in a couple of weeks at the worst.
<p>You will <b>receive an invoice soon</b>, in a couple of weeks at the worst.
Ask for it if you need it before.</p>
<p>Next imapsync releases will be available to you for lifetime without extra payment.<br/>
<p>Next imapsync releases will be available to you <b>for a lifetime without extra payment</b>.<br/>
This current page will be updated to reflect the latest release of imapsync.<br/>
You will be soon subscribed to the newsletter announcing new imapsync releases and services (and only that).</p>
<p>For <b>professional support</b>, in order to explain your <b>specific needs</b>,
find <b>best solutions</b> for them, <b>avoid loosing time</b>,
<p>For <b>professional support</b>, to explain your <b>specific needs</b>,
find the <b>best solutions</b> for them, <b>avoid losing time</b>,
and <b>succeed</b> your migration in the best conditions, <b>contact me</b>
(Gilles LAMIRAL) by email or phone at:</p>
(Gilles LAMIRAL) by preferably email or phone at:</p>
<ul>
<li>Email address: <b>gilles@lamiral.info</b>.</li>
<li>Professional phone number: <b>+33 9 51 84 42 42</b> (in France) I can <b>call you back</b> toll-free in many countries.</li>
@ -82,7 +77,7 @@ and <b>succeed</b> your migration in the best conditions, <b>contact me</b>
<p><b>I thank you</b> again for buying and using imapsync,<br/>
<b>I wish you successful imap transfers!</b></p>
<p>Back to <a href="../">imapsync homepage</a>.
<p>Back to the <a href="../">imapsync homepage</a>.
</p>
<p><b>Gilles LAMIRAL</b><br/>
@ -102,14 +97,12 @@ src="S/images/valid-xhtml10"
<img
alt="CSS Valide !"
src="S/images/vcss-blue"
style="border:0;width:88px;height:31px"
/></a>
<a href="https://www.anybrowser.org/campaign/">
<img
alt="Viewable With Any Browser"
src="S/images/ab_jlh.png"
style="border:0;width:88px;height:31px"
/></a>
</p>
@ -119,23 +112,15 @@ style="border:0;width:88px;height:31px"
<!--#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.36 2018/06/11 22:35:57 gilles Exp gilles $)
($Id: paypal_return.shtml,v 1.39 2020/10/13 16:25:09 gilles Exp gilles $)
</p>
<!-- Google Code for Achat imapsync Conversion Page -->
<script type="text/javascript">
/* <![CDATA[ */
var google_conversion_id = 992916412;
var google_conversion_language = "en";
var google_conversion_format = "2";
var google_conversion_color = "ffffff";
var google_conversion_label = "hVVWCKzApQIQvOe62QM";
var google_conversion_value = "USD 1.00";
var google_conversion_currency = "USD";
var google_remarketing_only = false;
/* ]]> */
<script type="text/javascript" src="S/conversion_data.js">
</script>
<script type="text/javascript" src="//www.googleadservices.com/pagead/conversion.js">
</script>
<noscript>
<div style="display:inline;">
<img height="1" width="1" style="border-style:none;" alt="" src="//www.googleadservices.com/pagead/conversion/992916412/?value=1.00&amp;currency_code=USD&amp;label=hVVWCKzApQIQvOe62QM&amp;guid=ON&amp;script=0"/>

View file

@ -1,5 +1,5 @@
/* $Id: style.css,v 1.14 2018/06/12 09:30:13 gilles Exp gilles $ */
/* $Id: style.css,v 1.16 2020/06/17 05:13:27 gilles Exp gilles $ */
/* http://www.w3schools.com/html/html5_browsers.asp */
@ -30,29 +30,15 @@ body {
width: 60%;
}
}
@media screen and ( min-width: 1280px ) {
#left-menu {
float: left;
width: 40%;
}
#centered-logo {
float: left;
width: 60%;
}
}
@media screen and ( min-width: 960px ) {
div.list {
display: inline-block;
vertical-align: top;
}
}
div.poll {
display: inline-block;
vertical-align: top;
@ -99,3 +85,61 @@ select {
font-size: larger;
}
/*!
* LaTeX.css (https://latex.now.sh/)
*
* Source: https://github.com/vincentdoerig/latex-css
* Licensed under MIT (https://github.com/vincentdoerig/latex-css/blob/master/LICENSE)
*/
@font-face {
font-family: 'Latin Modern';
font-style: normal;
font-weight: normal;
font-display: swap;
src: url('./fonts/LM-regular.woff2') format('woff2'),
url('./fonts/LM-regular.woff') format('woff'),
url('./fonts/LM-regular.ttf') format('truetype');
}
@font-face {
font-family: 'Latin Modern';
font-style: italic;
font-weight: normal;
font-display: swap;
src: url('./fonts/LM-italic.woff2') format('woff2'),
url('./fonts/LM-italic.woff') format('woff'),
url('./fonts/LM-italic.ttf') format('truetype');
}
@font-face {
font-family: 'Latin Modern';
font-style: normal;
font-weight: bold;
font-display: swap;
src: url('./fonts/LM-bold.woff2') format('woff2'),
url('./fonts/LM-bold.woff') format('woff'),
url('./fonts/LM-bold.ttf') format('truetype');
}
@font-face {
font-family: 'Latin Modern';
font-style: italic;
font-weight: bold;
font-display: swap;
src: url('./fonts/LM-bold-italic.woff2') format('woff2'),
url('./fonts/LM-bold-italic.woff') format('woff'),
url('./fonts/LM-bold-italic.ttf') format('truetype');
}
body {
/* I'm not very satisfied with the rendering of Computer Modern when browsing
so I comment it for now.
*/
/* font-family: 'Latin Modern', serif;
*/
}

View file

@ -39,7 +39,7 @@ http://www.w3schools.com/html/html5_browsers.asp
</h1>
<p>Please read these terms and conditions carefully before using Our Service.
<p>Please read these terms and conditions carefully before using My Service.
</p>
<h1>Interpretation and Definitions</h1>
@ -133,8 +133,6 @@ Please read Our <a href="privacy_policy.shtml">Privacy Policy</a>
carefully before using Our Service.
</p>
<h1>Links to Other Websites</h1>
<p>
@ -400,7 +398,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: terms_and_conditions.shtml,v 1.2 2019/12/23 15:57:00 gilles Exp gilles $)<br>
($Id: terms_and_conditions.shtml,v 1.3 2020/02/14 21:41:12 gilles Exp gilles $)<br>
<a href="#TOP">Top of the page</a>
</p>
</footer>

217
TODO
View file

@ -1,5 +1,5 @@
#!/bin/cat
# $Id: TODO,v 1.230 2020/01/03 22:39:22 gilles Exp gilles $
# $Id: TODO,v 1.257 2021/07/05 20:19:31 gilles Exp gilles $
This documentation is also at http://imapsync.lamiral.info/#doc
@ -7,6 +7,177 @@ This documentation is also at http://imapsync.lamiral.info/#doc
TODO file for imapsync
----------------------
https://imapsync.lamiral.info/TODO
SUGGESTED 2021_05_29 on github https://github.com/imapsync/imapsync/issues/78
ripmime https://github.com/inflex/ripMIME
altermime http://pldaniels.com/altermime/
SUGGESTED 2021_05_29 by Gilles
Add --regexbody --regexheader, similar to --regexmess
Hum hum, time goes by:
SUGGESTED 2016_06_09 by Gilles and David Carter
In order to avoid useless headaches from --regexmess, add
--regexheader
--regexbody
SUGGESTED 2021_01_26 by Gilles and Martin L. R. @duelhost.dk
I am trying to move some e-mail using imapsync but the domain I'm moving
to have the Danish "ø"-character which it doesn't seem like imapsync can handle.
Make a functional test of this scenario.
SUGGESTED 2021_01_26 by Gilles and Mike
https://github.com/imapsync/imapsync/pull/266
Maybe Gmail has changed and that currently "All Mail" really contains all emails
with all the labels well set to do a good Gmail to Gmail sync but I have to
investigate on that.
SUGGESTED 2020_12_11 by Gilles
Look at XAPPLEPUSHSERVICE for iCloud imap service Apple (Is it Dovecot masquerade?)
SUGGESTED 2020_12_11 by Gilles
Check my Office365 account (outlook.com) and play with the configuration
to still allow imap with imapsync. It already works but it is an old account.
It looks like new O365 accounts are less likely to allow basic LOGIN imap
with a password.
SUGGESTED 2020_12_11 byTimo Smit
Allow the syntax --host1 "example.com/Sent"
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
the name.
SUGGESTED 2020_11_24 by Gilles
On Centos 8 SELinux is blocking imapsync online /X by default.
Dig into this to find the commands that will allow only the online /X service.
Instead of:
sestatus
setenforce 0
sestatus
SUGGESTED 2020_11_21 by Mike Alexander https://github.com/mtalexander and Wittmer, Christian https://github.com/computersalat
Make a "make github" target in Makefile and add an automatic
git tag 1.977 # (not 1.977 of course, the actual release number)
https://github.com/imapsync/imapsync/issues/156
https://github.com/imapsync/imapsync/issues/251
SUGGESTED 2020_11_01 bilogic
How to uninstalled cpanm modules installed by cpanm and installed by
perl -Mlazy imapsync
https://github.com/imapsync/imapsync/issues/211#issuecomment-719889417
SUGGESTED 2020_11_04 by Tim O (and others before)
Add an option to sync newest emails first.
SUGGESTED 2020_10_15 by Alexander Perlis
Bugfix. With --delete1 duplicate messages on host1 are deleted only
one at a time, one at each run. Imapsync should delete them all on first pass.
Add --delete1duplicates
SUGGESTED 2020_09_22 by Jon Ward
--idatefromreceivedheader
As I thought about how this option works, I wondered if it makes more sense to
use the date from the final RECEIVED header rather than the DATE header?
This seems like a better solution since it avoids the case of wrong or
spoofed times in the DATE header.
Also, I would guess that in most cases the final RECEIVED header is for
the closest server (to me) and is probably the most correct date/time.
SUGGESTED 2020_09_17 by Peter Franken
I found a bug:
If I use the parameters "--subfolder1 Sent/2017 --subfolder2 Sent/2017",
the mails from "Sent/2017" on Host 1 are transferred to "Sent/2017/INBOX" on Host 2.
==============================================================================
OAUTH2 requests
Readings
https://developers.google.com/identity/protocols/oauth2
https://www.oauth.com/oauth2-servers/client-registration/client-id-secret/
https://unix.stackexchange.com/questions/495691/how-to-provide-oauth2-client-id-and-client-secret-to-an-open-source-bash-scr
https://stackoverflow.com/questions/64150126/best-practice-for-open-source-applications-using-imap-with-oauth2-regarding-cred
SUGGESTED 05/12/2020 by David Carter
https://massivescale.com/microsoft-v2-endpoint-primer/
A big complication is https://docs.microsoft.com/en-us/exchange/client-developer/legacy-protocols/how-to-authenticate-an-imap-pop-smtp-application-by-using-oauth :
"Get an access token
... you can select an appropriate flow from the following list and follow the corresponding steps to call the underlying identity platform REST APIs and retrieve an access token.
OAuth2 authorization code flow
OAuth2 Device authorization grant flow
OAuth access to IMAP, POP, SMTP AUTH protocols via OAuth2 client credentials grant flow is not supported."
SUGGESTED 2020_10_15 by Alexander Perlis
https://gitlab.com/muttmua/mutt/-/blob/master/contrib/mutt_oauth2.py.README
https://gitlab.com/muttmua/mutt/-/blob/master/contrib/mutt_oauth2.py
SUGGESTED 2020_09_10 by Joe Rizzo
I can follow these instructions and authenticate to imap.
Is there a way I can use the access token generated by this process to authenticate with imapsync?
https://github.com/google/gmail-oauth2-tools/wiki/OAuth2DotPyRunThrough
$ python2.7 oauth2.py --test_imap_authentication --access_token=XXXX --user=user@domain.com
35:05.38 > CCPK1 AUTHENTICATE XOAUTH2
35:05.39 < +
35:05.39 write literal size 276
35:05.46 < * CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 UIDPLUS COMPRESS=DEFLATE ENABLE MOVE CONDSTORE ESEARCH UTF8=ACCEPT LIST-EXTENDED LIST-STATUS LITERAL- SPECIAL-USE APPENDLIMIT=35651584
35:05.46 < CCPK1 OK user@domain.com authenticated (Success)
SUGGESTED 2021_01_07 by many people
Add OAUTH2 individual to Gmail and Office365
http://vdirsyncer.pimutils.org/en/stable/config.html#google
Office365:
https://techcommunity.microsoft.com/t5/exchange-team-blog/announcing-oauth-2-0-support-for-imap-and-smtp-auth-protocols-in/ba-p/1330432
https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow
https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-device-code
SUGGESTED on 31 Jan 2017 by tibbsbrookside
Try this code XOAUTH2
https://github.com/imapsync/imapsync/issues/87#issuecomment-276298841
End of OAUTH2 requests
==============================================================================
SUGGESTED 2020_04_16 by Gilles and tom@mklab
Reinvestigate the memory issue for huge folder with
326691 messages in them. It sounds that imapsync
take 2.5 Ko memory per message.
Trace memory consumption by message.
SUGGESTED 2020_04_23 by Gabriel
Folders Size human readable
une option pour avoir la taille des dossiers individuels en MB,
lors de l'utilisation de --justfoldersizes ?
SUGGESTED 2020_03_02 by https://github.com/gpothier
https://github.com/imapsync/imapsync/issues/27#issuecomment-593425945
Bugfix. Do fail when --minage or --maxage are employed with --search
Or make them be consistent, ie, do an AND between them.
Or at least document the bad current behavior which is that
--search overrides any --minage or --maxage
SUGGESTED 2020_01_03 by Gilles
Bugfix. When running ./imapsync --tests --testslive
@ -88,29 +259,26 @@ and update this status file every few seconds, so any application
can access it and see what's going on with this process without
parsing logs or keeping up with the log format when it changes.
Example of such status file would be:
In progress
In good progress
{
"status": "In progress",
"status": "in progress",
"progress": "245/5000",
"Message": "",
"Debug": "",
"Process ID": "pid123456"
}
On error example
{
"status": "Fail",
"progress": "245/5000",
"Message": "ERRCODE:123",
"Debug": "LOG_imapsync/2019_09_22_09_01_42_058_abc@example.com_JDoe@example.com.txt",
"Process ID": "pid123456"
"message_rate":"7.06 msgs/s",
"bandwidth_rate":"2.801 KiB/s",
"errors_count": "0",
"logfile": "LOG_imapsync/2019_09_22_09_01_42_058_abc@example.com_JDoe@example.com.txt",
"pid": "123456",
"exit_value": ""
}
On complete example*
{
"status": "Completed",
"status": "finished",
"progress": "5000/5000",
"Message": "",
"Debug": "LOG_imapsync/2019_09_22_09_01_42_058_abc@example.com_JDoe@example.com.txt",
"Process ID": ""
"logfile": "LOG_imapsync/2019_09_22_09_01_42_058_abc@example.com_JDoe@example.com.txt",
"pid": ""
"exit_value": "0"
}
@ -138,10 +306,6 @@ ks5 should be ok: Server Version: Apache/2.4.33 (FreeBSD)
SUGGESTED on 31 Jan 2017 by tibbsbrookside
Try this code XOAUTH2
https://github.com/imapsync/imapsync/issues/87#issuecomment-276298841
SUGGESTED 2019_06_18 by Konrad Wawryn
Add NTLMv2 support
@ -318,10 +482,6 @@ DONE * 420 perlcritic violations of CodeLayout::ProhibitParensWithBuiltins. "Bui
SUGGESTED 2016_06_09 by Gilles and David Carter
In order to avoid useless headaches from --regexmess, add
--regexheader
--regexbody
SUGGESTED 2016_06_09 by David Carter
Add --pipemess-on-fail
@ -536,6 +696,11 @@ http://asg.web.cmu.edu/cyrus/download/imapd/altnamespace.html
Now the TODO done! (or not)
===========================================================================
DONE 2021/04/30 revision 2.111 by Gilles
SUGGESTED 2021_04_22 by popular request
Add an option --syncduplicates that syncs duplicates.
DONE 2019/12/16 revision 1.974 by Gilles
Use Debug_fh to set where go the --debugimap outputs.
SUGGESTED 2017_09_04 by Gilles

View file

@ -1 +1 @@
1.977
2.140

View file

@ -1,759 +0,0 @@
1287414970 BEGIN 1.359 : lundi 18 octobre 2010, 17:16:10 (UTC+0200)
1287415485 END 1.359 : lundi 18 octobre 2010, 17:24:45 (UTC+0200)
1287529537 BEGIN 1.361 : mercredi 20 octobre 2010, 01:05:37 (UTC+0200)
1287530365 END 1.361 : mercredi 20 octobre 2010, 01:19:25 (UTC+0200)
1287959962 BEGIN 1.363 : lundi 25 octobre 2010, 00:39:22 (UTC+0200)
1287961164 END 1.363 : lundi 25 octobre 2010, 00:59:24 (UTC+0200)
1288000749 BEGIN 1.364 : lundi 25 octobre 2010, 11:59:09 (UTC+0200)
1288001592 END 1.364 : lundi 25 octobre 2010, 12:13:12 (UTC+0200)
1288007381 BEGIN 1.365 : lundi 25 octobre 2010, 13:49:41 (UTC+0200)
1288008514 END 1.365 : lundi 25 octobre 2010, 14:08:34 (UTC+0200)
1288027748 BEGIN 1.366 : lundi 25 octobre 2010, 19:29:08 (UTC+0200)
1288028635 END 1.366 : lundi 25 octobre 2010, 19:43:55 (UTC+0200)
1288393061 BEGIN 1.366 : samedi 30 octobre 2010, 00:57:41 (UTC+0200)
1288394122 END 1.366 : samedi 30 octobre 2010, 01:15:22 (UTC+0200)
1288441141 BEGIN 1.366 : samedi 30 octobre 2010, 14:19:01 (UTC+0200)
1288442098 END 1.366 : samedi 30 octobre 2010, 14:34:58 (UTC+0200)
1288672517 BEGIN 1.370 : mardi 2 novembre 2010, 05:35:17 (UTC+0100)
1288673466 END 1.370 : mardi 2 novembre 2010, 05:51:06 (UTC+0100)
1288749547 BEGIN 1.372 : mercredi 3 novembre 2010, 02:59:07 (UTC+0100)
1288750449 END 1.372 : mercredi 3 novembre 2010, 03:14:09 (UTC+0100)
1289173896 BEGIN 1.375 : lundi 8 novembre 2010, 00:51:36 (UTC+0100)
1289174968 END 1.375 : lundi 8 novembre 2010, 01:09:28 (UTC+0100)
1289267414 BEGIN 1.376 : mardi 9 novembre 2010, 02:50:14 (UTC+0100)
1289268358 END 1.376 : mardi 9 novembre 2010, 03:05:58 (UTC+0100)
1289268882 BEGIN 1.377 : mardi 9 novembre 2010, 03:14:42 (UTC+0100)
1289269805 END 1.377 : mardi 9 novembre 2010, 03:30:05 (UTC+0100)
1289530140 BEGIN 1.379 : vendredi 12 novembre 2010, 03:49:00 (UTC+0100)
1289530697 END 1.379 : vendredi 12 novembre 2010, 03:58:17 (UTC+0100)
1290919960 BEGIN 1.383 : dimanche 28 novembre 2010, 05:52:40 (UTC+0100)
1290920529 END 1.383 : dimanche 28 novembre 2010, 06:02:09 (UTC+0100)
1293675398 BEGIN 1.388 : jeudi 30 décembre 2010, 03:16:38 (UTC+0100)
1293675986 END 1.388 : jeudi 30 décembre 2010, 03:26:26 (UTC+0100)
1294638763 BEGIN 1.390 : lundi 10 janvier 2011, 06:52:43 (UTC+0100)
1294639451 END 1.390 : lundi 10 janvier 2011, 07:04:11 (UTC+0100)
1295319857 BEGIN 1.398 : mardi 18 janvier 2011, 04:04:17 (UTC+0100)
1295320425 END 1.398 : mardi 18 janvier 2011, 04:13:45 (UTC+0100)
1297861110 BEGIN 1.402 : mercredi 16 février 2011, 13:58:30 (UTC+0100)
1297861912 END 1.402 : mercredi 16 février 2011, 14:11:52 (UTC+0100)
1298253714 BEGIN 1.403 : lundi 21 février 2011, 03:01:54 (UTC+0100)
1298254508 END 1.403 : lundi 21 février 2011, 03:15:08 (UTC+0100)
1298255478 BEGIN 1.403 : lundi 21 février 2011, 03:31:18 (UTC+0100)
1298256141 END 1.403 : lundi 21 février 2011, 03:42:21 (UTC+0100)
1298260592 BEGIN 1.404 : lundi 21 février 2011, 04:56:32 (UTC+0100)
1298261452 END 1.404 : lundi 21 février 2011, 05:10:52 (UTC+0100)
1301848291 BEGIN 1.407 : dimanche 3 avril 2011, 18:31:31 (UTC+0200)
1301848906 END 1.407 : dimanche 3 avril 2011, 18:41:46 (UTC+0200)
1303254735 BEGIN 1.410 : mercredi 20 avril 2011, 01:12:15 (UTC+0200)
1303255348 END 1.410 : mercredi 20 avril 2011, 01:22:28 (UTC+0200)
1303256202 BEGIN 1.411 : mercredi 20 avril 2011, 01:36:42 (UTC+0200)
1303256792 END 1.411 : mercredi 20 avril 2011, 01:46:32 (UTC+0200)
1304002264 BEGIN 1.412 : jeudi 28 avril 2011, 16:51:04 (UTC+0200)
1304002897 END 1.412 : jeudi 28 avril 2011, 17:01:37 (UTC+0200)
1304123317 BEGIN 1.414 : samedi 30 avril 2011, 02:28:37 (UTC+0200)
1304123975 END 1.414 : samedi 30 avril 2011, 02:39:35 (UTC+0200)
1304213299 BEGIN 1.415 : dimanche 1 mai 2011, 03:28:19 (UTC+0200)
1304213991 END 1.415 : dimanche 1 mai 2011, 03:39:51 (UTC+0200)
1304611981 BEGIN 1.417 : jeudi 5 mai 2011, 18:13:01 (UTC+0200)
1304612684 END 1.417 : jeudi 5 mai 2011, 18:24:44 (UTC+0200)
1304816113 BEGIN 1.420 : dimanche 8 mai 2011, 02:55:13 (UTC+0200)
1304816775 END 1.420 : dimanche 8 mai 2011, 03:06:15 (UTC+0200)
1304876623 BEGIN 1.422 : dimanche 8 mai 2011, 19:43:43 (UTC+0200)
1304877295 END 1.422 : dimanche 8 mai 2011, 19:54:55 (UTC+0200)
1305335893 BEGIN 1.426 : samedi 14 mai 2011, 03:18:13 (UTC+0200)
1305336587 END 1.426 : samedi 14 mai 2011, 03:29:47 (UTC+0200)
1305337730 BEGIN 1.427 : samedi 14 mai 2011, 03:48:50 (UTC+0200)
1305338433 END 1.427 : samedi 14 mai 2011, 04:00:33 (UTC+0200)
1305340416 BEGIN 1.428 : samedi 14 mai 2011, 04:33:36 (UTC+0200)
1305341178 END 1.428 : samedi 14 mai 2011, 04:46:18 (UTC+0200)
1305421759 BEGIN 1.431 : dimanche 15 mai 2011, 03:09:19 (UTC+0200)
1305422519 END 1.431 : dimanche 15 mai 2011, 03:21:59 (UTC+0200)
1305516015 BEGIN 1.433 : lundi 16 mai 2011, 05:20:16 (UTC+0200)
1305516805 END 1.433 : lundi 16 mai 2011, 05:33:25 (UTC+0200)
1305530708 BEGIN 1.434 : lundi 16 mai 2011, 09:25:08 (UTC+0200)
1305531494 END 1.434 : lundi 16 mai 2011, 09:38:14 (UTC+0200)
1306774566 BEGIN 1.444 : lundi 30 mai 2011, 18:56:06 (UTC+0200)
1306775410 END 1.444 : lundi 30 mai 2011, 19:10:10 (UTC+0200)
1306792918 BEGIN 1.444 : mardi 31 mai 2011, 00:01:58 (UTC+0200)
1306793766 END 1.444 : mardi 31 mai 2011, 00:16:06 (UTC+0200)
1306834735 BEGIN 1.446 : mardi 31 mai 2011, 11:38:55 (UTC+0200)
1306835728 END 1.446 : mardi 31 mai 2011, 11:55:28 (UTC+0200)
1310345934 BEGIN 1.452 : lundi 11 juillet 2011, 02:58:54 (UTC+0200)
1310346470 END 1.452 : lundi 11 juillet 2011, 03:07:50 (UTC+0200)
1310657415 BEGIN 1.452 : jeudi 14 juillet 2011, 17:30:15 (UTC+0200)
1310658721 END 1.452 : jeudi 14 juillet 2011, 17:52:01 (UTC+0200)
1311908493 BEGIN 1.455 : vendredi 29 juillet 2011, 05:01:33 (UTC+0200)
1311909777 END 1.455 : vendredi 29 juillet 2011, 05:22:57 (UTC+0200)
1314166856 BEGIN 1.456 : mercredi 24 août 2011, 08:20:56 (UTC+0200)
1314168142 END 1.456 : mercredi 24 août 2011, 08:42:22 (UTC+0200)
1314171749 BEGIN 1.456 : mercredi 24 août 2011, 09:42:29 (UTC+0200)
1314173017 END 1.456 : mercredi 24 août 2011, 10:03:37 (UTC+0200)
1321129414 BEGIN 1.462 : samedi 12 novembre 2011, 21:23:34 (UTC+0100)
1321130650 END 1.462 : samedi 12 novembre 2011, 21:44:10 (UTC+0100)
1321176819 BEGIN 1.463 : dimanche 13 novembre 2011, 10:33:40 (UTC+0100)
1321178088 END 1.463 : dimanche 13 novembre 2011, 10:54:48 (UTC+0100)
1321319225 BEGIN 1.464 : mardi 15 novembre 2011, 02:07:05 (UTC+0100)
1321320488 END 1.464 : mardi 15 novembre 2011, 02:28:08 (UTC+0100)
1321581274 BEGIN 1.468 : vendredi 18 novembre 2011, 02:54:34 (UTC+0100)
1321582671 END 1.468 : vendredi 18 novembre 2011, 03:17:51 (UTC+0100)
1321630549 BEGIN 1.468 : vendredi 18 novembre 2011, 16:35:49 (UTC+0100)
1321631939 END 1.468 : vendredi 18 novembre 2011, 16:58:59 (UTC+0100)
1322799435 BEGIN 1.473 : vendredi 2 décembre 2011, 05:17:15 (UTC+0100)
1322800825 END 1.473 : vendredi 2 décembre 2011, 05:40:25 (UTC+0100)
1323481197 BEGIN 1.476 : samedi 10 décembre 2011, 02:39:57 (UTC+0100)
1323483957 END 1.476 : samedi 10 décembre 2011, 03:25:57 (UTC+0100)
1325999759 BEGIN 1.480 : dimanche 8 janvier 2012, 06:15:59 (UTC+0100)
1326001199 END 1.480 : dimanche 8 janvier 2012, 06:39:59 (UTC+0100)
1326006966 BEGIN 1.480 : dimanche 8 janvier 2012, 08:16:06 (UTC+0100)
1326008395 END 1.480 : dimanche 8 janvier 2012, 08:39:55 (UTC+0100)
1328579636 BEGIN 1.484 : mardi 7 février 2012, 02:53:56 (UTC+0100)
1328582268 END 1.484 : mardi 7 février 2012, 03:37:48 (UTC+0100)
1328612115 BEGIN 1.484 : mardi 7 février 2012, 11:55:15 (UTC+0100)
1328614619 END 1.484 : mardi 7 février 2012, 12:36:59 (UTC+0100)
1330180997 BEGIN 1.486 : samedi 25 février 2012, 15:43:17 (UTC+0100)
1330183785 END 1.486 : samedi 25 février 2012, 16:29:45 (UTC+0100)
1330493497 BEGIN 1.487 : mercredi 29 février 2012, 06:31:37 (UTC+0100)
1330496194 END 1.487 : mercredi 29 février 2012, 07:16:34 (UTC+0100)
1334360626 BEGIN 1.487 : samedi 14 avril 2012, 01:43:46 (UTC+0200)
1334361596 END 1.487 : samedi 14 avril 2012, 01:59:56 (UTC+0200)
1334511846 BEGIN 1.488 : dimanche 15 avril 2012, 19:44:07 (UTC+0200)
1334512816 END 1.488 : dimanche 15 avril 2012, 20:00:16 (UTC+0200)
1342519040 BEGIN 1.497 : mardi 17 juillet 2012, 11:57:20 (UTC+0200)
1342520082 END 1.497 : mardi 17 juillet 2012, 12:14:42 (UTC+0200)
1342796692 BEGIN 1.498 : vendredi 20 juillet 2012, 17:04:52 (UTC+0200)
1342796879 END 1.498 : vendredi 20 juillet 2012, 17:07:59 (UTC+0200)
1342797789 END 1.498 : vendredi 20 juillet 2012, 17:23:09 (UTC+0200)
1344574981 BEGIN 1.500 : vendredi 10 août 2012, 07:03:01 (UTC+0200)
1344576351 END 1.500 : vendredi 10 août 2012, 07:25:51 (UTC+0200)
1344637410 BEGIN 1.500 : samedi 11 août 2012, 00:23:30 (UTC+0200)
1344638512 END 1.500 : samedi 11 août 2012, 00:41:52 (UTC+0200)
1344862816 BEGIN 1.501 : lundi 13 août 2012, 15:00:16 (UTC+0200)
1344864048 END 1.501 : lundi 13 août 2012, 15:20:48 (UTC+0200)
1346111304 BEGIN 1.503 : mardi 28 août 2012, 01:48:25 (UTC+0200)
1346112385 END 1.503 : mardi 28 août 2012, 02:06:25 (UTC+0200)
1346159791 BEGIN 1.504 : mardi 28 août 2012, 15:16:31 (UTC+0200)
1346160945 END 1.504 : mardi 28 août 2012, 15:35:45 (UTC+0200)
1346241775 BEGIN 1.504 : mercredi 29 août 2012, 14:02:55 (UTC+0200)
1346242932 END 1.504 : mercredi 29 août 2012, 14:22:12 (UTC+0200)
1347195553 BEGIN 1.507 : dimanche 9 septembre 2012, 14:59:13 (UTC+0200)
1347196697 END 1.507 : dimanche 9 septembre 2012, 15:18:17 (UTC+0200)
1347392501 BEGIN 1.508 : mardi 11 septembre 2012, 21:41:41 (UTC+0200)
1347393591 END 1.508 : mardi 11 septembre 2012, 21:59:51 (UTC+0200)
1351688288 BEGIN 1.515 : mercredi 31 octobre 2012, 13:58:08 (UTC+0100)
1351689817 END 1.515 : mercredi 31 octobre 2012, 14:23:37 (UTC+0100)
1351894814 BEGIN 1.516 : vendredi 2 novembre 2012, 23:20:14 (UTC+0100)
1351896296 END 1.516 : vendredi 2 novembre 2012, 23:44:56 (UTC+0100)
1356314808 BEGIN 1.518 : lundi 24 décembre 2012, 03:06:48 (UTC+0100)
1356315575 END 1.518 : lundi 24 décembre 2012, 03:19:35 (UTC+0100)
1356340377 BEGIN 1.518 : lundi 24 décembre 2012, 10:12:57 (UTC+0100)
1356341221 END 1.518 : lundi 24 décembre 2012, 10:27:01 (UTC+0100)
1359077003 BEGIN 1.521 : vendredi 25 janvier 2013, 02:23:23 (UTC+0100)
1359077793 END 1.521 : vendredi 25 janvier 2013, 02:36:33 (UTC+0100)
1359419422 BEGIN 1.522 : mardi 29 janvier 2013, 01:30:22 (UTC+0100)
1359420274 END 1.522 : mardi 29 janvier 2013, 01:44:34 (UTC+0100)
1359421115 BEGIN 1.522 : mardi 29 janvier 2013, 01:58:35 (UTC+0100)
1359421989 END 1.522 : mardi 29 janvier 2013, 02:13:09 (UTC+0100)
1360108747 BEGIN 1.525 : mercredi 6 février 2013, 00:59:07 (UTC+0100)
1360109581 END 1.525 : mercredi 6 février 2013, 01:13:01 (UTC+0100)
1364528510 BEGIN 1.528 : vendredi 29 mars 2013, 04:41:51 (UTC+0100)
1364529434 END 1.528 : vendredi 29 mars 2013, 04:57:14 (UTC+0100)
1365000098 BEGIN 1.529 : mercredi 3 avril 2013, 16:41:38 (UTC+0200)
1365001150 END 1.529 : mercredi 3 avril 2013, 16:59:10 (UTC+0200)
1365595458 BEGIN 1.533 : mercredi 10 avril 2013, 14:04:18 (UTC+0200)
1365596319 END 1.533 : mercredi 10 avril 2013, 14:18:39 (UTC+0200)
1366126390 BEGIN 1.534 : mardi 16 avril 2013, 17:33:10 (UTC+0200)
1366127411 END 1.534 : mardi 16 avril 2013, 17:50:11 (UTC+0200)
1366202919 BEGIN 1.535 : mercredi 17 avril 2013, 14:48:39 (UTC+0200)
1366203902 END 1.535 : mercredi 17 avril 2013, 15:05:02 (UTC+0200)
1366209307 BEGIN 1.536 : mercredi 17 avril 2013, 16:35:07 (UTC+0200)
1366210370 END 1.536 : mercredi 17 avril 2013, 16:52:50 (UTC+0200)
1366591668 BEGIN 1.538 : lundi 22 avril 2013, 02:47:48 (UTC+0200)
1366592337 END 1.538 : lundi 22 avril 2013, 02:58:57 (UTC+0200)
1367829058 BEGIN 1.542 : lundi 6 mai 2013, 10:30:58 (UTC+0200)
1367829799 END 1.542 : lundi 6 mai 2013, 10:43:19 (UTC+0200)
1369002592 BEGIN 1.542 : lundi 20 mai 2013, 00:29:52 (UTC+0200)
1369003347 END 1.542 : lundi 20 mai 2013, 00:42:27 (UTC+0200)
1369007256 BEGIN 1.542 : lundi 20 mai 2013, 01:47:36 (UTC+0200)
1369007618 END 1.542 : lundi 20 mai 2013, 01:53:38 (UTC+0200)
1369008471 BEGIN 1.542 : lundi 20 mai 2013, 02:07:51 (UTC+0200)
1369008871 END 1.542 : lundi 20 mai 2013, 02:14:31 (UTC+0200)
1369009301 BEGIN 1.542 : lundi 20 mai 2013, 02:21:41 (UTC+0200)
1369009684 END 1.542 : lundi 20 mai 2013, 02:28:04 (UTC+0200)
1369066181 BEGIN 1.542 : lundi 20 mai 2013, 18:09:41 (UTC+0200)
1369066684 END 1.542 : lundi 20 mai 2013, 18:18:04 (UTC+0200)
1369091275 BEGIN 1.542 : mardi 21 mai 2013, 01:07:55 (UTC+0200)
1369091715 END 1.542 : mardi 21 mai 2013, 01:15:15 (UTC+0200)
1369093368 BEGIN 1.542 : mardi 21 mai 2013, 01:42:48 (UTC+0200)
1369093884 END 1.542 : mardi 21 mai 2013, 01:51:24 (UTC+0200)
1369185777 BEGIN 1.543 : mercredi 22 mai 2013, 03:22:57 (UTC+0200)
1369186219 END 1.543 : mercredi 22 mai 2013, 03:30:19 (UTC+0200)
1369217503 BEGIN 1.543 : mercredi 22 mai 2013, 12:11:43 (UTC+0200)
1369218286 END 1.543 : mercredi 22 mai 2013, 12:24:46 (UTC+0200)
1369236897 BEGIN 1.543 : mercredi 22 mai 2013, 17:34:57 (UTC+0200)
1369237336 END 1.543 : mercredi 22 mai 2013, 17:42:16 (UTC+0200)
1369237945 BEGIN 1.543 : mercredi 22 mai 2013, 17:52:25 (UTC+0200)
1369238373 END 1.543 : mercredi 22 mai 2013, 17:59:33 (UTC+0200)
1370216259 BEGIN 1.544 : lundi 3 juin 2013, 01:37:39 (UTC+0200)
1370216695 END 1.544 : lundi 3 juin 2013, 01:44:55 (UTC+0200)
1372753674 BEGIN 1.546 : mardi 2 juillet 2013, 10:27:54 (UTC+0200)
1372754442 END 1.546 : mardi 2 juillet 2013, 10:40:42 (UTC+0200)
1372815752 BEGIN 1.547 : mercredi 3 juillet 2013, 03:42:32 (UTC+0200)
1372816528 END 1.547 : mercredi 3 juillet 2013, 03:55:28 (UTC+0200)
1372851174 BEGIN 1.547 : mercredi 3 juillet 2013, 13:32:54 (UTC+0200)
1372851958 END 1.547 : mercredi 3 juillet 2013, 13:45:58 (UTC+0200)
1372852860 BEGIN 1.547 : mercredi 3 juillet 2013, 14:01:00 (UTC+0200)
1372853599 END 1.547 : mercredi 3 juillet 2013, 14:13:19 (UTC+0200)
1374244772 BEGIN 1.551 : vendredi 19 juillet 2013, 16:39:32 (UTC+0200)
1374245570 END 1.551 : vendredi 19 juillet 2013, 16:52:50 (UTC+0200)
1374459974 BEGIN 1.554 : lundi 22 juillet 2013, 04:26:14 (UTC+0200)
1374460797 END 1.554 : lundi 22 juillet 2013, 04:39:57 (UTC+0200)
1374461464 BEGIN 1.554 : lundi 22 juillet 2013, 04:51:04 (UTC+0200)
1374462214 END 1.554 : lundi 22 juillet 2013, 05:03:34 (UTC+0200)
1374579832 BEGIN 1.555 : mardi 23 juillet 2013, 13:43:52 (UTC+0200)
1374579895 BEGIN 1.555 : mardi 23 juillet 2013, 13:44:55 (UTC+0200)
1374581003 END 1.555 : mardi 23 juillet 2013, 14:03:23 (UTC+0200)
1374582566 BEGIN 1.555 : mardi 23 juillet 2013, 14:29:26 (UTC+0200)
1374583297 END 1.555 : mardi 23 juillet 2013, 14:41:37 (UTC+0200)
1375316925 BEGIN 1.556 : jeudi 1 août 2013, 02:28:45 (UTC+0200)
1375317443 END 1.556 : jeudi 1 août 2013, 02:37:23 (UTC+0200)
1375488764 BEGIN 1.557 : samedi 3 août 2013, 02:12:44 (UTC+0200)
1375489277 END 1.557 : samedi 3 août 2013, 02:21:17 (UTC+0200)
1375492828 BEGIN 1.558 : samedi 3 août 2013, 03:20:28 (UTC+0200)
1375494466 END 1.558 : samedi 3 août 2013, 03:47:46 (UTC+0200)
1375495357 BEGIN 1.558 : samedi 3 août 2013, 04:02:37 (UTC+0200)
1375497013 END 1.558 : samedi 3 août 2013, 04:30:13 (UTC+0200)
1375534760 BEGIN 1.558 : samedi 3 août 2013, 14:59:20 (UTC+0200)
1375536286 END 1.558 : samedi 3 août 2013, 15:24:46 (UTC+0200)
1376617407 BEGIN 1.563 : vendredi 16 août 2013, 03:43:27 (UTC+0200)
1376618294 END 1.563 : vendredi 16 août 2013, 03:58:14 (UTC+0200)
1376856084 BEGIN 1.564 : dimanche 18 août 2013, 22:01:24 (UTC+0200)
1376856924 END 1.564 : dimanche 18 août 2013, 22:15:24 (UTC+0200)
1379035013 BEGIN 1.565 : vendredi 13 septembre 2013, 03:16:53 (UTC+0200)
1379036258 END 1.565 : vendredi 13 septembre 2013, 03:37:38 (UTC+0200)
1379036858 BEGIN 1.565 : vendredi 13 septembre 2013, 03:47:38 (UTC+0200)
1379038028 END 1.565 : vendredi 13 septembre 2013, 04:07:08 (UTC+0200)
1379067300 BEGIN 1.565 : vendredi 13 septembre 2013, 12:15:00 (UTC+0200)
1379068253 END 1.565 : vendredi 13 septembre 2013, 12:30:53 (UTC+0200)
1379068512 BEGIN 1.565 : vendredi 13 septembre 2013, 12:35:12 (UTC+0200)
1379069423 BEGIN 1.565 : vendredi 13 septembre 2013, 12:50:23 (UTC+0200)
1379069895 END 1.565 : vendredi 13 septembre 2013, 12:58:15 (UTC+0200)
1379070862 BEGIN 1.565 : vendredi 13 septembre 2013, 13:14:22 (UTC+0200)
1379071364 END 1.565 : vendredi 13 septembre 2013, 13:22:44 (UTC+0200)
1379541254 BEGIN 1.567 : mercredi 18 septembre 2013, 23:54:14 (UTC+0200)
1379541678 BEGIN 1.567 : jeudi 19 septembre 2013, 00:01:18 (UTC+0200)
1379544193 BEGIN 1.567 : jeudi 19 septembre 2013, 00:43:13 (UTC+0200)
1379549519 BEGIN 1.567 : jeudi 19 septembre 2013, 02:11:59 (UTC+0200)
1379550371 END 1.567 : jeudi 19 septembre 2013, 02:26:11 (UTC+0200)
1379803429 BEGIN 1.567 : dimanche 22 septembre 2013, 00:43:49 (UTC+0200)
1379804324 END 1.567 : dimanche 22 septembre 2013, 00:58:44 (UTC+0200)
1380337279 BEGIN 1.568 : samedi 28 septembre 2013, 05:01:20 (UTC+0200)
1380337867 END 1.568 : samedi 28 septembre 2013, 05:11:07 (UTC+0200)
1380340560 BEGIN 1.568 : samedi 28 septembre 2013, 05:56:00 (UTC+0200)
1380341166 END 1.568 : samedi 28 septembre 2013, 06:06:06 (UTC+0200)
1380369597 BEGIN 1.568 : samedi 28 septembre 2013, 13:59:57 (UTC+0200)
1380370230 END 1.568 : samedi 28 septembre 2013, 14:10:30 (UTC+0200)
1381964425 BEGIN 1.569 : jeudi 17 octobre 2013, 01:00:25 (UTC+0200)
1381964810 BEGIN 1.569 : jeudi 17 octobre 2013, 01:06:50 (UTC+0200)
1381969720 BEGIN 1.569 : jeudi 17 octobre 2013, 02:28:40 (UTC+0200)
1381970545 END 1.569 : jeudi 17 octobre 2013, 02:42:25 (UTC+0200)
1381974866 BEGIN 1.569 : jeudi 17 octobre 2013, 03:54:26 (UTC+0200)
1381975685 END 1.569 : jeudi 17 octobre 2013, 04:08:05 (UTC+0200)
1383010060 BEGIN 1.574 : mardi 29 octobre 2013, 02:27:40 (UTC+0100)
1383012576 END 1.574 : mardi 29 octobre 2013, 03:09:36 (UTC+0100)
1387941690 BEGIN 1.580 : mercredi 25 décembre 2013, 04:21:30 (UTC+0100)
1387967067 BEGIN 1.580 : mercredi 25 décembre 2013, 11:24:28 (UTC+0100)
1387967901 END 1.580 : mercredi 25 décembre 2013, 11:38:21 (UTC+0100)
1390615061 BEGIN 1.582 : samedi 25 janvier 2014, 02:57:41 (UTC+0100)
1390685504 END 1.582 : samedi 25 janvier 2014, 22:31:44 (UTC+0100)
1390874372 BEGIN 1.582 : mardi 28 janvier 2014, 02:59:33 (UTC+0100)
1390875240 END 1.582 : mardi 28 janvier 2014, 03:14:00 (UTC+0100)
1391561330 BEGIN 1.584 : mercredi 5 février 2014, 01:48:50 (UTC+0100)
1391562789 END 1.584 : mercredi 5 février 2014, 02:13:09 (UTC+0100)
1399288404 BEGIN 1.586 : lundi 5 mai 2014, 13:13:24 (UTC+0200)
1399655068 BEGIN 1.587 : vendredi 9 mai 2014, 19:04:28 (UTC+0200)
1399657515 END 1.587 : vendredi 9 mai 2014, 19:45:15 (UTC+0200)
1399729631 BEGIN 1.587 : samedi 10 mai 2014, 15:47:11 (UTC+0200)
1399730345 END 1.587 : samedi 10 mai 2014, 15:59:05 (UTC+0200)
1400630617 BEGIN 1.590 : mercredi 21 mai 2014, 02:03:37 (UTC+0200)
1400639261 BEGIN 1.590 : mercredi 21 mai 2014, 04:27:41 (UTC+0200)
1400640226 END 1.590 : mercredi 21 mai 2014, 04:43:46 (UTC+0200)
1400722992 BEGIN 1.591 : jeudi 22 mai 2014, 03:43:12 (UTC+0200)
1400723946 END 1.591 : jeudi 22 mai 2014, 03:59:06 (UTC+0200)
1400754149 BEGIN 1.592 : jeudi 22 mai 2014, 12:22:29 (UTC+0200)
1400755228 END 1.592 : jeudi 22 mai 2014, 12:40:28 (UTC+0200)
1401188766 BEGIN 1.592 : mardi 27 mai 2014, 13:06:06 (UTC+0200)
1401190037 END 1.592 : mardi 27 mai 2014, 13:27:17 (UTC+0200)
1401197283 BEGIN 1.592 : mardi 27 mai 2014, 15:28:03 (UTC+0200)
1401227679 BEGIN 1.592 : mardi 27 mai 2014, 23:54:39 (UTC+0200)
1401262215 END 1.592 : mercredi 28 mai 2014, 09:30:15 (UTC+0200)
1401407642 BEGIN 1.592 : vendredi 30 mai 2014, 01:54:02 (UTC+0200)
1401410706 BEGIN 1.592 : vendredi 30 mai 2014, 02:45:07 (UTC+0200)
1401411830 END 1.592 : vendredi 30 mai 2014, 03:03:50 (UTC+0200)
1411192222 BEGIN 1.596 : samedi 20 septembre 2014, 07:50:22 (UTC+0200)
1411228014 BEGIN 1.596 : samedi 20 septembre 2014, 17:46:54 (UTC+0200)
1411266788 BEGIN 1.596 : dimanche 21 septembre 2014, 04:33:08 (UTC+0200)
1411267953 END 1.596 : dimanche 21 septembre 2014, 04:52:33 (UTC+0200)
1412693514 BEGIN 1.597 : mardi 7 octobre 2014, 16:51:54 (UTC+0200)
1412750854 BEGIN 1.597 : mercredi 8 octobre 2014, 08:47:34 (UTC+0200)
1412751726 END 1.597 : mercredi 8 octobre 2014, 09:02:06 (UTC+0200)
1415448836 BEGIN 1.604 : samedi 8 novembre 2014, 13:13:56 (UTC+0100)
1415449975 END 1.604 : samedi 8 novembre 2014, 13:32:55 (UTC+0100)
1415818269 BEGIN 1.605 : mercredi 12 novembre 2014, 19:51:09 (UTC+0100)
1415819173 END 1.605 : mercredi 12 novembre 2014, 20:06:13 (UTC+0100)
1415985918 BEGIN 1.607 : vendredi 14 novembre 2014, 18:25:18 (UTC+0100)
1415986823 END 1.607 : vendredi 14 novembre 2014, 18:40:23 (UTC+0100)
1426391624 BEGIN 1.626 : dimanche 15 mars 2015, 04:53:44 (UTC+0100)
1426637725 BEGIN 1.627 : mercredi 18 mars 2015, 01:15:26 (UTC+0100)
1426734624 BEGIN 1.628 : jeudi 19 mars 2015, 04:10:24 (UTC+0100)
1426736361 END 1.628 : jeudi 19 mars 2015, 04:39:21 (UTC+0100)
1426820957 BEGIN 1.630 : vendredi 20 mars 2015, 04:09:18 (UTC+0100)
1426823109 END 1.630 : vendredi 20 mars 2015, 04:45:09 (UTC+0100)
1427249505 BEGIN 1.634 : mercredi 25 mars 2015, 03:11:45 (UTC+0100)
1427250851 END 1.634 : mercredi 25 mars 2015, 03:34:11 (UTC+0100)
1427814853 BEGIN 1.636 : mardi 31 mars 2015, 17:14:13 (UTC+0200)
1427815136 END 1.636 : mardi 31 mars 2015, 17:18:56 (UTC+0200)
1427853312 BEGIN 1.637 : mercredi 1 avril 2015, 03:55:12 (UTC+0200)
1427854440 END 1.637 : mercredi 1 avril 2015, 04:14:00 (UTC+0200)
1431218601 BEGIN 1.641 : dimanche 10 mai 2015, 02:43:21 (UTC+0200)
1431262946 END 1.641 : dimanche 10 mai 2015, 15:02:26 (UTC+0200)
1431414203 BEGIN 1.642 : mardi 12 mai 2015, 09:03:23 (UTC+0200)
1432116391 BEGIN 1.642 : mercredi 20 mai 2015, 12:06:31 (UTC+0200)
1432138982 BEGIN 1.642 : mercredi 20 mai 2015, 18:23:02 (UTC+0200)
1432140305 END 1.642 : mercredi 20 mai 2015, 18:45:05 (UTC+0200)
1435274638 BEGIN 1.643 : vendredi 26 juin 2015, 01:23:58 (UTC+0200)
1435275180 END 1.643 : vendredi 26 juin 2015, 01:33:00 (UTC+0200)
1435279579 BEGIN 1.643 : vendredi 26 juin 2015, 02:46:19 (UTC+0200)
1435280203 END 1.643 : vendredi 26 juin 2015, 02:56:43 (UTC+0200)
1437158716 BEGIN 1.644 : vendredi 17 juillet 2015, 20:45:16 (UTC+0200)
1437160124 END 1.644 : vendredi 17 juillet 2015, 21:08:44 (UTC+0200)
1439777074 BEGIN 1.650 : lundi 17 août 2015, 04:04:34 (UTC+0200)
1439778213 END 1.650 : lundi 17 août 2015, 04:23:33 (UTC+0200)
1440289827 BEGIN 1.651 : dimanche 23 août 2015, 02:30:27 (UTC+0200)
1440291228 END 1.651 : dimanche 23 août 2015, 02:53:48 (UTC+0200)
1441934795 BEGIN 1.654 : vendredi 11 septembre 2015, 03:26:35 (UTC+0200)
1441940822 BEGIN 1.655 : vendredi 11 septembre 2015, 05:07:02 (UTC+0200)
1441941869 END 1.655 : vendredi 11 septembre 2015, 05:24:29 (UTC+0200)
1447192716 BEGIN 1.665 : mardi 10 novembre 2015, 22:58:36 (UTC+0100)
1447193035 END 1.665 : mardi 10 novembre 2015, 23:03:55 (UTC+0100)
1447201375 BEGIN 1.665 : mercredi 11 novembre 2015, 01:22:55 (UTC+0100)
1447201490 END 1.665 : mercredi 11 novembre 2015, 01:24:50 (UTC+0100)
1447201666 BEGIN 1.665 : mercredi 11 novembre 2015, 01:27:46 (UTC+0100)
1447202045 BEGIN 1.665 : mercredi 11 novembre 2015, 01:34:05 (UTC+0100)
1447202227 END 1.665 : mercredi 11 novembre 2015, 01:37:07 (UTC+0100)
1447205467 BEGIN 1.665 : mercredi 11 novembre 2015, 02:31:07 (UTC+0100)
1447205527 END 1.665 : mercredi 11 novembre 2015, 02:32:07 (UTC+0100)
1447205754 BEGIN 1.665 : mercredi 11 novembre 2015, 02:35:54 (UTC+0100)
1447205813 END 1.665 : mercredi 11 novembre 2015, 02:36:53 (UTC+0100)
1447205877 BEGIN 1.665 : mercredi 11 novembre 2015, 02:37:57 (UTC+0100)
1447206591 BEGIN 1.665 : mercredi 11 novembre 2015, 02:49:51 (UTC+0100)
1447206779 END 1.665 : mercredi 11 novembre 2015, 02:52:59 (UTC+0100)
1447206877 BEGIN 1.665 : mercredi 11 novembre 2015, 02:54:37 (UTC+0100)
1447207318 BEGIN 1.665 : mercredi 11 novembre 2015, 03:01:58 (UTC+0100)
1447207507 END 1.665 : mercredi 11 novembre 2015, 03:05:07 (UTC+0100)
1447208020 BEGIN 1.665 : mercredi 11 novembre 2015, 03:13:40 (UTC+0100)
1447208213 END 1.665 : mercredi 11 novembre 2015, 03:16:53 (UTC+0100)
1447209722 BEGIN 1.665 : mercredi 11 novembre 2015, 03:42:03 (UTC+0100)
1447209976 END 1.665 : mercredi 11 novembre 2015, 03:46:16 (UTC+0100)
1448298296 BEGIN 1.666 : lundi 23 novembre 2015, 18:04:56 (UTC+0100)
1448298474 END 1.666 : lundi 23 novembre 2015, 18:07:54 (UTC+0100)
1448851660 BEGIN 1.667 : lundi 30 novembre 2015, 03:47:40 (UTC+0100)
1448852283 END 1.667 : lundi 30 novembre 2015, 03:58:03 (UTC+0100)
1449111689 BEGIN 1.670 : jeudi 3 décembre 2015, 04:01:29 (UTC+0100)
1449112253 END 1.670 : jeudi 3 décembre 2015, 04:10:53 (UTC+0100)
1449744079 BEGIN 1.672 : jeudi 10 décembre 2015, 11:41:19 (UTC+0100)
1449744625 END 1.672 : jeudi 10 décembre 2015, 11:50:25 (UTC+0100)
1449767529 BEGIN 1.672 : jeudi 10 décembre 2015, 18:12:09 (UTC+0100)
1449767714 END 1.672 : jeudi 10 décembre 2015, 18:15:14 (UTC+0100)
1452122921 BEGIN 1.675 : jeudi 7 janvier 2016, 00:28:41 (UTC+0100)
1452123698 END 1.675 : jeudi 7 janvier 2016, 00:41:38 (UTC+0100)
1453217007 BEGIN 1.677 : mardi 19 janvier 2016, 16:23:27 (UTC+0100)
1453217776 END 1.677 : mardi 19 janvier 2016, 16:36:16 (UTC+0100)
1453407595 BEGIN 1.678 : jeudi 21 janvier 2016, 21:19:55 (UTC+0100)
1453408277 END 1.678 : jeudi 21 janvier 2016, 21:31:17 (UTC+0100)
1457139168 BEGIN 1.682 : samedi 5 mars 2016, 01:52:48 (UTC+0100)
1457139341 END 1.682 : samedi 5 mars 2016, 01:55:41 (UTC+0100)
1457318569 BEGIN 1.683 : lundi 7 mars 2016, 03:42:49 (UTC+0100)
1457318753 END 1.683 : lundi 7 mars 2016, 03:45:53 (UTC+0100)
1457903122 BEGIN 1.683 : dimanche 13 mars 2016, 22:05:22 (UTC+0100)
1457903935 END 1.683 : dimanche 13 mars 2016, 22:18:55 (UTC+0100)
1458205761 BEGIN 1.684 : jeudi 17 mars 2016, 10:09:21 (UTC+0100)
1458206536 END 1.684 : jeudi 17 mars 2016, 10:22:16 (UTC+0100)
1458216703 BEGIN 1.684 : jeudi 17 mars 2016, 13:11:43 (UTC+0100)
1458217520 END 1.684 : jeudi 17 mars 2016, 13:25:20 (UTC+0100)
1458428579 BEGIN 1.684 : dimanche 20 mars 2016, 00:02:59 (UTC+0100)
1458428756 END 1.684 : dimanche 20 mars 2016, 00:05:56 (UTC+0100)
1458433683 BEGIN 1.684 : dimanche 20 mars 2016, 01:28:03 (UTC+0100)
1458434445 END 1.684 : dimanche 20 mars 2016, 01:40:45 (UTC+0100)
1458436534 BEGIN 1.684 : dimanche 20 mars 2016, 02:15:34 (UTC+0100)
1458437310 END 1.684 : dimanche 20 mars 2016, 02:28:30 (UTC+0100)
1463261525 BEGIN 1.690 : samedi 14 mai 2016, 23:32:05 (UTC+0200)
1463261701 END 1.690 : samedi 14 mai 2016, 23:35:01 (UTC+0200)
1463261777 BEGIN 1.690 : samedi 14 mai 2016, 23:36:17 (UTC+0200)
1463262258 END 1.690 : samedi 14 mai 2016, 23:44:18 (UTC+0200)
1464194085 BEGIN 1.692 : mercredi 25 mai 2016, 18:34:45 (UTC+0200)
1464194868 END 1.692 : mercredi 25 mai 2016, 18:47:49 (UTC+0200)
1465431106 BEGIN 1.694 : jeudi 9 juin 2016, 02:11:46 (UTC+0200)
1465431905 END 1.694 : jeudi 9 juin 2016, 02:25:05 (UTC+0200)
1465864115 BEGIN 1.701 : mardi 14 juin 2016, 02:28:35 (UTC+0200)
1465864364 END 1.701 : mardi 14 juin 2016, 02:32:44 (UTC+0200)
1465865557 BEGIN 1.701 : mardi 14 juin 2016, 02:52:37 (UTC+0200)
1465866291 END 1.701 : mardi 14 juin 2016, 03:04:51 (UTC+0200)
1466171000 BEGIN 1.706 : vendredi 17 juin 2016, 15:43:20 (UTC+0200)
1466171789 END 1.706 : vendredi 17 juin 2016, 15:56:29 (UTC+0200)
1466210899 BEGIN 1.707 : samedi 18 juin 2016, 02:48:19 (UTC+0200)
1466211650 END 1.707 : samedi 18 juin 2016, 03:00:50 (UTC+0200)
1466610746 BEGIN 1.710 : mercredi 22 juin 2016, 17:52:26 (UTC+0200)
1466611426 END 1.710 : mercredi 22 juin 2016, 18:03:46 (UTC+0200)
1466627202 BEGIN 1.711 : mercredi 22 juin 2016, 22:26:42 (UTC+0200)
1466627955 END 1.711 : mercredi 22 juin 2016, 22:39:15 (UTC+0200)
1467069519 BEGIN 1.711 : mardi 28 juin 2016, 01:18:39 (UTC+0200)
1467069574 END 1.711 : mardi 28 juin 2016, 01:19:34 (UTC+0200)
1467069750 BEGIN 1.711 : mardi 28 juin 2016, 01:22:30 (UTC+0200)
1467069794 END 1.711 : mardi 28 juin 2016, 01:23:14 (UTC+0200)
1467069926 BEGIN 1.711 : mardi 28 juin 2016, 01:25:26 (UTC+0200)
1467070138 BEGIN 1.711 : mardi 28 juin 2016, 01:28:58 (UTC+0200)
1467070225 BEGIN 1.711 : mardi 28 juin 2016, 01:30:25 (UTC+0200)
1467070345 BEGIN 1.711 : mardi 28 juin 2016, 01:32:25 (UTC+0200)
1467070391 BEGIN 1.711 : mardi 28 juin 2016, 01:33:11 (UTC+0200)
1467070514 BEGIN 1.711 : mardi 28 juin 2016, 01:35:14 (UTC+0200)
1467070588 BEGIN 1.711 : mardi 28 juin 2016, 01:36:28 (UTC+0200)
1467070950 BEGIN 1.711 : mardi 28 juin 2016, 01:42:30 (UTC+0200)
1467255653 BEGIN 1.712 : jeudi 30 juin 2016, 05:00:53 (UTC+0200)
1467255813 END 1.712 : jeudi 30 juin 2016, 05:03:33 (UTC+0200)
1467755793 BEGIN 1.715 : mardi 5 juillet 2016, 23:56:34 (UTC+0200)
1467756564 END 1.715 : mercredi 6 juillet 2016, 00:09:24 (UTC+0200)
1469013686 BEGIN 1.718 : mercredi 20 juillet 2016, 13:21:26 (UTC+0200)
1469014489 BEGIN 1.718 : mercredi 20 juillet 2016, 13:34:49 (UTC+0200)
1469814584 BEGIN 1.721 : vendredi 29 juillet 2016, 19:49:44 (UTC+0200)
1469815484 END 1.721 : vendredi 29 juillet 2016, 20:04:44 (UTC+0200)
1469828350 BEGIN 1.722 : vendredi 29 juillet 2016, 23:39:10 (UTC+0200)
1469829123 END 1.722 : vendredi 29 juillet 2016, 23:52:03 (UTC+0200)
1469831589 BEGIN 1.723 : samedi 30 juillet 2016, 00:33:09 (UTC+0200)
1469832393 END 1.723 : samedi 30 juillet 2016, 00:46:33 (UTC+0200)
1471305986 BEGIN 1.725 : mardi 16 août 2016, 02:06:26 (UTC+0200)
1471306861 END 1.725 : mardi 16 août 2016, 02:21:01 (UTC+0200)
1471390396 BEGIN 1.726 : mercredi 17 août 2016, 01:33:16 (UTC+0200)
1471391143 END 1.726 : mercredi 17 août 2016, 01:45:43 (UTC+0200)
1471399447 BEGIN 1.726 : mercredi 17 août 2016, 04:04:07 (UTC+0200)
1471399633 END 1.726 : mercredi 17 août 2016, 04:07:13 (UTC+0200)
1471514233 BEGIN 1.726 : jeudi 18 août 2016, 11:57:13 (UTC+0200)
1471515101 END 1.726 : jeudi 18 août 2016, 12:11:41 (UTC+0200)
1471606171 BEGIN 1.727 : vendredi 19 août 2016, 13:29:31 (UTC+0200)
1471616659 BEGIN 1.727 : vendredi 19 août 2016, 16:24:19 (UTC+0200)
1471617309 END 1.727 : vendredi 19 août 2016, 16:35:09 (UTC+0200)
1474122976 BEGIN 1.730 : samedi 17 septembre 2016, 16:36:16 (UTC+0200)
1474123287 END 1.730 : samedi 17 septembre 2016, 16:41:27 (UTC+0200)
1475152767 BEGIN 1.731 : jeudi 29 septembre 2016, 14:39:27 (UTC+0200)
1475153042 END 1.731 : jeudi 29 septembre 2016, 14:44:02 (UTC+0200)
1475183016 BEGIN 1.732 : jeudi 29 septembre 2016, 23:03:36 (UTC+0200)
1475183329 END 1.732 : jeudi 29 septembre 2016, 23:08:49 (UTC+0200)
1476189796 BEGIN 1.737 : mardi 11 octobre 2016, 14:43:16 (UTC+0200)
1476190171 END 1.737 : mardi 11 octobre 2016, 14:49:31 (UTC+0200)
1478207726 BEGIN 1.739 : jeudi 3 novembre 2016, 22:15:26 (UTC+0100)
1478208016 END 1.739 : jeudi 3 novembre 2016, 22:20:16 (UTC+0100)
1479397595 BEGIN 1.740 : jeudi 17 novembre 2016, 16:46:36 (UTC+0100)
1479397878 END 1.740 : jeudi 17 novembre 2016, 16:51:18 (UTC+0100)
1479853031 BEGIN 1.741 : mardi 22 novembre 2016, 23:17:11 (UTC+0100)
1479853321 END 1.741 : mardi 22 novembre 2016, 23:22:01 (UTC+0100)
1482594346 BEGIN 1.747 : samedi 24 décembre 2016, 16:45:46 (UTC+0100)
1483589059 BEGIN 1.749 : jeudi 5 janvier 2017, 05:04:19 (UTC+0100)
1483589684 BEGIN 1.749 : jeudi 5 janvier 2017, 05:14:44 (UTC+0100)
1483589923 END 1.749 : jeudi 5 janvier 2017, 05:18:43 (UTC+0100)
1483624220 BEGIN 1.750 : jeudi 5 janvier 2017, 14:50:20 (UTC+0100)
1483624536 END 1.750 : jeudi 5 janvier 2017, 14:55:36 (UTC+0100)
1483945333 BEGIN 1.751 : lundi 9 janvier 2017, 08:02:13 (UTC+0100)
1483949465 BEGIN 1.751 : lundi 9 janvier 2017, 09:11:05 (UTC+0100)
1483984043 BEGIN 1.751 : lundi 9 janvier 2017, 18:47:23 (UTC+0100)
1484009458 BEGIN 1.752 : mardi 10 janvier 2017, 01:50:58 (UTC+0100)
1484009742 END 1.752 : mardi 10 janvier 2017, 01:55:42 (UTC+0100)
1484112177 BEGIN 1.753 : mercredi 11 janvier 2017, 06:22:57 (UTC+0100)
1484112484 END 1.753 : mercredi 11 janvier 2017, 06:28:04 (UTC+0100)
1484217375 BEGIN 1.757 : jeudi 12 janvier 2017, 11:36:15 (UTC+0100)
1484217700 END 1.757 : jeudi 12 janvier 2017, 11:41:40 (UTC+0100)
1484516992 BEGIN 1.758 : dimanche 15 janvier 2017, 22:49:52 (UTC+0100)
1484517360 END 1.758 : dimanche 15 janvier 2017, 22:56:00 (UTC+0100)
1484577677 BEGIN 1.759 : lundi 16 janvier 2017, 15:41:17 (UTC+0100)
1484578003 END 1.759 : lundi 16 janvier 2017, 15:46:43 (UTC+0100)
1484628512 BEGIN 1.760 : mardi 17 janvier 2017, 05:48:32 (UTC+0100)
1484628850 END 1.760 : mardi 17 janvier 2017, 05:54:10 (UTC+0100)
1484633474 BEGIN 1.761 : mardi 17 janvier 2017, 07:11:14 (UTC+0100)
1484633792 END 1.761 : mardi 17 janvier 2017, 07:16:32 (UTC+0100)
1484788241 BEGIN 1.763 : jeudi 19 janvier 2017, 02:10:41 (UTC+0100)
1484788555 END 1.763 : jeudi 19 janvier 2017, 02:15:55 (UTC+0100)
1484803145 BEGIN 1.765 : jeudi 19 janvier 2017, 06:19:05 (UTC+0100)
1484804058 BEGIN 1.766 : jeudi 19 janvier 2017, 06:34:18 (UTC+0100)
1484804378 END 1.766 : jeudi 19 janvier 2017, 06:39:38 (UTC+0100)
1484805361 BEGIN 1.767 : jeudi 19 janvier 2017, 06:56:01 (UTC+0100)
1484805735 END 1.767 : jeudi 19 janvier 2017, 07:02:16 (UTC+0100)
1484806480 BEGIN 1.768 : jeudi 19 janvier 2017, 07:14:40 (UTC+0100)
1484806804 END 1.768 : jeudi 19 janvier 2017, 07:20:04 (UTC+0100)
1485900842 BEGIN 1.771 : mardi 31 janvier 2017, 23:14:02 (UTC+0100)
1485901133 BEGIN 1.771 : mardi 31 janvier 2017, 23:18:53 (UTC+0100)
1485901561 END 1.771 : mardi 31 janvier 2017, 23:26:01 (UTC+0100)
1487116017 BEGIN 1.773 : mercredi 15 février 2017, 00:46:57 (UTC+0100)
1487157193 BEGIN 1.773 : mercredi 15 février 2017, 12:13:13 (UTC+0100)
1487169674 BEGIN 1.774 : mercredi 15 février 2017, 15:41:14 (UTC+0100)
1487188465 BEGIN 1.774 : mercredi 15 février 2017, 20:54:25 (UTC+0100)
1487240884 BEGIN 1.774 : jeudi 16 février 2017, 11:28:04 (UTC+0100)
1487296664 BEGIN 1.775 : vendredi 17 février 2017, 02:57:44 (UTC+0100)
1487296925 END 1.775 : vendredi 17 février 2017, 03:02:05 (UTC+0100)
1488337707 BEGIN 1.777 : mercredi 1 mars 2017, 04:08:28 (UTC+0100)
1488338331 END 1.777 : mercredi 1 mars 2017, 04:18:51 (UTC+0100)
1489416028 BEGIN 1.783 : lundi 13 mars 2017, 15:40:28 (UTC+0100)
1489416325 END 1.783 : lundi 13 mars 2017, 15:45:25 (UTC+0100)
1489514968 BEGIN 1.785 : mardi 14 mars 2017, 19:09:28 (UTC+0100)
1489515233 END 1.785 : mardi 14 mars 2017, 19:13:53 (UTC+0100)
1489980931 BEGIN 1.786 : lundi 20 mars 2017, 04:35:31 (UTC+0100)
1490084192 BEGIN 1.788 : mardi 21 mars 2017, 09:16:32 (UTC+0100)
1490084443 END 1.788 : mardi 21 mars 2017, 09:20:43 (UTC+0100)
1492680526 BEGIN 1.794 : jeudi 20 avril 2017, 11:28:46 (UTC+0200)
1492680802 END 1.794 : jeudi 20 avril 2017, 11:33:22 (UTC+0200)
1493248850 BEGIN 1.803 : jeudi 27 avril 2017, 01:20:50 (UTC+0200)
1493249119 END 1.803 : jeudi 27 avril 2017, 01:25:19 (UTC+0200)
1493253906 BEGIN 1.804 : jeudi 27 avril 2017, 02:45:06 (UTC+0200)
1493254173 END 1.804 : jeudi 27 avril 2017, 02:49:33 (UTC+0200)
1493298460 BEGIN 1.805 : jeudi 27 avril 2017, 15:07:40 (UTC+0200)
1493299002 BEGIN 1.805 : jeudi 27 avril 2017, 15:16:42 (UTC+0200)
1493299269 END 1.805 : jeudi 27 avril 2017, 15:21:09 (UTC+0200)
1493387151 BEGIN 1.807 : vendredi 28 avril 2017, 15:45:51 (UTC+0200)
1493387431 END 1.807 : vendredi 28 avril 2017, 15:50:31 (UTC+0200)
1493578212 BEGIN 1.807 : dimanche 30 avril 2017, 20:50:12 (UTC+0200)
1493578413 END 1.807 : dimanche 30 avril 2017, 20:53:33 (UTC+0200)
1493586266 BEGIN 1.807 : dimanche 30 avril 2017, 23:04:26 (UTC+0200)
1493586762 END 1.807 : dimanche 30 avril 2017, 23:12:42 (UTC+0200)
1493587646 BEGIN 1.807 : dimanche 30 avril 2017, 23:27:26 (UTC+0200)
1493588141 END 1.807 : dimanche 30 avril 2017, 23:35:41 (UTC+0200)
1493642636 BEGIN 1.807 : lundi 1 mai 2017, 14:43:56 (UTC+0200)
1493642871 END 1.807 : lundi 1 mai 2017, 14:47:51 (UTC+0200)
1493662775 BEGIN 1.807 : lundi 1 mai 2017, 20:19:35 (UTC+0200)
1493663003 END 1.807 : lundi 1 mai 2017, 20:23:23 (UTC+0200)
1493676290 BEGIN 1.807 : mardi 2 mai 2017, 00:04:50 (UTC+0200)
1493676496 END 1.807 : mardi 2 mai 2017, 00:08:16 (UTC+0200)
1493676673 BEGIN 1.807 : mardi 2 mai 2017, 00:11:13 (UTC+0200)
1493676871 END 1.807 : mardi 2 mai 2017, 00:14:31 (UTC+0200)
1493685869 BEGIN 1.807 : mardi 2 mai 2017, 02:44:29 (UTC+0200)
1493686077 END 1.807 : mardi 2 mai 2017, 02:47:57 (UTC+0200)
1493709285 BEGIN 1.807 : mardi 2 mai 2017, 09:14:45 (UTC+0200)
1493709482 END 1.807 : mardi 2 mai 2017, 09:18:02 (UTC+0200)
1493710750 BEGIN 1.807 : mardi 2 mai 2017, 09:39:10 (UTC+0200)
1493710951 END 1.807 : mardi 2 mai 2017, 09:42:31 (UTC+0200)
1493714417 BEGIN 1.807 : mardi 2 mai 2017, 10:40:17 (UTC+0200)
1493714614 END 1.807 : mardi 2 mai 2017, 10:43:34 (UTC+0200)
1493746207 BEGIN 1.807 : mardi 2 mai 2017, 19:30:07 (UTC+0200)
1493746268 BEGIN 1.807 : mardi 2 mai 2017, 19:31:08 (UTC+0200)
1493746540 END 1.807 : mardi 2 mai 2017, 19:35:40 (UTC+0200)
1493747268 BEGIN 1.808 : mardi 2 mai 2017, 19:47:48 (UTC+0200)
1493747469 END 1.808 : mardi 2 mai 2017, 19:51:09 (UTC+0200)
1493749409 BEGIN 1.808 : mardi 2 mai 2017, 20:23:29 (UTC+0200)
1493749606 END 1.808 : mardi 2 mai 2017, 20:26:46 (UTC+0200)
1493750039 BEGIN 1.808 : mardi 2 mai 2017, 20:33:59 (UTC+0200)
1493750963 BEGIN 1.810 : mardi 2 mai 2017, 20:49:23 (UTC+0200)
1493751248 END 1.810 : mardi 2 mai 2017, 20:54:08 (UTC+0200)
1495648275 BEGIN 1.813 : mercredi 24 mai 2017, 19:51:15 (UTC+0200)
1495648641 END 1.813 : mercredi 24 mai 2017, 19:57:21 (UTC+0200)
1499474148 BEGIN 1.819 : samedi 8 juillet 2017, 02:35:48 (UTC+0200)
1499537272 BEGIN 1.819 : samedi 8 juillet 2017, 20:07:52 (UTC+0200)
1499610623 BEGIN 1.819 : dimanche 9 juillet 2017, 16:30:23 (UTC+0200)
1499627770 BEGIN 1.819 : dimanche 9 juillet 2017, 21:16:10 (UTC+0200)
1499628010 END 1.819 : dimanche 9 juillet 2017, 21:20:10 (UTC+0200)
1499729465 BEGIN 1.819 : mardi 11 juillet 2017, 01:31:05 (UTC+0200)
1499729716 END 1.819 : mardi 11 juillet 2017, 01:35:16 (UTC+0200)
1501096358 BEGIN 1.825 : mercredi 26 juillet 2017, 21:12:38 (UTC+0200)
1501096497 BEGIN 1.825 : mercredi 26 juillet 2017, 21:14:57 (UTC+0200)
1501096673 BEGIN 1.825 : mercredi 26 juillet 2017, 21:17:53 (UTC+0200)
1501096738 BEGIN 1.825 : mercredi 26 juillet 2017, 21:18:58 (UTC+0200)
1501097034 END 1.825 : mercredi 26 juillet 2017, 21:23:54 (UTC+0200)
1502873680 BEGIN 1.825 : mercredi 16 août 2017, 10:54:41 (UTC+0200)
1502886497 BEGIN 1.825 : mercredi 16 août 2017, 14:28:17 (UTC+0200)
1502887469 BEGIN 1.825 : mercredi 16 août 2017, 14:44:29 (UTC+0200)
1502887710 END 1.825 : mercredi 16 août 2017, 14:48:30 (UTC+0200)
1503494561 BEGIN 1.829 : mercredi 23 août 2017, 15:22:41 (UTC+0200)
1503939535 BEGIN 1.831 : lundi 28 août 2017, 18:58:55 (UTC+0200)
1503939776 END 1.831 : lundi 28 août 2017, 19:02:56 (UTC+0200)
1504149108 BEGIN 1.833 : jeudi 31 août 2017, 05:11:48 (UTC+0200)
1504149402 END 1.833 : jeudi 31 août 2017, 05:16:42 (UTC+0200)
1504156366 BEGIN 1.834 : jeudi 31 août 2017, 07:12:46 (UTC+0200)
1504156668 END 1.834 : jeudi 31 août 2017, 07:17:48 (UTC+0200)
1504415626 BEGIN 1.835 : dimanche 3 septembre 2017, 07:13:46 (UTC+0200)
1504628756 BEGIN 1.836 : mardi 5 septembre 2017, 18:25:56 (UTC+0200)
1504629099 END 1.836 : mardi 5 septembre 2017, 18:31:39 (UTC+0200)
1508853199 BEGIN 1.840 : mardi 24 octobre 2017, 15:53:20 (UTC+0200)
1508853523 END 1.840 : mardi 24 octobre 2017, 15:58:43 (UTC+0200)
1509924534 BEGIN 1.843 : lundi 6 novembre 2017, 00:28:54 (UTC+0100)
1509924865 END 1.843 : lundi 6 novembre 2017, 00:34:25 (UTC+0100)
1512012992 BEGIN 1.846 : jeudi 30 novembre 2017, 04:36:32 (UTC+0100)
1512102532 BEGIN 1.846 : vendredi 1 décembre 2017, 05:28:52 (UTC+0100)
1512948368 BEGIN 1.846 : lundi 11 décembre 2017, 00:26:08 (UTC+0100)
1512950380 BEGIN 1.846 : lundi 11 décembre 2017, 00:59:40 (UTC+0100)
1512953257 BEGIN 1.846 : lundi 11 décembre 2017, 01:47:37 (UTC+0100)
1512986252 BEGIN 1.846 : lundi 11 décembre 2017, 10:57:32 (UTC+0100)
1512986818 END 1.846 : lundi 11 décembre 2017, 11:06:58 (UTC+0100)
1518045016 BEGIN 1.848 : jeudi 8 février 2018, 00:10:16 (UTC+0100)
1518295038 BEGIN 1.848 : samedi 10 février 2018, 21:37:18 (UTC+0100)
1518376644 BEGIN 1.848 : dimanche 11 février 2018, 20:17:24 (UTC+0100)
1518474553 BEGIN 1.848 : lundi 12 février 2018, 23:29:13 (UTC+0100)
1518475716 END 1.848 : lundi 12 février 2018, 23:48:36 (UTC+0100)
1520881928 BEGIN 1.853 : lundi 12 mars 2018, 20:12:09 (UTC+0100)
1520910093 BEGIN 1.853 : mardi 13 mars 2018, 04:01:33 (UTC+0100)
1520910431 END 1.853 : mardi 13 mars 2018, 04:07:12 (UTC+0100)
1523363300 BEGIN 1.870 : mardi 10 avril 2018, 14:28:20 (UTC+0200)
1523856136 BEGIN 1.871 : lundi 16 avril 2018, 07:22:16 (UTC+0200)
1524233668 BEGIN 1.879 : vendredi 20 avril 2018, 16:14:28 (UTC+0200)
1524234906 END 1.879 : vendredi 20 avril 2018, 16:35:06 (UTC+0200)
1525465051 BEGIN 1.879 : vendredi 4 mai 2018, 22:17:31 (UTC+0200)
1525465406 END 1.879 : vendredi 4 mai 2018, 22:23:26 (UTC+0200)
1525559651 BEGIN 1.882 : dimanche 6 mai 2018, 00:34:11 (UTC+0200)
1525562545 BEGIN 1.882 : dimanche 6 mai 2018, 01:22:25 (UTC+0200)
1525563698 END 1.882 : dimanche 6 mai 2018, 01:41:38 (UTC+0200)
1530935431 BEGIN 1.884 : samedi 7 juillet 2018, 05:50:31 (UTC+0200)
1533572276 BEGIN 1.886 : lundi 6 août 2018, 18:17:57 (UTC+0200)
1533573483 END 1.886 : lundi 6 août 2018, 18:38:03 (UTC+0200)
1536674569 BEGIN 1.894 : mardi 11 septembre 2018, 16:02:49 (UTC+0200)
1536675825 END 1.894 : mardi 11 septembre 2018, 16:23:45 (UTC+0200)
1536861485 BEGIN 1.895 : jeudi 13 septembre 2018, 19:58:05 (UTC+0200)
1536862770 END 1.895 : jeudi 13 septembre 2018, 20:19:30 (UTC+0200)
1538776338 BEGIN 1.902 : vendredi 5 octobre 2018, 23:52:18 (UTC+0200)
1538777640 END 1.902 : samedi 6 octobre 2018, 00:14:00 (UTC+0200)
1539952034 BEGIN 1.904 : vendredi 19 octobre 2018, 14:27:14 (UTC+0200)
1539953290 END 1.904 : vendredi 19 octobre 2018, 14:48:10 (UTC+0200)
1541964784 BEGIN 1.906 : dimanche 11 novembre 2018, 20:33:04 (UTC+0100)
1541966136 END 1.906 : dimanche 11 novembre 2018, 20:55:36 (UTC+0100)
1542365354 BEGIN 1.907 : vendredi 16 novembre 2018, 11:49:15 (UTC+0100)
1542366666 END 1.907 : vendredi 16 novembre 2018, 12:11:06 (UTC+0100)
1549626773 BEGIN 1.918 : vendredi 8 février 2019, 12:52:54 (UTC+0100)
1549628101 END 1.918 : vendredi 8 février 2019, 13:15:01 (UTC+0100)
1549838284 BEGIN 64bit 1.920 : dimanche 10 février 2019, 23:38:04 (UTC+0100)
1549838455 END 64bit 1.920 : dimanche 10 février 2019, 23:40:55 (UTC+0100)
1549844664 BEGIN 1.920 : lundi 11 février 2019, 01:24:24 (UTC+0100)
1549845893 END 1.920 : lundi 11 février 2019, 01:44:53 (UTC+0100)
1550487405 BEGIN 1.921 : lundi 18 février 2019, 11:56:45 (UTC+0100)
1550490170 BEGIN 1.921 : lundi 18 février 2019, 12:42:50 (UTC+0100)
1550490616 END 1.921 : lundi 18 février 2019, 12:50:16 (UTC+0100)
1550490651 BEGIN 64bit 1.921 : lundi 18 février 2019, 12:50:51 (UTC+0100)
1550490992 END 64bit 1.921 : lundi 18 février 2019, 12:56:32 (UTC+0100)
1550491431 BEGIN 64bit 1.921 : lundi 18 février 2019, 13:03:51 (UTC+0100)
1550491837 END 64bit 1.921 : lundi 18 février 2019, 13:10:37 (UTC+0100)
1550492090 BEGIN 1.921 : lundi 18 février 2019, 13:14:50 (UTC+0100)
1550493338 END 1.921 : lundi 18 février 2019, 13:35:38 (UTC+0100)
1550493338 BEGIN 64bit 1.921 : lundi 18 février 2019, 13:35:38 (UTC+0100)
1550493671 END 64bit 1.921 : lundi 18 février 2019, 13:41:11 (UTC+0100)
1551276097 BEGIN 64bit 1.922 : mercredi 27 février 2019, 15:01:37 (UTC+0100)
1551276382 END 64bit 1.922 : mercredi 27 février 2019, 15:06:22 (UTC+0100)
1551279995 BEGIN 1.922 : mercredi 27 février 2019, 16:06:35 (UTC+0100)
1551281318 END 1.922 : mercredi 27 février 2019, 16:28:38 (UTC+0100)
1553344520 BEGIN 1.927 : samedi 23 mars 2019, 13:35:20 (UTC+0100)
1553345844 END 1.927 : samedi 23 mars 2019, 13:57:24 (UTC+0100)
1553345844 BEGIN 64bit 1.927 : samedi 23 mars 2019, 13:57:24 (UTC+0100)
1553347859 BEGIN 64bit 1.927 : samedi 23 mars 2019, 14:30:59 (UTC+0100)
1553347950 BEGIN 64bit 1.927 : samedi 23 mars 2019, 14:32:30 (UTC+0100)
1553348266 END 64bit 1.927 : samedi 23 mars 2019, 14:37:46 (UTC+0100)
1553772623 BEGIN 1.928 : jeudi 28 mars 2019, 12:30:23 (UTC+0100)
1553773942 END 1.928 : jeudi 28 mars 2019, 12:52:22 (UTC+0100)
1553773942 BEGIN 64bit 1.928 : jeudi 28 mars 2019, 12:52:22 (UTC+0100)
1553774220 END 64bit 1.928 : jeudi 28 mars 2019, 12:57:00 (UTC+0100)
1555022344 BEGIN 1.930 : vendredi 12 avril 2019, 00:39:04 (UTC+0200)
1555023694 END 1.930 : vendredi 12 avril 2019, 01:01:34 (UTC+0200)
1555023694 BEGIN 64bit 1.930 : vendredi 12 avril 2019, 01:01:34 (UTC+0200)
1555024099 END 64bit 1.930 : vendredi 12 avril 2019, 01:08:19 (UTC+0200)
1555172099 BEGIN 1.931 : samedi 13 avril 2019, 18:14:59 (UTC+0200)
1555174250 END 1.931 : samedi 13 avril 2019, 18:50:50 (UTC+0200)
1555174250 BEGIN 64bit 1.931 : samedi 13 avril 2019, 18:50:50 (UTC+0200)
1555174461 END 64bit 1.931 : samedi 13 avril 2019, 18:54:21 (UTC+0200)
1555692711 BEGIN 1.932 : vendredi 19 avril 2019, 18:51:52 (UTC+0200)
1555693944 END 1.932 : vendredi 19 avril 2019, 19:12:24 (UTC+0200)
1555693944 BEGIN 64bit 1.932 : vendredi 19 avril 2019, 19:12:24 (UTC+0200)
1556423792 BEGIN 1.935 : dimanche 28 avril 2019, 05:56:32 (UTC+0200)
1556424470 BEGIN 1.935 : dimanche 28 avril 2019, 06:07:50 (UTC+0200)
1556424717 BEGIN 1.935 : dimanche 28 avril 2019, 06:11:57 (UTC+0200)
1556510637 BEGIN 64bit 1.935 : lundi 29 avril 2019, 06:03:57 (UTC+0200)
1556510687 BEGIN 64bit 1.935 : lundi 29 avril 2019, 06:04:47 (UTC+0200)
1556510711 BEGIN 1.935 : lundi 29 avril 2019, 06:05:11 (UTC+0200)
1556512550 BEGIN 64bit 1.935 : lundi 29 avril 2019, 06:35:50 (UTC+0200)
1556514236 BEGIN 1.935 : lundi 29 avril 2019, 07:03:56 (UTC+0200)
1556515512 BEGIN 1.935 : lundi 29 avril 2019, 07:25:12 (UTC+0200)
1556515981 BEGIN 1.936 : lundi 29 avril 2019, 07:33:01 (UTC+0200)
1556517503 END 1.936 : lundi 29 avril 2019, 07:58:23 (UTC+0200)
1556517503 BEGIN 64bit 1.936 : lundi 29 avril 2019, 07:58:23 (UTC+0200)
1556517802 END 64bit 1.936 : lundi 29 avril 2019, 08:03:22 (UTC+0200)
1556795946 BEGIN 1.937 : jeudi 2 mai 2019, 13:19:06 (UTC+0200)
1556797196 END 1.937 : jeudi 2 mai 2019, 13:39:56 (UTC+0200)
1556797196 BEGIN 64bit 1.937 : jeudi 2 mai 2019, 13:39:56 (UTC+0200)
1556797521 END 64bit 1.937 : jeudi 2 mai 2019, 13:45:21 (UTC+0200)
1558993720 BEGIN 1.938 : lundi 27 mai 2019, 23:48:41 (UTC+0200)
1558995018 END 1.938 : mardi 28 mai 2019, 00:10:18 (UTC+0200)
1558995018 BEGIN 64bit 1.938 : mardi 28 mai 2019, 00:10:18 (UTC+0200)
1558995347 END 64bit 1.938 : mardi 28 mai 2019, 00:15:47 (UTC+0200)
1559041754 BEGIN 64bit 1.939 : mardi 28 mai 2019, 13:09:14 (UTC+0200)
1559042130 END 64bit 1.939 : mardi 28 mai 2019, 13:15:30 (UTC+0200)
1559042228 BEGIN 64bit 1.939 : mardi 28 mai 2019, 13:17:08 (UTC+0200)
1559048685 BEGIN 64bit 1.939 : mardi 28 mai 2019, 15:04:45 (UTC+0200)
1559048999 END 64bit 1.939 : mardi 28 mai 2019, 15:09:59 (UTC+0200)
1561482028 BEGIN 1.944 : mardi 25 juin 2019, 19:00:28 (UTC+0200)
1561483425 END 1.944 : mardi 25 juin 2019, 19:23:45 (UTC+0200)
1561483425 BEGIN 64bit 1.944 : mardi 25 juin 2019, 19:23:45 (UTC+0200)
1561485269 BEGIN 64bit 1.944 : mardi 25 juin 2019, 19:54:29 (UTC+0200)
1561485610 END 64bit 1.944 : mardi 25 juin 2019, 20:00:10 (UTC+0200)
1561591178 BEGIN 1.945 : jeudi 27 juin 2019, 01:19:38 (UTC+0200)
1561592446 END 1.945 : jeudi 27 juin 2019, 01:40:46 (UTC+0200)
1561592446 BEGIN 64bit 1.945 : jeudi 27 juin 2019, 01:40:46 (UTC+0200)
1561592761 END 64bit 1.945 : jeudi 27 juin 2019, 01:46:01 (UTC+0200)
1563247231 BEGIN 1.947 : mardi 16 juillet 2019, 05:20:31 (UTC+0200)
1563271510 BEGIN 1.947 : mardi 16 juillet 2019, 12:05:10 (UTC+0200)
1563272943 END 1.947 : mardi 16 juillet 2019, 12:29:03 (UTC+0200)
1564388334 BEGIN 1.953 : lundi 29 juillet 2019, 10:18:54 (UTC+0200)
1564627935 BEGIN 1.955 : jeudi 1 août 2019, 04:52:15 (UTC+0200)
1564629209 END 1.955 : jeudi 1 août 2019, 05:13:29 (UTC+0200)
1564629209 BEGIN 64bit 1.955 : jeudi 1 août 2019, 05:13:29 (UTC+0200)
1564659229 BEGIN 64bit 1.955 : jeudi 1 août 2019, 13:33:49 (UTC+0200)
1564659589 END 64bit 1.955 : jeudi 1 août 2019, 13:39:49 (UTC+0200)
1564795411 BEGIN 1.956 : samedi 3 août 2019, 03:23:31 (UTC+0200)
1564796657 END 1.956 : samedi 3 août 2019, 03:44:17 (UTC+0200)
1564796657 BEGIN 64bit 1.956 : samedi 3 août 2019, 03:44:17 (UTC+0200)
1564823546 BEGIN 64bit 1.956 : samedi 3 août 2019, 11:12:26 (UTC+0200)
1564823894 END 64bit 1.956 : samedi 3 août 2019, 11:18:14 (UTC+0200)
1574416593 BEGIN 1.962 : vendredi 22 novembre 2019, 10:56:34 (UTC+0100)
1574419847 BEGIN 1.962 : vendredi 22 novembre 2019, 11:50:47 (UTC+0100)
1574429786 BEGIN 64bit 1.962 : vendredi 22 novembre 2019, 14:36:26 (UTC+0100)
1574433224 BEGIN 64bit 1.962 : vendredi 22 novembre 2019, 15:33:44 (UTC+0100)
1574433927 BEGIN 1.962 : vendredi 22 novembre 2019, 15:45:27 (UTC+0100)
1574434278 BEGIN 64bit 1.962 : vendredi 22 novembre 2019, 15:51:18 (UTC+0100)
1574434980 BEGIN 64bit 1.962 : vendredi 22 novembre 2019, 16:03:00 (UTC+0100)
1574435270 BEGIN 64bit 1.962 : vendredi 22 novembre 2019, 16:07:50 (UTC+0100)
1574450028 BEGIN 1.962 : vendredi 22 novembre 2019, 20:13:48 (UTC+0100)
1574450399 END 1.962 : vendredi 22 novembre 2019, 20:19:59 (UTC+0100)
1574452231 BEGIN 1.962 : vendredi 22 novembre 2019, 20:50:32 (UTC+0100)
1574452286 BEGIN 1.962 : vendredi 22 novembre 2019, 20:51:26 (UTC+0100)
1574452715 END 1.962 : vendredi 22 novembre 2019, 20:58:36 (UTC+0100)
1574681848 BEGIN 64bit 1.962 : lundi 25 novembre 2019, 12:37:28 (UTC+0100)
1574692336 BEGIN 1.963 : lundi 25 novembre 2019, 15:32:16 (UTC+0100)
1574693629 END 1.963 : lundi 25 novembre 2019, 15:53:49 (UTC+0100)
1574693629 BEGIN 64bit 1.963 : lundi 25 novembre 2019, 15:53:49 (UTC+0100)
1574693945 END 64bit 1.963 : lundi 25 novembre 2019, 15:59:05 (UTC+0100)
1574953419 BEGIN 1.967 : jeudi 28 novembre 2019, 16:03:39 (UTC+0100)
1574954698 END 1.967 : jeudi 28 novembre 2019, 16:24:58 (UTC+0100)
1574954698 BEGIN 64bit 1.967 : jeudi 28 novembre 2019, 16:24:58 (UTC+0100)
1574955031 END 64bit 1.967 : jeudi 28 novembre 2019, 16:30:31 (UTC+0100)
1575033978 BEGIN 1.969 : vendredi 29 novembre 2019, 14:26:18 (UTC+0100)
1575035212 END 1.969 : vendredi 29 novembre 2019, 14:46:52 (UTC+0100)
1575035212 BEGIN 64bit 1.969 : vendredi 29 novembre 2019, 14:46:52 (UTC+0100)
1575035732 END 64bit 1.969 : vendredi 29 novembre 2019, 14:55:32 (UTC+0100)
1575911925 BEGIN 1.969 : lundi 9 décembre 2019, 18:18:45 (UTC+0100)
1575916737 BEGIN 1.969 : lundi 9 décembre 2019, 19:38:57 (UTC+0100)
1575924912 END 1.969 : lundi 9 décembre 2019, 21:55:12 (UTC+0100)
1575931824 BEGIN 64bit 1.969 : lundi 9 décembre 2019, 23:50:24 (UTC+0100)
1575932149 END 64bit 1.969 : lundi 9 décembre 2019, 23:55:49 (UTC+0100)
1575933203 BEGIN 1.970 : mardi 10 décembre 2019, 00:13:23 (UTC+0100)
1575973632 BEGIN 1.970 : mardi 10 décembre 2019, 11:27:12 (UTC+0100)
1575973801 BEGIN 1.970 : mardi 10 décembre 2019, 11:30:01 (UTC+0100)
1575973972 BEGIN 1.970 : mardi 10 décembre 2019, 11:32:52 (UTC+0100)
1575974574 BEGIN 1.970 : mardi 10 décembre 2019, 11:42:54 (UTC+0100)
1575975909 END 1.970 : mardi 10 décembre 2019, 12:05:09 (UTC+0100)
1575977906 BEGIN 64bit 1.970 : mardi 10 décembre 2019, 12:38:26 (UTC+0100)
1575978279 END 64bit 1.970 : mardi 10 décembre 2019, 12:44:39 (UTC+0100)
1575978283 BEGIN 32bit 1.970 : mardi 10 décembre 2019, 12:44:43 (UTC+0100)
1575979537 END 32bit 1.970 : mardi 10 décembre 2019, 13:05:37 (UTC+0100)
1577132428 BEGIN 64bit 1.977 : lundi 23 décembre 2019, 21:20:28 (UTC+0100)
1577133568 BEGIN 64bit 1.977 : lundi 23 décembre 2019, 21:39:28 (UTC+0100)
1577134322 END 64bit 1.977 : lundi 23 décembre 2019, 21:52:02 (UTC+0100)
1577134327 BEGIN 32bit 1.977 : lundi 23 décembre 2019, 21:52:07 (UTC+0100)
1577135607 END 32bit 1.977 : lundi 23 décembre 2019, 22:13:27 (UTC+0100)

View file

137
W/.compok
View file

@ -1,137 +0,0 @@
lundi 6 novembre 2017, 00:00:33 (UTC+0100)
mardi 7 novembre 2017, 23:20:00 (UTC+0100)
mercredi 8 novembre 2017, 06:05:30 (UTC+0100)
lundi 13 novembre 2017, 01:11:50 (UTC+0100)
jeudi 16 novembre 2017, 15:37:53 (UTC+0100)
jeudi 16 novembre 2017, 15:39:32 (UTC+0100)
jeudi 30 novembre 2017, 03:41:20 (UTC+0100)
lundi 18 décembre 2017, 00:49:53 (UTC+0100)
mercredi 7 février 2018, 23:29:31 (UTC+0100)
lundi 12 mars 2018, 19:30:26 (UTC+0100)
mercredi 21 mars 2018, 08:59:55 (UTC+0100)
mardi 10 avril 2018, 04:10:12 (UTC+0200)
lundi 16 avril 2018, 06:28:59 (UTC+0200)
mercredi 18 avril 2018, 02:48:08 (UTC+0200)
mercredi 18 avril 2018, 16:54:44 (UTC+0200)
mercredi 18 avril 2018, 16:57:03 (UTC+0200)
mercredi 18 avril 2018, 17:22:43 (UTC+0200)
jeudi 19 avril 2018, 00:42:59 (UTC+0200)
jeudi 19 avril 2018, 01:55:58 (UTC+0200)
jeudi 19 avril 2018, 03:29:18 (UTC+0200)
vendredi 20 avril 2018, 15:32:30 (UTC+0200)
vendredi 4 mai 2018, 12:22:24 (UTC+0200)
samedi 5 mai 2018, 14:11:25 (UTC+0200)
samedi 5 mai 2018, 14:20:55 (UTC+0200)
samedi 5 mai 2018, 15:53:28 (UTC+0200)
samedi 5 mai 2018, 23:52:27 (UTC+0200)
lundi 6 août 2018, 01:05:56 (UTC+0200)
lundi 6 août 2018, 17:34:13 (UTC+0200)
mercredi 29 août 2018, 21:18:54 (UTC+0200)
mardi 4 septembre 2018, 06:05:56 (UTC+0200)
mardi 11 septembre 2018, 02:25:29 (UTC+0200)
mardi 11 septembre 2018, 11:35:56 (UTC+0200)
mardi 11 septembre 2018, 15:23:30 (UTC+0200)
mardi 11 septembre 2018, 20:57:36 (UTC+0200)
jeudi 13 septembre 2018, 01:54:06 (UTC+0200)
vendredi 5 octobre 2018, 22:50:41 (UTC+0200)
jeudi 18 octobre 2018, 14:14:30 (UTC+0200)
lundi 5 novembre 2018, 12:16:05 (UTC+0100)
lundi 5 novembre 2018, 12:20:11 (UTC+0100)
lundi 5 novembre 2018, 12:51:13 (UTC+0100)
lundi 5 novembre 2018, 17:37:53 (UTC+0100)
mardi 6 novembre 2018, 09:27:35 (UTC+0100)
mardi 6 novembre 2018, 09:44:04 (UTC+0100)
mardi 6 novembre 2018, 10:52:15 (UTC+0100)
mercredi 7 novembre 2018, 00:36:45 (UTC+0100)
mercredi 7 novembre 2018, 14:27:44 (UTC+0100)
jeudi 8 novembre 2018, 19:38:22 (UTC+0100)
dimanche 11 novembre 2018, 23:24:54 (UTC+0100)
lundi 12 novembre 2018, 10:34:42 (UTC+0100)
dimanche 18 novembre 2018, 13:07:46 (UTC+0100)
dimanche 18 novembre 2018, 13:20:31 (UTC+0100)
dimanche 18 novembre 2018, 15:59:13 (UTC+0100)
dimanche 18 novembre 2018, 17:59:07 (UTC+0100)
lundi 19 novembre 2018, 18:39:28 (UTC+0100)
lundi 19 novembre 2018, 18:41:30 (UTC+0100)
mardi 4 décembre 2018, 02:56:45 (UTC+0100)
dimanche 9 décembre 2018, 22:26:54 (UTC+0100)
samedi 5 janvier 2019, 01:43:02 (UTC+0100)
samedi 5 janvier 2019, 02:40:14 (UTC+0100)
samedi 5 janvier 2019, 14:19:18 (UTC+0100)
samedi 5 janvier 2019, 14:21:58 (UTC+0100)
samedi 5 janvier 2019, 16:22:51 (UTC+0100)
samedi 5 janvier 2019, 23:17:20 (UTC+0100)
lundi 7 janvier 2019, 20:11:24 (UTC+0100)
lundi 7 janvier 2019, 20:44:41 (UTC+0100)
mercredi 6 février 2019, 14:02:24 (UTC+0100)
jeudi 7 février 2019, 13:56:24 (UTC+0100)
jeudi 14 février 2019, 18:27:42 (UTC+0100)
lundi 18 février 2019, 23:52:36 (UTC+0100)
mercredi 27 février 2019, 16:20:41 (UTC+0100)
dimanche 3 mars 2019, 19:42:11 (UTC+0100)
vendredi 22 mars 2019, 16:33:19 (UTC+0100)
lundi 25 mars 2019, 18:57:57 (UTC+0100)
mardi 26 mars 2019, 12:30:43 (UTC+0100)
lundi 1 avril 2019, 01:17:29 (UTC+0200)
lundi 1 avril 2019, 20:09:43 (UTC+0200)
mardi 2 avril 2019, 21:10:12 (UTC+0200)
mercredi 3 avril 2019, 01:09:15 (UTC+0200)
mardi 9 avril 2019, 12:56:28 (UTC+0200)
mardi 9 avril 2019, 17:11:22 (UTC+0200)
mercredi 10 avril 2019, 17:34:10 (UTC+0200)
mercredi 10 avril 2019, 18:11:30 (UTC+0200)
mercredi 10 avril 2019, 18:19:37 (UTC+0200)
mercredi 10 avril 2019, 18:27:57 (UTC+0200)
mercredi 10 avril 2019, 18:31:03 (UTC+0200)
mercredi 10 avril 2019, 18:32:13 (UTC+0200)
mercredi 10 avril 2019, 18:38:13 (UTC+0200)
mercredi 10 avril 2019, 19:08:42 (UTC+0200)
vendredi 12 avril 2019, 03:13:33 (UTC+0200)
samedi 13 avril 2019, 18:01:03 (UTC+0200)
samedi 13 avril 2019, 19:01:23 (UTC+0200)
vendredi 19 avril 2019, 17:08:45 (UTC+0200)
vendredi 26 avril 2019, 11:05:36 (UTC+0200)
vendredi 26 avril 2019, 11:40:46 (UTC+0200)
vendredi 26 avril 2019, 15:03:14 (UTC+0200)
dimanche 28 avril 2019, 04:53:37 (UTC+0200)
lundi 29 avril 2019, 16:45:47 (UTC+0200)
mardi 30 avril 2019, 13:47:11 (UTC+0200)
mercredi 1 mai 2019, 13:07:09 (UTC+0200)
mercredi 1 mai 2019, 13:10:34 (UTC+0200)
mercredi 8 mai 2019, 22:38:01 (UTC+0200)
lundi 27 mai 2019, 20:54:29 (UTC+0200)
mardi 28 mai 2019, 01:28:06 (UTC+0200)
mercredi 5 juin 2019, 18:26:32 (UTC+0200)
jeudi 6 juin 2019, 02:04:34 (UTC+0200)
jeudi 6 juin 2019, 02:11:48 (UTC+0200)
jeudi 6 juin 2019, 02:16:38 (UTC+0200)
jeudi 6 juin 2019, 16:04:46 (UTC+0200)
jeudi 20 juin 2019, 16:32:12 (UTC+0200)
mardi 25 juin 2019, 00:47:36 (UTC+0200)
mardi 25 juin 2019, 10:26:28 (UTC+0200)
mardi 25 juin 2019, 10:39:18 (UTC+0200)
mardi 25 juin 2019, 10:46:03 (UTC+0200)
mardi 25 juin 2019, 18:52:01 (UTC+0200)
mercredi 26 juin 2019, 17:34:23 (UTC+0200)
mercredi 26 juin 2019, 21:32:34 (UTC+0200)
mardi 16 juillet 2019, 03:57:32 (UTC+0200)
mercredi 17 juillet 2019, 17:45:33 (UTC+0200)
mercredi 17 juillet 2019, 18:35:58 (UTC+0200)
mercredi 17 juillet 2019, 18:40:36 (UTC+0200)
mercredi 17 juillet 2019, 18:49:36 (UTC+0200)
dimanche 21 juillet 2019, 02:47:49 (UTC+0200)
jeudi 25 juillet 2019, 19:10:43 (UTC+0200)
jeudi 25 juillet 2019, 20:30:32 (UTC+0200)
jeudi 25 juillet 2019, 22:46:56 (UTC+0200)
vendredi 26 juillet 2019, 12:13:40 (UTC+0200)
lundi 29 juillet 2019, 09:26:31 (UTC+0200)
jeudi 1 août 2019, 04:03:35 (UTC+0200)
samedi 3 août 2019, 02:31:37 (UTC+0200)
mercredi 20 novembre 2019, 14:59:11 (UTC+0100)
lundi 25 novembre 2019, 15:18:38 (UTC+0100)
lundi 2 décembre 2019, 15:59:44 (UTC+0100)
mercredi 4 décembre 2019, 19:41:38 (UTC+0100)
mercredi 11 décembre 2019, 22:12:49 (UTC+0100)
jeudi 19 décembre 2019, 10:52:31 (UTC+0100)
vendredi 20 décembre 2019, 18:00:28 (UTC+0100)
mardi 24 décembre 2019, 22:25:29 (UTC+0100)

File diff suppressed because it is too large Load diff

View file

View file

@ -1,26 +0,0 @@
===== Synopsis =====
$mailbox_1 = Mail::imapsync::mailbox->new();
$mailbox_2 = Mail::imapsync::mailbox->new();
$mailbox_1->host('imap1.lala.org');
$mailbox_1->user('toto1');
...
$mailbox_2->host('imap2.lala.org');
$mailbox_2->user('toto2');
...
$transfer = Mail::imapsync::transfer->new();
$transfer->sync($mailbox_1, $mailbox_2);
- an object for mailbox
- an object for a transfer
- ?an object for a folder?
- ?an object for a message?

View file

@ -1 +0,0 @@
Failure running NOEXIST

View file

@ -1 +0,0 @@
Failure running .\imapsync.exe --tests

File diff suppressed because it is too large Load diff

View file

@ -1,42 +0,0 @@
Changes
MANIFEST
Makefile.PL
README
examples/build_dist.pl
examples/build_ldif.pl
examples/cleanTest.pl
examples/copy_folder.pl
examples/cyrus_expire.pl
examples/cyrus_expunge.pl
examples/find_dup_msgs.pl
examples/idle.pl
examples/imap_to_mbox.pl
examples/imtestExample.pl
examples/migrate_mail2.pl
examples/migrate_mbox.pl
examples/populate_mailbox.pl
examples/sharedFolder.pl
lib/Mail/IMAPClient.pm
lib/Mail/IMAPClient.pod
lib/Mail/IMAPClient/BodyStructure.pm
lib/Mail/IMAPClient/BodyStructure/Parse.grammar
lib/Mail/IMAPClient/BodyStructure/Parse.pm
lib/Mail/IMAPClient/BodyStructure/Parse.pod
lib/Mail/IMAPClient/MessageSet.pm
lib/Mail/IMAPClient/Thread.grammar
lib/Mail/IMAPClient/Thread.pm
lib/Mail/IMAPClient/Thread.pod
prepare_dist
t/basic.t
t/body_string.t
t/bodystructure.t
t/fetch_hash.t
t/lib/MyTest.pm
t/messageset.t
t/pod.t
t/quota.t
t/simple.t
t/thread.t
test_template.txt
META.yml Module meta-data (added by MakeMaker)
META.json Module JSON meta-data (added by MakeMaker)

View file

@ -1,57 +0,0 @@
{
"abstract" : "IMAP4 client library",
"author" : [
"Phil Pearl (Lobbes) <plobbes+mail-imapclient@gmail.com>"
],
"dynamic_config" : 1,
"generated_by" : "ExtUtils::MakeMaker version 7.24, CPAN::Meta::Converter version 2.150010",
"license" : [
"perl_5"
],
"meta-spec" : {
"url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
"version" : 2
},
"name" : "Mail-IMAPClient",
"no_index" : {
"directory" : [
"t",
"inc"
]
},
"prereqs" : {
"build" : {
"requires" : {
"ExtUtils::MakeMaker" : "0"
}
},
"configure" : {
"requires" : {
"ExtUtils::MakeMaker" : "0"
}
},
"runtime" : {
"requires" : {
"Carp" : "0",
"Errno" : "0",
"Fcntl" : "0",
"File::Temp" : "0",
"IO::File" : "0",
"IO::Select" : "0",
"IO::Socket" : "0",
"IO::Socket::INET" : "1.26",
"List::Util" : "0",
"MIME::Base64" : "0",
"Parse::RecDescent" : "1.94",
"Test::More" : "0",
"perl" : "5.008"
}
}
},
"release_status" : "stable",
"resources" : {
"homepage" : "https://sourceforge.net/projects/mail-imapclient/"
},
"version" : "3.42",
"x_serialization_backend" : "JSON::PP version 2.97001"
}

View file

@ -1,37 +0,0 @@
---
abstract: 'IMAP4 client library'
author:
- 'Phil Pearl (Lobbes) <plobbes+mail-imapclient@gmail.com>'
build_requires:
ExtUtils::MakeMaker: '0'
configure_requires:
ExtUtils::MakeMaker: '0'
dynamic_config: 1
generated_by: 'ExtUtils::MakeMaker version 7.24, CPAN::Meta::Converter version 2.150010'
license: perl
meta-spec:
url: http://module-build.sourceforge.net/META-spec-v1.4.html
version: '1.4'
name: Mail-IMAPClient
no_index:
directory:
- t
- inc
requires:
Carp: '0'
Errno: '0'
Fcntl: '0'
File::Temp: '0'
IO::File: '0'
IO::Select: '0'
IO::Socket: '0'
IO::Socket::INET: '1.26'
List::Util: '0'
MIME::Base64: '0'
Parse::RecDescent: '1.94'
Test::More: '0'
perl: '5.008'
resources:
homepage: https://sourceforge.net/projects/mail-imapclient/
version: '3.42'
x_serialization_backend: 'CPAN::Meta::YAML version 0.018'

View file

@ -1,138 +0,0 @@
use ExtUtils::MakeMaker;
use warnings;
use strict;
use 5.008_001;
my @missing;
my %optional = (
"Authen::NTLM" => { for => "Authmechanism 'NTLM'" },
"Authen::SASL" => { for => "Authmechanism 'DIGEST-MD5'" },
"Compress::Zlib" => { for => "COMPRESS DEFLATE support" },
"Digest::HMAC_MD5" => { for => "Authmechanism 'CRAM-MD5'" },
"Digest::MD5" => { for => "Authmechanism 'DIGEST-MD5'" },
"IO::Socket::IP" => { for => "IPv6 support" },
"IO::Socket::SSL" => { for => "SSL enabled connections (Ssl => 1)" },
"Test::Pod" => { for => "Pod tests", ver => "1.00" },
);
foreach my $mod ( sort keys %optional ) {
my $for = $optional{$mod}->{"for"} || "";
my $ver = $optional{$mod}->{"ver"} || "";
eval "use $mod $ver ();";
push @missing, $mod . ( $for ? " for $for" : "" ) if $@;
}
# similar message to one used in DBI:
if (@missing) {
print( "The following optional modules were not found:",
map( "\n\t" . $_, @missing ), "\n" );
print <<'MSG';
Optional modules are available from any CPAN mirror, reference:
https://metacpan.org/
https://www.cpan.org/modules/by-module/
MSG
sleep 3;
}
# HACK: die on broken Parse::RecDescent 1.966002 through 1.967009
# - rt.cpan.org#74593: Recent changes break Module::ExtractUse and ...
# - rt.cpan.org#74733: Fails with Parse::RecDescent >= 1.966_002
do {
eval { require version; require Parse::RecDescent; };
unless ($@) {
my $found = version->parse( Parse::RecDescent->VERSION() );
my $broke = version->parse("1.966002");
my $fixed = version->parse("1.967009");
if ( $found < $fixed and $found >= $broke ) {
die(
"Found broken Parse::RecDescent $found in your environment.\n",
"Please upgrade to version $fixed or greater.\n"
);
}
}
};
WriteMakefile(
NAME => 'Mail::IMAPClient',
AUTHOR => 'Phil Pearl (Lobbes) <plobbes+mail-imapclient@gmail.com>',
ABSTRACT => 'IMAP4 client library',
VERSION_FROM => 'lib/Mail/IMAPClient.pm',
LICENSE => 'perl',
META_MERGE => {
resources => {
bugtracker => {
web =>
'https://rt.cpan.org/Public/Dist/Display.html?Name=Mail-IMAPClient',
mailto => 'bug-Mail-IMAPClient@rt.cpan.org',
},
homepage => 'https://sourceforge.net/projects/mail-imapclient/',
repository => {
url => 'git://git.code.sf.net/p/mail-imapclient/git',
web => 'https://sourceforge.net/p/mail-imapclient/git/',
type => 'git',
},
},
},
MIN_PERL_VERSION => '5.008',
PREREQ_PM => {
'Carp' => 0,
'Errno' => 0,
'Fcntl' => 0,
'IO::File' => 0,
'IO::Select' => 0,
'IO::Socket' => 0,
'IO::Socket::INET' => 1.26,
'List::Util' => 0,
'MIME::Base64' => 0,
'Parse::RecDescent' => 1.94,
'Test::More' => 0,
'File::Temp' => 0,
},
clean => { FILES => 'test.txt' },
);
set_test_data();
exit 0;
###
### HELPERS
###
sub set_test_data {
unless ( -f "lib/Mail/IMAPClient.pm" ) {
warn("ERROR: not in installation directory\n");
return;
}
if ( -s "./test.txt" ) {
print("The file test.txt will be used for extended tests.\n");
return;
}
print <<EOF;
(OPTIONAL) For extended tests during 'make test', create a file
'test.txt' in the top level directory of this distribution (the same
directory as the Makefile.PL, etc.). This file must contain an IMAP
server name or IP (server=...), a user account (user=...), and a
password (passed=...). A port (port=....) and an authentication
mechanism to be used (authmechanism=...) can also be specified.
Example:
--- BEGIN: test.txt ---
server=localhost
user=mytestuser
passed=mypassword
port=143
--- END: test.txt ---
NOTE: When testing is completed, be sure to remove test.txt (either by
hand or by 'make clean').
EOF
}

View file

@ -1,96 +0,0 @@
Mail::IMAPClient
================
Mail::IMAPClient is a Perl module that provides an interface for
communicating with an IMAP server as an IMAP client.
DEPENDENCIES
============
The following are the minimum requirements for using Mail::IMAPClient:
- Perl 5.8
https://www.perl.org/
- Perl modules from CPAN:
https://metacpan.org/
Required:
List::Util
MIME::Base64
Parse::RecDescent
Optional:
Authen::NTLM
Authen::SASL
Compress::Zlib
Digest::HMAC_MD5
Digest::MD5
IO::Socket::SSL
- RFC 3501 (IMAP4REV1) compatible IMAP server
https://tools.ietf.org/html/rfc3501
- Mail::IMAPClient (this package)
INSTALLATION
============
1. Download Mail::IMAPClient module
https://metacpan.org/release/Mail-IMAPClient
2. Read this README
3. This module has a number of dependencies on other Perl modules
available from CPAN. If any modules are missing, appropriate
warnings will be generated in the following step.
4. Prepare to build this module and install any prerequisite modules:
perl Makefile.PL
5. (OPTIONAL) For extended tests during 'make test', create a file
'test.txt' in the top level directory of this distribution (the
same directory as the Makefile.PL, etc.). This file must contain
an IMAP server name or IP (server=...), a user account (user=...),
and password a (passed=...). A port (port=....) and an
authentication mechanism to be used (authmechanism=...) can also be
specified.
Example:
--- BEGIN: test.txt ---
server=localhost
user=mytestuser
passed=mypassword
port=143
--- END: test.txt ---
NOTE: When testing is completed, be sure to remove test.txt (either
by hand or by 'make clean').
6. Build, test and install this module:
make
make test
(sudo) make install
7. Read the documentation to become familiar with this module.
Project Links
=============
- Bugs/tickets:
https://rt.cpan.org/Public/Dist/Display.html?Name=Mail-IMAPClient
- Source code repository (git):
https://sourceforge.net/p/mail-imapclient/git/
https://github.com/plobbes/mail-imapclient/
- CPAN releases:
https://metacpan.org/release/Mail-IMAPClient
COPYRIGHT AND LICENSE
=====================
Copyright (C) 1999-2003 The Kernen Group, Inc.
Copyright (C) 2007-2009 Mark Overmeer
Copyright (C) 2010-2019 Phil Pearl (Lobbes)
All rights reserved.
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.8.0 or,
at your option, any later version of Perl 5 you may have available.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See either the
GNU General Public License or the Artistic License for more details.

View file

@ -1,172 +0,0 @@
#!/usr/local/bin/perl
#$Id$
use Mail::IMAPClient;
=head1 DESCRIPTION
B<build_dist.pl> accepts the name of a target folder as an argument. It
then opens that folder and rummages through all the mail files in it, looking
for "Reply-to:" headers (or "From:" headers, where there is no "Reply-to:").
It then appends a message into the folder containing all of the addresses in
thus found as a list of recipients. This message can be used to conveniently
drag and drop names into an address book, distribution list, or e-mail message,
using the GUI client of choice.
The email appended to the folder specified in the I<-f> option will have the
subject "buid_dist.pl I<folder> Output".
=head1 SYNTAX
b<build_dist.pl> I<-h>
b<build_dist.pl> I<-s servername -u username -p password -f folder [ -d ]>
=over 4
=item -f The folder name to process.
=item -s The servername of the IMAP server
=item -u The user to log in as
=item -p The password for the user specified in the I<-u> option
=item -d Tells the IMAP client to turn on debugging info
=item -h Prints out this document
=back
B<NOTE:> You can supply defaults for the above options by updating the script.
=cut
use Getopt::Std;
getopts('s:u:p:f:d');
# Update the following to supply defaults:
$opt_f ||= "default folder";
$opt_s ||= "default server";
$opt_u ||= "default user";
$opt_p ||= "default password"; # security risk: use with caution!
# Let the compiler know we're serious about these two variables:
$opt_h = $opt_h or $opt_d = $opt_d ;
exec "perldoc $0" if $opt_h;
my $imap = Mail::IMAPClient->new(
Server => $opt_s ,
User => $opt_u ,
Password=> $opt_p ,
Debug => $opt_d||0 ,
) or die "can't connect to server\n";
$imap->select($opt_f);
my @msgs = $imap->search("NOT SUBJECT",qq("buid_dist.pl $opt_f Output"));
my %list;
foreach my $m (@msgs) {
my $ref = $imap->parse_headers($m,"Reply-to","From");
warn "Couldn't get recipient address from msg#$m\n"
unless scalar(@{$ref->{'Reply-to'}}) ||
scalar(@{$ref->{'From'}}) ;
my $from = scalar(@{$ref->{'Reply-to'}}) ?
$ref->{'Reply-to'}[0] :
$ref->{'From'}[0] ;
my $addr = $from;
$addr =~ s/.*<//;
$addr =~ s/[\<\>]//g;
$list{$addr} = $from unless exists $list{$addr};
}
$append = <<"EOMSG";
To: ${\(join(",",values %list))}
From: $opt_u\@$opt_s
Date: ${\($imap->Rfc822_date(time))}
Subject: build_dist.pl $opt_f Output
The above note was never actually sent to the following people:
${\(join("\n",keys %list))}
Interesting, eh?
Love,
$opt_u
EOMSG
$imap->append($opt_f,$append) or warn "Couldn't append the message.";
$imap->logout;
=head1 AUTHOR
David J. Kernen
The Kernen Group, Inc.
imap@kernengroup.com
=head1 COPYRIGHT
This example and Mail::IMAPClient are Copyright (c) 2003
by The Kernen Group, Inc. All rights reserved.
This example is distributed with Mail::IMAPClient and
subject to the same licensing requirements as Mail::IMAPClient.
imtest is a utility distributed with Cyrus IMAP server,
Copyright (c) 1994-2000 Carnegie Mellon University.
All rights reserved.
=cut
# $Id$
# $Log: build_dist.pl,v $
# Revision 19991216.7 2003/06/12 21:38:29 dkernen
#
# Preparing 2.2.8
# Added Files: COPYRIGHT
# Modified Files: Parse.grammar
# Added Files: Makefile.old
# Makefile.PL Todo sample.perldb
# BodyStructure.pm
# Parse.grammar Parse.pod
# range.t
# Thread.grammar
# draft-crispin-imapv-17.txt rfc1731.txt rfc2060.txt rfc2062.txt
# rfc2221.txt rfc2359.txt rfc2683.txt
#
# Revision 19991216.6 2000/12/11 21:58:50 dkernen
#
# Modified Files:
# build_dist.pl build_ldif.pl copy_folder.pl find_dup_msgs.pl
# imap_to_mbox.pl populate_mailbox.pl
# to add CVS data
#
# Revision 19991216.5 1999/12/16 17:19:09 dkernen
# Bring up to same level
#
# Revision 19991124.3 1999/12/16 17:14:22 dkernen
# Incorporate changes for exists method performance enhancement
#
# Revision 19991124.02 1999/11/24 17:46:16 dkernen
# More fixes to t/basic.t
#
# Revision 19991124.01 1999/11/24 16:51:46 dkernen
# Changed t/basic.t to test for UIDPLUS before trying UID cmds
#
# Revision 1.8 1999/11/23 17:51:05 dkernen
# Committing version 1.06 distribution copy
#

View file

@ -1,235 +0,0 @@
#!/usr/local/bin/perl
#$Id$
use Mail::IMAPClient;
use MIME::Lite;
use Data::Dumper;
=head1 DESCRIPTION
B<build_ldif.pl> accepts the name of a target folder as an argument. It
then opens that folder and rummages through all the mail files in it, looking
for "Reply-to:" headers (or "From:" headers, where there is no "Reply-to:").
It then prints to STDOUT a file in ldif format containing entries for all of
the addresses that it finds. It also appends a message into the specified folder containing
all of the addresses in both the B<To:> field of the message header and in an
LDIF-format attachment.
B<build_ldif.pl> requires B<MIME::Lite>.
=head1 SYNTAX
B<build_ldif.pl> I<-h>
B<build_ldif.pl> I<-s servername -u username -p password -f folder [ -d ]>
=over 4
=item -f The folder name to process.
=item -s The servername of the IMAP server
=item -t Include "To" and "Cc" fields as well as "From"
=item -u The user to log in as
=item -p The password for the user specified in the I<-u> option
=item -d Tells the IMAP client to turn on debugging info
=item -n Suppress delivering message to folder
=item -h Prints out this document
=back
B<NOTE:> You can supply defaults for the above options by updating the script.
=cut
use Getopt::Std;
getopts('hs:u:p:f:dtn');
# Update the following to supply defaults:
$opt_f ||= "default folder";
$opt_s ||= "default server";
$opt_u ||= "default user";
$opt_p ||= "default password"; # security risk: use with caution!
# Let the compiler know we're serious about these variables:
$opt_0 = ( $opt_h or $opt_d or $opt_t or $opt_n or $opt_0);
exec "perldoc $0" if $opt_h;
my $imap = Mail::IMAPClient->new(
Server => $opt_s ,
User => $opt_u ,
Password=> $opt_p ,
Debug => $opt_d||0 ,
) or die "can't connect to server\n";
$imap->select($opt_f); $imap->expunge;
my @msgs = $imap->search("NOT SUBJECT",qq("buid_ldif.pl $opt_f Output"));
my %list;
foreach my $m (@msgs) {
my $ref = $imap->parse_headers($m,"Reply-to","From");
warn "Couldn't get recipient address from msg#$m\n"
unless scalar(@{$ref->{'Reply-to'}}) ||
scalar(@{$ref->{'From'}}) ;
my $from = scalar(@{$ref->{'Reply-to'}}) ?
$ref->{'Reply-to'}[0] :
$ref->{'From'}[0] ;
my $name = $from ;
$name =~ s/<.*// ;
if ($name =~ /\@/) {
$name = $from ;
$name =~ s/\@.*//; ;
}
$name =~ s/\"//g ;
$name =~ s/^\s+|\s+$//g ;
my $addr = $from ;
$addr =~ s/.*<// ;
$addr =~ s/[\<\>]//g ;
$list{lc($addr)} = [ $addr, $name ]
unless exists $list{lc($addr)} ;
if ($opt_t) { # Do "To" and "Cc", too
my $ref = $imap->parse_headers($m,"To","Cc") ;
my @array = ( @{$ref->{To}} , @{$ref->{Cc}} ) ;
my @members = () ;
foreach my $text (@array) {
while ( $text =~ / "([^"\\]*(\\.[^"\\]*)*"[^,]*),? |
([^",]+),? |
,
/gx
) {
push @members, defined($1)?$1:$3 ;
}
}
foreach my $to (@members) {
my $name = $to ;
$name =~ s/<.*// ;
if ($name =~ /\@/) {
$name = $to ;
$name =~ s/\@.*//; ;
}
$name =~ s/\"//g ;
$name =~ s/^\s+|\s+$//g ;
my $addr = $to ;
$addr =~ s/.*<// ;
$addr =~ s/[\<\>]//g ;
$list{lc($addr)} = [ $addr, $name ]
unless exists $list{lc($addr)} ;
}
}
}
my $text = join "",map {
qq{dn: cn="} . $list{$_}[1] .
qq{", mail=$list{$_}[0]\n} .
qq{cn: } . $list{$_}[1] . qq{\n} .
qq{mail: $list{$_}[0]\n} .
qq{objectclass: top\nobjectclass: person\n\n};
} keys %list ;
# Create a new multipart message:
my $msg = MIME::Lite->new(
From => $opt_u,
map({ ("To" => $list{$_}[0]) } keys %list),
Subject => "LDIF file from $opt_f",
Type =>'TEXT',
Data =>"Attached is the LDIF file of addresses from folder $opt_f."
);
$msg->attach( Type =>'text/ldif',
Filename => "$opt_f.ldif",
Data => $text ,
);
print $text;
$imap->append($opt_f, $msg->as_string) unless $opt_n;
print Dumper($imap) if $opt_d;
$imap->logout;
=head1 AUTHOR
David J. Kernen
The Kernen Group, Inc.
imap@kernengroup.com
=head1 COPYRIGHT
This example and Mail::IMAPClient are Copyright (c) 1999,2003
by The Kernen Group, Inc. All rights reserved.
This example is distributed with Mail::IMAPClient and
subject to the same licensing requirements as Mail::IMAPClient.
imtest is a utility distributed with Cyrus IMAP server,
Copyright (c) 1994-2000 Carnegie Mellon University.
All rights reserved.
=cut
# $Id$
# $Log: build_ldif.pl,v $
# Revision 19991216.11 2003/06/12 21:38:30 dkernen
#
# Preparing 2.2.8
# Added Files: COPYRIGHT
# Modified Files: Parse.grammar
# Added Files: Makefile.old
# Makefile.PL Todo sample.perldb
# BodyStructure.pm
# Parse.grammar Parse.pod
# range.t
# Thread.grammar
# draft-crispin-imapv-17.txt rfc1731.txt rfc2060.txt rfc2062.txt
# rfc2221.txt rfc2359.txt rfc2683.txt
#
# Revision 19991216.10 2002/05/24 15:47:18 dkernen
# Misc fixes
#
# Revision 19991216.9 2000/12/11 21:58:51 dkernen
#
# Modified Files:
# build_dist.pl build_ldif.pl copy_folder.pl find_dup_msgs.pl
# imap_to_mbox.pl populate_mailbox.pl
# to add CVS data
#
# Revision 19991216.8 2000/03/02 19:57:13 dkernen
#
# Modified Files: build_ldif.pl -- to support new option to all "To:" and "Cc:" to be included in ldif file
#
# Revision 19991216.7 2000/02/21 16:16:10 dkernen
#
# Modified Files: build_ldif.pl -- to allow for "To:" and "Cc:" header handling and
# to handle quoted names in headers
#
# Revision 19991216.6 1999/12/28 13:56:59 dkernen
# Fixed -h option (help).
#
# Revision 19991216.5 1999/12/16 17:19:10 dkernen
# Bring up to same level
#
# Revision 19991124.3 1999/12/16 17:14:24 dkernen
# Incorporate changes for exists method performance enhancement
#
# Revision 19991124.02 1999/11/24 17:46:18 dkernen
# More fixes to t/basic.t
#
# Revision 19991124.01 1999/11/24 16:51:48 dkernen
# Changed t/basic.t to test for UIDPLUS before trying UID cmds
#
# Revision 1.8 1999/11/23 17:51:05 dkernen
# Committing version 1.06 distribution copy
#

View file

@ -1,64 +0,0 @@
#!/usr/local/bin/perl
use Mail::IMAPClient;
use IO::File;
#
# Example that will also clean out your test account if interrupted 'make test'
# runs have left junk folders there. Run from installation dir, installation/examples
# subdir, or supply full path to the test.txt file (created during 'perl Makefile.PL'
# and left in the installation dir until 'make clean').
# If you 've already run 'make clean' or said no to extended tests,
# then you don't have the file anyway; re-run 'perl Makefile.PL', reply 'y' to the
# extended tests prompt, then supply the test account's credentials as prompted.
# Then try this again.
#
if ( -f "./test.txt" ) {
$configFile = "./test.txt"
} elsif ( -f "../test.txt" ) {
$configFile = "../test.txt"
} elsif ( $ARGV[0] and -f "$ARGV[0]" ) {
$configFile = $ARGV[0];
} else {
print STDERR "Can't find test.txt. Please run this from the installation directory ",
"or supply the full path to test.txt as an argument on the command line.\n";
}
my $fh = IO::File->new("./test.txt") or die "./test.txt: $!\n";
while (my $input = <$fh>) {
chomp $input;
my($k,$v) = split(/=/,$input,2);
$conf{$k}=$v;
}
my $imap = Mail::IMAPClient->new(Server=>$conf{server},User=>$conf{user},
Password=>$conf{passed}) or die "Connecting to $conf{server}: $! $@\n";
for my $f ( grep(/^IMAPClient_/,$imap->folders) ) {
print "Deleting $f\n";
$imap->select($f);
$imap->delete_messages(@{$imap->messages}) ;
$imap->close($f);
$imap->delete($f);
}
=head1 AUTHOR
David J. Kernen
The Kernen Group, Inc.
imap@kernengroup.com
=head1 COPYRIGHT
This example and Mail::IMAPClient are Copyright (c) 2003
by The Kernen Group, Inc. All rights reserved.
This example is distributed with Mail::IMAPClient and
subject to the same licensing requirements as Mail::IMAPClient.
imtest is a utility distributed with Cyrus IMAP server,
Copyright (c) 1994-2000 Carnegie Mellon University.
All rights reserved.
=cut

View file

@ -1,147 +0,0 @@
#!/usr/local/bin/perl
#$Id$
++$|;
use Getopt::Std;
use Mail::IMAPClient;
use vars qw/$opt_r $opt_h $opt_t $opt_f/;
getopts("t:f:F:N:rh");
if ( $opt_h ) {
print &usage;
exit;
}
my($to_id,$to_pass,$thost) = $opt_t =~ m{
([^/]+) # everything up to / is the id
/ # then a slash
([^@]+) # then everything up to @ is pswd
@ # then an @-sign
(.*) # then everything else is the host
}x ;
my($from_id,$from_pass,$fhost) =
$opt_f =~ m{
([^/]+) # everything up to / is the id
/ # then a slash
([^@]+) # then everything up to @ is pswd
@ # then an @-sign
(.*) # then everything else is the host
}x ;
$to_id and $from_id and $to_pass and $from_pass and $thost and $fhost
or die "Error: Must specify -t and -f (to and from)\n" . &usage;
$opt_F or
die "Error: Must specify '-F folder' or how will I know what folder to copy?\n" .
&usage ;
$opt_N ||= $opt_F;
print "Copying folder $opt_F from $from_id\@$fhost to ${to_id}'s $opt_N folder on $thost.\n";
my ($from) = Mail::IMAPClient->new( Server => $fhost,
User => $from_id,
Password=> $from_pass,
Fast_IO => 1,
Uid => 1,
Debug => 0,
);
my ($to) = Mail::IMAPClient->new( Server => $thost,
User => $to_id,
Password=> $to_pass,
Fast_IO => 1,
Uid => 1,
Debug => 0,
);
my @folders = $opt_r ? @{$from->folders($opt_F)} : ( $opt_F ) ;
foreach my $fold (@folders) {
print "Processing folder $fold\n";
$from->select($fold);
if ($opt_F ne $opt_N) {
$fold =~s/^$opt_F/$opt_N/o;
}
unless ($to->exists($fold)) {
$to->create($fold) or warn "Couldn't create $fold\n" and next;
}
$to->select($fold);
my @msgs = $from->search("ALL");
# my %flaghash = $from->flags(\@msgs);
foreach $msg (@msgs) {
print "Processing message $msg in folder $fold.\n";
my $string = $from->message_string($msg);
# print "String = $string\n";
my $new_id = $to->append($fold,$string)
or warn "Couldn't append msg #$msg to target folder $fold.\n";
$to->store($new_id,"+FLAGS (" . join(" ",@{$from->flags($msg)}) . ")");
}
}
sub usage {
return "Syntax:\n\t$0 -t to_id/to_pass\@to.host -f from_id/from_pass\@from.host \\\n" .
"\t\t-F folder [-N New_Folder] [-r]\n".
"\tor\n\t$0 -h\n\n".
"\twhere:\n\t\t".
"to_id\t\tis the id to recieve the folder\n\t\t".
"to_pass\t\tis the password for to_id\n\t\t".
"from\t\tis the uid who currently has the folder\n\t\t".
"from_pass\tis the password for from_id\n\t\t".
"to.host\t\tis the optional host where the 'to' uid has a mailbox\n\t\t".
"from.host\tis the optional host where the 'from' uid has a mailbox\n\t\t".
"folder\t\tis the folder to copy from\n\t\t".
"New_Folder\tis the folder to copy to (defaults to 'folder')\n\t\t".
"-h\t\tprints this help message\n\t\t".
"-r\t\tspecifies a recursive copy (only works on systems that support the idea " .
"\n\t\t\t\tof recursive folders)\n\t\t".
"\n"
;
}
=head1 AUTHOR
David J. Kernen
The Kernen Group, Inc.
imap@kernengroup.com
=head1 COPYRIGHT
This example and Mail::IMAPClient are Copyright (c) 1999,2000,2003
by The Kernen Group, Inc. All rights reserved.
This example is distributed with Mail::IMAPClient and
subject to the same licensing requirements as Mail::IMAPClient.
imtest is a utility distributed with Cyrus IMAP server,
Copyright (c) 1994-2000 Carnegie Mellon University.
All rights reserved.
=cut
# History:
# $Log: copy_folder.pl,v $
# Revision 19991216.3 2003/06/12 21:38:30 dkernen
#
# Preparing 2.2.8
# Added Files: COPYRIGHT
# Modified Files: Parse.grammar
# Added Files: Makefile.old
# Makefile.PL Todo sample.perldb
# BodyStructure.pm
# Parse.grammar Parse.pod
# range.t
# Thread.grammar
# draft-crispin-imapv-17.txt rfc1731.txt rfc2060.txt rfc2062.txt
# rfc2221.txt rfc2359.txt rfc2683.txt
#
# Revision 19991216.2 2000/12/11 21:58:51 dkernen
#
# Modified Files:
# build_dist.pl build_ldif.pl copy_folder.pl find_dup_msgs.pl
# imap_to_mbox.pl populate_mailbox.pl
# to add CVS data
#

View file

@ -1,111 +0,0 @@
#!/usr/local/bin/perl
#$Id
use Mail::IMAPClient; # available from http://search.cpan.org/search?mode=module&query=IMAPClient
use IO::File;
use Getopt::Std;
use vars qw/ $opt_d $opt_s $opt_p $opt_u $opt_P $opt_h /;
&getopts('d:s:u:p:P:h'); # -d days_to_keep -u cyrys_user -p cyrus_pswd -s cyrus_server -P port
my $days_to_keep = $opt_d||365; # Delete msgs older than -d arg or 365 days
my $cutoff = time - ( $days_to_keep * 24 * 60 * 60 ) ; # time - arg * 24 * 60 * 60 = cutoff date in seconds
# Change the following line (or replace it with something better):
$opt_h and die help()."\n";
my $h = $opt_s || "localhost" ;
my $u = $opt_u || "cyrys" ;
my $p = $opt_p or die "Unable to continue. No password provided.\n" . help();
my $imap = Mail::IMAPClient->new(
Server => "$h",
User => "$u", # $u,
Password=> "$p", # $p,
Uid => 1, # True value
Port => $opt_P||143, # imapd
Debug => 0, # Make true to debug
Buffer => 4096*10, # True value; decrease on machines w/little memory
Fast_io => 1, # True value
Timeout => 30, # True value
# Debug_fh=> IO::File->new(">out.db"), # fhandle
)
or die "$@";
my $mcnt = my $fcnt = 0;
print "Deleting messages older than ",$imap->Rfc2060_date($cutoff),"\n";
for my $f ( $imap->folders ) {
print "Expiring $f\n";
unless ($imap->select($f) ) {
$imap->setacl($f,$u,"lrswipcda") or warn "Cannot setacl for $f: $@\n" and next;
$imap->select($f) or warn "Cannot select $f: $@" and next;
}
my @expired = $imap->search("SENTBEFORE",$imap->Rfc2060_date($cutoff));
next unless @expired;
$mcnt += scalar(@expired); $fcnt ++;
print "Deleting ",scalar(@expired)," messages from $f\n";
$imap->delete_message(@expired);
$imap->expunge;
$imap->close;
}
$imap->logout;
print "Deleted a total of $mcnt messages in $fcnt folders.\n";
exit;
sub help {
return <<"EOHELP";
Usage:
$0 [ -d days_to_keep ] [ -s mail_server ] [ -u cyrus_admin_id ] -p cyrus_password
$0 -h
-h -- prints this here help message
-d days_to_keep -- $0 will delete messages older than "days_to_keep". (Default is 365)
-s mail_server -- hostname or IP Address of IMAP mail server (defaults to "localhost")
-u cyrus_admin_id -- user name of Unix account that owns Cyrus server (defaults to "cyrus")
-p cyrus_password -- password for the "cyrus_admin_id" user account (no default)
-P cyrus_port -- port where the cyrus imapd daemon is listening (defaults to value from
/etc/services or '143')
EOHELP
}
=head1 AUTHOR
David J. Kernen
The Kernen Group, Inc.
imap@kernengroup.com
=head1 COPYRIGHT
This example and Mail::IMAPClient are Copyright (c) 2003
by The Kernen Group, Inc. All rights reserved.
This example is distributed with Mail::IMAPClient and
subject to the same licensing requirements as Mail::IMAPClient.
imtest is a utility distributed with Cyrus IMAP server,
Copyright (c) 1994-2000 Carnegie Mellon University.
All rights reserved.
=cut
#$Log: cyrus_expire.pl,v $
#Revision 19991216.2 2003/06/12 21:38:31 dkernen
#
#Preparing 2.2.8
#Added Files: COPYRIGHT
#Modified Files: Parse.grammar
#Added Files: Makefile.old
# Makefile.PL Todo sample.perldb
# BodyStructure.pm
# Parse.grammar Parse.pod
# range.t
# Thread.grammar
# draft-crispin-imapv-17.txt rfc1731.txt rfc2060.txt rfc2062.txt
# rfc2221.txt rfc2359.txt rfc2683.txt
#

View file

@ -1,85 +0,0 @@
#!/usr/local/bin/perl
#$Id$
use Mail::IMAPClient;
use IO::File;
# Change the following line (or replace it with something better):
my($h,$u,$p) = ('cyrus_host','cyrus_admin_id','cyrus_admin_pswd');
my $imap = Mail::IMAPClient->new( Server => "$h", # imap host
User => "$u", # $u,
Password=> "$p", # $p,
Uid => 1, # True value
Port => 143, # Cyrus
Debug => 0, # True value
Buffer => 4096*10, # True value
Fast_io => 1, # True value
Timeout => 30, # True value
# Debug_fh=> IO::File->new(">out.db"), # fhandle
)
or die "$@";
for my $f ( $imap->folders ) {
print "Expunging $f\n";
unless ($imap->select($f) ) {
$imap->setacl($f,$u,"lrswipcda") or warn "Cannot setacl for $f: $@\n" and next;
$imap->select($f) or warn "Cannot select $f: $@" and next;
}
$imap->expunge;
}
=head1 AUTHOR
David J. Kernen
The Kernen Group, Inc.
imap@kernengroup.com
=head1 COPYRIGHT
This example and Mail::IMAPClient are Copyright (c) 2003
by The Kernen Group, Inc. All rights reserved.
This example is distributed with Mail::IMAPClient and
subject to the same licensing requirements as Mail::IMAPClient.
imtest is a utility distributed with Cyrus IMAP server,
Copyright (c) 1994-2000 Carnegie Mellon University.
All rights reserved.
=cut
#
#$Log: cyrus_expunge.pl,v $
#Revision 19991216.3 2003/06/12 21:38:31 dkernen
#
#Preparing 2.2.8
#Added Files: COPYRIGHT
#Modified Files: Parse.grammar
#Added Files: Makefile.old
# Makefile.PL Todo sample.perldb
# BodyStructure.pm
# Parse.grammar Parse.pod
# range.t
# Thread.grammar
# draft-crispin-imapv-17.txt rfc1731.txt rfc2060.txt rfc2062.txt
# rfc2221.txt rfc2359.txt rfc2683.txt
#
#Revision 1.1 2003/06/12 21:38:14 dkernen
#
#Preparing 2.2.8
#Added Files: COPYRIGHT
#Modified Files: Parse.grammar
#Added Files: Makefile.old
# Makefile.PL Todo sample.perldb
# BodyStructure.pm
# Parse.grammar Parse.pod
# range.t
# Thread.grammar
# draft-crispin-imapv-17.txt rfc1731.txt rfc2060.txt rfc2062.txt
# rfc2221.txt rfc2359.txt rfc2683.txt
#
#

View file

@ -1,217 +0,0 @@
#!/usr/local/bin/perl
# $Id$
use Mail::IMAPClient;
use Mozilla::LDAP::Conn;
use Getopt::Std;
use vars qw/$rootdn $opt_a/;
use Data::Dumper;
# It then connects to a user's mailhost and rummages around,
# looking for duplicate messages.
# It will optionally delete messages that are duplicates (based on
# msg-id header and number of bytes).
# For help, enter:
# find_dup_msgs.pl -h
#
getopts('ahdtvf:F:u:s:p:P:');
if ( $opt_h ) {
print STDERR &usage;
exit;
}
my $uid = $opt_u or die &usage;
$opt_s||='localhost';
$opt_p or die &usage;
$opt_P||=143;
$opt_t and
$opt_d and
die "ERROR: Don't specify -d and -t together.\n" . &usage;
my($pu,$pp) = get_admin();
print "Connecting to $host:$opt_P\n" if $opt_v;
my $imap = Imap->new( Server => $opt_s,
User => $opt_u,
Password=> $opt_p,
Port => $opt_P,
Fast_io => 1,
) or die "couldn't connect to $host port $opt_P: $!\n";
my %folders; my %counts;
FOLDER: foreach my $f ( $opt_F ? $opt_F : $imap->folders ) {
next if $opt_t and $f eq 'Trash';
$folders{$f} = 0;
$counts{$f} = $imap->message_count($f);
print "Processing folder $f\n" if $opt_v;
unless ( $imap->select($f)) {
warn "Error selecting $f: " . $imap->LastError . "\n";
next FOLDER;
}
my @msgs = $imap->search("ALL");
my %hash = ();
MESSAGE: foreach my $m (@msgs) {
my $mid;
if ($opt_a) {
my $h = $imap->parse_headers(
$m,"Date","Subject","From","Message-ID"
) or next MESSAGE;
$mid = "$h->{'Date'}[0]$;$h->{'Subject'}[0]$;".
"$h->{'From'}[0]$;$h->{'Message-ID'}[0]";
} else {
$mid = $imap->parse_headers(
$m,
"Message-ID"
)->{'Message-ID'}[0]
or next MESSAGE;
}
my $size = $imap->size($m);
if ( exists $hash{$mid} and $hash{$mid} == $size ) {
if ($opt_f) {
open F,">>$opt_f" or
die "can't open $opt_f: $!\n";
print F $imap->message_string($m),
"___END OF SAVED MESSAGE___","\n";
close F;
}
$imap->move("Trash",$m) if $opt_t;
$imap->delete_message($m) if $opt_d;
$folders{$f}++;
print "Found a duplicate in ${f}; key = $mid\n" if $opt_v;
} else {
$hash{$mid} = $size;
}
}
print "$f hash:\n",Data::Dumper::Dumper(\%hash) if $opt_v;
$imap->expunge if ($opt_t or $opt_d);
}
my $total; my $totms;
map { $total += $_} values %folders;
map { $totms += $_ } values %counts;
print "Found $total duplicate messages in ${uid}'s mailbox. ",
"The breakdown is:\n",
"\tFolder\tNumber of Duplicates\tNumber of Msgs in Folder\n",
"\t------\t--------------------\t------------------------\n",
map { "\t$_\t$folders{$_}\t$counts{$_}\n" } keys %folders,
"\tTOTAL\t$total\t$totms\n"
;
sub usage {
return "Usage:\n" .
"\t$0 [-d|-t] [-v] [-f filename] [-a] [-P port] \\\n".
"\t\t-s server -u user -p password\n\n" .
"\t-a\t\tdo an especially aggressive search for duplicates\n".
"\t-d\t\tdelete duplicates (default is to just report them)\n".
"\t-f file\t\tsave deleted messages in file named 'file'\n" .
"\t-F fldr\t\tOnly check the folder named 'fldr' (default is to check all folders)\n" .
"\t-h\t\tprint this help message (all other options are ignored)\n" .
"\t-p password\tspecify the target user's password\n" .
"\t-P port\t\tspecify the port to connect to (default is 143)\n" .
"\t-s server\tspecify the target mail server\n" .
"\t-u uid\t\tspecify the target user\n" .
"\t-t\t\tmove deleted messages to trash folder\n" .
"\t-v\t\tprint verbose status messages while processing\n".
"\n" ;
}
=head1 AUTHOR
David J. Kernen
The Kernen Group, Inc.
imap@kernengroup.com
=head1 COPYRIGHT
This example and Mail::IMAPClient are Copyright (c) 2003
by The Kernen Group, Inc. All rights reserved.
This example is distributed with Mail::IMAPClient and
subject to the same licensing requirements as Mail::IMAPClient.
imtest is a utility distributed with Cyrus IMAP server,
Copyright (c) 1994-2000 Carnegie Mellon University.
All rights reserved.
=cut
# History:
# $Log: find_dup_msgs.pl,v $
# Revision 19991216.5 2003/06/12 21:38:32 dkernen
#
# Preparing 2.2.8
# Added Files: COPYRIGHT
# Modified Files: Parse.grammar
# Added Files: Makefile.old
# Makefile.PL Todo sample.perldb
# BodyStructure.pm
# Parse.grammar Parse.pod
# range.t
# Thread.grammar
# draft-crispin-imapv-17.txt rfc1731.txt rfc2060.txt rfc2062.txt
# rfc2221.txt rfc2359.txt rfc2683.txt
#
# Revision 1.1 2003/06/12 21:38:14 dkernen
#
# Preparing 2.2.8
# Added Files: COPYRIGHT
# Modified Files: Parse.grammar
# Added Files: Makefile.old
# Makefile.PL Todo sample.perldb
# BodyStructure.pm
# Parse.grammar Parse.pod
# range.t
# Thread.grammar
# draft-crispin-imapv-17.txt rfc1731.txt rfc2060.txt rfc2062.txt
# rfc2221.txt rfc2359.txt rfc2683.txt
#
# Revision 19991216.4 2002/08/23 14:34:51 dkernen
#
# Modified Files: Changes IMAPClient.pm Makefile Makefile.PL test.txt for version 2.2.0
# Added Files: Makefile Makefile.PL Parse.grammar Parse.pm Parse.pod version 2.2.0
# Added Files: parse.t for version 2.2.0
# Added Files: bodystructure.t for 2.2.0
# Modified Files: find_dup_msgs.pl for v2.2.0
#
# Revision 1.6 2001/03/08 19:00:35 dkernen
#
# ----------------------------------------------------------------------
# Modified Files:
# copy_folder.pl delete_mailbox.pl find_dup_msgs.pl
# mbox_check.pl process_orphans.pl rename_id.pl
# scratch_indexes.pl
# to get ready for nsusmsg02 upgrade
# ----------------------------------------------------------------------
#
# Revision 1.5 2000/11/01 15:51:58 dkernen
#
# Modified Files: copy_folder.pl find_dup_msgs.pl restore_mbox.pl
#
# Revision 1.4 2000/04/13 21:17:18 dkernen
#
# Modified Files: find_dup_msgs.pl - to add -a switch (for aggressive dup search)
# Added Files: copy_folder.pl - a utility for copying a folder from one user's
# mailbox to another's
#
# Revision 1.3 2000/03/14 16:40:21 dkernen
#
# Modified Files: find_dup_msgs.pl -- to skip msgs with no message-id
#
# Revision 1.2 2000/03/13 19:05:50 dkernen
#
# Modified Files:
# delete_mailbox.pl find_dup_msgs.pl restore_mbox.pl -- to add cvs comments
# find_dup_msgs.pl -- to fix bug that occurred when -t (move-to-trash) switch is used
#

View file

@ -1,231 +0,0 @@
#!/usr/bin/perl
=head1 NAME
idle.pl - example using IMAP idle
=head1 SYNOPSIS
idle.pl [options]
Options: [*] == Required, [+] == Multiple vals OK, (val) == Default
--o Server=<server> *IMAP server name/IP
--o User=<user> *User account to login to
--o Password=<passwd> *Password to use for the User account
(see security note below)
--o Port=<port> port on Server to connect to
--o Ssl=<bool> use SSL on this connection
--o Starttls=<bool> call STARTTLS on this connection
--o Debug=<int> enable debugging in Mail::IMAPClient
--o ImapclientKey=Val any other Mail::IMAPClient attribute/value pair
--folder <folder> folder (mailbox) to IMAP SELECT (INBOX)
--maxidle <sec> maximum time to idle without receiving data (300)
--help display a brief help message
--man display the entire man page
--debug enable script debugging
=head1 NOTES
=head2 --o Password=<password>
A password specified as a command-line option may be visible
to other users via the system process table. It may alternately be
given in the PASSWORD environment variable.
=head2 --maxidle <sec>
RFC 2177 states, "The server MAY consider a client inactive if it has
an IDLE command running, and if such a server has an inactivity
timeout it MAY log the client off implicitly at the end of its timeout
period. Because of that, clients using IDLE are advised to terminate
the IDLE and re-issue it at least every 29 minutes to avoid being
logged off."
The default of --maxidle 300 is used to allow the client to notice
when a connection has silently been closed upstream due to network or
firewall issue or configuration without missing too many idle events.
=cut
use strict;
use warnings;
use File::Basename qw(basename);
use Getopt::Long qw(GetOptions);
use Mail::IMAPClient qw();
use Pod::Usage qw(pod2usage);
use POSIX qw();
use constant {
FOLDER => "INBOX",
MAXIDLE => 300,
};
$| = 1; # set autoflush
my $DEBUG = 0; # GLOBAL set by process_options()
my $QUIT = 0;
my $VERSION = "1.00";
my $Prog = basename($0);
###
# main program
main();
sub main {
my %Opt = process_options();
pout("started $Prog\n");
my $imap = Mail::IMAPClient->new( %{ $Opt{opt} } )
or die("$Prog: error: Mail::IMAPClient->new: $@\n");
my ( $folder, $chkseen, $tag ) = ( $Opt{folder}, 1, undef );
$imap->select($folder)
or die("$Prog: error: select '$folder': $@\n");
$SIG{'INT'} = \&sigint_handler;
until ($QUIT) {
unless ( $imap->IsConnected ) {
warn("$Prog: reconnecting due to error: $@\n") if $imap->LastError;
$imap->connect or last;
$imap->select($folder) or last;
$tag = undef;
}
my $ret;
if ($chkseen) {
$chkseen = 0;
# end idle if necessary
if ($tag) {
$tag = undef;
$ret = $imap->done or last;
}
my $unseen = $imap->unseen_count;
last if $@;
pout("$unseen unseen/new message(s) in '$folder'\n") if $unseen;
}
# idle for X seconds unless data was returned by done
unless ($ret) {
$tag ||= $imap->idle
or die("$Prog: error: idle: $@\n");
warn( "$Prog: DEBUG: ", _ts(), " do idle_data($Opt{maxidle})\n" )
if $DEBUG;
$ret = $imap->idle_data( $Opt{maxidle} ) or last;
# connection can go stale so we exit/re-enter of idle state
# - RFC 2177 mentions 29m but firewalls may be more strict
unless (@$ret) {
warn( "$Prog: DEBUG: ", _ts(), " force exit of idle\n" )
if $DEBUG;
$tag = undef;
# restarted lost connections on next iteration
$ret = $imap->done or next;
}
}
local ( $1, $2, $3 );
foreach my $resp (@$ret) {
$resp =~ s/\015?\012$//;
warn("$Prog: DEBUG: server response: $resp\n") if $DEBUG;
# ignore:
# - DONE command
# - <tag> OK IDLE...
next if ( $resp eq "DONE" );
next if ( $resp =~ /^\w+\s+OK\s+IDLE\b/ );
if ( $resp =~ /^\*\s+(\d+)\s+(EXISTS)\b/ ) {
my ( $num, $what ) = ( $1, $2 );
pout("$what: $num message(s) in '$folder'\n");
$chkseen++;
}
elsif ( $resp =~ /^\*\s+(\d+)\s+(EXPUNGE)\b/ ) {
my ( $num, $what ) = ( $1, $2 );
pout("$what: message $num from '$folder'\n");
}
# * 83 FETCH (FLAGS (\Seen))
elsif ( $resp =~ /^\*\s+(\d+)\s+(FETCH)\s+(.*)/ ) {
my ( $num, $what, $info ) = ( $1, $2, $3 );
$chkseen++ if ( $info =~ /[\(|\s]\\Seen[\)|\s]/ );
pout("$what: message $num from '$folder': $info\n");
}
else {
pout("server response: $resp\n");
}
}
}
my $rc = 0;
if ($@) {
if ($QUIT) {
warn("$Prog: caught signal\n");
}
else {
$rc = 1;
}
warn("$Prog: imap error: $@\n") if ( !$QUIT || $DEBUG );
}
exit($rc);
}
###
# supporting routines
sub pout {
print( _ts(), " ", @_ );
}
sub process_options {
my ( %Opt, @err );
GetOptions( \%Opt, "opt=s%", "debug:1", "help", "man", "folder=s",
"maxidle:i" )
or pod2usage( -verbose => 0 );
pod2usage( -message => "$Prog: version $VERSION\n", -verbose => 1 )
if ( $Opt{help} );
pod2usage( -verbose => 2 ) if ( $Opt{man} );
# set global DEBUG
$DEBUG = $Opt{debug} || 0;
# folder (mailbox) to watch
$Opt{folder} = FOLDER unless ( exists $Opt{folder} );
# restart idle when no idle_data seen for this long
$Opt{maxidle} = MAXIDLE unless ( exists $Opt{maxidle} );
$Opt{opt}->{Password} = $ENV{PASSWORD}
if ( !exists $Opt{opt}->{Password} && defined $ENV{PASSWORD} );
foreach my $arg (qw(Server User Password)) {
push( @err, "-o $arg=<val> is required" ) if !exists $Opt{opt}->{$arg};
}
pod2usage(
-verbose => 1,
-message => join( "", map( "$Prog: $_\n", @err ) )
) if (@err);
return %Opt;
}
# example: 2005-10-02 07:50:32
sub _ts {
my %opt = @_;
my $fmt = $opt{fmt} || "%Y-%m-%d %T";
return POSIX::strftime( $fmt, localtime(time) );
}
sub sigint_handler {
$QUIT = 1;
}

View file

@ -1,266 +0,0 @@
#!/usr/local/bin/perl
# (c) 1999 Thomas Stromberg, Research Triangle Commerce, Inc.
# This software is protected by the BSD License. No rights reserved anyhow.
# <tstromberg@rtci.com>
# DESC: Reads a users IMAP folders, and converts them to mbox
# Good for an interim switch-over from say, Exchange to Cyrus IMAP.
# $Header$
# History:
# --------
# 2008/08/07 - Added SSL support, fixed From header printing, and CR
# elimination (sobek)
# TODO:
# -----
# lsub instead of list option
use warnings;
use strict;
use Mail::IMAPClient; # a nice set of perl libs for imap
use IO::Socket::SSL; # for SSL support
use vars qw($opt_h $opt_u $opt_p $opt_P $opt_s $opt_i $opt_f $opt_m $opt_b
$opt_c $opt_r $opt_w $opt_W $opt_S $opt_D $opt_U $opt_d $opt_I
$opt_n);
use Getopt::Std; # for the command-line overrides. good for user
use File::Path; # create full file paths. (yummy!)
use File::Basename; # find a nice basename for a folder.
use Date::Manip; # to create From header date
$| = 1;
sub connect_imap();
sub find_folders();
sub write_folder($$$$);
sub help();
# Config for the imap migration kit.
getopts('u:p:P:s:i:f:m:b:c:r:w:W:SDUdhIn:') or
$opt_h = 1;
my $SSL = $opt_S || 0;
my $SERVER = $opt_s || 'machine';
my $USER = $opt_u || 'userid';
my $PASSWORD = $opt_p || 'password';
my $PORT = $opt_P || '143';
my $INBOX_PATH = $opt_i || "/var/mail/$USER";
my $DOINBOX = $opt_I ? 0 : 1 || 1;
my $FOLDERS_PATH = $opt_f || "./folders/$USER";
my $DONT_MOVE = $opt_m || '.mailboxlist|Trash|INBOXIIMAP|mlbxl';
my $READ_DELIMITER = $opt_r || '/';
my $WRITE_DELIMITER = $opt_w || '/';
my $WRITE_MODE = $opt_W || '>';
my $BANNED_CHARS = $opt_b || '.|^|%';
my $CR = $opt_c || "\r";
my $NUMBER = $opt_n || "";
my $DELETE = $opt_D || 0;
my $DEBUG = $opt_d || "0";
my $UNSEEN = $opt_U || 0;
my $FAIL = 0;
my $imap; # definition for IMAP structure
if ($opt_h) {
# print help here
help();
}
sub help() {
print "imap_to_mbox.pl - with the following optional arguments\:
-S Use an SSL connection (default $SSL)
-s <s> Server specification (default $SERVER)
-u <u> User login (default $USER)
-p <p> User password
-P <p> Server Port (default $PORT)
-i <i> INBOX save path (default $INBOX_PATH)
-I skip INBOX (default $DOINBOX)
-f <f> Save path for other folders (default $FOLDERS_PATH)
-m <r> Regexp for IMAP folders not to be saved:
$DONT_MOVE
-r <r> Read delimiter (default \"$READ_DELIMITER\")
-w <w> Write Delimiter (default \"$WRITE_DELIMITER\")
-b <b> Banned chars (default \"$BANNED_CHARS\")
-c <c> Strip CRs from saved files [for Unix] (default \"$CR\")
-n <n> Receive only <n> messages (Default ".($NUMBER ? "$NUMBER" : "all").")
-U Unseen messages Only
-D Delete downloaded files on server
-d Debug mode (default $DEBUG)\n";
exit 1;
}
## do our magic tricks ######################################
connect_imap();
find_folders();
sub connect_imap()
{
# Open an SSL session to the IMAP server
# Handles the SSL setup, and gives us back a socket
my $ssl;
if ($opt_S) {
$ssl=IO::Socket::SSL->new(
PeerHost => "$SERVER:imaps"
# , SSL_version => 'SSLv2' # for older versions of openssl
);
defined $ssl
or die "Error connecting to $SERVER:imaps - $@";
$ssl->autoflush(1);
}
$imap = Mail::IMAPClient->new(
Socket => ($opt_S ? $ssl : 0),
Server => $SERVER,
User => $USER,
Password => $PASSWORD,
Port => $PORT,
Debug => $DEBUG,
Uid => 0,
Clear => 1,
)
or die ("Could not connect to $SERVER:$PORT with $USER: $! $?\n");
}
sub find_folders()
{
my @folders = $imap->folders;
# push(@folders, "INBOX");
foreach my $folder (@folders) {
my $message_count;
if ($folder eq "INBOX" and $DOINBOX == 0) {
print "* $folder is unwanted, skipping.\n";
next;
}
if (!$UNSEEN) {
$message_count = $imap->message_count($folder);
} else {
$message_count = $imap->unseen_count($folder) || 0;
}
if(! $message_count) {
print "* $folder is empty, skipping.\n";
next;
}
if($folder =~ /$DONT_MOVE/) {
warn "! $folder matches DONT_MOVE ruleset, skipping\n";
next;
}
my $new_folder = $folder;
$new_folder =~ s/\./_/g;
$new_folder =~ s/\Q$READ_DELIMITER/$WRITE_DELIMITER/g;
my $path
= $new_folder eq "INBOX" ? "$INBOX_PATH"
: "$FOLDERS_PATH/$new_folder";
if ($NUMBER && $NUMBER < $message_count) {
printf "x %4i %-45.45s => %s", $NUMBER, $folder, $path;
write_folder $folder, $path, 1, $NUMBER;
} else {
printf "x %4i %-45.45s => %s", $message_count, $folder, $path;
write_folder $folder, $path, 1, $message_count;
}
}
}
sub write_folder($$$$)
{ my($folder, $newpath, $first_message, $last_message) = @_;
$imap->select($folder)
or warn "Could not examine $folder: $!";
my $new_dir = dirname $newpath;
my $new_file = basename $newpath;
-d $new_dir
or mkpath($new_dir, 0700)
or die "Cannot create $new_dir:$!\n";
open my $mbox, $WRITE_MODE, $newpath
or die "Cannot create file $newpath: $!\n";
my @msgs = $imap->unseen if $UNSEEN;
for (my $i=$first_message; $i<$last_message+1; ++$i)
{ my $m = ($UNSEEN ? shift @msgs : $i);
my $date = UnixDate(ParseDate($imap->internaldate($m)),
"%a %b %e %T %Y");
my $user = $imap->get_envelope($m)->from_addresses;
$user =~ s/^.*<([^>]*)>/$1/;
$user = '-' unless $user;
print '.' if $m%25 == 0;
my $msg_header = $imap->fetch($m, "FAST")
or warn "Could not fetch header $m from $folder\n";
my $msg_rfc822 = $imap->fetch($m, "RFC822");
unless($msg_rfc822)
{ warn "Could not fetch RFC822 $m from $folder\n";
$FAIL=1
}
undef my $start;
foreach (@$msg_rfc822)
{ my $message;
if($_ =~ /\: / && !$message)
{ ++$message;
print $mbox "From $user $date\n";
}
if(/^\)\r/)
{ undef $message;
print $mbox "\n\n";
}
next unless $message;
$_ =~ s/\r$//;
$_ = $imap->Strip_cr($_) if $CR;
print $mbox "$_";
}
if($DELETE && ! $FAIL)
{ $imap->delete_message($m)
or warn "Could not delete_message: $@\n";
$FAIL = 0;
}
}
close $mbox
or die "Write errors to $newpath: $!\n";
if($DELETE)
{ $imap->expunge($folder)
or warn "Could not expunge: $@\n";
}
print "\n";
}
# 2008/08/07 - Added SSL support, fixed From header printing, and CR
# elimination (sobek)
#
# Revision 19991216.7 2002/08/23 13:29:48 dkernen
#
# Revision 19991216.6 2000/12/11 21:58:52 dkernen
#
# Revision 19991216.5 1999/12/16 17:19:12 dkernen
# Bring up to same level
#
# Revision 19991124.3 1999/12/16 17:14:25 dkernen
# Incorporate changes for exists method performance enhancement
#
# Revision 19991124.02 1999/11/24 17:46:19 dkernen
# More fixes to t/basic.t
#
# Revision 19991124.01 1999/11/24 16:51:49 dkernen
# Changed t/basic.t to test for UIDPLUS before trying UID cmds
#
# Revision 1.3 1999/11/23 17:51:06 dkernen
# Committing version 1.06 distribution copy

View file

@ -1,226 +0,0 @@
#!/usr/local/bin/perl
use Sys::Hostname;
use Mail::IMAPClient;
use IPC::Open3;
use IO::Socket::UNIX;
use IO::Socket;
use Socket;
use Getopt::Std;
&getopts('ha:df:i:o:p:r:m:u:x:w:p:s:');
if ($opt_h) {
print <<" HELP";
$0 -- uses imtest to connect and authenticate to imap server
Options:
-h print this help message
-a auth authenticate as user 'auth'. This value is passed as the '-a' value
to imtest and defaults to whatever you supplied for -u.
-d turn on Mail::IMAPClient debugging
-f file write Mail::IMAPClient debugging info to file 'file'
-m mech use authentication mechanism "mech"; default is to not supply -m to
imtest
-i path path to imtest executable; default is to let your shell find it via the
PATH environmental variable.
-p port port on mail server to connect to (default is 143)
-r rlm Use realm 'rlm' (default is name of mail server)
-s srvr Name of IMAP mail server (default is the localhost's hostname)
-u usr Use 'usr' as the user id (required)
-w pswd Use 'pswd' as the password for 'usr' (required)
-x path Path to Unix socket (fifo). Default is '/tmp/$0.sock'.
-o 'ops' Pass the string 'ops' directy to imtest as additional options.
This is how you get "other" imtest options passed to imtest. (I only
included switches for options that are either really common or useful
to the IMAPClient object as well as to imtest.)
Many of these switches have the same function here as with imtest. I added a
few extras though!
Example:
$0 -o '-k 128 -l 128' -s imapmail -u test -w testpswd \
-i /usr/local/src/cyrus/cyrus-imapd-2.1.11/imtest/ \
-m DIGEST-MD5
It's a good idea to test your options by running imtest from the command line
(but without the -x switch) first. Once you have it working by hand you should
be able to get it to work from this script (or one remarkably like it) without
too much bloodshed.
HELP
exit;
}
$opt_u and $opt_w or die "No userid/password credentials supplied. I hate that.\n";
$opt_a ||= $opt_u;
if ($opt_i ) {
$opt_i =~ m#^[/\.]# or $opt_i = "./$opt_i";
$opt_i =~ m#imtest$# or ( -x $opt_i and -f $opt_i )
or $opt_i .= ( $opt_i =~ m#/$# ? "imtest" : "/imtest") ;
-x $opt_i and -f $opt_i or die "Cannot find executable $opt_i\n";
}
$opt_p ||= 143;
$opt_s ||= hostname;
$opt_r ||= $opt_s;
$opt_x ||= "/tmp/$0.sock";
my($rfh,$wfh,$efh) ;
my($imt) = ($opt_i ? "$opt_i " : "imtest ") .
($opt_m ? "-m $opt_m ":"" ) .
qq(-r $opt_r -a $opt_a -u $opt_u ).
qq(-x $opt_x -w $opt_w -p $opt_p $opt_s);
open3($wfh,$rfh,$efh,$imt);
my $line;
until ($line =~ /^Security strength factor:/i ) {
$line = <$rfh> or die "EOF\n";
print STDERR "Prolog: $line" if $opt_d;
}
sleep 5;
my $sock = IO::Socket::UNIX->new("$opt_x")
or warn "No socket: $!\n" and exit;
print STDERR "<<<END OF PROLOG>>>\n" if $opt_d;
my $imap = Mail::IMAPClient->new;
$imap->Prewritemethod(\&Mail::IMAPClient::Strip_cr);
$imap->User("$opt_u");
$imap->Server("$opt_s");
$imap->Port("$opt_p");
$imap->Debug($opt_d);
$imap->Debug_fh($opt_f||\*STDERR);
$imap->State($imap->Connected);
$imap->Socket($sock);
# Your code goes here:
$imap->Select("INBOX");
for my $m (@{$imap->search("TEXT SUBJECT")} ) {
print "Message $m:\t",$imap->subject($m),"\n";
}
# You should have finished your code by about here
$imap->logout;
print STDERR "<<<END>>>\n" if $opt_d;
exit;
=head1 NAME
imtestExample.pl -- uses imtest to connect and authenticate to imap server
=head1 DESCRIPTION
=head2 Options
=over 4
=item -h
print this help message
=item -a auth
authenticate as user 'auth'. This value is passed as the '-a' value
to imtest and defaults to whatever you supplied for -u.
=item -d
turn on Mail::IMAPClient debugging
=item -f file
write Mail::IMAPClient debugging info to file 'file'
=item -m mech
use authentication mechanism "mech"; default is to not supply -m to
imtest
=item -i path
path to imtest executable; default is to let your shell find it via the
PATH environmental variable.
=item -p port
port on mail server to connect to (default is 143)
=item -r rlm
Use realm 'rlm' (default is name of mail server)
=item -s srvr
Name of IMAP mail server (default is the localhost's hostname)
=item -u usr
Use 'usr' as the user id (required)
=item -w pswd
Use 'pswd' as the password for 'usr' (required)
=item -x path
Path to Unix socket (fifo). Default is '/tmp/$0.sock'.
=item -o 'ops'
Pass the string 'ops' directy to imtest as additional options.
This is how you get "other" imtest options passed to imtest. (I only
included switches for options that are either really common or useful
to the IMAPClient object as well as to imtest.)
Many of these switches have the same function here as with imtest. I added a
few extras though!
=back
Example:
imtestExample.pl -o '-k 128 -l 128' -s imapmail -u test -w testpswd \
-i /usr/local/src/cyrus/cyrus-imapd-2.1.11/imtest/ \
-m DIGEST-MD5
It's a good idea to test your options by running imtest from the command line
(but without the -x switch) first. Once you have it working by hand you should
be able to get it to work from this script (or one remarkably like it) without
too much bloodshed.
=head1 AUTHOR
David J. Kernen
The Kernen Group, Inc.
imap@kernengroup.com
Based on a suggestion by Tara L. Andrews.
=head1 COPYRIGHT
This example and Mail::IMAPClient are Copyright (c) 2003
by The Kernen Group, Inc. All rights reserved.
This example is distributed with Mail::IMAPClient and
subject to the same licensing requirements as Mail::IMAPClient.
imtest is a utility distributed with Cyrus IMAP server,
Copyright (c) 1994-2000 Carnegie Mellon University.
All rights reserved.
=cut

View file

@ -1,326 +0,0 @@
#!/usr/local/bin/perl
#$Id$
#
# An example of how to migrate from a Netscape server
# (which uses a slash as a separator and which does
# not allow subfolders under the INBOX, only next to it)
# to a Cyrus server (which uses a dot (.) as a separator
# and which requires subfolders to be under "INBOX").
# There are also some allowed-character differences taken
# into account but this is by no means complete AFAIK.
#
# This is an example. If you are doing mail migrations
# then this may in fact be a very helpful example but
# it is unlikely to work 100% correctly as-is.
# A good place to start is by testing a rather large-volume
# transfer of actual mail from the source server with the
# -v option turned on and redirect output to a file for
# perusal. Examine the output carefully for unexpected
# results, such as a number of messages being skipped because
# they're already in the target folder when you know darn
# well this is the first time you ran the script. This
# would indicate an incompatibility with the logic for
# detecting duplicates, unless for some reason the source
# mailbox contains a lot of duplicate messages to begin with.
# (The latter case is an example of why you should use an
# actual mailbox stuffed with actual mail for test; if you
# generate test messages and then test migrating those you
# will only prove that your test messages are migratable.
#
# Also, you may need to play with the rules
# for translating folder names based on what kind of
# names your target server and source server support.
#
# You may also need to play with the logic that determines
# whether or not a message has already been migrated,
# especially if your source server has messages that
# did not come from an SMTP gateway or something like that.
#
# Some servers allow folders to contain mail and subfolders,
# some allow folders to only contain either mail or subfolders.
# If you are migrating from a "mixed use" type to a "single use"
# type server then you'll have to figure out how to deal
# with this. (This script deals with this by creating folders like
# "/blah_mail", "/blah/blah_mail", and "/blah/blah/blah_mail"
# to hold mail if the source folder contains mail and subfolders
# and the target server supports only single-use folders.
# You may not choose a different strategy.)
#
# Finally, it's possible that in some server-to-server
# copies, the source server supports messages that the
# target server considers unacceptable. For example, some
# but not all IMAP servers flat out refuse to accept
# messages with "base newlines", which is to say messages
# whose lines are match the pattern /[^\r]\n$/. There is
# no logic in this script that deals with the situation;
# you will have to identify it if it exists and figure
# out how you want to handle it.
#
# This is probably not an exhaustive list of issues you'll
# face in a migration, but it's a start.
#
# If you're just migrating from an old version to a newer
# version of the same server then you'll probably have
# a much easier time of it.
#
#
use Mail::IMAPClient;
use Data::Dumper;
use IO::File;
use File::Basename ;
use Getopt::Std;
use strict;
use vars qw/ $opt_B $opt_D $opt_T $opt_U
$opt_W $opt_b $opt_d $opt_h
$opt_t $opt_u $opt_w $opt_v
$opt_s $opt_S $opt_W $opt_p
$opt_P $opt_f $opt_F $opt_m
$opt_M
/;
getopts('vs:S:u:U:dDb:B:f:F:w:W:p:P:t:T:hm:M:');
if ( $opt_h ) {
print STDERR <<"HELP";
$0 - an example script demonstrating the use of the Mail::IMAPClient's
migrate method.
Syntax:
$0 -s source_server -u source_user -w source_password -p source_port \
-d debug_source -f source_debugging_file -b source_buffsize \
-t source_timeout -m source_auth_mechanism \
-S target_server -U target_user -W target_password -P target_port \
-D debug_target -F target_debugging_file -B target_buffsize \
-T target_timeout -M target_auth_mechanism \
-v
where "source" refers to the "copied from" mailbox, target is the
"copied to" mailbox, and -v turns on verbose output.
Authentication mechanisms default to "PLAIN".
HELP
exit;
}
$opt_v and ++$|;
print "$0: Started at ",scalar(localtime),"\n" if $opt_v;
$opt_p||=143;
$opt_P||=143;
# Make a connection to the source mailbox:
my $imap = Mail::IMAPClient->new(
Server => $opt_s,
User => $opt_u,
Password=> $opt_w,
Uid => 1,
Port => $opt_p,
Debug => $opt_d||0,
Buffer => $opt_b||4096,
Fast_io => 1,
( $opt_m ? ( Authmechanism => $opt_m) : () ),
Timeout => $opt_t,
($opt_f ? ( Debug_fh=>IO::File->new(">$opt_f" )) : ()),
) or die "$@";
# Make a connection to the target mailbox:
my $imap2 = Mail::IMAPClient->new(
Server => $opt_S,
User => $opt_U,
Password=> $opt_W,
Port => $opt_P,
Uid => 1,
Debug => $opt_D||0,
( $opt_M ? ( Authmechanism => $opt_M) : () ),
($opt_F ? ( Debug_fh=>IO::File->new(">$opt_F")) : ()),
Buffer => $opt_B||4096,
Fast_io => 1,
Timeout => $opt_T, # True value
) or die "$@";
# Turn off buffering on debug files:
$imap->Debug_fh->autoflush;
$imap2->Debug_fh->autoflush;
# Get folder hierarchy separator characters from source and target:
my $sep1 = $imap->separator;
my $sep2 = $imap2->separator;
# Find out if source and target support subfolders inside INBOX:
my $inferiorFlag1 = $imap->is_parent("INBOX");
my $inferiorFlag2 = $imap2->is_parent("INBOX");
# Set up a test folders to see if the source and target support mixed-use
# folders (i.e. folders with both subfolders and mail messages):
my $testFolder1 = "Migrate_Test_$$" ; # Ex: Migrate_Test_1234
$testFolder1 = $inferiorFlag2 ?
"INBOX" . $sep2 . $testFolder1 :
$testFolder1 ;
# The following folder will be a subfolder of $testFolder1:
my $testFolder2 = "Migrate_Test_$$" . $sep2 . "Migrate_test_subfolder_$$" ;
$testFolder2 = $inferiorFlag2 ? "INBOX" . $sep2 . $testFolder2 : $testFolder2 ;
$imap2->create($testFolder2) ; # Create the subfolder first; RFC2060 dictates that
# the parent folder should be created at the same time
# The following line inspired the selectable method. It was also made obsolete by it,
# but I'm leaving it as is to demonstrate use of lower-level method calls:
my $mixedUse2 = grep(/NoSelect/i,$imap2->list("",$testFolder1))? 0 : 1;
# Repeat the above with the source mailbox:
$testFolder2 = "Migrate_Test_$$" . $sep1 . "Migrate_test_subfolder_$$" ;
$testFolder2 = $inferiorFlag1 ? "INBOX" . $sep1 . $testFolder1 : $testFolder1 ;
$imap->create($testFolder2) ;
my $mixedUse1 = grep(/NoSelect/i,$imap->list("",$testFolder1))? 0 : 1;
print "Imap host $opt_s:$opt_p uses a '$sep1' as a separator and ",
( defined($inferiorFlag1) ? "allows " : "does not allow "),
"children in the INBOX. It supports ",
($mixedUse1?"mixed use ":"single use "), "folders.\n" if $opt_v;
print "Imap host $opt_S:$opt_P uses a '$sep2' as a separator and ",
( defined($inferiorFlag2) ? "allows " : "does not allow "),
"children in the INBOX. It supports ",
($mixedUse2?"mixed use ":"single use "), "folders.\n" if $opt_v;
for ($testFolder1,$testFolder2) {$imap->delete($_); $imap2->delete($_);}
my($totalMsgs, $totalBytes) = (0,0);
# Now we will migrate the folder. Here we are doing one message at a time
# so that we can do more granular status reporting and error checking.
# A lazier way would be to do all the messages in one migrate method call
# (specifying "ALL" as the message number) but then we wouldn't be able
# to print out which message we were migrating and it would be a little
# bit tougher to control checking for duplicates and stuff like that.
# We could also check the size of the message on the target right after
# the migrate as an extra safety check if we wanted to but I didn't bother
# here. (I saved as an exercise for the reader. Yeah! That's it! An exercise!)
# Iterate over all the folders in the source mailbox:
for my $f ($imap->folders) {
# Select the folder on the source side:
$imap->select($f) ;
# Massage the foldername into an acceptable target-side foldername:
my $targF = "";
my $srcF = $f;
$srcF =~ s/^INBOX$sep1//i;
if ( $inferiorFlag2 ) {
$targF = $srcF eq "INBOX" ? "INBOX" : "INBOX.$f" ;
} else {
$targF = $srcF ;
}
$targF =~ s/$sep1/$sep2/go unless $sep1 eq $sep2;
$targF =~ tr/#\$\& '"/\@\@+_/;
if ( $imap->is_parent($f) and !$mixedUse2 ) {
$targF .= "_mail" ;
}
print "Migrating folder $f to $targF\n" if $opt_v;
# Create the (massaged) folder on the target side:
unless ( $imap2->exists($targF) ) {
$imap2->create($imap2->Massage($targF))
or warn "Cannot create $targF on " . $imap2->Server . ": $@\n" and next;
}
# ... and select it
$imap2->select($imap2->Massage($targF))
or warn "Cannot select $targF on " . $imap2->Server . ": $@\n" and next;
# now that we know the target folder is selectable, we can close it again:
$imap2->close;
my $count = 0;
my $expectedTotal = $imap->message_count($f) ;
# Now start iterating over all the messages on the source side...
for my $msg ($imap->messages) {
++$count;
my $h = "";
# Get some basic info about the message:
eval { $h = ($imap->parse_headers($msg,"Message-id")||{})->{'Message-id'}[0]};
my $tsize = $imap->size($msg);
my $ret = 0 ; my $h2 = [];
# Make sure we didn't already migrate the message in a previous pass:
$imap2->select($targF);
if ( $tsize and $h and $h2 = $imap2->search(
HEADER => 'Message-id' => $imap2->Quote($h),
NOT => SMALLER => $tsize,
NOT => LARGER => $tsize
)
) {
print
"Skipping $f/$msg to $targF. ",
"One or more messages (" ,join(", ",@$h2),
") with the same size and message id ($h) ",
"is already on the server. ",
"\n"
if $opt_v;
$imap2->close;
} else {
print
"Migrating $f/$msg to $targF. ",
"Message #$count of $expectedTotal has ",
$tsize , " bytes.",
"\n" if $opt_v;
$imap2->close;
# Migrate the message:
my $ret = $imap->migrate($imap2,$msg,"$targF") ;
$ret and ( $totalMsgs++ , $totalBytes += $tsize);
$ret or warn "Cannot migrate $f/$msg to $targF on " . $imap2->Server . ": $@\n" ;
}
}
}
print "$0: Finished migrating $totalMsgs messages and $totalBytes bytes at ",scalar(localtime),"\n"
if $opt_v;
exit;
=head1 AUTHOR
David J. Kernen
The Kernen Group, Inc.
imap@kernengroup.com
=head1 COPYRIGHT
This example and Mail::IMAPClient are Copyright (c) 2003
by The Kernen Group, Inc. All rights reserved.
This example is distributed with Mail::IMAPClient and
subject to the same licensing requirements as Mail::IMAPClient.
imtest is a utility distributed with Cyrus IMAP server,
Copyright (c) 1994-2000 Carnegie Mellon University.
All rights reserved.
=cut
#$Log: migrate_mail2.pl,v $
#Revision 19991216.4 2003/06/12 21:38:33 dkernen
#
#Preparing 2.2.8
#Added Files: COPYRIGHT
#Modified Files: Parse.grammar
#Added Files: Makefile.old
# Makefile.PL Todo sample.perldb
# BodyStructure.pm
# Parse.grammar Parse.pod
# range.t
# Thread.grammar
# draft-crispin-imapv-17.txt rfc1731.txt rfc2060.txt rfc2062.txt
# rfc2221.txt rfc2359.txt rfc2683.txt
#

View file

@ -1,131 +0,0 @@
#!/usr/local/bin/perl
#
# This is an example demonstrating the use of the migrate method.
# Note that the migrate method is considered experimental and should
# be used with caution.
#
#$Id$
#
use Mail::IMAPClient;
use IO::File;
use File::Basename ;
use Getopt::Std;
use warnings;
use vars qw/$opt_h $opt_H
$opt_s $opt_u $opt_p $opt_d $opt_b $opt_o
$opt_S $opt_U $opt_P $opt_D $opt_B $opt_O
/;
getopts('Hhs:S:u:U:p:P:d:D:b:B:o:O:');
if ($opt_h or $opt_H ) {
print << "HELP";
Usage:
$0 -[h|H] -- prints this message
Lower-case options are for source server; upper-case options are for the target server.
$0 -s server -S server -u uid -U uid -p passwd -P passwd \
-b buffersize -B buffersize -o debugFile -O debugFile > error_file
All uppercase options except -O default to the lowercase option that was specified.
If you don't specify any uppercase options at all then God help you, I don't know
what will happen.
Always capture STDERR so that you'll be able to resolve any problems that come up.
HELP
exit;
}
my $imap = Mail::IMAPClient->new(
Server => $opt_s,
User => $opt_u,
Password=> $opt_p,
Uid => 1,
Debug => $opt_d,
Buffer => $opt_b||4096,
Fast_io => 1,
Timeout => 160, # True value
Debug_fh=> (
$opt_o ? IO::File->new(">$opt_o")||die "can't open $opt_o: $!\n" : undef )
) or die "Error opening source connection: $@\n";
my $imap2 = Mail::IMAPClient->new(
Server => $opt_S||$opt_s,
User => $opt_U||$opt_u,
Password=> $opt_P||$opt_p,
Uid => 1,
Debug => $opt_D||$opt_d,
Buffer => $opt_B||$opt_b||4096,
Fast_io => 1,
Timeout => 160,
Debug_fh=> (
$opt_O ? IO::File->new(">$opt_O")||die "can't open $opt_O: $!\n" : undef )
) or die "Error opening target connection: $@\n";
$imap->Debug_fh->autoflush;
$imap2->Debug_fh->autoflush;
for my $f ($imap->folders) { $imap->select($f) ; $imap->migrate($imap2,"ALL") ;}
=head1 AUTHOR
David J. Kernen
The Kernen Group, Inc.
imap@kernengroup.com
=head1 COPYRIGHT
This example and Mail::IMAPClient are Copyright (c) 2003
by The Kernen Group, Inc. All rights reserved.
This example is distributed with Mail::IMAPClient and
subject to the same licensing requirements as Mail::IMAPClient.
imtest is a utility distributed with Cyrus IMAP server,
Copyright (c) 1994-2000 Carnegie Mellon University.
All rights reserved.
=cut
#
#$Log: migrate_mbox.pl,v $
#Revision 19991216.2 2003/06/12 21:38:33 dkernen
#
#Preparing 2.2.8
#Added Files: COPYRIGHT
#Modified Files: Parse.grammar
#Added Files: Makefile.old
# Makefile.PL Todo sample.perldb
# BodyStructure.pm
# Parse.grammar Parse.pod
# range.t
# Thread.grammar
# draft-crispin-imapv-17.txt rfc1731.txt rfc2060.txt rfc2062.txt
# rfc2221.txt rfc2359.txt rfc2683.txt
#
#Revision 1.1 2003/06/12 21:38:15 dkernen
#
#Preparing 2.2.8
#Added Files: COPYRIGHT
#Modified Files: Parse.grammar
#Added Files: Makefile.old
# Makefile.PL Todo sample.perldb
# BodyStructure.pm
# Parse.grammar Parse.pod
# range.t
# Thread.grammar
# draft-crispin-imapv-17.txt rfc1731.txt rfc2060.txt rfc2062.txt
# rfc2221.txt rfc2359.txt rfc2683.txt
#
#

View file

@ -1,246 +0,0 @@
#!/usr/bin/perl
use Time::Local;
use FileHandle;
use File::Copy;
use Mail::IMAPClient;
use Sys::Hostname;
my $default_user = 'default';
my $default_pswd = 'default';
###
# ARGS: DATE = YYYYMMDDHHMM (defaults to current system date)
# UID = IMAP account id (defaults to $default_user)
# PSWD = uid's password (defaults to $default_pswd)
# HOST = Target host (defaults to localhost)
# CLEAN = 1 (defaults to 0; used to clean out mailbox 1st)
# CLEANONLY= 1 (defaults to 0; if 1 then only CLEAN is done)
# DOMAIN = x.com (no default) the mail domain for UID's address
#
# EG: populate_mailbox.pl DATE=200001010100 UID=testuser
###
( my ($x) = join( " ", @ARGV ) );
$x =~ s~=~ ~g;
chomp($x);
my %hash = split( /\s+/, $x ) if $x;
while ( my ( $k, $v ) = each %hash ) {
$hash{ uc $k } = $v;
}
while ( my ( $k, $v ) = each %hash ) {
delete $hash{$k} if $k =~ tr/[a-z]//;
}
$hash{UID} ||= "$default_user";
$hash{PSWD} ||= "$default_pswd";
$hash{HOST} ||= hostname;
while ( my ( $k, $v ) = each %hash ) {
print "Running with $k set to $v\n";
}
my $domain = $hash{DOMAIN} or die "No mail domain provided.\n";
my $now = seconds( $hash{DATE} ) || time;
my $six = $now - ( 6 * 24 * 60 * 60 );
my $seven = $now - ( 7 * 24 * 60 * 60 );
my $notthirty = $now - ( 29 * 24 * 60 * 60 );
my $thirty = $now - ( 30 * 24 * 60 * 60 );
my $notsixty = $now - ( 59 * 24 * 60 * 60 );
my $sixty = $now - ( 60 * 24 * 60 * 60 );
my $notd365 = $now - ( 364 * 24 * 60 * 60 );
my $d365 = $now - ( 365 * 24 * 60 * 60 );
$hash{SUBJECTS} = [
"Sixty days old",
"Less than sixty days old",
"365 days old",
"Less than 365 days old",
"Trash/Incinerator -- 7 days old",
"Sent -- 29 days old",
"Sent -- 30 days old",
"Trash -- 6 days old",
];
$hash{FOLDERS} = [
"Sent", "INBOX",
"Trash", "365_folder",
"Trash/Incinerator", "not_365_folder",
];
&clean_mailbox if $hash{CLEANONLY} || $hash{CLEAN};
exit if $hash{CLEANONLY};
# send to: date: subject:
# -------- --- ----- ---------
sendmail( $hash{UID}, $sixty, "Sixty days old" );
sendmail( $hash{UID}, $notsixty, "Less than sixty days old" );
sendmail( $hash{UID}, $d365, "365 days old" );
sendmail( $hash{UID}, $notd365, "Less than 365 days old" );
populate_trash( "Trash/Incinerator", $hash{UID}, $seven, 7 );
populate_trash( "Trash", $hash{UID}, $six, 6 );
populate_trash( "Sent", $hash{UID}, $thirty, 30 );
populate_trash( "Sent", $hash{UID}, $notthirty, 29 );
movemail( "365 days old", "365_folder" );
movemail( "Less than 365 days old", "not_365_folder" );
exit;
sub seconds {
my $d = shift or return undef;
my ( $yy, $moy, $dom, $hr, $min ) =
$d =~ m! ^ # anchor at start #
(\d\d\d\d) # year #
(\d\d) # month #
(\d\d) # day #
(\d\d) # hour #
(\d\d) # minute #
!x;
# allow year 0999 to be year 999, and year 0099 to be year 99
return timegm( 0, $min, $hr, $dom, $moy - 1,
( $yy > 999 ? $yy : $yy - 1900 ) );
}
sub sendmail {
my ( $to, $date, $subject ) = @_;
my $text = <<EOTEXT ;
To: $to\@$hash{DOMAIN}
Date: @{[&rfc822_date($date)]}
Subject: $subject
Dear mail tester,
This is a test message to test mail for messages \l$subject.
I hope you like it!
Love,
The E-Mail Engineering Team
EOTEXT
for ( my $x = 0 ; $x < 10 ; $x++ ) {
my $imap = Mail::IMAPClient->new(
Server => $hash{HOST},
User => $hash{UID},
Password => $hash{PSWD}
) or die "can't connect: $!\n";
$imap->append( "INBOX", $text );
$imap->logout;
}
}
sub populate_trash {
my $where = shift;
my $to = shift;
my $date = shift;
my $d = shift;
my ( $ss, $min, $hr, $day, $mon, $year ) = gmtime($date);
$mon++;
$year += 1900;
my $fn = sprintf( "%4.4d%2.2d%2.2d%2.2d%2.2d%2.2d",
$year, $mon, $day, $hr, $min, $ss );
my $x = 0;
my $subject = "$where -- $d days old";
while ( $x++ < 10 ) {
my $fh;
$fh .= "Date: @{[&rfc822_date($date)]}\n";
$fh .= <<EOTRAH ;
Subject: $subject
This note was put in the $where folder $d days ago. (My how time flies!)
I hope you enjoyed testing with it!
EOTRAH
my $imap = Mail::IMAPClient->new(
Server => $hash{HOST},
User => $hash{UID},
Password => $hash{PSWD}
) or die "can't connect: $!\n";
$imap->append( $where, $fh );
}
}
sub movemail {
my ( $subj, $fold ) = @_;
my $fh = Mail::IMAPClient->new(
Debug => 0,
Server => $hash{HOST},
User => $hash{UID},
Password => $hash{PSWD},
);
$fh->select("inbox") or die "cannot open inbox: $!\n";
foreach my $f ( $fh->search(qq(SUBJECT "$subj")) ) {
$fh->move( $fold, $f );
}
}
sub clean_mailbox {
my $fh = Mail::IMAPClient->new(
Debug => 0,
Server => $hash{HOST},
User => $hash{UID},
Password => $hash{PSWD},
);
for my $x ( @{ $hash{FOLDERS} } ) {
my @msgs;
$fh->create($x) unless $fh->exists($x);
$fh->select($x);
for my $s ( @{ $hash{SUBJECTS} } ) {
push @msgs, $fh->search(qq(SUBJECT "$s"));
}
$fh->delete_message(@msgs) if scalar(@msgs);
$fh->expunge;
}
}
# Date: Fri, 09 Jul 1999 13:10:55 -0400
sub rfc822_date {
my $date = shift;
my @date = localtime($date);
my @dow = qw{ Sun Mon Tue Wed Thu Fri Sat };
my @mnt = qw{ Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec};
return sprintf(
"%s, %2.2d %s %4.4s %2.2d:%2.2d:%2.2d -0400",
$dow[ $date[6] ],
$date[3],
$mnt[ $date[4] ],
$date[5] += 1900,
$date[2], $date[1], $date[0]
);
}
=head1 AUTHOR
David J. Kernen
The Kernen Group, Inc.
imap@kernengroup.com
=head1 COPYRIGHT
This example and Mail::IMAPClient are Copyright (c) 2003
by The Kernen Group, Inc. All rights reserved.
This example is distributed with Mail::IMAPClient and
subject to the same licensing requirements as Mail::IMAPClient.
imtest is a utility distributed with Cyrus IMAP server,
Copyright (c) 1994-2000 Carnegie Mellon University.
All rights reserved.
=cut

View file

@ -1,88 +0,0 @@
#!/usr/local/bin/perl
#$Id$
use Mail::IMAPClient;
use Getopt::Std;
use File::Basename;
getopts('s:u:p:f:dh');
if ($opt_h) {
print STDERR "$0 -- example of how to select shared folder\n",
"\n\nUsage:\n",
"\t-s server -- specify name or ip address of mail server\n",
"\t-u userid -- specify login name of authenticating user\n",
"\t-p passwd -- specify login password of authenticating user\n",
"\t-f folder -- specify shared folder to access (i.e. '-f frank/INBOX')\n",
"\t-h display this help message\n\n";
"\t-d turn on debugging output\n\n";
exit;
}
my $server = $opt_s or die "No server name specified\n";
my $user = $opt_u or die "No user name specified\n";
my $pass = $opt_p or die "No password specified\n";
my $folder = $opt_f or die "No shared folder specified\n";
chomp $pass;
my $imap = Mail::IMAPClient->new(Server=>$server,User=>$user,Password=>$pass,Debug=>$opt_d)
or die "Can't connect to $user\@$server: $@ $!\n";
my($prefix,$prefSep) = @{$imap->namespace->[1][0]}
or die "Can't get shared folder namespace or separator: $@\n";
my $target = $prefix .
( $prefix =~ /\Q$prefSep\E$/ || $opt_f =~ /^\Q$prefSep/ ? "" : $prefSep ) .
$opt_f ;
print "Selecting $target\n";
$imap->select($target)
or die "Cannot select $target: $@\n";
print "Ok: $target has ", $imap->message_count($target)," messages.\n";
$imap->logout;
exit;
=head1 AUTHOR
David J. Kernen
The Kernen Group, Inc.
imap@kernengroup.com
=head1 COPYRIGHT
This example and Mail::IMAPClient are Copyright (c) 2003
by The Kernen Group, Inc. All rights reserved.
This example is distributed with Mail::IMAPClient and
subject to the same licensing requirements as Mail::IMAPClient.
imtest is a utility distributed with Cyrus IMAP server,
Copyright (c) 1994-2000 Carnegie Mellon University.
All rights reserved.
=cut
#
#$Log: sharedFolder.pl,v $
#Revision 19991216.1 2003/06/12 21:38:35 dkernen
#
#Preparing 2.2.8
#Added Files: COPYRIGHT
#Modified Files: Parse.grammar
#Added Files: Makefile.old
# Makefile.PL Todo sample.perldb
# BodyStructure.pm
# Parse.grammar Parse.pod
# range.t
# Thread.grammar
# draft-crispin-imapv-17.txt rfc1731.txt rfc2060.txt rfc2062.txt
# rfc2221.txt rfc2359.txt rfc2683.txt
#
#

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,576 +0,0 @@
use warnings;
use strict;
package Mail::IMAPClient::BodyStructure;
use Mail::IMAPClient::BodyStructure::Parse;
# BUG?: old code used name "HEAD" instead of "HEADER", change?
my $HEAD = "HEAD";
# my has file scope, not limited to package!
my $parser = Mail::IMAPClient::BodyStructure::Parse->new
or die "Cannot parse rules: $@\n"
. "Try remaking Mail::IMAPClient::BodyStructure::Parse.\n";
sub new {
my $class = shift;
my $bodystructure = shift;
my $self = $parser->start($bodystructure)
or return undef;
$self->{_prefix} = "";
$self->{_id} = exists $self->{bodystructure} ? $HEAD : 1;
$self->{_top} = 1;
bless $self, ref($class) || $class;
}
sub _get_thingy {
my $thingy = shift;
my $object = shift || ( ref $thingy ? $thingy : undef );
unless ( $object && ref $object ) {
warn $@ = "No argument passed to $thingy method.";
return undef;
}
unless ( UNIVERSAL::isa( $object, 'HASH' ) && exists $object->{$thingy} ) {
my $a = $thingy =~ /^[aeiou]/i ? 'an' : 'a';
my $has = ref $object eq 'HASH' ? join( ", ", keys %$object ) : '';
warn $@ =
ref($object)
. " $object does not have $a $thingy. "
. ( $has ? "It has $has" : '' );
return undef;
}
my $value = $object->{$thingy};
$value =~ s/\\ ( [\\\(\)"\x0d\x0a] )/$1/gx;
$value =~ s/^"(.*)"$/$1/;
$value;
}
BEGIN {
no strict 'refs';
foreach my $datum (
qw/ bodytype bodysubtype bodyparms bodydisp bodyid bodydesc bodyenc
bodysize bodylang envelopestruct textlines /
)
{
*$datum = sub { _get_thingy( $datum, @_ ) };
}
}
sub parts {
my $self = shift;
return wantarray ? @{ $self->{PartsList} } : $self->{PartsList}
if exists $self->{PartsList};
my @parts;
$self->{PartsList} = \@parts;
# BUG?: should this default to ($HEAD, TEXT)
unless ( exists $self->{bodystructure} ) {
$self->{PartsIndex}{1} = $self;
@parts = ( $HEAD, 1 );
return wantarray ? @parts : \@parts;
}
foreach my $p ( $self->bodystructure ) {
my $id = $p->id;
push @parts, $id;
$self->{PartsIndex}{$id} = $p;
my $type = uc $p->bodytype || '';
push @parts, "$id.$HEAD"
if $type eq 'MESSAGE';
}
wantarray ? @parts : \@parts;
}
sub bodystructure {
my $self = shift;
my $partno = 0;
my @parts;
if ( $self->{_top} ) {
$self->{_id} ||= $HEAD;
$self->{_prefix} ||= $HEAD;
$partno = 0;
foreach my $b ( @{ $self->{bodystructure} } ) {
$b->{_id} = ++$partno;
$b->{_prefix} = $partno;
push @parts, $b, $b->bodystructure;
}
return wantarray ? @parts : \@parts;
}
my $prefix = $self->{_prefix} || "";
$prefix =~ s/\.?$/./;
foreach my $p ( @{ $self->{bodystructure} } ) {
$partno++;
# BUG?: old code didn't add .TEXT sections, should we skip these?
# - This code needs to be generalised (maybe it belongs in parts()?)
# - Should every message should have HEAD (actually MIME) and TEXT?
# at least dovecot and iplanet appear to allow this even for
# non-multipart sections
my $pno = $partno;
my $stype = $self->{bodytype} || "";
my $ptype = $p->{bodytype} || "";
# a message and the multipart inside of it "collapse together"
if ( $partno == 1 and $stype eq 'MESSAGE' and $ptype eq 'MULTIPART' ) {
$pno = "TEXT";
$p->{_prefix} = "$prefix";
}
else {
$p->{_prefix} = "$prefix$partno";
}
$p->{_id} ||= "$prefix$pno";
push @parts, $p, $p->{bodystructure} ? $p->bodystructure : ();
}
wantarray ? @parts : \@parts;
}
sub id {
my $self = shift;
return $self->{_id}
if exists $self->{_id};
return $HEAD
if $self->{_top};
# BUG?: can this be removed? ... seems wrong
if ( $self->{bodytype} eq 'MULTIPART' ) {
my $p = $self->{_id} || $self->{_prefix};
$p =~ s/\.$//;
return $p;
}
else {
return $self->{_id} ||= 1;
}
}
package Mail::IMAPClient::BodyStructure::Part;
our @ISA = qw/Mail::IMAPClient::BodyStructure/;
package Mail::IMAPClient::BodyStructure::Envelope;
our @ISA = qw/Mail::IMAPClient::BodyStructure/;
sub new {
my ( $class, $envelope ) = @_;
$parser->envelope($envelope);
}
sub parse_string {
my ( $class, $envelope ) = @_;
$envelope = "(" . $envelope . ")" unless ( $envelope =~ /^\(/ );
$parser->envelopestruct($envelope);
}
sub from_addresses { shift->_addresses( from => 1 ) }
sub sender_addresses { shift->_addresses( sender => 1 ) }
sub replyto_addresses { shift->_addresses( replyto => 1 ) }
sub to_addresses { shift->_addresses( to => 0 ) }
sub cc_addresses { shift->_addresses( cc => 0 ) }
sub bcc_addresses { shift->_addresses( bcc => 0 ) }
sub _addresses($$$) {
my ( $self, $name, $isSender ) = @_;
ref $self->{$name} eq 'ARRAY'
or return ();
my @list;
foreach ( @{ $self->{$name} } ) {
my $pn = $_->personalname;
my $name = $pn && $pn ne 'NIL' ? "$pn " : '';
push @list, $name . '<' . $_->mailboxname . '@' . $_->hostname . '>';
}
wantarray ? @list
: $isSender ? $list[0]
: \@list;
}
BEGIN {
no strict 'refs';
for my $datum (
qw(subject inreplyto from messageid bcc date
replyto to sender cc)
)
{
*$datum = sub { @_ > 1 ? $_[0]->{$datum} = $_[1] : $_[0]->{$datum} }
}
}
package Mail::IMAPClient::BodyStructure::Address;
our @ISA = qw/Mail::IMAPClient::BodyStructure/;
for my $datum (qw(personalname mailboxname hostname sourcename)) {
no strict 'refs';
*$datum = sub { shift->{$datum}; };
}
1;
__END__
=head1 NAME
Mail::IMAPClient::BodyStructure - parse fetched results
=head1 SYNOPSIS
use Mail::IMAPClient;
use Mail::IMAPClient::BodyStructure;
my $imap = Mail::IMAPClient->new(
Server => $server, User => $login, Password => $pass
);
$imap->select("INBOX") or die "Could not select INBOX: $@\n";
my @recent = $imap->search("recent") or die "No recent msgs in INBOX\n";
foreach my $id (@recent) {
my $bsdat = $imap->fetch( $id, "bodystructure" );
my $bso = Mail::IMAPClient::BodyStructure->new( join("", $imap->History) );
my $mime = $bso->bodytype . "/" . $bso->bodysubtype;
my $parts = map( "\n\t" . $_, $bso->parts );
print "Msg $id (Content-type: $mime) contains these parts:$parts\n";
}
=head1 DESCRIPTION
This extension will parse the result of an IMAP FETCH BODYSTRUCTURE
command into a perl data structure. It also provides helper methods
to help pull information out of the data structure.
This module requires Parse::RecDescent.
=head1 Class Methods
The following class method is available:
=head2 new
This class method is the constructor method for instantiating new
Mail::IMAPClient::BodyStructure objects. The B<new> method accepts
one argument, a string containing a server response to a FETCH
BODYSTRUCTURE directive.
The module B<Mail::IMAPClient> provides the B<get_bodystructure>
convenience method to simplify use of this module when starting with
just a messages sequence number or unique ID (UID).
=head1 Object Methods
The following object methods are available:
=head2 bodytype
The B<bodytype> object method requires no arguments. It returns the
bodytype for the message whose structure is described by the calling
B<Mail::IMAPClient::Bodystructure> object.
=head2 bodysubtype
The B<bodysubtype> object method requires no arguments. It returns the
bodysubtype for the message whose structure is described by the calling
B<Mail::IMAPClient::Bodystructure> object.
=head2 bodyparms
The B<bodyparms> object method requires no arguments. It returns the
bodyparms for the message whose structure is described by the calling
B<Mail::IMAPClient::Bodystructure> object.
=head2 bodydisp
The B<bodydisp> object method requires no arguments. It returns the
bodydisp for the message whose structure is described by the calling
B<Mail::IMAPClient::Bodystructure> object.
=head2 bodyid
The B<bodyid> object method requires no arguments. It returns the
bodyid for the message whose structure is described by the calling
B<Mail::IMAPClient::Bodystructure> object.
=head2 bodydesc
The B<bodydesc> object method requires no arguments. It returns the
bodydesc for the message whose structure is described by the calling
B<Mail::IMAPClient::Bodystructure> object.
=head2 bodyenc
The B<bodyenc> object method requires no arguments. It returns the
bodyenc for the message whose structure is described by the calling
B<Mail::IMAPClient::Bodystructure> object.
=head2 bodysize
The B<bodysize> object method requires no arguments. It returns the
bodysize for the message whose structure is described by the calling
B<Mail::IMAPClient::Bodystructure> object.
=head2 bodylang
The B<bodylang> object method requires no arguments. It returns the
bodylang for the message whose structure is described by the calling
B<Mail::IMAPClient::Bodystructure> object.
=head2 bodystructure
The B<bodystructure> object method requires no arguments. It returns
the bodystructure for the message whose structure is described by the
calling B<Mail::IMAPClient::Bodystructure> object.
=head2 envelopestruct
The B<envelopestruct> object method requires no arguments. It returns
a B<Mail::IMAPClient::BodyStructure::Envelope> object for the message
from the calling B<Mail::IMAPClient::Bodystructure> object.
=head2 textlines
The B<textlines> object method requires no arguments. It returns the
textlines for the message whose structure is described by the calling
B<Mail::IMAPClient::Bodystructure> object.
=head1 Mail::IMAPClient::BodyStructure::Envelope
The IMAP standard specifies that output from the IMAP B<FETCH
ENVELOPE> command will be an RFC2060 envelope structure. It further
specifies that output from the B<FETCH BODYSTRUCTURE> command may also
contain embedded envelope structures (if, for example, a message's
subparts contain one or more included messages). Objects belonging to
B<Mail::IMAPClient::BodyStructure::Envelope> are Perl representations
of these envelope structures, which is to say the nested parenthetical
lists of RFC2060 translated into a Perl datastructure.
Note that all of the fields relate to the specific part to which they
belong. In other words, output from a FETCH nnnn ENVELOPE command
(or, in B<Mail::IMAPClient>, C<$imap->fetch($msgid,"ENVELOPE")> or
C<my $env = $imap->get_envelope($msgid)>) are for the message, but
fields from within a bodystructure relate to the message subpart and
not the parent message.
An envelope structure's B<Mail::IMAPClient::BodyStructure::Envelope>
representation is a hash of thingies that looks like this:
{
subject => "subject",
inreplyto => "reference_message_id",
from => [ addressStruct1 ],
messageid => "message_id",
bcc => [ addressStruct1, addressStruct2 ],
date => "Tue, 09 Jul 2002 14:15:53 -0400",
replyto => [ adressStruct1, addressStruct2 ],
to => [ adressStruct1, addressStruct2 ],
sender => [ adressStruct1 ],
cc => [ adressStruct1, addressStruct2 ],
}
The B<...::Envelope> object also has methods for accessing data in the
structure. They are:
=over 4
=item date
Returns the date of the message.
=item inreplyto
Returns the message id of the message to which this message is a reply.
=item subject
Returns the subject of the message.
=item messageid
Returns the message id of the message.
=back
You can also use the following methods to get addressing information.
Each of these methods returns an array of
B<Mail::IMAPClient::BodyStructure::Address> objects, which are perl
data structures representing RFC2060 address structures. Some of
these arrays would naturally contain one element (such as B<from>,
which normally contains a single "From:" address); others will often
contain more than one address. However, because RFC2060 defines all
of these as "lists of address structures", they are all translated
into arrays of B<...::Address> objects.
See the section on B<Mail::IMAPClient::BodyStructure::Address>, below,
for alternate (and preferred) ways of accessing these data.
The methods available are:
=over 4
=item bcc
Returns an array of blind cc'ed recipients' address structures.
(Don't expect much in here unless the message was sent from the
mailbox you're poking around in, by the way.)
=item cc
Returns an array of cc'ed recipients' address structures.
=item from
Returns an array of "From:" address structures--usually just one.
=item replyto
Returns an array of "Reply-to:" address structures. Once again there
is usually just one address in the list.
=item sender
Returns an array of senders' address structures--usually just one and
usually the same as B<from>.
=item to
Returns an array of recipients' address structures.
=back
Each of the methods that returns a list of address structures (i.e. a
list of B<Mail::IMAPClient::BodyStructure::Address> arrays) also has
an analogous method that will return a list of E-Mail addresses
instead. The addresses are in the format C<personalname
E<lt>mailboxname@hostnameE<gt>> (see the section on
B<Mail::IMAPClient::BodyStructure::Address>, below) However, if the
personal name is 'NIL' then it is omitted from the address.
These methods are:
=over 4
=item bcc_addresses
Returns a list (or an array reference if called in scalar context) of
blind cc'ed recipients' email addresses. (Don't expect much in here
unless the message was sent from the mailbox you're poking around in,
by the way.)
=item cc_addresses
Returns a list of cc'ed recipients' email addresses. If called in a
scalar context it returns a reference to an array of email addresses.
=item from_addresses
Returns a list of "From:" email addresses. If called in a scalar
context it returns the first email address in the list. (It's usually
a list of just one anyway.)
=item replyto_addresses
Returns a list of "Reply-to:" email addresses. If called in a scalar
context it returns the first email address in the list.
=item sender_addresses
Returns a list of senders' email addresses. If called in a scalar
context it returns the first email address in the list.
=item to_addresses
Returns a list of recipients' email addresses. If called in a scalar
context it returns a reference to an array of email addresses.
=back
Note that context affects the behavior of all of the above methods.
Those fields that will commonly contain multiple entries (i.e. they
are recipients) will return an array reference when called in scalar
context. You can use this behavior to optimize performance.
Those fields that will commonly contain just one address (the
sender's) will return the first (and usually only) address. You can
use this behavior to optimize your development time.
=head1 Addresses and the Mail::IMAPClient::BodyStructure::Address
Several components of an envelope structure are address structures.
They are each parsed into their own object,
B<Mail::IMAPClient::BodyStructure::Address>, which looks like this:
{
mailboxname => 'somebody.special',
hostname => 'somplace.weird.com'
personalname => 'Somebody Special
sourceroute => 'NIL'
}
RFC2060 specifies that each address component of a bodystructure is a
list of address structures, so B<Mail::IMAPClient::BodyStructure>
parses each of these into an array of
B<Mail::IMAPClient::BodyStructure::Address> objects.
Each of these objects has the following methods available to it:
=over 4
=item mailboxname
Returns the "mailboxname" portion of the address, which is the part to
the left of the '@' sign.
=item hostname
Returns the "hostname" portion of the address, which is the part to
the right of the '@' sign.
=item personalname
Returns the "personalname" portion of the address, which is the part
of the address that's treated like a comment.
=item sourceroute
Returns the "sourceroute" portion of the address, which is typically "NIL".
=back
Taken together, the parts of an address structure form an address that
will look something like this:
C<personalname E<lt>mailboxname@hostnameE<gt>>
Note that because the B<Mail::IMAPClient::BodyStructure::Address>
objects come in arrays, it's generally easier to use the methods
available to B<Mail::IMAPClient::BodyStructure::Envelope> to obtain
all of the addresses in a particular array in one operation. These
methods are provided, however, in case you'd rather do things the hard
way. (And also because the aforementioned methods from
B<Mail::IMAPClient::BodyStructure::Envelope> need them anyway.)
=cut
=head1 AUTHOR
Original author: David J. Kernen; Reworked by: Mark Overmeer;
Maintained by Phil Pearl.
=head1 SEE ALSO
perl(1), Mail::IMAPClient, Parse::RecDescent, and RFC2060.
=cut

View file

@ -1,189 +0,0 @@
# Directives
# ( none)
# Start-up Actions
{
my $mibs = "Mail::IMAPClient::BodyStructure";
my $subpartCount = 0;
my $partCount = 0;
sub take_optional_items($$@)
{ my ($r, $items) = (shift, shift);
foreach (@_)
{ my $opt = $_ .'(?)';
exists $items->{$opt} or next;
$r->{$_} = UNIVERSAL::isa($items->{$opt}, 'ARRAY')
? $items->{$opt}[0] : $items->{$opt};
}
}
sub merge_hash($$)
{ my $to = shift;
my $from = shift or return;
while( my($k,$v) = each %$from) { $to->{$k} = $v }
}
}
# Atoms
TEXT: /^"TEXT"|^TEXT/i { $return = "TEXT" }
PLAIN: /^"PLAIN"|^PLAIN/i { $return = "PLAIN" }
HTML: /"HTML"|HTML/i { $return = "HTML" }
MESSAGE: /^"MESSAGE"|^MESSAGE/i { $return = "MESSAGE"}
RFC822: /^"RFC822"|^RFC822/i { $return = "RFC822" }
NIL: /^NIL/i { $return = "NIL" }
RFCNONCOMPLY: /^\(\)/i { $return = "NIL" }
NUMBER: /^(\d+)/ { $return = $item[1] }
# Strings:
SINGLE_QUOTED_STRING: "'" /(?:\\['\\]|[^'])*/ "'" { $return = $item{__PATTERN1__} }
DOUBLE_QUOTED_STRING: '"' /(?:\\["\\]|[^"])*/ '"' { $return = $item{__PATTERN1__} }
BARESTRING: ...!/^[)('"]/ /^(?!\(|\))(?:\\ |\S)+/
{ $return = $item{__PATTERN1__} }
STRING: DOUBLE_QUOTED_STRING | SINGLE_QUOTED_STRING | BARESTRING
STRINGS: "(" STRING(s) ")" { $return = $item{'STRING(s)'} }
textlines: NIL | NUMBER
rfc822message: MESSAGE RFC822 { $return = "MESSAGE RFC822" }
bodysubtype: PLAIN | HTML | NIL | STRING
key: STRING
value: NIL | NUMBER | STRING | KVPAIRS
kvpair: ...!")" key value
{ $return = { $item{key} => $item{value} } }
KVPAIRS: "(" kvpair(s) ")"
{ $return = { map { (%$_) } @{$item{'kvpair(s)'}} } }
bodytype: STRING
bodyparms: NIL | KVPAIRS
bodydisp: NIL | KVPAIRS
bodyid: ...!/[()]/ NIL | STRING
bodydesc: ...!/[()]/ NIL | STRING
bodysize: ...!/[()]/ NIL | NUMBER
bodyenc: NIL | STRING | KVPAIRS
bodyMD5: NIL | STRING
bodylang: NIL | STRING | STRINGS
bodyextra: NIL | STRING | STRINGS
bodyloc: NIL | STRING
personalname: NIL | STRING
sourceroute: NIL | STRING
mailboxname: NIL | STRING
hostname: NIL | STRING
addressstruct: "(" personalname sourceroute mailboxname hostname ")"
{ bless { personalname => $item{personalname}
, sourceroute => $item{sourceroute}
, mailboxname => $item{mailboxname}
, hostname => $item{hostname}
}, 'Mail::IMAPClient::BodyStructure::Address';
}
subject: NIL | STRING
inreplyto: NIL | STRING
messageid: NIL | STRING
date: NIL | STRING
ADDRESSES: NIL | RFCNONCOMPLY
| "(" addressstruct(s) ")" { $return = $item{'addressstruct(s)'} }
cc: ADDRESSES
bcc: ADDRESSES
from: ADDRESSES
replyto: ADDRESSES
sender: ADDRESSES
to: ADDRESSES
envelopestruct: "(" date subject from sender replyto to cc
bcc inreplyto messageid ")"
{ $return = bless {}, "Mail::IMAPClient::BodyStructure::Envelope";
$return->{$_} = $item{$_}
for qw/date subject from sender replyto to cc/
, qw/bcc inreplyto messageid/;
1;
}
basicfields: bodysubtype bodyparms(?) bodyid(?)
bodydesc(?) bodyenc(?) bodysize(?)
{ $return = { bodysubtype => $item{bodysubtype} };
take_optional_items($return, \%item,
qw/bodyparms bodyid bodydesc bodyenc bodysize/);
1;
}
textmessage: TEXT <commit> basicfields textlines(?) bodyMD5(?)
bodydisp(?) bodylang(?) bodyextra(?)
{
$return = $item{basicfields} || {};
$return->{bodytype} = 'TEXT';
take_optional_items($return, \%item
, qw/textlines bodyMD5 bodydisp bodylang bodyextra/);
1;
}
othertypemessage: bodytype basicfields bodyMD5(?) bodydisp(?)
bodylang(?) bodyextra(?)
{ $return = { bodytype => $item{bodytype} };
take_optional_items($return, \%item
, qw/bodyMD5 bodydisp bodylang bodyextra/ );
merge_hash($return, $item{basicfields});
1;
}
nestedmessage: rfc822message <commit> bodyparms bodyid bodydesc bodyenc
# bodysize envelopestruct bodystructure textlines
bodysize envelopestruct(?) bodystructure(?) textlines(?)
bodyMD5(?) bodydisp(?) bodylang(?) bodyextra(?)
{
$return = {};
$return->{$_} = $item{$_}
for qw/bodyparms bodyid bodydesc bodyenc bodysize/;
# envelopestruct bodystructure textlines/;
take_optional_items($return, \%item
, qw/envelopestruct bodystructure textlines/
, qw/bodyMD5 bodydisp bodylang bodyextra/);
merge_hash($return, $item{bodystructure}[0]);
merge_hash($return, $item{basicfields});
$return->{bodytype} = "MESSAGE" ;
$return->{bodysubtype} = "RFC822" ;
1;
}
multipart: subpart(s) <commit> bodysubtype
bodyparms(?) bodydisp(?) bodylang(?) bodyloc(?) bodyextra(?)
<defer: $subpartCount = 0>
{ $return =
{ bodysubtype => $item{bodysubtype}
, bodytype => 'MULTIPART'
, bodystructure => $item{'subpart(s)'}
};
take_optional_items($return, \%item
, qw/bodyparms bodydisp bodylang bodyloc bodyextra/);
1;
}
subpart: "(" part ")" {$return = $item{part}} <defer: ++$subpartCount;>
part: multipart { $return = bless $item{multipart}, $mibs }
| textmessage { $return = bless $item{textmessage}, $mibs }
| nestedmessage { $return = bless $item{nestedmessage}, $mibs }
| othertypemessage { $return = bless $item{othertypemessage}, $mibs }
bodystructure: "(" part(s) ")"
{ $return = $item{'part(s)'} }
start: /.*?\(.*?BODYSTRUCTURE \(/i part(1) /\).*\)\r?\n?/
{ $return = $item{'part(1)'}[0] }
envelope: /.*?\(.*?ENVELOPE/ envelopestruct /.*\)/
{ $return = $item{envelopestruct} }

View file

@ -1,15 +0,0 @@
=head1 NAME
Mail::IMAPClient::BodyStructure::Parse - used internally by Mail::IMAPClient::BodyStructure
=head1 DESCRIPTION
This module is used internally by L<Mail::IMAPClient::BodyStructure>
and is generated using L<Parse::RecDescent>. It is not meant to be used
directly by other scripts nor is there much point in debugging it.
=head1 SYNOPSIS
This module is used internally by L<Mail::IMAPClient::BodyStructure>
and is not meant to be used or called directly from applications. So
don't do that.

View file

@ -1,280 +0,0 @@
use warnings;
use strict;
package Mail::IMAPClient::MessageSet;
=head1 NAME
Mail::IMAPClient::MessageSet - ranges of message sequence numbers
=cut
use overload
'""' => "str"
, '.=' => sub {$_[0]->cat($_[1])}
, '+=' => sub {$_[0]->cat($_[1])}
, '-=' => sub {$_[0]->rem($_[1])}
, '@{}' => "unfold"
, fallback => 1;
sub new
{ my $class = shift;
my $range = $class->range(@_);
bless \$range, $class;
}
sub str { overload::StrVal( ${$_[0]} ) }
sub _unfold_range($)
# { my $x = shift; return if $x =~ m/[^0-9,:]$/; $x =~ s/\:/../g; eval $x; }
{ map { /(\d+)\s*\:\s*(\d+)/ ? ($1..$2) : $_ }
split /\,/, shift;
}
sub rem
{ my $self = shift;
my %delete = map { ($_ => 1) } map { _unfold_range $_ } @_;
$$self = $self->range(grep {not $delete{$_}} $self->unfold);
$self;
}
sub cat
{ my $self = shift;
$$self = $self->range($$self, @_);
$self;
}
sub range
{ my $self = shift;
my @msgs;
foreach my $m (@_)
{ defined $m && length $m
or next;
foreach my $mm (ref $m eq 'ARRAY' ? @$m : $m)
{ push @msgs, _unfold_range $mm;
}
}
@msgs
or return undef;
@msgs = sort {$a <=> $b} @msgs;
my $low = my $high = shift @msgs;
my @ranges;
foreach my $m (@msgs)
{ next if $m == $high; # double
if($m == $high + 1) { $high = $m }
else
{ push @ranges, $low == $high ? $low : "$low:$high";
$low = $high = $m;
}
}
push @ranges, $low == $high ? $low : "$low:$high" ;
join ",", @ranges;
}
sub unfold
{ my $self = shift;
wantarray ? ( _unfold_range $$self ) : [ _unfold_range $$self ];
}
=head1 SYNOPSIS
my @msgs = $imap->search("SUBJECT","Virus"); # returns 1,3,4,5,6,9,10
my $msgset = Mail::IMAPClient::MessageSet->new(@msgs);
print $msgset; # prints "1,3:6,9:10"
# add message 14 to the set:
$msgset += 14;
print $msgset; # prints "1,3:6,9:10,14"
# add messages 16,17,18,19, and 20 to the set:
$msgset .= "16,17,18:20";
print $msgset; # prints "1,3:6,9:10,14,16:20"
# Hey, I didn't really want message 17 in there; let's take it out:
$msgset -= 17;
print $msgset; # prints "1,3:6,9:10,14,16,18:20"
# Now let's iterate over each message:
for my $msg (@$msgset)
{ print "$msg\n"; # Prints: "1\n3\n4\n5\n6..16\n18\n19\n20\n"
}
print join("\n", @$msgset)."\n"; # same simpler
local $" = "\n"; print "@$msgset\n"; # even more simple
=head1 DESCRIPTION
The B<Mail::IMAPClient::MessageSet> module is designed to make life easier
for programmers who need to manipulate potentially large sets of IMAP
message UID's or sequence numbers.
This module presents an object-oriented interface into handling your
message sets. The object reference returned by the L<new> method is an
overloaded reference to a scalar variable that contains the message set's
compact RFC2060 representation. The object is overloaded so that using
it like a string returns this compact message set representation. You
can also add messages to the set (using either a '.=' operator or a '+='
operator) or remove messages (with the '-=' operator). And if you use
it as an array reference, it will humor you and act like one by calling
L<unfold> for you.
RFC2060 specifies that multiple messages can be provided to certain IMAP
commands by separating them with commas. For example, "1,2,3,4,5" would
specify messages 1, 2, 3, 4, and (you guessed it!) 5. However, if you are
performing an operation on lots of messages, this string can get quite long.
So long that it may slow down your transaction, and perhaps even cause the
server to reject it. So RFC2060 also permits you to specify a range of
messages, so that messages 1, 2, 3, 4 and 5 can also be specified as
"1:5".
This is where B<Mail::IMAPClient::MessageSet> comes in. It will convert
your message set into the shortest correct syntax. This could potentially
save you tons of network I/O, as in the case where you want to fetch the
flags for all messages in a 10000 message folder, where the messages
are all numbered sequentially. Delimited as commas, and making the
best-case assumption that the first message is message "1", it would take
48893 bytes to specify the whole message set using the comma-delimited
method. To specify it as a range, it takes just seven bytes (1:10000).
Note that the L<Mail::IMAPClient> B<Range> method can be used as
a short-cut to specifying C<Mail::IMAPClient::MessageSet-E<gt>new(@etc)>.)
=head1 CLASS METHODS
The only class method you need to worry about is B<new>. And if you create
your B<Mail::IMAPClient::MessageSet> objects via L<Mail::IMAPClient>'s
B<Range> method then you don't even need to worry about B<new>.
=head2 new
Example:
my $msgset = Mail::IMAPClient::MessageSet->new(@msgs);
The B<new> method requires at least one argument. That argument can be
either a message, a comma-separated list of messages, a colon-separated
range of messages, or a combination of comma-separated messages and
colon-separated ranges. It can also be a reference to an array of messages,
comma-separated message lists, and colon separated ranges.
If more then one argument is supplied to B<new>, then those arguments should
be more message numbers, lists, and ranges (or references to arrays of them)
just as in the first argument.
The message numbers passed to B<new> can really be any kind of number at
all but to be useful in a L<Mail::IMAPClient> session they should be either
message UID's (if your I<Uid> parameter is true) or message sequence numbers.
The B<new> method will return a reference to a B<Mail::IMAPClient::MessageSet>
object. That object, when double quoted, will act just like a string whose
value is the message set expressed in the shortest possible way, with the
message numbers sorted in ascending order and with duplicates removed.
=head1 OBJECT METHODS
The only object method currently available to a B<Mail::IMAPClient::MessageSet>
object is the L<unfold> method.
=head2 unfold
Example:
my $msgset = $imap->Range( $imap->messages ) ;
my @all_messages = $msgset->unfold;
The B<unfold> method returns an array of messages that belong to the
message set. If called in a scalar context it returns a reference to the
array instead.
=head1 OVERRIDDEN OPERATIONS
B<Mail::IMAPClient::MessageSet> overrides a number of operators in order
to make manipulating your message sets easier. The overridden operations are:
=head2 stringify
Attempts to stringify a B<Mail::IMAPClient::MessageSet> object will result in
the compact message specification being returned, which is almost certainly
what you will want.
=head2 Auto-increment
Attempts to autoincrement a B<Mail::IMAPClient::MessageSet> object will
result in a message (or messages) being added to the object's message set.
Example:
$msgset += 34;
# Message #34 is now in the message set
=head2 Concatenate
Attempts to concatenate to a B<Mail::IMAPClient::MessageSet> object will
result in a message (or messages) being added to the object's message set.
Example:
$msgset .= "34,35,36,40:45";
# Messages 34,35,36,40,41,42,43,44,and 45 are now in the message set
The C<.=> operator and the C<+=> operator can be used interchangeably, but
as you can see by looking at the examples there are times when use of one
has an aesthetic advantage over use of the other.
=head2 Autodecrement
Attempts to autodecrement a B<Mail::IMAPClient::MessageSet> object will
result in a message being removed from the object's message set.
Examples:
$msgset -= 34;
# Message #34 is no longer in the message set
$msgset -= "1:10";
# Messages 1 through 10 are no longer in the message set
If you attempt to remove a message that was not in the original message set
then your resulting message set will be the same as the original, only more
expensive. However, if you attempt to remove several messages from the message
set and some of those messages were in the message set and some were not,
the additional overhead of checking for the messages that were not there
is negligible. In either case you get back the message set you want regardless
of whether it was already like that or not.
=head1 AUTHOR
David J. Kernen
The Kernen Consulting Group, Inc
=head1 COPYRIGHT
Copyright 1999, 2000, 2001, 2002 The Kernen Group, Inc.
All rights reserved.
This program is free software; you can redistribute it and/or modify it
under the terms of either:
=over 4
=item a) the "Artistic License" which comes with this Kit, or
=item b) the GNU General Public License as published by the Free Software
Foundation; either version 1, or (at your option) any later version.
=back
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See either the GNU
General Public License or the Artistic License for more details. All your
base are belong to us.
=cut
1;

View file

@ -1,18 +0,0 @@
# Atoms:
NUMBER: /\d+/
# Rules:
threadmember: NUMBER { $return = $item{NUMBER} ; } |
thread { $return = $item{thread} ; }
thread: "(" threadmember(s) ")"
{
$return = $item{'threadmember(s)'}||undef;
}
# Start:
start: /^\* THREAD /i thread(s?) {
$return=$item{'thread(s?)'}||undef;
}

File diff suppressed because it is too large Load diff

View file

@ -1,14 +0,0 @@
=head1 NAME
Mail::IMAPClient::Thread - used internally by Mail::IMAPClient->thread
=head1 DESCRIPTION
This module is used internally by L<Mail::IMAPClient> and is
generated using L<Parse::RecDescent>. It is not meant to be used directly by
other scripts nor is there much point in debugging it.
=head1 SYNOPSIS
This module is used internally by L<Mail::IMAPClient> and is not meant to
be used or called directly from applications. So don't do that.

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