mirror of
https://github.com/imapsync/imapsync.git
synced 2025-06-04 19:57:21 +02:00
2.140
This commit is contained in:
parent
4ce248c075
commit
f26b2573c3
370 changed files with 14441 additions and 136699 deletions
323
ChangeLog
323
ChangeLog
|
@ -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)
|
||||
----------------------------
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
||||
======================================================================
|
||||
======================================================================
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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 :-)
|
||||
|
||||
|
||||
=======================================================================
|
||||
=======================================================================
|
||||
=======================================================================
|
||||
|
|
|
@ -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?
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
=======================================================================
|
||||
=======================================================================
|
||||
|
|
|
@ -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."
|
||||
|
||||
|
||||
=======================================================================
|
||||
=======================================================================
|
||||
======================================================================
|
||||
======================================================================
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
23
FAQ.d/FAQ.GoDaddy.txt
Normal 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
|
||||
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
||||
=======================================================================
|
||||
=======================================================================
|
||||
=======================================================================
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
=======================================================================
|
||||
=======================================================================
|
||||
======================================================================
|
||||
======================================================================
|
||||
|
|
|
@ -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.
|
||||
|
||||
=====================================================================
|
||||
=====================================================================
|
||||
|
|
|
@ -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]/'
|
||||
|
||||
|
||||
=======================================================================
|
||||
=======================================================================
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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?
|
||||
|
|
|
@ -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
37
FAQ.d/FAQ.UCS.txt
Normal 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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
=======================================================================
|
||||
=======================================================================
|
|
@ -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
|
||||
|
||||
=======================================================================
|
||||
=======================================================================
|
||||
|
|
|
@ -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
107
INSTALL.d/Dockerfile
Normal file → Executable 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
|
||||
|
||||
|
|
|
@ -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/
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 hasn’t 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.
|
||||
|
||||
|
||||
=======================================================================
|
||||
=======================================================================
|
||||
|
|
|
@ -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.
|
||||
|
||||
=======================================================================
|
||||
=======================================================================
|
||||
|
|
|
@ -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!
|
||||
|
||||
|
|
|
@ -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
2
INSTALL.d/secret.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
IMAPSYNC_PASSWORD1=secret1
|
||||
IMAPSYNC_PASSWORD2=secret2
|
234
Makefile
234
Makefile
|
@ -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
237
README
|
@ -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
789
README.md
|
@ -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:
|
||||
|
||||
[](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.
|
||||
|
|
@ -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
13
S/conversion_data.js
Executable 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;
|
||||
|
|
@ -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>
|
||||
|
|
|
@ -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
BIN
S/fonts/LM-bold-italic.ttf
Normal file
Binary file not shown.
BIN
S/fonts/LM-bold-italic.woff
Normal file
BIN
S/fonts/LM-bold-italic.woff
Normal file
Binary file not shown.
BIN
S/fonts/LM-bold-italic.woff2
Normal file
BIN
S/fonts/LM-bold-italic.woff2
Normal file
Binary file not shown.
BIN
S/fonts/LM-bold.ttf
Normal file
BIN
S/fonts/LM-bold.ttf
Normal file
Binary file not shown.
BIN
S/fonts/LM-bold.woff
Normal file
BIN
S/fonts/LM-bold.woff
Normal file
Binary file not shown.
BIN
S/fonts/LM-bold.woff2
Normal file
BIN
S/fonts/LM-bold.woff2
Normal file
Binary file not shown.
BIN
S/fonts/LM-italic.ttf
Normal file
BIN
S/fonts/LM-italic.ttf
Normal file
Binary file not shown.
BIN
S/fonts/LM-italic.woff
Normal file
BIN
S/fonts/LM-italic.woff
Normal file
Binary file not shown.
BIN
S/fonts/LM-italic.woff2
Normal file
BIN
S/fonts/LM-italic.woff2
Normal file
Binary file not shown.
BIN
S/fonts/LM-regular.ttf
Normal file
BIN
S/fonts/LM-regular.ttf
Normal file
Binary file not shown.
BIN
S/fonts/LM-regular.woff
Normal file
BIN
S/fonts/LM-regular.woff
Normal file
Binary file not shown.
BIN
S/fonts/LM-regular.woff2
Normal file
BIN
S/fonts/LM-regular.woff2
Normal file
Binary file not shown.
53
S/images/logo_imapsync.svg
Executable file
53
S/images/logo_imapsync.svg
Executable 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 |
48
S/images/logo_imapsync_layers_ind.svg
Executable file
48
S/images/logo_imapsync_layers_ind.svg
Executable file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 32 KiB |
53
S/images/logo_imapsync_layers_merged.svg
Executable file
53
S/images/logo_imapsync_layers_merged.svg
Executable 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 |
60
S/images/logo_imapsync_layers_single.svg
Executable file
60
S/images/logo_imapsync_layers_single.svg
Executable 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 |
|
@ -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>
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
181
S/news.shtml
181
S/news.shtml
|
@ -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>
|
||||
|
|
|
@ -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&currency_code=USD&label=hVVWCKzApQIQvOe62QM&guid=ON&script=0"/>
|
||||
|
|
80
S/style.css
80
S/style.css
|
@ -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;
|
||||
*/
|
||||
}
|
||||
|
||||
|
|
|
@ -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
217
TODO
|
@ -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
|
||||
|
|
2
VERSION
2
VERSION
|
@ -1 +1 @@
|
|||
1.977
|
||||
2.140
|
||||
|
|
|
@ -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)
|
137
W/.compok
137
W/.compok
|
@ -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)
|
4935
W/.tests.errors.txt
4935
W/.tests.errors.txt
File diff suppressed because it is too large
Load diff
|
@ -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?
|
||||
|
||||
|
|
@ -1 +0,0 @@
|
|||
Failure running NOEXIST
|
|
@ -1 +0,0 @@
|
|||
Failure running .\imapsync.exe --tests
|
File diff suppressed because it is too large
Load diff
|
@ -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)
|
|
@ -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"
|
||||
}
|
|
@ -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'
|
|
@ -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
|
||||
}
|
|
@ -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.
|
|
@ -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
|
||||
#
|
|
@ -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
|
||||
#
|
|
@ -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
|
||||
|
|
@ -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
|
||||
#
|
|
@ -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
|
||||
#
|
|
@ -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
|
||||
#
|
||||
#
|
|
@ -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
|
||||
#
|
|
@ -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;
|
||||
}
|
|
@ -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
|
|
@ -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
|
||||
|
|
@ -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
|
||||
#
|
|
@ -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
|
||||
#
|
||||
#
|
|
@ -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
|
|
@ -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
|
@ -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
|
|
@ -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} }
|
File diff suppressed because it is too large
Load diff
|
@ -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.
|
|
@ -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;
|
|
@ -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
|
@ -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
Loading…
Add table
Add a link
Reference in a new issue