diff --git a/ChangeLog b/ChangeLog
index 5bb195d..ab36fb6 100644
--- a/ChangeLog
+++ b/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)
----------------------------
diff --git a/FAQ.d/FAQ.APPEND_errors.txt b/FAQ.d/FAQ.APPEND_errors.txt
index c8d473e..2f5a8b6 100644
--- a/FAQ.d/FAQ.APPEND_errors.txt
+++ b/FAQ.d/FAQ.APPEND_errors.txt
@@ -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"
+
+
+======================================================================
+======================================================================
diff --git a/FAQ.d/FAQ.Archiving.txt b/FAQ.d/FAQ.Archiving.txt
index 6ed064e..45c4bb5 100644
--- a/FAQ.d/FAQ.Archiving.txt
+++ b/FAQ.d/FAQ.Archiving.txt
@@ -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.
diff --git a/FAQ.d/FAQ.Bandwidth.txt b/FAQ.d/FAQ.Bandwidth.txt
index 73e0685..5e089c1 100644
--- a/FAQ.d/FAQ.Bandwidth.txt
+++ b/FAQ.d/FAQ.Bandwidth.txt
@@ -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 :-)
=======================================================================
-=======================================================================
\ No newline at end of file
+=======================================================================
diff --git a/FAQ.d/FAQ.Docker.txt b/FAQ.d/FAQ.Docker.txt
index b416894..a159286 100644
--- a/FAQ.d/FAQ.Docker.txt
+++ b/FAQ.d/FAQ.Docker.txt
@@ -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?
diff --git a/FAQ.d/FAQ.Duplicates.txt b/FAQ.d/FAQ.Duplicates.txt
index 91002a7..48092f5 100644
--- a/FAQ.d/FAQ.Duplicates.txt
+++ b/FAQ.d/FAQ.Duplicates.txt
@@ -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
-
=======================================================================
=======================================================================
diff --git a/FAQ.d/FAQ.Exchange.txt b/FAQ.d/FAQ.Exchange.txt
index 7778774..88bf0db 100644
--- a/FAQ.d/FAQ.Exchange.txt
+++ b/FAQ.d/FAQ.Exchange.txt
@@ -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."
-=======================================================================
-=======================================================================
+======================================================================
+======================================================================
diff --git a/FAQ.d/FAQ.Folders_Sizes.txt b/FAQ.d/FAQ.Folders_Sizes.txt
index 674e7a3..14081c9 100644
--- a/FAQ.d/FAQ.Folders_Sizes.txt
+++ b/FAQ.d/FAQ.Folders_Sizes.txt
@@ -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
diff --git a/FAQ.d/FAQ.Gmail.txt b/FAQ.d/FAQ.Gmail.txt
index e52f7ea..3464304 100644
--- a/FAQ.d/FAQ.Gmail.txt
+++ b/FAQ.d/FAQ.Gmail.txt
@@ -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 \
diff --git a/FAQ.d/FAQ.GoDaddy.txt b/FAQ.d/FAQ.GoDaddy.txt
new file mode 100644
index 0000000..38ad8cf
--- /dev/null
+++ b/FAQ.d/FAQ.GoDaddy.txt
@@ -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
+
diff --git a/FAQ.d/FAQ.Messages_Selection.txt b/FAQ.d/FAQ.Messages_Selection.txt
index 705bddc..480cca2 100644
--- a/FAQ.d/FAQ.Messages_Selection.txt
+++ b/FAQ.d/FAQ.Messages_Selection.txt
@@ -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
diff --git a/FAQ.d/FAQ.Messages_Too_Big.txt b/FAQ.d/FAQ.Messages_Too_Big.txt
index 5b756ec..aba8cfd 100644
--- a/FAQ.d/FAQ.Messages_Too_Big.txt
+++ b/FAQ.d/FAQ.Messages_Too_Big.txt
@@ -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.
=======================================================================
-=======================================================================
\ No newline at end of file
+=======================================================================
+
diff --git a/FAQ.d/FAQ.Office365.txt b/FAQ.d/FAQ.Office365.txt
index 38d14cd..4e159c4 100644
--- a/FAQ.d/FAQ.Office365.txt
+++ b/FAQ.d/FAQ.Office365.txt
@@ -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
-=======================================================================
-=======================================================================
+======================================================================
+======================================================================
diff --git a/FAQ.d/FAQ.OnlineUI.txt b/FAQ.d/FAQ.OnlineUI.txt
index 8741ea2..7d6b74f 100644
--- a/FAQ.d/FAQ.OnlineUI.txt
+++ b/FAQ.d/FAQ.OnlineUI.txt
@@ -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.
=====================================================================
=====================================================================
diff --git a/FAQ.d/FAQ.Oracle-UCS.txt b/FAQ.d/FAQ.Oracle-UCS.txt
deleted file mode 100644
index af621d9..0000000
--- a/FAQ.d/FAQ.Oracle-UCS.txt
+++ /dev/null
@@ -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]/'
-
-
-=======================================================================
-=======================================================================
diff --git a/FAQ.d/FAQ.Release_Checklist.txt b/FAQ.d/FAQ.Release_Checklist.txt
index bb382d2..92b705e 100644
--- a/FAQ.d/FAQ.Release_Checklist.txt
+++ b/FAQ.d/FAQ.Release_Checklist.txt
@@ -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
diff --git a/FAQ.d/FAQ.SSL_errors.txt b/FAQ.d/FAQ.SSL_errors.txt
index 58aaaeb..508a587 100644
--- a/FAQ.d/FAQ.SSL_errors.txt
+++ b/FAQ.d/FAQ.SSL_errors.txt
@@ -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)
diff --git a/FAQ.d/FAQ.Security.txt b/FAQ.d/FAQ.Security.txt
index 2d4e796..afbc72c 100644
--- a/FAQ.d/FAQ.Security.txt
+++ b/FAQ.d/FAQ.Security.txt
@@ -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?
diff --git a/FAQ.d/FAQ.Two_Ways_Sync.txt b/FAQ.d/FAQ.Two_Ways_Sync.txt
index e70096b..32c1eee 100644
--- a/FAQ.d/FAQ.Two_Ways_Sync.txt
+++ b/FAQ.d/FAQ.Two_Ways_Sync.txt
@@ -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.
=======================================================================
=======================================================================
diff --git a/FAQ.d/FAQ.UCS.txt b/FAQ.d/FAQ.UCS.txt
new file mode 100644
index 0000000..7d6a765
--- /dev/null
+++ b/FAQ.d/FAQ.UCS.txt
@@ -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
+
+
+
+
+
+
+=======================================================================
+=======================================================================
diff --git a/FAQ.d/FAQ.Yahoo.txt b/FAQ.d/FAQ.Yahoo.txt
index 41b1110..198a401 100644
--- a/FAQ.d/FAQ.Yahoo.txt
+++ b/FAQ.d/FAQ.Yahoo.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{(?Back to Imapsync main page." ..
AddDescription "Where this Description column comes from ." htaccess.txt
+AddDescription "Private ." memo
AddDescription "APPEND errors ." FAQ.Admin_Authentication.txt
AddDescription "Authenticate via an admin account ." FAQ.APPEND_errors.txt
AddDescription "Archiving tips." FAQ.Archiving.txt
AddDescription "Authentication failures ." FAQ.Authentication_failure.txt
+
+AddDescription "Bandwidth questions tips." FAQ.Bandwidth.txt
AddDescription "Big mailboxes tips." FAQ.Big_Mailbox.txt
+
AddDescription "Changing folders names ." FAQ.Folders_Mapping.txt
AddDescription "Connection issues ." FAQ.Connection.txt
AddDescription "Contacts & Calendars & Chat issues ." FAQ.Contacts_Calendars.txt
+AddDescription "Cyrus accounts." FAQ.Cyrus.txt
+
+
AddDescription "Dates issues ." FAQ.Dates.txt
AddDescription "David Tobit accounts." FAQ.David_Tobit.txt
+AddDescription "DBmail accounts." FAQ.DBmail.txt
AddDescription "Docker usage." FAQ.Docker.txt
AddDescription "Domino accounts." FAQ.Domino.txt
AddDescription "Dovecot accounts." FAQ.Dovecot.txt
@@ -25,15 +33,21 @@ AddDescription "Selecting folders ." FAQ.Fold
AddDescription "Folders sizes with Imapsync ." FAQ.Folders_Sizes.txt
+
+
+AddDescription "FirstClass accounts." FAQ.FirstClass.txt
AddDescription "Flags tips and issues ." FAQ.Flags.txt
AddDescription "General Data Protection Regulation (GDPR)." FAQ.GDPR.txt
AddDescription "General and pot-pourri issues" FAQ.General.txt
AddDescription "Gmail accounts." FAQ.Gmail.txt
+AddDescription "IceWarp accounts." FAQ.IceWarp.txt
AddDescription "ISP tips ." FAQ.ISP.txt
AddDescription "Kerio accounts." FAQ.Kerio.txt
+AddDescription "MailEnable accounts." FAQ.MailEnable.txt
AddDescription "Massive/bulk migrations ." FAQ.Massive.txt
AddDescription "Memory issues ." FAQ.Memory.txt
AddDescription "Migration Plan ." FAQ.Migration_Plan.txt
+AddDescription "Office365 accounts." FAQ.Office365.txt
AddDescription "The Online UI service Q&R ." FAQ.OnlineUI.txt
AddDescription "Password & special characters on Windows ." FAQ.Passwords_on_Windows.txt
AddDescription "Password & special characters on Unix ." FAQ.Passwords_on_Unix.txt
@@ -43,7 +57,7 @@ AddDescription "Principles & design decisions ." FAQ.Prin
AddDescription "Selecting messages ." FAQ.Messages_Selection.txt
AddDescription "How to transfer too big messages ." FAQ.Messages_Too_Big.txt
AddDescription "Why the imapsync web site looks so old? " FAQ.Old_Style_Web_Design.txt
-AddDescription "Oracle-UCS accounts." FAQ.Oracle-UCS.txt
+AddDescription "UCS accounts." FAQ.UCS.txt
AddDescription "Checklist before release a new release ." FAQ.Release_Checklist.txt
AddDescription "Guidelines to report bugs ." FAQ.Reporting_Bugs.txt
diff --git a/INSTALL.d/Dockerfile b/INSTALL.d/Dockerfile
old mode 100644
new mode 100755
index c44f2bc..b3e93a4
--- a/INSTALL.d/Dockerfile
+++ b/INSTALL.d/Dockerfile
@@ -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 " \
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
+
diff --git a/INSTALL.d/INSTALL.ANY.txt b/INSTALL.d/INSTALL.ANY.txt
index f12cf02..e063253 100644
--- a/INSTALL.d/INSTALL.ANY.txt
+++ b/INSTALL.d/INSTALL.ANY.txt
@@ -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/
diff --git a/INSTALL.d/INSTALL.AWS_EC2.txt b/INSTALL.d/INSTALL.AWS_EC2.txt
index d0c47fe..8bcf62c 100644
--- a/INSTALL.d/INSTALL.AWS_EC2.txt
+++ b/INSTALL.d/INSTALL.AWS_EC2.txt
@@ -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
diff --git a/INSTALL.d/INSTALL.Centos.txt b/INSTALL.d/INSTALL.Centos.txt
index 165ee2a..087ede7 100644
--- a/INSTALL.d/INSTALL.Centos.txt
+++ b/INSTALL.d/INSTALL.Centos.txt
@@ -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,
diff --git a/INSTALL.d/INSTALL.Darwin.txt b/INSTALL.d/INSTALL.Darwin.txt
index 3c3119d..8536ffe 100644
--- a/INSTALL.d/INSTALL.Darwin.txt
+++ b/INSTALL.d/INSTALL.Darwin.txt
@@ -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.
-
-
=======================================================================
=======================================================================
diff --git a/INSTALL.d/INSTALL.Debian.txt b/INSTALL.d/INSTALL.Debian.txt
index cf81e41..3884bc7 100644
--- a/INSTALL.d/INSTALL.Debian.txt
+++ b/INSTALL.d/INSTALL.Debian.txt
@@ -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.
=======================================================================
=======================================================================
diff --git a/INSTALL.d/INSTALL.OnlineUI.txt b/INSTALL.d/INSTALL.OnlineUI.txt
index 921e640..1e84da5 100644
--- a/INSTALL.d/INSTALL.OnlineUI.txt
+++ b/INSTALL.d/INSTALL.OnlineUI.txt
@@ -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/
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
+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!
diff --git a/INSTALL.d/memo_docker b/INSTALL.d/memo_docker
index 81ee8d6..9d442e2 100644
--- a/INSTALL.d/memo_docker
+++ b/INSTALL.d/memo_docker
@@ -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
}
diff --git a/INSTALL.d/secret.txt b/INSTALL.d/secret.txt
new file mode 100644
index 0000000..35f8f71
--- /dev/null
+++ b/INSTALL.d/secret.txt
@@ -0,0 +1,2 @@
+IMAPSYNC_PASSWORD1=secret1
+IMAPSYNC_PASSWORD2=secret2
diff --git a/Makefile b/Makefile
index 94dcaeb..6046a6b 100644
--- a/Makefile
+++ b/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'
diff --git a/README b/README
index 510ca35..4fc332f 100644
--- a/README
+++ b/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.
diff --git a/README.md b/README.md
deleted file mode 100644
index 8a6fe04..0000000
--- a/README.md
+++ /dev/null
@@ -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
-
- 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.
-
diff --git a/README_Windows.txt b/README_Windows.txt
index 6d89489..99ba050 100644
--- a/README_Windows.txt
+++ b/README_Windows.txt
@@ -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.
diff --git a/S/conversion_data.js b/S/conversion_data.js
new file mode 100755
index 0000000..79956ef
--- /dev/null
+++ b/S/conversion_data.js
@@ -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;
+
diff --git a/S/donate.shtml b/S/donate.shtml
index 45416a6..0379a05 100644
--- a/S/donate.shtml
+++ b/S/donate.shtml
@@ -31,7 +31,14 @@
Imapsync donation
-Help the author to maintain imapsync and its online services:
+
+Help the imapsync author, Gilles LAMIRAL, to maintain imapsync and its online services!
+
+
+
+
+
+
Donate via Paypal
@@ -46,6 +53,12 @@ value="-----BEGIN PKCS7-----MIIHRwYJKoZIhvcNAQcEoIIHODCCBzQCAQExggEwMIIBLAIBADCB
+Donate via Github
+
+
+Become a Github sponsor to Gilles LAMIRAL
+
+
Donate with Crypto
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
-
Thanks in advance!
+Thanks!
+And remember, no money donation is ok!
+Kind words are always sweets to me
@@ -83,7 +98,7 @@ to give fake ones, like "Smith" and smith@example.com if you prefer to be anonym
This document last modified on
-($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 $)
diff --git a/S/external.shtml b/S/external.shtml
index f1113fb..38ff879 100644
--- a/S/external.shtml
+++ b/S/external.shtml
@@ -26,18 +26,23 @@
-Similar software tools (back to menu)
+Imapsync similar software tools (back to menu)
+ Here is a list of Imapsync alternative tools, 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
imaputils: https://github.com/mtsatsenko/imaputils (very old imap_tools fork)
- Doveadm-Sync: https://wiki2.dovecot.org/Tools/Doveadm/Sync ( Dovecot sync tool )
+ 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/
@@ -68,25 +73,65 @@
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.
+
External online IMAP migration services (back to menu)
-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).
+These services are similar to the
+imapsync online service
+I call /X. Some are an exact copy of /X, some are not, some use Imapsync, some don't.
+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).
+
+
+Imapsync based
+
+
+
+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.
+
- Web Hosting Canada 0 USD : https://imapsync.whc.ca/ (imapsync based)
- BoomHost 0 USD : https://imapsync.boomhost.com/ (imapsync based)
- https://tools.controlpanel.si/imapsync/ (imapsync based)
- https://www.cadeolink.com.br/ (imapsync based)
+ Slovenia Control Panel 0 USD : https://tools.controlpanel.si/imapsync/ (imapsync 1.810)
+ Intertune Cloud 0 USD : https://tools.intertune.io/imapsync/X/ (imapsync 1.882)
+ Web Hosting Canada 0 USD : https://imapsync.whc.ca/ (imapsync 1.882)
+ BoomHost 0 USD : https://imapsync.boomhost.com/ (imapsync 1.925)
+ WebHosting|4u (greek) 0 USD : https://imapcopy.webhosting4u.gr/ (imapsync 1.977)
+ Vimexx 0 USD : https://imapsync.nl/ (imapsync 1.991)
+ Timetakernet 0 USD : https://mailsync.timetakernet.info/ (imapsync 1.998)
+ KeurigOnline 0 USD : https://imapsync.keurigonline.nl/ (imapsync 1.998)
+ UK Migration Wizard 0 USD : https://app.migrationwizard.co.uk/ (imapsync ?.???)
+
+
+Not Imapsync based
+
Ovh migration 0 EUR : https://omm.ovh.net/Migration/Create
Rackspace migration 0 USD : http://www.rackspace.com/email-hosting/migrations
Movemymail one free, 5 USD after: https://movemymail.net/
@@ -96,9 +141,20 @@ Prices are given par mailbox and may be outdated
Yippiemove 14.95 USD (discontinued on April 2019): http://www.yippiemove.com/
( See Yippiemove vs ImapSync )
ShuttleCloud one free, 19.95 USD after https://www.shuttlecloud.com/
-
+Imap to files services
+
+
+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 Maildir format.
+
+
+
+PowerMail Backup (French language)
+ https://www.powermail.fr/sauvegarder-une-boite-mail/ .
+
+
@@ -126,7 +182,7 @@ alt="Viewable With Any Browser" />
This document last modified on
-($Id: external.shtml,v 1.45 2019/12/23 12:38:41 gilles Exp gilles $)
+($Id: external.shtml,v 1.58 2021/06/30 20:34:23 gilles Exp gilles $)
Top of the page
diff --git a/S/fonts/LM-bold-italic.ttf b/S/fonts/LM-bold-italic.ttf
new file mode 100644
index 0000000..7b684ee
Binary files /dev/null and b/S/fonts/LM-bold-italic.ttf differ
diff --git a/S/fonts/LM-bold-italic.woff b/S/fonts/LM-bold-italic.woff
new file mode 100644
index 0000000..d54af37
Binary files /dev/null and b/S/fonts/LM-bold-italic.woff differ
diff --git a/S/fonts/LM-bold-italic.woff2 b/S/fonts/LM-bold-italic.woff2
new file mode 100644
index 0000000..078ce29
Binary files /dev/null and b/S/fonts/LM-bold-italic.woff2 differ
diff --git a/S/fonts/LM-bold.ttf b/S/fonts/LM-bold.ttf
new file mode 100644
index 0000000..17624d4
Binary files /dev/null and b/S/fonts/LM-bold.ttf differ
diff --git a/S/fonts/LM-bold.woff b/S/fonts/LM-bold.woff
new file mode 100644
index 0000000..318a3ad
Binary files /dev/null and b/S/fonts/LM-bold.woff differ
diff --git a/S/fonts/LM-bold.woff2 b/S/fonts/LM-bold.woff2
new file mode 100644
index 0000000..c14c620
Binary files /dev/null and b/S/fonts/LM-bold.woff2 differ
diff --git a/S/fonts/LM-italic.ttf b/S/fonts/LM-italic.ttf
new file mode 100644
index 0000000..b9a57b8
Binary files /dev/null and b/S/fonts/LM-italic.ttf differ
diff --git a/S/fonts/LM-italic.woff b/S/fonts/LM-italic.woff
new file mode 100644
index 0000000..fafb147
Binary files /dev/null and b/S/fonts/LM-italic.woff differ
diff --git a/S/fonts/LM-italic.woff2 b/S/fonts/LM-italic.woff2
new file mode 100644
index 0000000..166d6e6
Binary files /dev/null and b/S/fonts/LM-italic.woff2 differ
diff --git a/S/fonts/LM-regular.ttf b/S/fonts/LM-regular.ttf
new file mode 100644
index 0000000..6b4f6b8
Binary files /dev/null and b/S/fonts/LM-regular.ttf differ
diff --git a/S/fonts/LM-regular.woff b/S/fonts/LM-regular.woff
new file mode 100644
index 0000000..eb9fec0
Binary files /dev/null and b/S/fonts/LM-regular.woff differ
diff --git a/S/fonts/LM-regular.woff2 b/S/fonts/LM-regular.woff2
new file mode 100644
index 0000000..869279a
Binary files /dev/null and b/S/fonts/LM-regular.woff2 differ
diff --git a/S/images/logo_imapsync.svg b/S/images/logo_imapsync.svg
new file mode 100755
index 0000000..bebc7d4
--- /dev/null
+++ b/S/images/logo_imapsync.svg
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/S/images/logo_imapsync_layers_ind.svg b/S/images/logo_imapsync_layers_ind.svg
new file mode 100755
index 0000000..cda7bca
--- /dev/null
+++ b/S/images/logo_imapsync_layers_ind.svg
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/S/images/logo_imapsync_layers_merged.svg b/S/images/logo_imapsync_layers_merged.svg
new file mode 100755
index 0000000..bebc7d4
--- /dev/null
+++ b/S/images/logo_imapsync_layers_merged.svg
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/S/images/logo_imapsync_layers_single.svg b/S/images/logo_imapsync_layers_single.svg
new file mode 100755
index 0000000..dfd3ad8
--- /dev/null
+++ b/S/images/logo_imapsync_layers_single.svg
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/S/imapservers.shtml b/S/imapservers.shtml
index c51aca4..2040ad4 100644
--- a/S/imapservers.shtml
+++ b/S/imapservers.shtml
@@ -4,7 +4,7 @@
-
Imapsync list of the 81 imap server software applications supported
+
Imapsync list of the 86 imap server software applications supported
@@ -27,7 +27,8 @@
-
Imapsync list of the 81 imap server software applications supported (and the broken ones) (back to menu)
+Imapsync list of the 86 imap server software applications supported (and the broken ones)
+(back to menu)
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 Dovecot then you'
Let's start with the long reported success stories list:
-79 different imap server software tools supported!
+83 different imap server software tools supported!
[host1] means "source server" and [host2] means "destination server":
@@ -80,7 +81,7 @@ imapsync --host1 imap.gmail.com
BigFoot 1.0 (Derek Snider)
BincImap 1.2.3 (GPL) (http://www.bincimap.org/ )
-
BlueMind https://www.bluemind.net/
+
BlueMind https://www.bluemind.net/
ClearOS https://www.clearos.com/ uses Cyrus as IMAP backend server.
CommuniGatePro server (Redhat 8.0) (Solaris), CommuniGate Pro 5.2.17[host2] (CentOS 5.4)
(http://www.communigate.com/ )
@@ -108,6 +109,8 @@ imapsync --host1 imap.gmail.com
Earthlink webhosting (https://www.earthlink.net/ ) uses BigFoot imap server.
+
Emailchemy from weirdkid.com https://weirdkid.com/emailchemy/ . Use option --noabletosearch
+
Eudora WorldMail v2 (http://www.eudora.com/worldmail/ )
Exchange Server 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],
(http://www.microsoft.com/exchange/ )
-
FirtClass 12 [host1] hard so read the FAQ! (http://www.firstclass.com/ )
+
FirstClass 12 [host1]. FirstClass is hard to migrate so read the FirtClass FAQ ! (http://www.firstclass.com/ )
FortiMail 100C in server mode [host1] (https://www.fortinet.com/.../fortimail.html )
FTGate [host1][host2] (http://www.ftgate.com/ )
Fusemail imap.fusemail.net:143 (https://www.fusemail.com/ ).
Gimap (Gmail imap) [host1] [host2] (http://mail.google.com/ )
GMX IMAP4 StreamProxy. (http://www.gmx.com/ )
-
Godaddy IMAP (since Godaddy runs Courier) (https://www.godaddy.com/ )
+
Godaddy IMAP (since Godaddy runs Courier) (https://www.godaddy.com/ )
+
Gromox/Grammm IMAP server (https://docs.grammm.com/ )
Groupwise IMAP (Novell) 6.x and 7.0. Buggy so see the FAQ item about Groupwise
(http://www.novell.com/products/groupwise/ )
hMailServer 5.40-B1950 [host12], 5.3.3 [host2], 4.4.1 [host1], 5.3.2-B1769 [host2], 5.6 [host2]
(https://www.hmailserver.com/ )
+
Hostgator, Hostgator imap server software is Dovecot. https://www.hostgator.com/
Hotmail hotmail.com is outlook.com and live.com now.
IceWarp 10.4.5 [host1] 11.2.1.1 [host2] 11.4.1.0 [host2] (https://www.icewarp.com/ )
IdeaImapServer v0.80.1 [host1]
@@ -162,6 +167,8 @@ imapsync --host1 imap.gmail.com
Perdition (https://projects.horms.net/projects/perdition/
+
PowerMail (French Email provider) (https://www.powermail.fr/
+
ProtoMail [host1] (https://protonmail.com/
Qualcomm Worldmail (NT) (http://www.eudora.com/worldmail/ )
@@ -182,6 +189,7 @@ imapsync --host1 imap.gmail.com
(RedHat uses UW like 2003.338rh), v12.264 Solaris 5.7 (OSI Approved)
(
http://www.washington.edu/imap/ )
VMS, Imap part of TCP/IP suite of VMS 7.3.2 (https://www.vmssoftware.com/ )
+
Amazon WorkMail (https://aws.amazon.com/fr/workmail/ )
Xeams/Synametrics (http://www.xeams.com/ )
Yahoo [host1] (http://www.yahoo.com/ )
Zarafa 6,40,0,20653 [host1] (http://www.zarafa.com/ )
@@ -238,7 +246,7 @@ alt="Viewable With Any Browser" />
This document last modified on
-($Id: imapservers.shtml,v 1.44 2019/12/02 23:51:12 gilles Exp gilles $)
+($Id: imapservers.shtml,v 1.56 2021/06/08 09:56:54 gilles Exp gilles $)
Top of the page
diff --git a/S/imapsync_sold_by_country.txt b/S/imapsync_sold_by_country.txt
index 5a12c03..595b10d 100644
--- a/S/imapsync_sold_by_country.txt
+++ b/S/imapsync_sold_by_country.txt
@@ -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
diff --git a/S/news.shtml b/S/news.shtml
index 2d49966..5d44610 100644
--- a/S/news.shtml
+++ b/S/news.shtml
@@ -4,11 +4,9 @@
Imapsync News
-
-
-
+
@@ -30,72 +28,151 @@
next and previous releases
(back to menu)
-
imapsync was written on
-
-
See ChangeLog to read what has been done in details since 2001.
-
-
New features or bugfixes since previous releases:
+
Roadmap
-
-1.964
-Dependencies removed :
-Dependencies added : Perl modules
+
+If you are very interrested in those projects, don't hesitate to solicit me!
+
-Enhancement :
-Enhancement :
-Enhancement :
-Enhancement :
-Enhancement :
-
-
-Usability :
-Usability :
-Usability :
-Usability :
-Usability :
-Usability :
-Usability :
-
-Bug fix :
-Bug fix :
-Bug fix :
-Bug fix :
-Bug fix :
-Bug fix :
-
-Refactoring :
-Refactoring :
-Refactoring :
-Refactoring :
-
-Security :
-Security :
-
-Portability :
-Portability :
-
-
-
- -->
-
-
Roadmap : Build a docker image including everything, to have a complete online /X in a single command.
-Roadmap : Or better: Include a webserver in imapsync to have an online /X integrated.
+Roadmap : Or better: Include a webserver in imapsync to have an online /X integrated. (NB: proof of concept already coded and working)
Roadmap : Add the sync of multiple accounts inside imapsync itself instead of via an external shell script doing the loop from a csv file.
+Roadmap : Build an online tool, like /X, for multiple accounts at once. (NB: proof of concept already coded and working)
+
+
New features or bugfixes since previous releases:
+
+
imapsync was written on
+
+
+
See ChangeLog to read what has been done in details since 2001.
+
+
+
+
+
+
+
1.977
Dependencies removed : None.
Dependencies added : Perl modules Encode::IMAPUTF7
+Windows : imapsync.exe is now 64 bits (it was a 32bit binary before).
+ If you use an old 32bit PC, use imapsync_32bit.exe instead.
+
+
Enhancement : Folders sizes are now presented per folder for host1 and host2,
as well as the differrences between them.
Comparing folders is now easier
@@ -877,7 +954,7 @@ by ignoring PERMANENTFLAGS (Exchange tests)
This document last modified on
-($Id: news.shtml,v 1.74 2020/01/01 21:07:13 gilles Exp gilles $)
+($Id: news.shtml,v 1.78 2021/07/05 20:22:15 gilles Exp gilles $)
Top of the page
diff --git a/S/paypal_return.shtml b/S/paypal_return.shtml
index 2eaecaf..2292a1c 100644
--- a/S/paypal_return.shtml
+++ b/S/paypal_return.shtml
@@ -3,9 +3,8 @@
-imapsync download
+Imapsync download
-
@@ -14,63 +13,59 @@
-
-
+
+
+
+
+
+
+
-imapsync download
+Imapsync download
-I thank you for buying Imapsync!
+I thank you very much for buying Imapsync!
-The payment has been made and the transaction has been completed.
-A receipt for your purchase has been emailed to you.
+
The payment is done and the transaction is completed.
+A receipt for your purchase was emailed to you.
You may log into your account at www.paypal.com
to view details of this transaction (if you have a Paypal account).
-You will find imapsync release at this
-download page .
+
Now you have access to the full unlimited imapsync
+online service /X .
+This online imapsync service doesn't require any installation on your side, just use it as it is.
+
+Also, in case you want to run imapsync by yourself , you will find imapsync
+release on this download page .
-Next step is imapsync installation
-and then your first runs following the tutorial .
+The next step for you is reading and following the imapsync installation
+process and then doing your first syncs following the tutorial .
-You will receive an invoice soon, in a couple of weeks at the worst.
+
You will receive an invoice soon , in a couple of weeks at the worst.
Ask for it if you need it before.
-Next imapsync releases will be available to you for lifetime without extra payment.
+
Next imapsync releases will be available to you for a lifetime without extra payment .
This current page will be updated to reflect the latest release of imapsync.
You will be soon subscribed to the newsletter announcing new imapsync releases and services (and only that).
-For professional support , in order to explain your specific needs ,
-find best solutions for them, avoid loosing time ,
+
For professional support , to explain your specific needs ,
+find the best solutions for them, avoid losing time ,
and succeed your migration in the best conditions, contact me
-(Gilles LAMIRAL) by email or phone at:
+(Gilles LAMIRAL) by preferably email or phone at:
Email address: gilles@lamiral.info .
Professional phone number: +33 9 51 84 42 42 (in France) I can call you back toll-free in many countries.
@@ -82,7 +77,7 @@ and succeed your migration in the best conditions, contact me
I thank you again for buying and using imapsync,
I wish you successful imap transfers!
-Back to imapsync homepage .
+
Back to the imapsync homepage .
Gilles LAMIRAL
@@ -102,14 +97,12 @@ src="S/images/valid-xhtml10"
@@ -119,23 +112,15 @@ style="border:0;width:88px;height:31px"
This document last modified on
-($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 $)
-
-
+
+
diff --git a/S/style.css b/S/style.css
index 82b923f..7f11dc6 100644
--- a/S/style.css
+++ b/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;
+ */
+}
+
diff --git a/S/terms_and_conditions.shtml b/S/terms_and_conditions.shtml
index 9f68f52..9d0ae5d 100644
--- a/S/terms_and_conditions.shtml
+++ b/S/terms_and_conditions.shtml
@@ -39,7 +39,7 @@ http://www.w3schools.com/html/html5_browsers.asp
-
Please read these terms and conditions carefully before using Our Service.
+
Please read these terms and conditions carefully before using My Service.
Interpretation and Definitions
@@ -133,8 +133,6 @@ Please read Our
Privacy Policy
carefully before using Our Service.
-
-
Links to Other Websites
@@ -400,7 +398,7 @@ alt="Viewable With Any Browser" >
This document was last modified on
-($Id: terms_and_conditions.shtml,v 1.2 2019/12/23 15:57:00 gilles Exp gilles $)
+($Id: terms_and_conditions.shtml,v 1.3 2020/02/14 21:41:12 gilles Exp gilles $)
Top of the page
diff --git a/TODO b/TODO
index 0ffe9da..4fafaba 100644
--- a/TODO
+++ b/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
diff --git a/VERSION b/VERSION
index 93df0bc..4904a8a 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.977
+2.140
diff --git a/W/.BUILD_EXE_TIME b/W/.BUILD_EXE_TIME
deleted file mode 100644
index 8192618..0000000
--- a/W/.BUILD_EXE_TIME
+++ /dev/null
@@ -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)
diff --git a/W/.checklinkext b/W/.checklinkext
deleted file mode 100644
index e69de29..0000000
diff --git a/W/.compok b/W/.compok
deleted file mode 100644
index a599f60..0000000
--- a/W/.compok
+++ /dev/null
@@ -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)
diff --git a/W/.tests.errors.txt b/W/.tests.errors.txt
deleted file mode 100644
index 7b92c76..0000000
--- a/W/.tests.errors.txt
+++ /dev/null
@@ -1,4935 +0,0 @@
-2016_08_16_22_49_23 : FAILED 1/4 TESTS: ll_authmech_xoauth2_json_gmail
-2016_08_16_22_52_37 : FAILED 1/2 TESTS: ll_authmech_XOAUTH2_json_gmail
-2016_08_16_22_55_09 : FAILED 1/2 TESTS: ll_authmech_XOAUTH2_gmail
-2016_08_16_22_56_48 : FAILED 1/2 TESTS: ll_pipemess
-2016_08_16_23_59_51 : ALL 1 TESTS SUCCESSFUL
-2016_08_16_23_59_56 : ALL 2 TESTS SUCCESSFUL
-2016_08_17_00_00_27 : ALL 1 TESTS SUCCESSFUL
-2016_08_17_00_24_36 : ALL 114 TESTS SUCCESSFUL
-2016_08_17_00_48_26 : ALL 1 TESTS SUCCESSFUL
-2016_08_17_01_20_59 : ALL 114 TESTS SUCCESSFUL
-2016_08_19_10_22_53 : ALL 1 TESTS SUCCESSFUL
-2016_08_19_10_22_59 : ALL 2 TESTS SUCCESSFUL
-2016_08_19_11_45_57 : ALL 1 TESTS SUCCESSFUL
-2016_08_19_11_46_02 : ALL 2 TESTS SUCCESSFUL
-2016_08_19_11_48_53 : ALL 1 TESTS SUCCESSFUL
-2016_08_19_11_48_58 : ALL 2 TESTS SUCCESSFUL
-2016_08_19_11_49_28 : ALL 1 TESTS SUCCESSFUL
-2016_08_19_11_49_32 : ALL 2 TESTS SUCCESSFUL
-2016_08_19_11_50_21 : ALL 1 TESTS SUCCESSFUL
-2016_08_19_11_50_25 : ALL 2 TESTS SUCCESSFUL
-2016_08_19_11_52_06 : ALL 1 TESTS SUCCESSFUL
-2016_08_19_11_52_11 : ALL 2 TESTS SUCCESSFUL
-2016_08_19_11_53_49 : ALL 1 TESTS SUCCESSFUL
-2016_08_19_11_53_53 : ALL 2 TESTS SUCCESSFUL
-2016_08_19_11_55_13 : ALL 1 TESTS SUCCESSFUL
-2016_08_19_11_55_18 : ALL 2 TESTS SUCCESSFUL
-2016_08_19_11_57_16 : ALL 1 TESTS SUCCESSFUL
-2016_08_19_11_57_21 : ALL 2 TESTS SUCCESSFUL
-2016_08_19_11_58_33 : ALL 1 TESTS SUCCESSFUL
-2016_08_19_11_58_58 : ALL 2 TESTS SUCCESSFUL
-2016_08_19_12_29_48 : ALL 1 TESTS SUCCESSFUL
-2016_08_19_16_33_39 : ALL 1 TESTS SUCCESSFUL
-2016_08_19_16_33_46 : FAILED 1/2 TESTS: ll_ssl_justconnect_SSL_VERIFY_PEER
-2016_08_19_16_34_36 : ALL 1 TESTS SUCCESSFUL
-2016_08_19_16_34_41 : FAILED 1/2 TESTS: ll_ssl_justconnect_SSL_VERIFY_PEER
-2016_08_19_16_38_37 : ALL 1 TESTS SUCCESSFUL
-2016_08_19_16_38_42 : FAILED 1/2 TESTS: ll_ssl_justconnect_SSL_VERIFY_PEER
-2016_08_19_16_41_01 : ALL 1 TESTS SUCCESSFUL
-2016_08_19_16_41_05 : FAILED 1/2 TESTS: ll_ssl_justconnect_SSL_VERIFY_PEER
-2016_08_19_16_41_27 : ALL 1 TESTS SUCCESSFUL
-2016_08_19_16_41_32 : ALL 2 TESTS SUCCESSFUL
-2016_08_19_16_42_51 : ALL 1 TESTS SUCCESSFUL
-2016_08_19_16_42_56 : ALL 2 TESTS SUCCESSFUL
-2016_08_19_16_43_21 : ALL 1 TESTS SUCCESSFUL
-2016_08_19_16_43_26 : ALL 2 TESTS SUCCESSFUL
-2016_08_19_16_44_25 : ALL 1 TESTS SUCCESSFUL
-2016_08_19_16_44_29 : FAILED 1/2 TESTS: ll_ssl_justconnect_SSL_VERIFY_PEER
-2016_08_19_16_50_18 : ALL 1 TESTS SUCCESSFUL
-2016_08_19_16_50_26 : FAILED 1/2 TESTS: l_office365_justlogin_2
-2016_08_19_16_51_12 : ALL 1 TESTS SUCCESSFUL
-2016_08_19_16_52_50 : ALL 1 TESTS SUCCESSFUL
-2016_08_19_16_52_56 : ALL 2 TESTS SUCCESSFUL
-2016_08_19_16_53_30 : ALL 1 TESTS SUCCESSFUL
-2016_08_19_16_54_47 : ALL 1 TESTS SUCCESSFUL
-2016_08_19_16_54_54 : FAILED 1/2 TESTS: l_office365_justconnect_tls_SSL_verify_mode
-2016_08_19_16_55_13 : ALL 1 TESTS SUCCESSFUL
-2016_08_19_16_55_19 : FAILED 1/2 TESTS: l_office365_justconnect_tls_SSL_verify_mode
-2016_08_19_16_55_37 : ALL 1 TESTS SUCCESSFUL
-2016_08_19_16_55_43 : ALL 2 TESTS SUCCESSFUL
-2016_08_19_19_54_03 : ALL 1 TESTS SUCCESSFUL
-2016_08_19_20_18_58 : ALL 115 TESTS SUCCESSFUL
-2016_09_01_03_17_27 : ALL 1 TESTS SUCCESSFUL
-2016_09_01_03_17_32 : ALL 2 TESTS SUCCESSFUL
-2016_09_01_03_18_02 : ALL 1 TESTS SUCCESSFUL
-2016_09_01_03_18_05 : ALL 2 TESTS SUCCESSFUL
-2016_09_01_03_18_20 : ALL 1 TESTS SUCCESSFUL
-2016_09_01_03_18_22 : FAILED 1/2 TESTS: free_ssl
-2016_09_01_03_18_40 : ALL 1 TESTS SUCCESSFUL
-2016_09_01_03_18_42 : ALL 2 TESTS SUCCESSFUL
-2016_09_16_00_28_20 : ALL 1 TESTS SUCCESSFUL
-2016_09_16_00_47_52 : ALL 116 TESTS SUCCESSFUL
-2016_09_17_17_00_49 : ALL 1 TESTS SUCCESSFUL
-2016_09_17_17_19_08 : ALL 116 TESTS SUCCESSFUL
-2016_09_26_11_12_41 : ALL 1 TESTS SUCCESSFUL
-2016_09_26_11_13_55 : ALL 2 TESTS SUCCESSFUL
-2016_09_26_11_14_36 : ALL 1 TESTS SUCCESSFUL
-2016_09_26_11_15_17 : ALL 2 TESTS SUCCESSFUL
-2016_09_26_11_15_48 : ALL 1 TESTS SUCCESSFUL
-2016_09_26_11_16_29 : ALL 2 TESTS SUCCESSFUL
-2016_09_26_11_17_53 : ALL 1 TESTS SUCCESSFUL
-2016_09_26_11_18_33 : ALL 2 TESTS SUCCESSFUL
-2016_09_26_11_19_34 : ALL 1 TESTS SUCCESSFUL
-2016_09_26_11_19_44 : ALL 2 TESTS SUCCESSFUL
-2016_09_26_11_20_24 : ALL 1 TESTS SUCCESSFUL
-2016_09_26_11_20_24 : ALL 2 TESTS SUCCESSFUL
-2016_09_26_11_21_55 : ALL 1 TESTS SUCCESSFUL
-2016_09_26_11_21_56 : ALL 2 TESTS SUCCESSFUL
-2016_09_26_11_22_20 : ALL 1 TESTS SUCCESSFUL
-2016_09_26_11_22_20 : ALL 2 TESTS SUCCESSFUL
-2016_09_26_11_22_28 : ALL 1 TESTS SUCCESSFUL
-2016_09_26_11_22_28 : ALL 2 TESTS SUCCESSFUL
-2016_09_26_11_22_43 : ALL 1 TESTS SUCCESSFUL
-2016_09_26_11_22_53 : ALL 2 TESTS SUCCESSFUL
-2016_09_26_11_23_39 : ALL 1 TESTS SUCCESSFUL
-2016_09_26_11_24_28 : ALL 2 TESTS SUCCESSFUL
-2016_09_26_11_25_08 : ALL 1 TESTS SUCCESSFUL
-2016_09_26_11_25_53 : ALL 3 TESTS SUCCESSFUL
-2016_09_29_12_01_21 : ALL 1 TESTS SUCCESSFUL
-2016_09_29_12_01_32 : ALL 2 TESTS SUCCESSFUL
-2016_09_29_12_02_50 : ALL 1 TESTS SUCCESSFUL
-2016_09_29_12_02_54 : ALL 2 TESTS SUCCESSFUL
-2016_09_29_12_11_16 : ALL 1 TESTS SUCCESSFUL
-2016_09_29_12_11_19 : ALL 2 TESTS SUCCESSFUL
-2016_09_29_12_11_48 : ALL 1 TESTS SUCCESSFUL
-2016_09_29_12_11_52 : ALL 2 TESTS SUCCESSFUL
-2016_09_29_12_12_54 : FAILED 1/1 TESTS: perl_syntax
-2016_09_29_12_14_52 : ALL 1 TESTS SUCCESSFUL
-2016_09_29_12_14_55 : ALL 2 TESTS SUCCESSFUL
-2016_09_29_12_16_10 : ALL 1 TESTS SUCCESSFUL
-2016_09_29_12_16_14 : ALL 2 TESTS SUCCESSFUL
-2016_09_29_13_44_54 : ALL 1 TESTS SUCCESSFUL
-2016_09_29_13_44_58 : ALL 2 TESTS SUCCESSFUL
-2016_09_29_14_15_45 : ALL 1 TESTS SUCCESSFUL
-2016_09_29_14_15_48 : ALL 2 TESTS SUCCESSFUL
-2016_09_29_14_17_05 : ALL 1 TESTS SUCCESSFUL
-2016_09_29_14_17_07 : FAILED 1/2 TESTS: ll_noabletosearch1
-2016_09_29_14_23_01 : ALL 1 TESTS SUCCESSFUL
-2016_09_29_14_23_04 : ALL 2 TESTS SUCCESSFUL
-2016_09_29_14_26_39 : ALL 1 TESTS SUCCESSFUL
-2016_09_29_14_26_42 : ALL 2 TESTS SUCCESSFUL
-2016_09_29_14_44_27 : ALL 1 TESTS SUCCESSFUL
-2016_09_29_15_06_52 : ALL 116 TESTS SUCCESSFUL
-2016_09_29_23_09_17 : ALL 1 TESTS SUCCESSFUL
-2016_09_29_23_30_11 : ALL 116 TESTS SUCCESSFUL
-2016_10_03_00_57_01 : ALL 1 TESTS SUCCESSFUL
-2016_10_03_00_57_08 : ALL 2 TESTS SUCCESSFUL
-2016_10_03_00_57_34 : ALL 1 TESTS SUCCESSFUL
-2016_10_03_00_57_38 : ALL 2 TESTS SUCCESSFUL
-2016_10_06_03_26_27 : ALL 1 TESTS SUCCESSFUL
-2016_10_06_03_45_36 : FAILED 2/116 TESTS: option_tests ll_authmech_XOAUTH_gmail
-2016_10_09_21_20_41 : ALL 1 TESTS SUCCESSFUL
-2016_10_09_21_38_59 : FAILED 2/116 TESTS: option_tests ll_delete2foldersonly_NEW_3
-2016_10_10_05_55_31 : ALL 1 TESTS SUCCESSFUL
-2016_10_10_06_12_48 : ALL 116 TESTS SUCCESSFUL
-2016_10_10_22_54_25 : ALL 1 TESTS SUCCESSFUL
-2016_10_10_23_15_40 : ALL 116 TESTS SUCCESSFUL
-2016_10_11_02_16_33 : ALL 1 TESTS SUCCESSFUL
-2016_10_11_18_32_56 : ALL 1 TESTS SUCCESSFUL
-2016_10_11_18_34_03 : ALL 2 TESTS SUCCESSFUL
-2016_10_11_18_36_19 : ALL 1 TESTS SUCCESSFUL
-2016_10_11_18_36_47 : ALL 2 TESTS SUCCESSFUL
-2016_10_11_18_36_56 : ALL 1 TESTS SUCCESSFUL
-2016_10_11_18_37_59 : ALL 2 TESTS SUCCESSFUL
-2016_10_11_18_58_07 : ALL 1 TESTS SUCCESSFUL
-2016_10_11_18_58_15 : ALL 2 TESTS SUCCESSFUL
-2016_10_11_18_58_41 : ALL 1 TESTS SUCCESSFUL
-2016_10_11_18_58_49 : ALL 2 TESTS SUCCESSFUL
-2016_10_11_19_07_41 : ALL 1 TESTS SUCCESSFUL
-2016_10_11_19_07_41 : ALL 2 TESTS SUCCESSFUL
-2016_10_11_19_08_21 : ALL 1 TESTS SUCCESSFUL
-2016_10_11_19_08_21 : ALL 2 TESTS SUCCESSFUL
-2016_10_11_19_18_08 : ALL 1 TESTS SUCCESSFUL
-2016_10_11_19_18_08 : FAILED 1/2 TESTS: setx
-2016_10_11_19_18_16 : ALL 1 TESTS SUCCESSFUL
-2016_10_11_19_18_16 : FAILED 1/2 TESTS: setback
-2016_10_11_19_18_27 : ALL 1 TESTS SUCCESSFUL
-2016_10_11_19_18_27 : ALL 2 TESTS SUCCESSFUL
-2016_10_11_19_18_40 : ALL 1 TESTS SUCCESSFUL
-2016_10_11_19_18_40 : ALL 2 TESTS SUCCESSFUL
-2016_10_11_19_18_52 : ALL 1 TESTS SUCCESSFUL
-2016_10_11_19_18_52 : ALL 3 TESTS SUCCESSFUL
-2016_10_11_19_21_53 : ALL 1 TESTS SUCCESSFUL
-2016_10_11_19_21_53 : ALL 3 TESTS SUCCESSFUL
-2016_10_11_19_22_21 : ALL 1 TESTS SUCCESSFUL
-2016_10_11_19_22_29 : ALL 2 TESTS SUCCESSFUL
-2016_10_11_19_23_08 : ALL 1 TESTS SUCCESSFUL
-2016_10_11_19_23_16 : ALL 2 TESTS SUCCESSFUL
-2016_10_11_19_24_48 : ALL 1 TESTS SUCCESSFUL
-2016_10_11_19_24_56 : ALL 2 TESTS SUCCESSFUL
-2016_10_11_19_27_00 : ALL 1 TESTS SUCCESSFUL
-2016_10_11_19_27_07 : ALL 2 TESTS SUCCESSFUL
-2016_10_11_19_31_32 : ALL 1 TESTS SUCCESSFUL
-2016_10_11_19_31_32 : ALL 2 TESTS SUCCESSFUL
-2016_10_11_19_32_36 : ALL 1 TESTS SUCCESSFUL
-2016_10_11_19_32_36 : ALL 2 TESTS SUCCESSFUL
-2016_10_11_19_33_45 : ALL 1 TESTS SUCCESSFUL
-2016_10_11_19_33_53 : ALL 2 TESTS SUCCESSFUL
-2016_10_11_19_47_27 : ALL 1 TESTS SUCCESSFUL
-2016_10_11_20_05_18 : ALL 116 TESTS SUCCESSFUL
-2016_10_11_21_04_34 : ALL 1 TESTS SUCCESSFUL
-2016_10_11_21_22_54 : ALL 118 TESTS SUCCESSFUL
-2016_10_27_12_41_24 : ALL 1 TESTS SUCCESSFUL
-2016_10_27_12_41_37 : ALL 2 TESTS SUCCESSFUL
-2016_10_27_12_43_33 : ALL 1 TESTS SUCCESSFUL
-2016_10_27_12_43_51 : ALL 2 TESTS SUCCESSFUL
-2016_10_30_13_12_36 : ALL 1 TESTS SUCCESSFUL
-2016_10_30_13_12_40 : ALL 2 TESTS SUCCESSFUL
-2016_11_01_01_19_45 : ALL 1 TESTS SUCCESSFUL
-2016_11_01_01_19_45 : ALL 2 TESTS SUCCESSFUL
-2016_11_01_01_20_03 : ALL 1 TESTS SUCCESSFUL
-2016_11_01_01_20_47 : ALL 2 TESTS SUCCESSFUL
-2016_11_01_01_20_54 : ALL 1 TESTS SUCCESSFUL
-2016_11_01_01_21_07 : ALL 2 TESTS SUCCESSFUL
-2016_11_01_01_23_20 : ALL 1 TESTS SUCCESSFUL
-2016_11_01_01_23_31 : ALL 2 TESTS SUCCESSFUL
-2016_11_03_21_54_10 : ALL 1 TESTS SUCCESSFUL
-2016_11_03_22_13_36 : ALL 118 TESTS SUCCESSFUL
-2016_11_15_02_13_57 : ALL 1 TESTS SUCCESSFUL
-2016_11_15_02_14_02 : ALL 2 TESTS SUCCESSFUL
-2016_11_17_15_10_56 : ALL 1 TESTS SUCCESSFUL
-2016_11_17_15_30_01 : ALL 118 TESTS SUCCESSFUL
-2016_11_17_16_26_30 : ALL 1 TESTS SUCCESSFUL
-2016_11_17_16_44_56 : ALL 118 TESTS SUCCESSFUL
-2016_11_22_22_50_48 : ALL 1 TESTS SUCCESSFUL
-2016_11_22_23_09_40 : ALL 118 TESTS SUCCESSFUL
-2016_11_23_09_25_07 : ALL 1 TESTS SUCCESSFUL
-2016_11_23_09_25_17 : ALL 2 TESTS SUCCESSFUL
-2016_11_23_09_28_29 : ALL 1 TESTS SUCCESSFUL
-2016_11_23_09_28_32 : ALL 2 TESTS SUCCESSFUL
-2016_11_23_09_44_28 : ALL 1 TESTS SUCCESSFUL
-2016_11_23_09_44_31 : ALL 2 TESTS SUCCESSFUL
-2016_11_23_09_50_03 : ALL 1 TESTS SUCCESSFUL
-2016_11_23_09_50_06 : ALL 2 TESTS SUCCESSFUL
-2016_11_23_09_52_25 : ALL 1 TESTS SUCCESSFUL
-2016_11_23_09_52_29 : FAILED 1/2 TESTS: ll_regexmess_add_header
-2016_11_23_09_52_48 : ALL 1 TESTS SUCCESSFUL
-2016_11_23_09_52_51 : FAILED 1/2 TESTS: ll_regexmess_add_header
-2016_11_23_09_53_22 : ALL 1 TESTS SUCCESSFUL
-2016_11_23_09_58_15 : ALL 1 TESTS SUCCESSFUL
-2016_11_23_09_58_20 : FAILED 1/2 TESTS: ll_regexmess_add_header
-2016_11_23_10_10_47 : ALL 1 TESTS SUCCESSFUL
-2016_11_23_10_10_50 : FAILED 1/2 TESTS: ll_regexmess_add_header
-2016_11_28_17_43_13 : ALL 1 TESTS SUCCESSFUL
-2016_11_28_17_43_18 : ALL 2 TESTS SUCCESSFUL
-2016_11_28_17_44_46 : ALL 1 TESTS SUCCESSFUL
-2016_11_28_17_44_50 : ALL 2 TESTS SUCCESSFUL
-2016_11_28_17_45_11 : ALL 1 TESTS SUCCESSFUL
-2016_11_28_17_45_14 : ALL 2 TESTS SUCCESSFUL
-2016_11_29_03_48_41 : ALL 1 TESTS SUCCESSFUL
-2016_11_29_03_48_45 : ALL 2 TESTS SUCCESSFUL
-2016_12_12_02_34_42 : FAILED 1/1 TESTS: perl_syntax
-2016_12_12_02_34_47 : FAILED 1/1 TESTS: perl_syntax
-2016_12_12_02_35_51 : FAILED 1/1 TESTS: perl_syntax
-2016_12_12_02_36_18 : ALL 1 TESTS SUCCESSFUL
-2016_12_12_02_36_19 : ALL 2 TESTS SUCCESSFUL
-2016_12_12_02_36_51 : ALL 1 TESTS SUCCESSFUL
-2016_12_12_02_36_53 : ALL 2 TESTS SUCCESSFUL
-2016_12_12_02_46_48 : ALL 1 TESTS SUCCESSFUL
-2016_12_12_02_46_51 : ALL 2 TESTS SUCCESSFUL
-2016_12_12_03_16_27 : ALL 1 TESTS SUCCESSFUL
-2016_12_12_03_16_29 : ALL 2 TESTS SUCCESSFUL
-2016_12_12_03_18_23 : ALL 1 TESTS SUCCESSFUL
-2016_12_12_03_18_25 : ALL 2 TESTS SUCCESSFUL
-2016_12_12_03_20_42 : ALL 1 TESTS SUCCESSFUL
-2016_12_12_03_20_43 : ALL 2 TESTS SUCCESSFUL
-2016_12_12_03_20_51 : ALL 1 TESTS SUCCESSFUL
-2016_12_12_03_20_53 : ALL 2 TESTS SUCCESSFUL
-2016_12_12_03_23_05 : ALL 1 TESTS SUCCESSFUL
-2016_12_12_03_23_08 : ALL 2 TESTS SUCCESSFUL
-2016_12_12_03_23_12 : ALL 1 TESTS SUCCESSFUL
-2016_12_12_03_23_14 : ALL 2 TESTS SUCCESSFUL
-2016_12_12_03_24_18 : ALL 1 TESTS SUCCESSFUL
-2016_12_12_03_24_36 : ALL 1 TESTS SUCCESSFUL
-2016_12_12_03_24_36 : FAILED 1/2 TESTS: abort2
-2016_12_12_03_24_47 : ALL 1 TESTS SUCCESSFUL
-2016_12_12_03_24_48 : ALL 2 TESTS SUCCESSFUL
-2016_12_12_03_24_49 : ALL 2 TESTS SUCCESSFUL
-2016_12_12_03_24_58 : ALL 1 TESTS SUCCESSFUL
-2016_12_12_03_25_04 : ALL 1 TESTS SUCCESSFUL
-2016_12_12_03_25_07 : ALL 2 TESTS SUCCESSFUL
-2016_12_12_03_25_24 : ALL 2 TESTS SUCCESSFUL
-2016_12_12_03_27_03 : ALL 1 TESTS SUCCESSFUL
-2016_12_12_03_27_09 : ALL 1 TESTS SUCCESSFUL
-2016_12_12_03_27_09 : FAILED 1/2 TESTS: ll_abort2
-2016_12_12_03_27_21 : ALL 1 TESTS SUCCESSFUL
-2016_12_12_03_27_25 : FAILED 1/2 TESTS: ll_abort_run
-2016_12_12_03_27_25 : ALL 2 TESTS SUCCESSFUL
-2016_12_12_03_27_55 : ALL 1 TESTS SUCCESSFUL
-2016_12_12_03_28_03 : ALL 1 TESTS SUCCESSFUL
-2016_12_12_03_28_06 : FAILED 1/2 TESTS: ll_abort_run
-2016_12_12_03_28_07 : ALL 2 TESTS SUCCESSFUL
-2016_12_12_03_31_16 : ALL 1 TESTS SUCCESSFUL
-2016_12_12_03_31_22 : ALL 2 TESTS SUCCESSFUL
-2016_12_12_03_31_34 : ALL 1 TESTS SUCCESSFUL
-2016_12_12_03_31_41 : ALL 2 TESTS SUCCESSFUL
-2016_12_12_22_45_23 : ALL 1 TESTS SUCCESSFUL
-2016_12_12_22_54_37 : ALL 1 TESTS SUCCESSFUL
-2016_12_12_23_13_01 : FAILED 1/118 TESTS: ll_authmech_XOAUTH_gmail
-2016_12_12_23_15_44 : ALL 1 TESTS SUCCESSFUL
-2016_12_12_23_15_54 : ALL 2 TESTS SUCCESSFUL
-2016_12_12_23_16_43 : ALL 1 TESTS SUCCESSFUL
-2016_12_12_23_16_57 : FAILED 1/2 TESTS: ll_authmech_XOAUTH_gmail
-2016_12_12_23_21_49 : ALL 1 TESTS SUCCESSFUL
-2016_12_12_23_22_04 : FAILED 1/2 TESTS: ll_authmech_XOAUTH_gmail
-2016_12_12_23_40_25 : ALL 1 TESTS SUCCESSFUL
-2016_12_12_23_58_40 : ALL 117 TESTS SUCCESSFUL
-2016_12_13_14_05_12 : ALL 1 TESTS SUCCESSFUL
-2016_12_13_14_24_54 : ALL 117 TESTS SUCCESSFUL
-2016_12_13_20_48_55 : ALL 1 TESTS SUCCESSFUL
-2016_12_13_20_48_58 : ALL 2 TESTS SUCCESSFUL
-2016_12_13_20_52_10 : ALL 1 TESTS SUCCESSFUL
-2016_12_13_20_52_13 : ALL 2 TESTS SUCCESSFUL
-2016_12_13_20_52_40 : ALL 1 TESTS SUCCESSFUL
-2016_12_13_20_52_42 : ALL 2 TESTS SUCCESSFUL
-2016_12_13_20_53_17 : ALL 1 TESTS SUCCESSFUL
-2016_12_13_20_53_19 : ALL 2 TESTS SUCCESSFUL
-2016_12_14_17_35_59 : ALL 1 TESTS SUCCESSFUL
-2016_12_14_17_54_42 : FAILED 2/117 TESTS: option_tests_debug ll
-2016_12_14_18_26_41 : ALL 1 TESTS SUCCESSFUL
-2016_12_14_18_27_04 : ALL 2 TESTS SUCCESSFUL
-2016_12_14_18_45_32 : ALL 1 TESTS SUCCESSFUL
-2016_12_14_18_55_04 : ALL 1 TESTS SUCCESSFUL
-2016_12_14_19_05_19 : ALL 1 TESTS SUCCESSFUL
-2016_12_14_19_23_13 : FAILED 2/117 TESTS: option_tests ll_ask_password
-2016_12_14_23_51_08 : ALL 1 TESTS SUCCESSFUL
-2016_12_14_23_51_13 : FAILED 1/2 TESTS: option_tests
-2016_12_14_23_53_01 : ALL 1 TESTS SUCCESSFUL
-2016_12_14_23_53_05 : FAILED 1/2 TESTS: ll_ask_password
-2016_12_15_00_00_25 : ALL 1 TESTS SUCCESSFUL
-2016_12_15_00_00_29 : ALL 2 TESTS SUCCESSFUL
-2016_12_15_00_07_36 : ALL 1 TESTS SUCCESSFUL
-2016_12_15_00_07_40 : ALL 2 TESTS SUCCESSFUL
-2016_12_15_05_42_24 : ALL 1 TESTS SUCCESSFUL
-2016_12_15_06_00_09 : FAILED 3/117 TESTS: option_tests option_tests_debug ll_exclude
-2016_12_15_06_10_50 : ALL 1 TESTS SUCCESSFUL
-2016_12_15_06_10_53 : FAILED 1/2 TESTS: ll_regextrans2_d
-2016_12_15_06_11_24 : ALL 1 TESTS SUCCESSFUL
-2016_12_15_06_11_29 : ALL 2 TESTS SUCCESSFUL
-2016_12_15_06_16_19 : ALL 1 TESTS SUCCESSFUL
-2016_12_15_06_16_25 : ALL 2 TESTS SUCCESSFUL
-2016_12_15_06_16_47 : ALL 1 TESTS SUCCESSFUL
-2016_12_15_06_16_52 : ALL 2 TESTS SUCCESSFUL
-2016_12_24_16_41_53 : ALL 1 TESTS SUCCESSFUL
-2016_12_24_17_01_27 : ALL 117 TESTS SUCCESSFUL
-2017_01_05_03_04_44 : ALL 1 TESTS SUCCESSFUL
-2017_01_05_03_23_58 : FAILED 1/117 TESTS: l_office365_justconnect_inet4_inet6
-2017_01_05_04_18_13 : ALL 1 TESTS SUCCESSFUL
-2017_01_05_04_36_08 : ALL 117 TESTS SUCCESSFUL
-2017_01_05_15_18_24 : ALL 1 TESTS SUCCESSFUL
-2017_01_05_15_37_27 : ALL 117 TESTS SUCCESSFUL
-2017_01_09_08_52_00 : ALL 1 TESTS SUCCESSFUL
-2017_01_09_09_10_57 : ALL 117 TESTS SUCCESSFUL
-2017_01_09_19_00_22 : ALL 1 TESTS SUCCESSFUL
-2017_01_10_21_19_24 : ALL 1 TESTS SUCCESSFUL
-2017_01_10_21_38_26 : FAILED 2/117 TESTS: option_tests option_tests_debug
-2017_01_11_06_45_22 : ALL 1 TESTS SUCCESSFUL
-2017_01_11_07_04_31 : ALL 117 TESTS SUCCESSFUL
-2017_01_11_15_53_57 : ALL 1 TESTS SUCCESSFUL
-2017_01_11_16_12_29 : ALL 117 TESTS SUCCESSFUL
-2017_01_11_20_49_39 : ALL 1 TESTS SUCCESSFUL
-2017_01_11_20_49_41 : ALL 2 TESTS SUCCESSFUL
-2017_01_11_20_50_10 : ALL 1 TESTS SUCCESSFUL
-2017_01_11_20_50_12 : ALL 2 TESTS SUCCESSFUL
-2017_01_11_21_37_48 : ALL 1 TESTS SUCCESSFUL
-2017_01_11_21_37_50 : FAILED 1/2 TESTS: ll_justlogin
-2017_01_11_21_40_31 : ALL 1 TESTS SUCCESSFUL
-2017_01_11_21_40_34 : ALL 2 TESTS SUCCESSFUL
-2017_01_11_21_41_55 : ALL 1 TESTS SUCCESSFUL
-2017_01_11_21_41_58 : ALL 2 TESTS SUCCESSFUL
-2017_01_11_21_42_04 : ALL 1 TESTS SUCCESSFUL
-2017_01_11_21_42_06 : FAILED 1/2 TESTS: ll_justlogin
-2017_01_12_04_09_25 : ALL 1 TESTS SUCCESSFUL
-2017_01_12_04_09_28 : ALL 2 TESTS SUCCESSFUL
-2017_01_12_04_10_35 : ALL 1 TESTS SUCCESSFUL
-2017_01_12_04_10_57 : ALL 2 TESTS SUCCESSFUL
-2017_01_12_04_11_56 : ALL 1 TESTS SUCCESSFUL
-2017_01_12_04_11_59 : ALL 2 TESTS SUCCESSFUL
-2017_01_12_04_13_46 : ALL 1 TESTS SUCCESSFUL
-2017_01_12_04_13_57 : ALL 2 TESTS SUCCESSFUL
-2017_01_12_04_14_57 : ALL 1 TESTS SUCCESSFUL
-2017_01_12_04_15_00 : ALL 2 TESTS SUCCESSFUL
-2017_01_12_04_24_09 : FAILED 1/1 TESTS: perl_syntax
-2017_01_12_04_24_24 : ALL 1 TESTS SUCCESSFUL
-2017_01_12_04_24_26 : ALL 2 TESTS SUCCESSFUL
-2017_01_12_04_25_09 : ALL 1 TESTS SUCCESSFUL
-2017_01_12_04_25_12 : ALL 2 TESTS SUCCESSFUL
-2017_01_12_10_54_34 : ALL 1 TESTS SUCCESSFUL
-2017_01_12_11_00_23 : ALL 1 TESTS SUCCESSFUL
-2017_01_12_11_13_49 : ALL 1 TESTS SUCCESSFUL
-2017_01_12_11_17_00 : ALL 1 TESTS SUCCESSFUL
-2017_01_12_11_41_00 : FAILED 1/117 TESTS: option_tests
-2017_01_15_19_19_24 : ALL 1 TESTS SUCCESSFUL
-2017_01_15_19_19_59 : ALL 1 TESTS SUCCESSFUL
-2017_01_15_19_37_18 : ALL 1 TESTS SUCCESSFUL
-2017_01_15_19_38_09 : ALL 1 TESTS SUCCESSFUL
-2017_01_15_19_58_08 : ALL 117 TESTS SUCCESSFUL
-2017_01_15_20_32_11 : ALL 1 TESTS SUCCESSFUL
-2017_01_16_15_07_31 : ALL 1 TESTS SUCCESSFUL
-2017_01_16_15_27_36 : ALL 117 TESTS SUCCESSFUL
-2017_01_17_04_39_20 : FAILED 1/1 TESTS: perl_syntax
-2017_01_17_04_44_32 : ALL 1 TESTS SUCCESSFUL
-2017_01_17_04_44_45 : ALL 2 TESTS SUCCESSFUL
-2017_01_17_05_45_52 : ALL 1 TESTS SUCCESSFUL
-2017_01_17_06_06_04 : ALL 117 TESTS SUCCESSFUL
-2017_01_17_07_23_12 : ALL 1 TESTS SUCCESSFUL
-2017_01_17_07_42_44 : ALL 117 TESTS SUCCESSFUL
-2017_01_18_22_11_58 : ALL 1 TESTS SUCCESSFUL
-2017_01_18_22_29_08 : ALL 1 TESTS SUCCESSFUL
-2017_01_18_22_29_10 : FAILED 1/2 TESTS: ll_showpasswords
-2017_01_18_22_29_30 : ALL 1 TESTS SUCCESSFUL
-2017_01_18_22_29_33 : ALL 2 TESTS SUCCESSFUL
-2017_01_18_22_30_31 : ALL 1 TESTS SUCCESSFUL
-2017_01_18_22_30_39 : FAILED 1/2 TESTS: ll_showpasswords
-2017_01_18_22_31_55 : ALL 117 TESTS SUCCESSFUL
-2017_01_18_22_41_37 : FAILED 1/1 TESTS: perl_syntax
-2017_01_18_22_42_24 : ALL 1 TESTS SUCCESSFUL
-2017_01_18_22_42_32 : FAILED 1/2 TESTS: ll_showpasswords
-2017_01_19_00_07_34 : ALL 1 TESTS SUCCESSFUL
-2017_01_19_00_07_42 : FAILED 1/2 TESTS: ll_showpasswords
-2017_01_19_00_18_36 : ALL 1 TESTS SUCCESSFUL
-2017_01_19_00_18_44 : FAILED 1/2 TESTS: ll_showpasswords
-2017_01_19_00_19_23 : ALL 1 TESTS SUCCESSFUL
-2017_01_19_00_19_31 : FAILED 1/2 TESTS: ll_showpasswords
-2017_01_19_00_21_47 : ALL 1 TESTS SUCCESSFUL
-2017_01_19_00_21_55 : FAILED 1/2 TESTS: ll_showpasswords
-2017_01_19_00_24_58 : ALL 1 TESTS SUCCESSFUL
-2017_01_19_00_25_05 : FAILED 1/2 TESTS: ll_showpasswords
-2017_01_19_01_48_49 : ALL 1 TESTS SUCCESSFUL
-2017_01_19_01_49_58 : ALL 1 TESTS SUCCESSFUL
-2017_01_19_02_09_00 : FAILED 1/117 TESTS: ll_timeout
-2017_01_19_04_41_14 : ALL 1 TESTS SUCCESSFUL
-2017_01_19_05_00_46 : FAILED 1/117 TESTS: ll_timeout
-2017_01_19_06_15_27 : ALL 1 TESTS SUCCESSFUL
-2017_01_19_06_34_13 : FAILED 8/117 TESTS: option_tests l_office365_justconnect_tls_SSL_verify_mode_1 ll_timeout ll_justconnect_devel ll_tls_justconnect ll_tls_justlogin ll_tls ll_delete
-2017_01_19_06_53_41 : ALL 1 TESTS SUCCESSFUL
-2017_01_19_07_13_17 : FAILED 6/117 TESTS: l_office365_justconnect_tls_SSL_verify_mode_1 ll_timeout ll_justconnect_devel ll_tls_justconnect ll_tls_justlogin ll_tls
-2017_01_28_06_49_57 : ALL 1 TESTS SUCCESSFUL
-2017_01_28_06_50_18 : ALL 2 TESTS SUCCESSFUL
-2017_01_28_06_54_22 : ALL 1 TESTS SUCCESSFUL
-2017_01_28_06_54_30 : ALL 2 TESTS SUCCESSFUL
-2017_01_31_23_02_10 : ALL 1 TESTS SUCCESSFUL
-2017_01_31_23_02_20 : ALL 2 TESTS SUCCESSFUL
-2017_01_31_23_02_27 : ALL 1 TESTS SUCCESSFUL
-2017_01_31_23_02_37 : ALL 2 TESTS SUCCESSFUL
-2017_01_31_23_02_57 : ALL 1 TESTS SUCCESSFUL
-2017_01_31_23_03_07 : ALL 2 TESTS SUCCESSFUL
-2017_01_31_23_03_37 : ALL 1 TESTS SUCCESSFUL
-2017_01_31_23_03_43 : FAILED 1/2 TESTS: easygmail_gmail2
-2017_01_31_23_04_24 : ALL 1 TESTS SUCCESSFUL
-2017_01_31_23_04_35 : ALL 2 TESTS SUCCESSFUL
-2017_01_31_23_04_52 : ALL 1 TESTS SUCCESSFUL
-2017_01_31_23_05_00 : FAILED 1/2 TESTS: easygmail_gmail2
-2017_01_31_23_05_25 : ALL 1 TESTS SUCCESSFUL
-2017_01_31_23_05_32 : FAILED 1/2 TESTS: easygmail_gmail2
-2017_01_31_23_06_39 : ALL 1 TESTS SUCCESSFUL
-2017_01_31_23_06_48 : FAILED 1/2 TESTS: easygmail_gmail2
-2017_01_31_23_07_43 : ALL 1 TESTS SUCCESSFUL
-2017_01_31_23_07_57 : ALL 2 TESTS SUCCESSFUL
-2017_01_31_23_10_31 : ALL 1 TESTS SUCCESSFUL
-2017_01_31_23_10_44 : ALL 2 TESTS SUCCESSFUL
-2017_02_09_12_38_08 : ALL 1 TESTS SUCCESSFUL
-2017_02_09_12_38_31 : ALL 2 TESTS SUCCESSFUL
-2017_02_09_12_40_11 : ALL 1 TESTS SUCCESSFUL
-2017_02_09_12_40_21 : ALL 2 TESTS SUCCESSFUL
-2017_02_09_12_42_24 : ALL 1 TESTS SUCCESSFUL
-2017_02_09_12_42_54 : ALL 2 TESTS SUCCESSFUL
-2017_02_15_00_25_10 : ALL 1 TESTS SUCCESSFUL
-2017_02_15_00_44_22 : FAILED 9/117 TESTS: yahoo_xxxx l_office365_justconnect_tls_SSL_verify_mode_1 ll_timeout ll_justconnect_devel ll_tls_justconnect ll_tls_justlogin ll_tls ll_authmech_xoauth2_gmail ll_authmech_xoauth2_json_gmail
-2017_02_15_02_18_30 : ALL 1 TESTS SUCCESSFUL
-2017_02_15_02_37_11 : FAILED 8/117 TESTS: yahoo_xxxx l_office365_justconnect_tls_SSL_verify_mode_1 ll_justconnect_devel ll_tls_justconnect ll_tls_justlogin ll_tls ll_authmech_xoauth2_gmail ll_authmech_xoauth2_json_gmail
-2017_02_15_11_18_00 : ALL 1 TESTS SUCCESSFUL
-2017_02_15_11_18_34 : FAILED 8/9 TESTS: yahoo_xxxx l_office365_justconnect_tls_SSL_verify_mode_1 ll_justconnect_devel ll_tls_justconnect ll_tls_justlogin ll_tls ll_authmech_xoauth2_gmail ll_authmech_xoauth2_json_gmail
-2017_02_15_12_09_21 : ALL 1 TESTS SUCCESSFUL
-2017_02_15_12_09_28 : FAILED 1/2 TESTS: yahoo_xxxx
-2017_02_15_12_15_32 : ALL 1 TESTS SUCCESSFUL
-2017_02_15_12_15_40 : FAILED 1/2 TESTS: yahoo_xxxx_login
-2017_02_15_12_23_55 : ALL 1 TESTS SUCCESSFUL
-2017_02_15_12_24_40 : ALL 1 TESTS SUCCESSFUL
-2017_02_15_12_27_55 : ALL 1 TESTS SUCCESSFUL
-2017_02_15_12_28_37 : ALL 2 TESTS SUCCESSFUL
-2017_02_15_12_31_21 : ALL 1 TESTS SUCCESSFUL
-2017_02_15_12_31_25 : FAILED 1/2 TESTS: yahoo_all
-2017_02_15_12_33_10 : ALL 1 TESTS SUCCESSFUL
-2017_02_15_12_35_13 : FAILED 1/2 TESTS: yahoo_all
-2017_02_15_12_38_04 : ALL 1 TESTS SUCCESSFUL
-2017_02_15_12_38_04 : FAILED 1/2 TESTS: yahoo_login_tls
-2017_02_15_12_38_30 : ALL 1 TESTS SUCCESSFUL
-2017_02_15_12_38_33 : FAILED 1/2 TESTS: yahoo_xxxx_login_tls
-2017_02_15_13_27_32 : ALL 1 TESTS SUCCESSFUL
-2017_02_15_13_29_35 : FAILED 1/2 TESTS: yahoo_xxxx_login_tls
-2017_02_15_13_51_42 : ALL 1 TESTS SUCCESSFUL
-2017_02_15_13_52_33 : ALL 1 TESTS SUCCESSFUL
-2017_02_15_13_53_10 : ALL 1 TESTS SUCCESSFUL
-2017_02_15_13_53_17 : FAILED 1/2 TESTS: yahoo_xxxx_login_tls
-2017_02_15_13_53_30 : ALL 1 TESTS SUCCESSFUL
-2017_02_15_13_54_12 : ALL 2 TESTS SUCCESSFUL
-2017_02_15_13_54_43 : ALL 1 TESTS SUCCESSFUL
-2017_02_15_13_54_47 : ALL 2 TESTS SUCCESSFUL
-2017_02_15_13_54_59 : ALL 1 TESTS SUCCESSFUL
-2017_02_15_13_56_35 : FAILED 2/9 TESTS: ll_authmech_xoauth2_gmail ll_authmech_xoauth2_json_gmail
-2017_02_15_13_56_59 : ALL 1 TESTS SUCCESSFUL
-2017_02_15_13_57_02 : FAILED 1/2 TESTS: ll_authmech_xoauth2_gmail
-2017_02_15_15_37_56 : ALL 1 TESTS SUCCESSFUL
-2017_02_15_15_39_29 : ALL 9 TESTS SUCCESSFUL
-2017_02_17_03_13_57 : ALL 1 TESTS SUCCESSFUL
-2017_02_17_03_41_08 : FAILED 1/117 TESTS: ll_timeout
-2017_02_17_09_36_33 : ALL 1 TESTS SUCCESSFUL
-2017_02_17_09_36_38 : FAILED 1/2 TESTS: ll_timeout
-2017_02_17_09_39_58 : ALL 1 TESTS SUCCESSFUL
-2017_02_17_10_01_03 : ALL 117 TESTS SUCCESSFUL
-2017_02_27_15_39_13 : ALL 1 TESTS SUCCESSFUL
-2017_02_27_15_39_57 : ALL 2 TESTS SUCCESSFUL
-2017_02_27_15_43_50 : ALL 1 TESTS SUCCESSFUL
-2017_02_27_15_43_56 : ALL 2 TESTS SUCCESSFUL
-2017_02_27_15_44_41 : ALL 1 TESTS SUCCESSFUL
-2017_02_27_15_44_48 : ALL 2 TESTS SUCCESSFUL
-2017_02_27_15_46_03 : ALL 1 TESTS SUCCESSFUL
-2017_02_27_15_46_14 : ALL 2 TESTS SUCCESSFUL
-2017_02_27_15_46_24 : ALL 1 TESTS SUCCESSFUL
-2017_02_27_15_46_35 : ALL 2 TESTS SUCCESSFUL
-2017_02_27_16_24_44 : ALL 1 TESTS SUCCESSFUL
-2017_02_27_16_24_55 : ALL 2 TESTS SUCCESSFUL
-2017_02_27_17_47_38 : ALL 1 TESTS SUCCESSFUL
-2017_02_27_18_17_18 : FAILED 2/117 TESTS: l_office365_justconnect_inet4_inet6 l_office365_justconnect_tls_SSL_verify_mode_1
-2017_02_27_18_17_59 : ALL 1 TESTS SUCCESSFUL
-2017_02_27_18_20_30 : FAILED 1/3 TESTS: l_office365_justconnect_inet4_inet6
-2017_02_27_18_20_46 : ALL 1 TESTS SUCCESSFUL
-2017_02_27_18_23_07 : FAILED 1/2 TESTS: l_office365_justconnect_inet4_inet6
-2017_02_28_11_37_22 : ALL 1 TESTS SUCCESSFUL
-2017_02_28_11_41_38 : ALL 1 TESTS SUCCESSFUL
-2017_02_28_11_41_54 : ALL 2 TESTS SUCCESSFUL
-2017_02_28_11_43_08 : ALL 1 TESTS SUCCESSFUL
-2017_02_28_11_57_21 : ALL 1 TESTS SUCCESSFUL
-2017_02_28_11_59_15 : ALL 1 TESTS SUCCESSFUL
-2017_02_28_11_59_43 : ALL 2 TESTS SUCCESSFUL
-2017_02_28_12_00_47 : ALL 1 TESTS SUCCESSFUL
-2017_02_28_12_01_17 : ALL 2 TESTS SUCCESSFUL
-2017_02_28_12_01_27 : ALL 1 TESTS SUCCESSFUL
-2017_02_28_12_01_46 : ALL 1 TESTS SUCCESSFUL
-2017_02_28_12_01_49 : ALL 2 TESTS SUCCESSFUL
-2017_02_28_12_03_59 : ALL 117 TESTS SUCCESSFUL
-2017_02_28_12_04_22 : ALL 1 TESTS SUCCESSFUL
-2017_02_28_12_24_32 : ALL 117 TESTS SUCCESSFUL
-2017_03_01_04_08_06 : ALL 1 TESTS SUCCESSFUL
-2017_03_01_04_08_18 : ALL 1 TESTS SUCCESSFUL
-2017_03_01_04_44_07 : ALL 117 TESTS SUCCESSFUL
-2017_03_01_05_00_10 : ALL 1 TESTS SUCCESSFUL
-2017_03_01_05_00_22 : ALL 2 TESTS SUCCESSFUL
-2017_03_01_05_02_38 : ALL 1 TESTS SUCCESSFUL
-2017_03_01_05_02_44 : ALL 2 TESTS SUCCESSFUL
-2017_03_01_05_03_41 : ALL 1 TESTS SUCCESSFUL
-2017_03_01_05_05_02 : ALL 1 TESTS SUCCESSFUL
-2017_03_01_05_06_07 : ALL 1 TESTS SUCCESSFUL
-2017_03_01_05_07_57 : ALL 1 TESTS SUCCESSFUL
-2017_03_01_05_08_11 : ALL 2 TESTS SUCCESSFUL
-2017_03_01_05_09_03 : ALL 1 TESTS SUCCESSFUL
-2017_03_01_05_09_50 : ALL 1 TESTS SUCCESSFUL
-2017_03_01_05_10_04 : ALL 2 TESTS SUCCESSFUL
-2017_03_01_05_10_24 : ALL 1 TESTS SUCCESSFUL
-2017_03_01_05_10_39 : ALL 2 TESTS SUCCESSFUL
-2017_03_01_05_10_47 : ALL 1 TESTS SUCCESSFUL
-2017_03_01_05_10_55 : ALL 2 TESTS SUCCESSFUL
-2017_03_01_05_11_25 : ALL 1 TESTS SUCCESSFUL
-2017_03_01_05_11_38 : ALL 2 TESTS SUCCESSFUL
-2017_03_01_05_12_04 : ALL 1 TESTS SUCCESSFUL
-2017_03_01_05_12_18 : ALL 2 TESTS SUCCESSFUL
-2017_03_01_05_12_32 : ALL 1 TESTS SUCCESSFUL
-2017_03_01_05_12_42 : ALL 2 TESTS SUCCESSFUL
-2017_03_01_05_13_07 : ALL 1 TESTS SUCCESSFUL
-2017_03_01_05_13_16 : ALL 2 TESTS SUCCESSFUL
-2017_03_01_05_13_56 : ALL 1 TESTS SUCCESSFUL
-2017_03_01_05_14_12 : ALL 2 TESTS SUCCESSFUL
-2017_03_01_05_14_41 : ALL 1 TESTS SUCCESSFUL
-2017_03_01_05_20_10 : ALL 1 TESTS SUCCESSFUL
-2017_03_01_05_20_25 : ALL 2 TESTS SUCCESSFUL
-2017_03_01_05_22_04 : ALL 1 TESTS SUCCESSFUL
-2017_03_01_05_22_19 : ALL 2 TESTS SUCCESSFUL
-2017_03_01_05_22_26 : ALL 1 TESTS SUCCESSFUL
-2017_03_01_05_22_35 : ALL 2 TESTS SUCCESSFUL
-2017_03_01_15_35_41 : ALL 1 TESTS SUCCESSFUL
-2017_03_01_15_35_47 : ALL 2 TESTS SUCCESSFUL
-2017_03_01_15_37_38 : ALL 1 TESTS SUCCESSFUL
-2017_03_01_15_37_42 : FAILED 1/2 TESTS: ll_ask_password
-2017_03_05_12_11_19 : ALL 1 TESTS SUCCESSFUL
-2017_03_07_22_19_05 : FAILED 1/1 TESTS: perl_syntax
-2017_03_07_22_19_54 : ALL 1 TESTS SUCCESSFUL
-2017_03_07_22_20_07 : ALL 2 TESTS SUCCESSFUL
-2017_03_07_22_24_36 : ALL 1 TESTS SUCCESSFUL
-2017_03_07_22_24_46 : ALL 2 TESTS SUCCESSFUL
-2017_03_07_22_42_30 : ALL 1 TESTS SUCCESSFUL
-2017_03_07_22_42_33 : FAILED 1/2 TESTS: office1_office2
-2017_03_07_22_43_06 : ALL 1 TESTS SUCCESSFUL
-2017_03_07_22_43_09 : FAILED 1/2 TESTS: office1_office2
-2017_03_07_22_43_27 : ALL 1 TESTS SUCCESSFUL
-2017_03_07_22_43_53 : FAILED 1/2 TESTS: office1_office2
-2017_03_07_22_45_37 : ALL 1 TESTS SUCCESSFUL
-2017_03_07_22_45_54 : FAILED 1/2 TESTS: office1_office2
-2017_03_07_22_45_57 : ALL 1 TESTS SUCCESSFUL
-2017_03_07_22_54_58 : ALL 1 TESTS SUCCESSFUL
-2017_03_07_22_55_14 : ALL 2 TESTS SUCCESSFUL
-2017_03_07_22_59_19 : ALL 1 TESTS SUCCESSFUL
-2017_03_07_22_59_33 : ALL 2 TESTS SUCCESSFUL
-2017_03_07_23_02_34 : ALL 1 TESTS SUCCESSFUL
-2017_03_07_23_02_49 : ALL 2 TESTS SUCCESSFUL
-2017_03_07_23_05_34 : ALL 1 TESTS SUCCESSFUL
-2017_03_07_23_10_30 : ALL 1 TESTS SUCCESSFUL
-2017_03_07_23_10_44 : ALL 2 TESTS SUCCESSFUL
-2017_03_07_23_11_52 : ALL 1 TESTS SUCCESSFUL
-2017_03_07_23_12_06 : ALL 2 TESTS SUCCESSFUL
-2017_03_07_23_12_51 : ALL 1 TESTS SUCCESSFUL
-2017_03_07_23_13_05 : ALL 2 TESTS SUCCESSFUL
-2017_03_07_23_20_01 : ALL 1 TESTS SUCCESSFUL
-2017_03_07_23_40_52 : ALL 117 TESTS SUCCESSFUL
-2017_03_09_12_29_09 : ALL 1 TESTS SUCCESSFUL
-2017_03_09_12_50_04 : ALL 117 TESTS SUCCESSFUL
-2017_03_10_02_04_57 : ALL 1 TESTS SUCCESSFUL
-2017_03_10_02_25_41 : ALL 117 TESTS SUCCESSFUL
-2017_03_13_00_30_45 : FAILED 1/1 TESTS: perl_syntax
-2017_03_13_00_32_04 : ALL 1 TESTS SUCCESSFUL
-2017_03_13_00_32_04 : FAILED 1/2 TESTS: exchange1
-2017_03_13_00_32_33 : ALL 1 TESTS SUCCESSFUL
-2017_03_13_00_32_40 : FAILED 1/2 TESTS: exchange_1
-2017_03_13_00_34_14 : ALL 1 TESTS SUCCESSFUL
-2017_03_13_00_34_26 : ALL 2 TESTS SUCCESSFUL
-2017_03_13_00_40_03 : ALL 1 TESTS SUCCESSFUL
-2017_03_13_00_40_04 : FAILED 1/2 TESTS: ll_domino2
-2017_03_13_00_42_02 : ALL 1 TESTS SUCCESSFUL
-2017_03_13_00_42_04 : FAILED 1/2 TESTS: ll_domino2
-2017_03_13_00_44_33 : ALL 1 TESTS SUCCESSFUL
-2017_03_13_00_44_37 : FAILED 1/2 TESTS: ll_domino2
-2017_03_13_00_48_12 : ALL 1 TESTS SUCCESSFUL
-2017_03_13_00_48_17 : ALL 2 TESTS SUCCESSFUL
-2017_03_13_00_52_17 : ALL 1 TESTS SUCCESSFUL
-2017_03_13_00_52_21 : ALL 2 TESTS SUCCESSFUL
-2017_03_13_00_53_16 : ALL 1 TESTS SUCCESSFUL
-2017_03_13_00_53_21 : ALL 2 TESTS SUCCESSFUL
-2017_03_13_01_09_25 : ALL 1 TESTS SUCCESSFUL
-2017_03_13_01_09_26 : FAILED 1/2 TESTS: ll_domino1
-2017_03_13_01_09_34 : ALL 1 TESTS SUCCESSFUL
-2017_03_13_01_09_38 : ALL 2 TESTS SUCCESSFUL
-2017_03_13_01_10_52 : ALL 1 TESTS SUCCESSFUL
-2017_03_13_01_10_56 : ALL 2 TESTS SUCCESSFUL
-2017_03_13_01_15_11 : ALL 1 TESTS SUCCESSFUL
-2017_03_13_01_38_21 : FAILED 1/1 TESTS: perl_syntax
-2017_03_13_01_39_24 : FAILED 1/1 TESTS: perl_syntax
-2017_03_13_01_44_52 : FAILED 1/1 TESTS: perl_syntax
-2017_03_13_01_46_23 : ALL 1 TESTS SUCCESSFUL
-2017_03_13_01_57_33 : ALL 1 TESTS SUCCESSFUL
-2017_03_13_01_59_42 : FAILED 1/2 TESTS: ll_env_password
-2017_03_13_01_59_46 : ALL 1 TESTS SUCCESSFUL
-2017_03_13_01_59_49 : ALL 2 TESTS SUCCESSFUL
-2017_03_13_02_00_32 : ALL 1 TESTS SUCCESSFUL
-2017_03_13_02_00_36 : ALL 2 TESTS SUCCESSFUL
-2017_03_13_02_03_13 : ALL 1 TESTS SUCCESSFUL
-2017_03_13_02_03_47 : ALL 3 TESTS SUCCESSFUL
-2017_03_13_02_04_41 : ALL 1 TESTS SUCCESSFUL
-2017_03_13_02_05_19 : ALL 1 TESTS SUCCESSFUL
-2017_03_13_02_06_12 : ALL 1 TESTS SUCCESSFUL
-2017_03_13_02_06_17 : ALL 2 TESTS SUCCESSFUL
-2017_03_13_02_07_52 : ALL 1 TESTS SUCCESSFUL
-2017_03_13_02_08_00 : ALL 3 TESTS SUCCESSFUL
-2017_03_13_02_08_18 : ALL 1 TESTS SUCCESSFUL
-2017_03_13_02_08_21 : ALL 2 TESTS SUCCESSFUL
-2017_03_13_02_08_32 : ALL 1 TESTS SUCCESSFUL
-2017_03_13_02_08_40 : ALL 3 TESTS SUCCESSFUL
-2017_03_13_02_09_33 : ALL 1 TESTS SUCCESSFUL
-2017_03_13_02_09_42 : ALL 3 TESTS SUCCESSFUL
-2017_03_13_02_10_58 : ALL 1 TESTS SUCCESSFUL
-2017_03_13_02_11_06 : ALL 3 TESTS SUCCESSFUL
-2017_03_13_02_19_22 : ALL 1 TESTS SUCCESSFUL
-2017_03_13_02_19_30 : ALL 3 TESTS SUCCESSFUL
-2017_03_13_02_21_43 : ALL 1 TESTS SUCCESSFUL
-2017_03_13_02_45_48 : ALL 120 TESTS SUCCESSFUL
-2017_03_13_07_21_17 : ALL 1 TESTS SUCCESSFUL
-2017_03_13_07_21_30 : ALL 2 TESTS SUCCESSFUL
-2017_03_13_07_21_55 : ALL 1 TESTS SUCCESSFUL
-2017_03_13_07_22_14 : ALL 2 TESTS SUCCESSFUL
-2017_03_13_07_23_18 : ALL 1 TESTS SUCCESSFUL
-2017_03_13_07_44_06 : FAILED 1/120 TESTS: option_tests
-2017_03_13_14_13_32 : ALL 1 TESTS SUCCESSFUL
-2017_03_13_14_34_56 : FAILED 1/120 TESTS: option_tests
-2017_03_13_15_18_35 : ALL 1 TESTS SUCCESSFUL
-2017_03_13_15_39_17 : FAILED 1/120 TESTS: option_tests
-2017_03_14_01_56_18 : ALL 1 TESTS SUCCESSFUL
-2017_03_14_01_57_27 : ALL 1 TESTS SUCCESSFUL
-2017_03_14_01_59_20 : ALL 1 TESTS SUCCESSFUL
-2017_03_14_02_19_32 : FAILED 1/120 TESTS: option_tests
-2017_03_14_18_29_18 : ALL 1 TESTS SUCCESSFUL
-2017_03_14_18_30_35 : ALL 2 TESTS SUCCESSFUL
-2017_03_14_18_38_22 : ALL 1 TESTS SUCCESSFUL
-2017_03_14_18_43_17 : ALL 2 TESTS SUCCESSFUL
-2017_03_14_18_49_37 : ALL 1 TESTS SUCCESSFUL
-2017_03_14_18_54_38 : ALL 2 TESTS SUCCESSFUL
-2017_03_14_18_54_54 : ALL 1 TESTS SUCCESSFUL
-2017_03_14_18_56_26 : ALL 1 TESTS SUCCESSFUL
-2017_03_14_18_56_54 : ALL 2 TESTS SUCCESSFUL
-2017_03_14_18_57_06 : ALL 1 TESTS SUCCESSFUL
-2017_03_14_18_57_37 : ALL 2 TESTS SUCCESSFUL
-2017_03_14_18_58_05 : ALL 1 TESTS SUCCESSFUL
-2017_03_14_19_03_39 : ALL 2 TESTS SUCCESSFUL
-2017_03_14_19_06_00 : ALL 1 TESTS SUCCESSFUL
-2017_03_14_19_06_29 : ALL 2 TESTS SUCCESSFUL
-2017_03_14_19_07_18 : ALL 1 TESTS SUCCESSFUL
-2017_03_18_00_18_47 : ALL 1 TESTS SUCCESSFUL
-2017_03_18_00_40_07 : ALL 120 TESTS SUCCESSFUL
-2017_03_20_07_24_32 : ALL 1 TESTS SUCCESSFUL
-2017_03_20_07_25_45 : ALL 2 TESTS SUCCESSFUL
-2017_03_20_07_26_09 : ALL 1 TESTS SUCCESSFUL
-2017_03_20_07_27_10 : ALL 1 TESTS SUCCESSFUL
-2017_03_20_07_27_54 : ALL 2 TESTS SUCCESSFUL
-2017_03_20_13_39_58 : ALL 1 TESTS SUCCESSFUL
-2017_03_20_13_40_42 : ALL 2 TESTS SUCCESSFUL
-2017_03_20_14_15_06 : ALL 1 TESTS SUCCESSFUL
-2017_03_20_14_15_48 : ALL 2 TESTS SUCCESSFUL
-2017_03_20_14_31_30 : ALL 1 TESTS SUCCESSFUL
-2017_03_20_14_32_13 : ALL 2 TESTS SUCCESSFUL
-2017_03_20_14_46_49 : ALL 1 TESTS SUCCESSFUL
-2017_03_20_14_47_23 : ALL 2 TESTS SUCCESSFUL
-2017_03_20_14_48_00 : ALL 1 TESTS SUCCESSFUL
-2017_03_20_14_48_42 : ALL 2 TESTS SUCCESSFUL
-2017_03_20_21_20_18 : ALL 1 TESTS SUCCESSFUL
-2017_03_20_21_20_22 : ALL 2 TESTS SUCCESSFUL
-2017_03_20_21_21_37 : ALL 1 TESTS SUCCESSFUL
-2017_03_20_21_21_41 : ALL 2 TESTS SUCCESSFUL
-2017_03_20_21_22_18 : ALL 1 TESTS SUCCESSFUL
-2017_03_20_21_22_22 : ALL 2 TESTS SUCCESSFUL
-2017_03_20_23_32_03 : ALL 1 TESTS SUCCESSFUL
-2017_03_20_23_32_44 : ALL 2 TESTS SUCCESSFUL
-2017_03_20_23_33_06 : ALL 1 TESTS SUCCESSFUL
-2017_03_20_23_33_42 : ALL 2 TESTS SUCCESSFUL
-2017_03_20_23_33_45 : ALL 1 TESTS SUCCESSFUL
-2017_03_20_23_34_59 : ALL 1 TESTS SUCCESSFUL
-2017_03_20_23_35_58 : ALL 1 TESTS SUCCESSFUL
-2017_03_20_23_37_16 : ALL 1 TESTS SUCCESSFUL
-2017_03_20_23_37_57 : ALL 2 TESTS SUCCESSFUL
-2017_03_20_23_38_37 : ALL 1 TESTS SUCCESSFUL
-2017_03_20_23_39_18 : ALL 2 TESTS SUCCESSFUL
-2017_03_20_23_39_24 : ALL 1 TESTS SUCCESSFUL
-2017_03_20_23_40_55 : ALL 2 TESTS SUCCESSFUL
-2017_03_20_23_42_24 : ALL 1 TESTS SUCCESSFUL
-2017_03_20_23_43_56 : ALL 2 TESTS SUCCESSFUL
-2017_03_20_23_56_25 : ALL 1 TESTS SUCCESSFUL
-2017_03_20_23_58_47 : ALL 1 TESTS SUCCESSFUL
-2017_03_20_23_59_14 : ALL 2 TESTS SUCCESSFUL
-2017_03_21_00_00_07 : ALL 1 TESTS SUCCESSFUL
-2017_03_21_00_00_53 : ALL 2 TESTS SUCCESSFUL
-2017_03_21_00_01_15 : ALL 1 TESTS SUCCESSFUL
-2017_03_21_00_02_01 : ALL 2 TESTS SUCCESSFUL
-2017_03_21_00_05_33 : ALL 1 TESTS SUCCESSFUL
-2017_03_21_00_10_02 : ALL 1 TESTS SUCCESSFUL
-2017_03_21_00_10_47 : ALL 2 TESTS SUCCESSFUL
-2017_03_21_00_11_21 : ALL 1 TESTS SUCCESSFUL
-2017_03_21_00_11_48 : ALL 2 TESTS SUCCESSFUL
-2017_03_21_00_14_10 : ALL 1 TESTS SUCCESSFUL
-2017_03_21_00_14_45 : ALL 2 TESTS SUCCESSFUL
-2017_03_21_00_15_25 : ALL 1 TESTS SUCCESSFUL
-2017_03_21_00_16_24 : ALL 2 TESTS SUCCESSFUL
-2017_03_21_00_21_18 : ALL 1 TESTS SUCCESSFUL
-2017_03_21_00_22_20 : ALL 1 TESTS SUCCESSFUL
-2017_03_21_08_27_10 : ALL 1 TESTS SUCCESSFUL
-2017_03_21_08_48_16 : ALL 120 TESTS SUCCESSFUL
-2017_03_24_23_47_54 : ALL 1 TESTS SUCCESSFUL
-2017_03_24_23_48_02 : ALL 2 TESTS SUCCESSFUL
-2017_03_24_23_49_04 : ALL 1 TESTS SUCCESSFUL
-2017_03_24_23_49_25 : ALL 2 TESTS SUCCESSFUL
-2017_04_06_01_07_51 : ALL 1 TESTS SUCCESSFUL
-2017_04_06_01_29_21 : ALL 120 TESTS SUCCESSFUL
-2017_04_12_14_53_49 : ALL 1 TESTS SUCCESSFUL
-2017_04_12_15_15_38 : ALL 120 TESTS SUCCESSFUL
-2017_04_12_17_14_51 : ALL 1 TESTS SUCCESSFUL
-2017_04_12_17_14_51 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_12_17_16_50 : ALL 1 TESTS SUCCESSFUL
-2017_04_12_17_16_56 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_12_17_19_23 : ALL 1 TESTS SUCCESSFUL
-2017_04_12_17_19_32 : ALL 2 TESTS SUCCESSFUL
-2017_04_12_17_20_55 : ALL 1 TESTS SUCCESSFUL
-2017_04_12_17_21_03 : ALL 2 TESTS SUCCESSFUL
-2017_04_12_17_22_22 : ALL 1 TESTS SUCCESSFUL
-2017_04_12_17_22_30 : ALL 2 TESTS SUCCESSFUL
-2017_04_12_17_23_23 : ALL 1 TESTS SUCCESSFUL
-2017_04_12_17_23_29 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_12_17_25_32 : ALL 1 TESTS SUCCESSFUL
-2017_04_12_17_25_38 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_12_17_26_16 : ALL 1 TESTS SUCCESSFUL
-2017_04_12_17_26_22 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_12_17_27_01 : ALL 1 TESTS SUCCESSFUL
-2017_04_12_17_27_07 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_12_17_42_43 : ALL 1 TESTS SUCCESSFUL
-2017_04_12_17_42_49 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_12_21_37_27 : ALL 1 TESTS SUCCESSFUL
-2017_04_12_21_37_33 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_13_02_40_50 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_02_40_56 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_13_02_41_49 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_02_41_51 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_13_02_42_26 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_02_42_34 : FAILED 1/2 TESTS: option_tests_in_var_tmp_sub
-2017_04_13_02_42_46 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_02_42_48 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_13_02_47_38 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_02_47_40 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_13_02_48_31 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_02_48_33 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_13_02_49_33 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_02_49_35 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_13_02_50_57 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_02_50_59 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_13_02_52_56 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_02_52_58 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_13_02_53_30 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_02_53_31 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_13_02_55_54 : FAILED 1/1 TESTS: perl_syntax
-2017_04_13_02_56_20 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_02_56_21 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_13_03_01_02 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_03_01_04 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_13_03_06_21 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_03_06_23 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_13_03_08_09 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_03_08_11 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_13_03_09_00 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_03_09_02 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_13_03_09_37 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_03_09_39 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_13_03_11_22 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_03_11_24 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_13_03_12_50 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_03_12_52 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_13_03_14_34 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_03_14_36 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_13_03_16_50 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_03_16_52 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_13_03_17_27 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_03_17_28 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_13_03_18_45 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_03_18_47 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_13_03_18_56 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_03_19_03 : FAILED 1/2 TESTS: option_tests_in_var_tmp_sub
-2017_04_13_03_19_42 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_03_19_49 : FAILED 1/2 TESTS: option_tests_in_var_tmp_sub
-2017_04_13_03_20_32 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_03_20_34 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_13_03_51_30 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_03_51_32 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_13_14_25_27 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_14_25_29 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_13_14_33_31 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_14_33_33 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_13_14_41_28 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_14_41_30 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_13_14_46_33 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_14_46_35 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_13_14_50_16 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_14_50_18 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_13_14_50_36 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_14_50_38 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_13_14_52_56 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_14_52_58 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_13_15_24_18 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_15_24_20 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_13_15_35_37 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_15_35_39 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_13_15_38_25 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_15_38_27 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_04_13_15_40_05 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_15_40_07 : ALL 2 TESTS SUCCESSFUL
-2017_04_13_15_40_57 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_15_40_57 : FAILED 1/2 TESTS: option_tests_in_var
-2017_04_13_15_41_10 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_15_41_18 : FAILED 1/2 TESTS: option_tests_in_var_tmp_sub
-2017_04_13_15_41_45 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_15_41_54 : ALL 2 TESTS SUCCESSFUL
-2017_04_13_15_42_16 : ALL 1 TESTS SUCCESSFUL
-2017_04_13_15_42_23 : ALL 2 TESTS SUCCESSFUL
-2017_04_22_14_58_20 : ALL 1 TESTS SUCCESSFUL
-2017_04_22_15_02_48 : ALL 1 TESTS SUCCESSFUL
-2017_04_22_15_23_15 : ALL 122 TESTS SUCCESSFUL
-2017_04_24_04_53_15 : ALL 1 TESTS SUCCESSFUL
-2017_04_24_04_53_15 : FAILED 1/2 TESTS: passfile_noexist
-2017_04_24_04_53_55 : ALL 1 TESTS SUCCESSFUL
-2017_04_24_04_53_55 : FAILED 1/2 TESTS: passfile_noexistee
-2017_04_24_04_54_12 : ALL 1 TESTS SUCCESSFUL
-2017_04_24_04_54_18 : FAILED 1/2 TESTS: passfile_noexist
-2017_04_24_05_02_43 : ALL 1 TESTS SUCCESSFUL
-2017_04_24_05_02_46 : FAILED 1/2 TESTS: passfile_noexist
-2017_04_24_05_06_35 : ALL 1 TESTS SUCCESSFUL
-2017_04_24_05_06_38 : ALL 2 TESTS SUCCESSFUL
-2017_04_24_05_07_01 : ALL 1 TESTS SUCCESSFUL
-2017_04_24_05_07_03 : FAILED 1/2 TESTS: passfile_noexist
-2017_04_24_12_17_02 : ALL 1 TESTS SUCCESSFUL
-2017_04_24_12_17_41 : ALL 1 TESTS SUCCESSFUL
-2017_04_24_12_17_47 : ALL 3 TESTS SUCCESSFUL
-2017_04_24_12_54_42 : ALL 1 TESTS SUCCESSFUL
-2017_04_24_13_18_16 : FAILED 4/124 TESTS: office365_justconnect_inet4_inet6 ll_ask_password ll_env_password ll_authmech_xoauth2_json_gmail
-2017_04_24_15_48_46 : ALL 1 TESTS SUCCESSFUL
-2017_04_24_15_48_52 : ALL 3 TESTS SUCCESSFUL
-2017_04_24_15_51_01 : ALL 1 TESTS SUCCESSFUL
-2017_04_24_15_51_07 : ALL 3 TESTS SUCCESSFUL
-2017_04_24_22_52_47 : ALL 1 TESTS SUCCESSFUL
-2017_04_24_23_16_56 : FAILED 3/124 TESTS: option_tests option_tests_in_var_tmp option_tests_in_var_tmp_sub
-2017_04_25_01_00_30 : ALL 1 TESTS SUCCESSFUL
-2017_04_25_01_22_09 : ALL 124 TESTS SUCCESSFUL
-2017_04_25_16_13_59 : ALL 1 TESTS SUCCESSFUL
-2017_04_25_16_43_26 : ALL 124 TESTS SUCCESSFUL
-2017_04_25_18_13_58 : ALL 1 TESTS SUCCESSFUL
-2017_04_25_18_35_45 : FAILED 1/124 TESTS: free_ssl
-2017_04_25_22_54_46 : ALL 1 TESTS SUCCESSFUL
-2017_04_25_22_55_14 : ALL 1 TESTS SUCCESSFUL
-2017_04_26_01_17_24 : ALL 1 TESTS SUCCESSFUL
-2017_04_26_01_37_52 : ALL 124 TESTS SUCCESSFUL
-2017_04_26_13_22_27 : ALL 1 TESTS SUCCESSFUL
-2017_04_26_13_22_38 : ALL 2 TESTS SUCCESSFUL
-2017_04_26_13_23_38 : ALL 1 TESTS SUCCESSFUL
-2017_04_26_13_23_47 : ALL 2 TESTS SUCCESSFUL
-2017_04_26_13_24_25 : ALL 1 TESTS SUCCESSFUL
-2017_04_26_13_24_29 : ALL 2 TESTS SUCCESSFUL
-2017_04_26_13_25_23 : ALL 1 TESTS SUCCESSFUL
-2017_04_26_13_25_27 : ALL 2 TESTS SUCCESSFUL
-2017_04_26_13_26_16 : ALL 1 TESTS SUCCESSFUL
-2017_04_26_13_26_19 : ALL 2 TESTS SUCCESSFUL
-2017_04_26_13_26_44 : ALL 1 TESTS SUCCESSFUL
-2017_04_26_13_26_47 : ALL 2 TESTS SUCCESSFUL
-2017_04_26_13_34_11 : ALL 1 TESTS SUCCESSFUL
-2017_04_26_13_34_16 : ALL 2 TESTS SUCCESSFUL
-2017_04_26_13_34_47 : ALL 1 TESTS SUCCESSFUL
-2017_04_26_13_34_51 : ALL 2 TESTS SUCCESSFUL
-2017_04_26_13_35_14 : ALL 1 TESTS SUCCESSFUL
-2017_04_26_13_35_24 : ALL 2 TESTS SUCCESSFUL
-2017_04_26_19_54_31 : ALL 1 TESTS SUCCESSFUL
-2017_04_26_20_16_24 : ALL 124 TESTS SUCCESSFUL
-2017_05_02_21_19_15 : ALL 1 TESTS SUCCESSFUL
-2017_05_02_21_41_14 : ALL 124 TESTS SUCCESSFUL
-2017_05_03_04_47_52 : ALL 1 TESTS SUCCESSFUL
-2017_05_03_04_48_06 : ALL 2 TESTS SUCCESSFUL
-2017_05_23_09_45_39 : ALL 1 TESTS SUCCESSFUL
-2017_05_23_09_46_39 : ALL 2 TESTS SUCCESSFUL
-2017_05_23_11_04_56 : ALL 1 TESTS SUCCESSFUL
-2017_05_23_11_05_02 : ALL 2 TESTS SUCCESSFUL
-2017_05_23_11_05_29 : ALL 1 TESTS SUCCESSFUL
-2017_05_23_11_05_38 : ALL 2 TESTS SUCCESSFUL
-2017_05_23_11_06_18 : ALL 1 TESTS SUCCESSFUL
-2017_05_23_11_06_24 : ALL 2 TESTS SUCCESSFUL
-2017_05_23_11_06_49 : ALL 1 TESTS SUCCESSFUL
-2017_05_23_11_07_20 : ALL 2 TESTS SUCCESSFUL
-2017_05_23_11_07_35 : ALL 1 TESTS SUCCESSFUL
-2017_05_23_11_07_49 : ALL 2 TESTS SUCCESSFUL
-2017_05_30_00_20_13 : ALL 1 TESTS SUCCESSFUL
-2017_05_30_00_20_27 : ALL 2 TESTS SUCCESSFUL
-2017_05_30_00_24_46 : ALL 1 TESTS SUCCESSFUL
-2017_05_30_00_25_01 : ALL 2 TESTS SUCCESSFUL
-2017_05_30_00_26_53 : ALL 1 TESTS SUCCESSFUL
-2017_05_30_00_27_10 : ALL 2 TESTS SUCCESSFUL
-2017_05_30_00_29_25 : ALL 1 TESTS SUCCESSFUL
-2017_05_30_00_29_43 : ALL 2 TESTS SUCCESSFUL
-2017_05_30_00_33_13 : ALL 1 TESTS SUCCESSFUL
-2017_05_30_00_33_15 : ALL 2 TESTS SUCCESSFUL
-2017_05_30_00_33_43 : ALL 1 TESTS SUCCESSFUL
-2017_05_30_00_33_46 : FAILED 1/2 TESTS: inet4_inet6
-2017_05_30_09_27_11 : ALL 1 TESTS SUCCESSFUL
-2017_05_30_09_27_24 : FAILED 1/2 TESTS: ll_regexmess_change_header
-2017_05_30_09_30_20 : ALL 1 TESTS SUCCESSFUL
-2017_05_30_09_30_24 : FAILED 1/2 TESTS: ll_regexmess_change_header
-2017_05_30_09_40_55 : ALL 1 TESTS SUCCESSFUL
-2017_05_30_09_40_59 : FAILED 1/2 TESTS: ll_regexmess_change_header
-2017_05_30_09_45_07 : ALL 1 TESTS SUCCESSFUL
-2017_05_30_09_45_11 : FAILED 1/2 TESTS: ll_regexmess_change_header
-2017_05_30_09_47_03 : ALL 1 TESTS SUCCESSFUL
-2017_05_30_09_47_07 : FAILED 1/2 TESTS: ll_regexmess_change_header
-2017_05_30_09_48_01 : ALL 1 TESTS SUCCESSFUL
-2017_05_30_09_48_05 : FAILED 1/2 TESTS: ll_regexmess_change_header
-2017_05_30_09_49_10 : ALL 1 TESTS SUCCESSFUL
-2017_05_30_09_49_15 : FAILED 1/2 TESTS: ll_regexmess_change_header
-2017_05_30_09_49_55 : ALL 1 TESTS SUCCESSFUL
-2017_05_30_09_49_59 : FAILED 1/2 TESTS: ll_regexmess_change_header
-2017_05_30_09_51_37 : ALL 1 TESTS SUCCESSFUL
-2017_05_30_09_51_41 : FAILED 1/2 TESTS: ll_regexmess_change_header
-2017_05_30_09_52_31 : ALL 1 TESTS SUCCESSFUL
-2017_05_30_09_52_35 : FAILED 1/2 TESTS: ll_regexmess_change_header
-2017_05_30_09_54_18 : ALL 1 TESTS SUCCESSFUL
-2017_05_30_09_54_22 : FAILED 1/2 TESTS: ll_regexmess_change_header
-2017_05_30_09_55_12 : ALL 1 TESTS SUCCESSFUL
-2017_05_30_09_55_16 : FAILED 1/2 TESTS: ll_regexmess_change_header
-2017_05_30_09_56_04 : ALL 1 TESTS SUCCESSFUL
-2017_05_30_09_56_08 : FAILED 1/2 TESTS: ll_regexmess_change_header
-2017_05_30_09_57_03 : ALL 1 TESTS SUCCESSFUL
-2017_05_30_09_57_07 : FAILED 1/2 TESTS: ll_regexmess_change_header
-2017_05_30_09_59_46 : ALL 1 TESTS SUCCESSFUL
-2017_05_30_09_59_50 : FAILED 1/2 TESTS: ll_regexmess_change_header
-2017_05_30_10_00_40 : ALL 1 TESTS SUCCESSFUL
-2017_05_30_10_00_44 : FAILED 1/2 TESTS: ll_regexmess_change_header
-2017_05_30_10_01_24 : ALL 1 TESTS SUCCESSFUL
-2017_05_30_10_01_28 : FAILED 1/2 TESTS: ll_regexmess_change_header
-2017_05_30_10_01_48 : ALL 1 TESTS SUCCESSFUL
-2017_05_30_10_01_52 : FAILED 1/2 TESTS: ll_regexmess_change_header
-2017_05_30_10_02_43 : ALL 1 TESTS SUCCESSFUL
-2017_05_30_10_02_47 : FAILED 1/2 TESTS: ll_regexmess_change_header
-2017_05_30_10_03_24 : ALL 1 TESTS SUCCESSFUL
-2017_05_30_10_03_28 : FAILED 1/2 TESTS: ll_regexmess_change_header
-2017_05_30_10_03_55 : ALL 1 TESTS SUCCESSFUL
-2017_05_30_10_03_59 : FAILED 1/2 TESTS: ll_regexmess_change_header
-2017_05_30_10_04_48 : ALL 1 TESTS SUCCESSFUL
-2017_05_30_10_04_52 : FAILED 1/2 TESTS: ll_regexmess_change_header
-2017_05_30_10_05_31 : ALL 1 TESTS SUCCESSFUL
-2017_05_30_10_05_36 : FAILED 1/2 TESTS: ll_regexmess_change_header
-2017_05_30_10_06_44 : ALL 1 TESTS SUCCESSFUL
-2017_05_30_10_06_49 : FAILED 1/2 TESTS: ll_regexmess_change_header
-2017_05_30_10_08_07 : ALL 1 TESTS SUCCESSFUL
-2017_05_30_10_08_12 : FAILED 1/2 TESTS: ll_regexmess_change_header
-2017_06_01_03_04_51 : ALL 1 TESTS SUCCESSFUL
-2017_06_01_03_05_00 : ALL 2 TESTS SUCCESSFUL
-2017_06_01_03_06_33 : ALL 1 TESTS SUCCESSFUL
-2017_06_01_03_06_37 : ALL 2 TESTS SUCCESSFUL
-2017_06_01_03_07_47 : ALL 1 TESTS SUCCESSFUL
-2017_06_01_03_07_51 : ALL 2 TESTS SUCCESSFUL
-2017_06_01_03_14_30 : ALL 1 TESTS SUCCESSFUL
-2017_06_01_03_14_34 : ALL 2 TESTS SUCCESSFUL
-2017_06_01_03_15_04 : ALL 1 TESTS SUCCESSFUL
-2017_06_01_03_15_08 : ALL 2 TESTS SUCCESSFUL
-2017_06_01_03_15_28 : ALL 1 TESTS SUCCESSFUL
-2017_06_01_03_15_33 : ALL 2 TESTS SUCCESSFUL
-2017_06_01_03_15_55 : ALL 1 TESTS SUCCESSFUL
-2017_06_01_03_15_59 : ALL 2 TESTS SUCCESSFUL
-2017_06_01_03_16_39 : ALL 1 TESTS SUCCESSFUL
-2017_06_01_03_16_43 : ALL 2 TESTS SUCCESSFUL
-2017_06_01_03_17_00 : ALL 1 TESTS SUCCESSFUL
-2017_06_01_03_17_04 : ALL 2 TESTS SUCCESSFUL
-2017_06_01_03_17_38 : ALL 1 TESTS SUCCESSFUL
-2017_06_01_03_17_42 : ALL 2 TESTS SUCCESSFUL
-2017_06_01_03_22_20 : ALL 1 TESTS SUCCESSFUL
-2017_06_01_03_22_24 : ALL 2 TESTS SUCCESSFUL
-2017_06_01_03_23_06 : ALL 1 TESTS SUCCESSFUL
-2017_06_01_03_23_10 : ALL 2 TESTS SUCCESSFUL
-2017_06_01_03_23_58 : ALL 1 TESTS SUCCESSFUL
-2017_06_01_03_24_01 : ALL 2 TESTS SUCCESSFUL
-2017_06_01_03_25_02 : ALL 1 TESTS SUCCESSFUL
-2017_06_01_03_25_05 : ALL 2 TESTS SUCCESSFUL
-2017_06_01_03_25_43 : ALL 1 TESTS SUCCESSFUL
-2017_06_01_03_25_47 : ALL 2 TESTS SUCCESSFUL
-2017_06_01_03_26_23 : ALL 1 TESTS SUCCESSFUL
-2017_06_01_03_26_27 : ALL 2 TESTS SUCCESSFUL
-2017_06_01_03_26_41 : ALL 1 TESTS SUCCESSFUL
-2017_06_01_03_26_45 : ALL 2 TESTS SUCCESSFUL
-2017_06_01_03_27_09 : ALL 1 TESTS SUCCESSFUL
-2017_06_01_03_27_12 : ALL 2 TESTS SUCCESSFUL
-2017_06_01_03_27_30 : ALL 1 TESTS SUCCESSFUL
-2017_06_01_03_27_34 : ALL 2 TESTS SUCCESSFUL
-2017_06_01_03_29_30 : ALL 1 TESTS SUCCESSFUL
-2017_06_01_03_29_34 : ALL 2 TESTS SUCCESSFUL
-2017_06_01_03_29_56 : ALL 1 TESTS SUCCESSFUL
-2017_06_01_03_30_00 : ALL 2 TESTS SUCCESSFUL
-2017_06_01_03_31_42 : ALL 1 TESTS SUCCESSFUL
-2017_06_01_03_31_46 : ALL 2 TESTS SUCCESSFUL
-2017_06_01_03_32_25 : ALL 1 TESTS SUCCESSFUL
-2017_06_01_03_32_29 : ALL 2 TESTS SUCCESSFUL
-2017_06_01_03_33_25 : ALL 1 TESTS SUCCESSFUL
-2017_06_01_03_33_29 : ALL 2 TESTS SUCCESSFUL
-2017_06_01_03_35_54 : ALL 1 TESTS SUCCESSFUL
-2017_06_01_03_35_58 : ALL 2 TESTS SUCCESSFUL
-2017_06_01_03_37_47 : ALL 1 TESTS SUCCESSFUL
-2017_06_01_03_37_51 : ALL 2 TESTS SUCCESSFUL
-2017_06_01_03_42_15 : ALL 1 TESTS SUCCESSFUL
-2017_06_01_03_42_19 : ALL 2 TESTS SUCCESSFUL
-2017_06_02_00_49_51 : ALL 1 TESTS SUCCESSFUL
-2017_06_02_00_50_03 : ALL 2 TESTS SUCCESSFUL
-2017_06_02_00_50_32 : ALL 1 TESTS SUCCESSFUL
-2017_06_02_00_50_37 : ALL 2 TESTS SUCCESSFUL
-2017_06_08_11_31_37 : ALL 1 TESTS SUCCESSFUL
-2017_06_08_11_31_42 : ALL 2 TESTS SUCCESSFUL
-2017_06_08_11_34_47 : ALL 1 TESTS SUCCESSFUL
-2017_06_08_11_34_50 : ALL 2 TESTS SUCCESSFUL
-2017_06_08_11_36_11 : ALL 1 TESTS SUCCESSFUL
-2017_06_08_11_36_14 : FAILED 1/2 TESTS: ll_ssl_justconnect_SSL_VERIFY_PEER
-2017_06_16_12_02_28 : ALL 1 TESTS SUCCESSFUL
-2017_06_16_12_03_28 : ALL 2 TESTS SUCCESSFUL
-2017_06_17_15_53_44 : ALL 1 TESTS SUCCESSFUL
-2017_06_17_15_54_04 : FAILED 1/2 TESTS: yahoo_all
-2017_06_17_15_55_04 : ALL 1 TESTS SUCCESSFUL
-2017_06_17_15_56_04 : ALL 2 TESTS SUCCESSFUL
-2017_06_17_15_57_26 : ALL 1 TESTS SUCCESSFUL
-2017_06_17_15_57_55 : ALL 2 TESTS SUCCESSFUL
-2017_06_17_16_20_24 : ALL 1 TESTS SUCCESSFUL
-2017_06_17_16_21_07 : ALL 2 TESTS SUCCESSFUL
-2017_06_19_17_16_40 : ALL 1 TESTS SUCCESSFUL
-2017_06_19_17_17_19 : ALL 2 TESTS SUCCESSFUL
-2017_06_19_17_18_32 : ALL 1 TESTS SUCCESSFUL
-2017_06_19_17_18_44 : ALL 2 TESTS SUCCESSFUL
-2017_06_19_17_40_07 : ALL 1 TESTS SUCCESSFUL
-2017_06_19_17_40_16 : ALL 2 TESTS SUCCESSFUL
-2017_06_19_17_41_03 : ALL 1 TESTS SUCCESSFUL
-2017_06_19_17_41_11 : ALL 2 TESTS SUCCESSFUL
-2017_07_06_05_24_46 : ALL 1 TESTS SUCCESSFUL
-2017_07_06_05_54_01 : FAILED 1/124 TESTS: office365_justconnect_inet4_inet6
-2017_07_06_13_12_23 : ALL 1 TESTS SUCCESSFUL
-2017_07_06_13_15_17 : FAILED 1/2 TESTS: office365_justconnect_inet4_inet6
-2017_07_06_14_03_55 : ALL 1 TESTS SUCCESSFUL
-2017_07_06_14_04_17 : ALL 2 TESTS SUCCESSFUL
-2017_07_06_14_04_39 : ALL 1 TESTS SUCCESSFUL
-2017_07_06_14_30_01 : ALL 124 TESTS SUCCESSFUL
-2017_07_06_14_42_45 : ALL 1 TESTS SUCCESSFUL
-2017_07_06_14_42_49 : ALL 2 TESTS SUCCESSFUL
-2017_07_06_14_43_54 : ALL 1 TESTS SUCCESSFUL
-2017_07_06_14_44_00 : ALL 2 TESTS SUCCESSFUL
-2017_07_06_14_44_42 : ALL 1 TESTS SUCCESSFUL
-2017_07_06_14_44_48 : ALL 2 TESTS SUCCESSFUL
-2017_07_06_14_45_52 : ALL 1 TESTS SUCCESSFUL
-2017_07_06_14_45_55 : ALL 2 TESTS SUCCESSFUL
-2017_07_06_14_48_24 : ALL 1 TESTS SUCCESSFUL
-2017_07_06_14_48_24 : FAILED 1/2 TESTS: ks2ipv6.lamiral.info
-2017_07_06_14_48_41 : ALL 1 TESTS SUCCESSFUL
-2017_07_06_14_48_47 : ALL 2 TESTS SUCCESSFUL
-2017_07_06_14_53_30 : ALL 1 TESTS SUCCESSFUL
-2017_07_06_14_53_48 : ALL 5 TESTS SUCCESSFUL
-2017_07_08_00_16_24 : ALL 1 TESTS SUCCESSFUL
-2017_07_08_00_39_03 : FAILED 5/130 TESTS: option_tests option_tests_in_var_tmp option_tests_in_var_tmp_sub testlive testlive6
-2017_07_08_00_44_01 : ALL 1 TESTS SUCCESSFUL
-2017_07_08_01_05_59 : FAILED 3/130 TESTS: option_tests option_tests_in_var_tmp option_tests_in_var_tmp_sub
-2017_07_08_01_21_18 : ALL 1 TESTS SUCCESSFUL
-2017_07_08_01_43_17 : ALL 130 TESTS SUCCESSFUL
-2017_07_21_00_24_17 : ALL 1 TESTS SUCCESSFUL
-2017_07_21_00_25_43 : ALL 2 TESTS SUCCESSFUL
-2017_07_21_00_27_20 : ALL 1 TESTS SUCCESSFUL
-2017_07_21_00_27_35 : ALL 2 TESTS SUCCESSFUL
-2017_07_21_00_28_14 : ALL 1 TESTS SUCCESSFUL
-2017_07_21_00_28_29 : ALL 2 TESTS SUCCESSFUL
-2017_07_21_00_30_04 : ALL 1 TESTS SUCCESSFUL
-2017_07_21_00_30_13 : ALL 2 TESTS SUCCESSFUL
-2017_07_21_00_33_33 : ALL 1 TESTS SUCCESSFUL
-2017_07_21_00_33_56 : ALL 2 TESTS SUCCESSFUL
-2017_07_21_00_42_02 : ALL 1 TESTS SUCCESSFUL
-2017_07_21_00_51_05 : ALL 1 TESTS SUCCESSFUL
-2017_07_21_00_51_20 : ALL 2 TESTS SUCCESSFUL
-2017_07_21_00_52_18 : ALL 1 TESTS SUCCESSFUL
-2017_07_21_00_52_33 : ALL 2 TESTS SUCCESSFUL
-2017_07_21_01_16_17 : ALL 1 TESTS SUCCESSFUL
-2017_07_21_01_16_31 : ALL 2 TESTS SUCCESSFUL
-2017_07_21_01_16_56 : ALL 1 TESTS SUCCESSFUL
-2017_07_21_01_17_14 : ALL 2 TESTS SUCCESSFUL
-2017_07_22_16_42_03 : ALL 1 TESTS SUCCESSFUL
-2017_07_22_17_17_05 : FAILED 4/130 TESTS: option_tests option_tests_in_var_tmp option_tests_in_var_tmp_sub free_ssl
-2017_07_24_10_05_38 : ALL 1 TESTS SUCCESSFUL
-2017_07_27_15_35_41 : ALL 1 TESTS SUCCESSFUL
-2017_07_27_15_58_56 : FAILED 2/130 TESTS: option_tests_in_var_tmp option_tests_in_var_tmp_sub
-2017_07_27_17_32_53 : ALL 1 TESTS SUCCESSFUL
-2017_07_27_17_33_03 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_07_27_17_34_48 : ALL 1 TESTS SUCCESSFUL
-2017_07_27_17_34_58 : FAILED 1/2 TESTS: option_tests_in_var_tmp
-2017_07_27_17_37_16 : ALL 1 TESTS SUCCESSFUL
-2017_07_27_17_37_27 : ALL 2 TESTS SUCCESSFUL
-2017_07_27_17_38_18 : ALL 1 TESTS SUCCESSFUL
-2017_07_27_18_01_28 : ALL 130 TESTS SUCCESSFUL
-2017_08_27_00_19_42 : ALL 1 TESTS SUCCESSFUL
-2017_08_27_00_42_29 : ALL 130 TESTS SUCCESSFUL
-2017_08_28_21_23_19 : ALL 1 TESTS SUCCESSFUL
-2017_08_28_21_46_41 : FAILED 4/130 TESTS: option_tests option_tests_in_var_tmp option_tests_in_var_tmp_sub free_ssl
-2017_08_28_23_18_30 : ALL 1 TESTS SUCCESSFUL
-2017_08_28_23_30_05 : FAILED 64/130 TESTS: option_tests option_tests_in_var_tmp option_tests_in_var_tmp_sub ll_oneemail ll_nosubscribe ll_justfoldersizes ll_authmd5 ll_authmd51 ll_authmd52 ll_noauthmd5 ll_maxage ll_maxsize ll_skipsize ll_skipheader ll_include ll_exclude ll_exclude_INBOX ll_regextrans2 ll_regextrans2_subfolder ll_sep2 ll_skipmess ll_skipmess_8bits ll_pipemess ll_pipemess_catcat ll_justconnect ll_justconnect_ipv6 ll_justconnect_ipv6_nossl ks_justconnect_ipv6 ks_justconnect_ipv6_nossl ll_justlogin ll_justconnect_devel ll_ssl ll_ssl_justconnect ll_ssl_justlogin ll_tls_justconnect ll_tls_justlogin ll_tls ll_authmech_PLAIN ll_authmech_xoauth2_gmail ll_authmech_xoauth2_json_gmail ll_authmech_LOGIN ll_authmech_CRAMMD5 ll_authuser ll_delete2 ll_delete ll_folderrec ll_newmessage ll_usecache ll_usecache_noheader ll_usecache_debugcache ll_nousecache ll_delete2foldersonly_NEW_3 ll_delete2foldersonly ll_delete2foldersonly_tmp ll_delete2foldersbutnot ll_folder_create ll_folder_create_INBOX_Inbox ll_useuid ll_noheader_force ll_noheader ll_domino1_domino2 ll_domino2 testslive testslive6
-2017_08_29_00_26_13 : ALL 1 TESTS SUCCESSFUL
-2017_08_29_00_41_34 : FAILED 43/130 TESTS: option_tests option_tests_in_var_tmp option_tests_in_var_tmp_sub gmail gmail_gmail gmail_gmail_INBOX gmail_gmail_folderfirst yahoo_all free_ssl office365_justconnect_inet4_inet6 office365_justconnect_tls_SSL_verify_mode_1 ll_ask_password ll_env_password ll_timeout ll_folder ll_folder_noexist ll_folder_mixfolders ll_oneemail ll_buffersize ll_justfolders_delete1emptyfolders ll_prefix12 ll_nosyncinternaldates ll_idatefromheader ll_folder_rev ll_subscribed ll_nosubscribe ll_justfoldersizes ll_authmd5 ll_authmd51 ll_authmd52 ll_noauthmd5 ll_maxage ll_maxsize ll_skipsize ll_skipheader ll_include ll_exclude ll_exclude_INBOX ll_regextrans2 ll_regextrans2_subfolder ll_sep2 ll_skipmess ll_skipmess_8bits
-2017_08_29_01_08_37 : ALL 1 TESTS SUCCESSFUL
-2017_08_29_02_53_01 : ALL 1 TESTS SUCCESSFUL
-2017_08_29_02_54_46 : ALL 1 TESTS SUCCESSFUL
-2017_08_29_03_17_18 : ALL 1 TESTS SUCCESSFUL
-2017_08_29_03_22_56 : ALL 1 TESTS SUCCESSFUL
-2017_08_29_05_13_32 : ALL 1 TESTS SUCCESSFUL
-2017_08_31_04_12_32 : ALL 1 TESTS SUCCESSFUL
-2017_08_31_04_35_55 : ALL 130 TESTS SUCCESSFUL
-2017_08_31_06_14_44 : ALL 1 TESTS SUCCESSFUL
-2017_08_31_06_37_10 : ALL 130 TESTS SUCCESSFUL
-2017_09_03_06_12_35 : ALL 1 TESTS SUCCESSFUL
-2017_09_03_06_36_17 : ALL 130 TESTS SUCCESSFUL
-2017_09_03_15_17_33 : ALL 1 TESTS SUCCESSFUL
-2017_09_05_10_31_24 : ALL 1 TESTS SUCCESSFUL
-2017_09_05_10_31_39 : ALL 2 TESTS SUCCESSFUL
-2017_09_05_10_33_57 : ALL 1 TESTS SUCCESSFUL
-2017_09_05_10_34_07 : ALL 2 TESTS SUCCESSFUL
-2017_09_05_10_35_54 : ALL 1 TESTS SUCCESSFUL
-2017_09_05_10_36_05 : ALL 2 TESTS SUCCESSFUL
-2017_09_05_11_19_50 : ALL 1 TESTS SUCCESSFUL
-2017_09_05_11_20_02 : ALL 2 TESTS SUCCESSFUL
-2017_09_05_11_21_07 : ALL 1 TESTS SUCCESSFUL
-2017_09_05_11_21_17 : ALL 2 TESTS SUCCESSFUL
-2017_09_05_11_22_19 : ALL 1 TESTS SUCCESSFUL
-2017_09_05_11_22_29 : ALL 2 TESTS SUCCESSFUL
-2017_09_05_11_38_16 : ALL 1 TESTS SUCCESSFUL
-2017_09_05_11_38_31 : ALL 2 TESTS SUCCESSFUL
-2017_09_05_11_39_19 : ALL 1 TESTS SUCCESSFUL
-2017_09_05_11_39_32 : ALL 2 TESTS SUCCESSFUL
-2017_09_05_11_40_49 : ALL 1 TESTS SUCCESSFUL
-2017_09_05_11_41_33 : ALL 2 TESTS SUCCESSFUL
-2017_09_05_17_18_12 : ALL 1 TESTS SUCCESSFUL
-2017_09_05_17_44_28 : ALL 130 TESTS SUCCESSFUL
-2017_09_05_18_16_27 : ALL 1 TESTS SUCCESSFUL
-2017_09_05_18_47_25 : ALL 130 TESTS SUCCESSFUL
-2017_09_22_11_53_31 : ALL 1 TESTS SUCCESSFUL
-2017_09_22_12_17_24 : FAILED 3/130 TESTS: option_tests option_tests_in_var_tmp option_tests_in_var_tmp_sub
-2017_10_01_04_46_56 : ALL 1 TESTS SUCCESSFUL
-2017_10_01_04_48_18 : ALL 2 TESTS SUCCESSFUL
-2017_10_01_17_03_45 : ALL 1 TESTS SUCCESSFUL
-2017_10_01_17_06_54 : ALL 1 TESTS SUCCESSFUL
-2017_10_01_17_07_05 : ALL 4 TESTS SUCCESSFUL
-2017_10_01_19_28_37 : ALL 1 TESTS SUCCESSFUL
-2017_10_01_19_52_29 : FAILED 3/130 TESTS: option_tests option_tests_in_var_tmp option_tests_in_var_tmp_sub
-2017_10_02_14_22_42 : ALL 1 TESTS SUCCESSFUL
-2017_10_02_14_47_40 : ALL 130 TESTS SUCCESSFUL
-2017_10_02_14_57_57 : ALL 1 TESTS SUCCESSFUL
-2017_10_02_14_57_59 : ALL 2 TESTS SUCCESSFUL
-2017_10_02_15_01_10 : ALL 1 TESTS SUCCESSFUL
-2017_10_02_15_01_12 : ALL 2 TESTS SUCCESSFUL
-2017_10_02_15_01_40 : ALL 1 TESTS SUCCESSFUL
-2017_10_02_15_01_43 : FAILED 1/2 TESTS: ll_abort_nopidfile
-2017_10_02_15_02_23 : ALL 1 TESTS SUCCESSFUL
-2017_10_02_15_02_25 : ALL 2 TESTS SUCCESSFUL
-2017_10_02_15_03_48 : ALL 1 TESTS SUCCESSFUL
-2017_10_02_15_03_50 : ALL 2 TESTS SUCCESSFUL
-2017_10_02_15_04_50 : ALL 1 TESTS SUCCESSFUL
-2017_10_02_15_04_54 : ALL 3 TESTS SUCCESSFUL
-2017_10_02_15_05_36 : ALL 1 TESTS SUCCESSFUL
-2017_10_02_15_05_46 : ALL 3 TESTS SUCCESSFUL
-2017_10_02_15_05_59 : ALL 1 TESTS SUCCESSFUL
-2017_10_02_15_06_07 : ALL 2 TESTS SUCCESSFUL
-2017_10_02_15_08_59 : ALL 1 TESTS SUCCESSFUL
-2017_10_02_15_09_06 : FAILED 1/2 TESTS: ll_abort
-2017_10_02_15_09_26 : ALL 1 TESTS SUCCESSFUL
-2017_10_02_15_09_33 : ALL 2 TESTS SUCCESSFUL
-2017_10_02_15_11_41 : ALL 1 TESTS SUCCESSFUL
-2017_10_02_15_11_48 : FAILED 1/2 TESTS: ll_abort
-2017_10_02_15_13_08 : ALL 1 TESTS SUCCESSFUL
-2017_10_02_15_13_15 : ALL 2 TESTS SUCCESSFUL
-2017_10_02_15_13_45 : ALL 1 TESTS SUCCESSFUL
-2017_10_02_15_13_52 : ALL 2 TESTS SUCCESSFUL
-2017_10_02_15_31_52 : ALL 1 TESTS SUCCESSFUL
-2017_10_02_15_31_59 : FAILED 1/2 TESTS: ll_abort
-2017_10_02_15_32_30 : ALL 1 TESTS SUCCESSFUL
-2017_10_02_15_32_38 : FAILED 1/2 TESTS: ll_abort
-2017_10_02_15_34_17 : ALL 1 TESTS SUCCESSFUL
-2017_10_02_15_34_24 : FAILED 1/2 TESTS: ll_abort
-2017_10_02_15_34_44 : ALL 1 TESTS SUCCESSFUL
-2017_10_02_15_34_51 : ALL 2 TESTS SUCCESSFUL
-2017_10_02_22_35_25 : ALL 1 TESTS SUCCESSFUL
-2017_10_02_22_36_16 : ALL 1 TESTS SUCCESSFUL
-2017_10_02_23_00_14 : ALL 133 TESTS SUCCESSFUL
-2017_10_04_18_54_47 : ALL 1 TESTS SUCCESSFUL
-2017_10_04_18_54_55 : ALL 2 TESTS SUCCESSFUL
-2017_10_04_19_48_40 : ALL 1 TESTS SUCCESSFUL
-2017_10_04_19_48_50 : FAILED 1/2 TESTS: ll_pidfilelocking
-2017_10_04_19_49_38 : ALL 1 TESTS SUCCESSFUL
-2017_10_04_19_49_48 : ALL 2 TESTS SUCCESSFUL
-2017_10_27_14_29_00 : ALL 1 TESTS SUCCESSFUL
-2017_10_27_14_29_03 : ALL 2 TESTS SUCCESSFUL
-2017_10_27_14_29_20 : ALL 1 TESTS SUCCESSFUL
-2017_10_27_14_29_24 : ALL 2 TESTS SUCCESSFUL
-2017_10_27_14_31_50 : ALL 1 TESTS SUCCESSFUL
-2017_10_27_14_31_52 : FAILED 1/2 TESTS: option_extra_arguments
-2017_10_27_14_32_11 : ALL 1 TESTS SUCCESSFUL
-2017_10_27_14_32_21 : FAILED 1/2 TESTS: option_extra_arguments
-2017_10_27_14_33_57 : ALL 1 TESTS SUCCESSFUL
-2017_10_27_14_33_59 : ALL 2 TESTS SUCCESSFUL
-2017_10_28_01_28_38 : ALL 1 TESTS SUCCESSFUL
-2017_10_28_01_28_46 : ALL 2 TESTS SUCCESSFUL
-2017_10_28_01_30_23 : ALL 1 TESTS SUCCESSFUL
-2017_10_28_01_30_28 : ALL 2 TESTS SUCCESSFUL
-2017_10_28_01_31_07 : ALL 1 TESTS SUCCESSFUL
-2017_10_28_01_31_12 : ALL 2 TESTS SUCCESSFUL
-2017_10_28_01_31_48 : ALL 1 TESTS SUCCESSFUL
-2017_10_28_01_31_52 : ALL 2 TESTS SUCCESSFUL
-2017_10_28_23_25_09 : FAILED 1/1 TESTS: perl_syntax
-2017_10_30_20_46_46 : ALL 1 TESTS SUCCESSFUL
-2017_10_30_20_46_48 : ALL 2 TESTS SUCCESSFUL
-2017_10_30_20_47_38 : ALL 1 TESTS SUCCESSFUL
-2017_10_30_20_47_40 : ALL 2 TESTS SUCCESSFUL
-2017_10_31_01_15_19 : ALL 1 TESTS SUCCESSFUL
-2017_10_31_01_34_44 : FAILED 6/134 TESTS: yahoo_all ll_regextrans2_subfolder ll_delete2foldersonly ll_delete2foldersonly_tmp ll_domino1_domino2 ll_domino2
-2017_10_31_13_44_16 : FAILED 1/1 TESTS: perl_syntax
-2017_10_31_13_45_04 : ALL 1 TESTS SUCCESSFUL
-2017_10_31_13_45_06 : FAILED 1/2 TESTS: ll_checkselectable
-2017_10_31_13_45_43 : ALL 1 TESTS SUCCESSFUL
-2017_10_31_13_45_54 : ALL 2 TESTS SUCCESSFUL
-2017_10_31_13_50_56 : ALL 1 TESTS SUCCESSFUL
-2017_10_31_13_51_01 : ALL 2 TESTS SUCCESSFUL
-2017_10_31_13_58_49 : ALL 1 TESTS SUCCESSFUL
-2017_10_31_13_58_54 : ALL 2 TESTS SUCCESSFUL
-2017_11_05_09_00_13 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_09_00_28 : ALL 2 TESTS SUCCESSFUL
-2017_11_05_09_04_41 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_09_04_45 : ALL 2 TESTS SUCCESSFUL
-2017_11_05_09_05_04 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_09_05_09 : ALL 2 TESTS SUCCESSFUL
-2017_11_05_09_06_04 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_09_06_09 : ALL 2 TESTS SUCCESSFUL
-2017_11_05_09_09_22 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_09_09_25 : FAILED 1/2 TESTS: ll_checkfoldersexist
-2017_11_05_09_11_30 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_09_14_50 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_09_14_57 : ALL 2 TESTS SUCCESSFUL
-2017_11_05_09_16_41 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_09_16_47 : ALL 2 TESTS SUCCESSFUL
-2017_11_05_09_17_10 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_09_17_16 : ALL 2 TESTS SUCCESSFUL
-2017_11_05_09_18_10 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_09_18_16 : ALL 2 TESTS SUCCESSFUL
-2017_11_05_09_18_51 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_09_21_50 : FAILED 1/2 TESTS: ll_checkfoldersexist
-2017_11_05_09_21_57 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_09_22_03 : FAILED 1/2 TESTS: ll_checkfoldersexist
-2017_11_05_09_22_17 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_09_22_23 : ALL 2 TESTS SUCCESSFUL
-2017_11_05_09_30_18 : FAILED 7/138 TESTS: gmail_gmail_folderfirst yahoo_all ll_regextrans2_subfolder ll_delete2foldersonly ll_delete2foldersonly_tmp ll_domino1_domino2 ll_domino2
-2017_11_05_09_35_15 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_09_58_39 : FAILED 5/138 TESTS: ll_regextrans2_subfolder ll_delete2foldersonly ll_delete2foldersonly_tmp ll_domino1_domino2 ll_domino2
-2017_11_05_12_12_25 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_12_12_45 : FAILED 5/6 TESTS: ll_regextrans2_subfolder ll_delete2foldersonly ll_delete2foldersonly_tmp ll_domino1_domino2 ll_domino2
-2017_11_05_12_14_03 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_12_14_07 : FAILED 1/2 TESTS: ll_regextrans2_subfolder
-2017_11_05_12_16_04 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_12_16_09 : ALL 2 TESTS SUCCESSFUL
-2017_11_05_12_19_06 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_12_19_10 : FAILED 1/2 TESTS: ll_regextrans2_subfolder_02
-2017_11_05_12_23_17 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_12_23_53 : FAILED 2/6 TESTS: ll_domino1_domino2 ll_domino2
-2017_11_05_12_28_35 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_12_28_40 : FAILED 1/2 TESTS: ll_subfolder2
-2017_11_05_12_29_51 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_12_30_14 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_12_30_29 : ALL 2 TESTS SUCCESSFUL
-2017_11_05_12_31_01 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_12_31_37 : ALL 6 TESTS SUCCESSFUL
-2017_11_05_12_34_19 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_12_59_14 : FAILED 1/140 TESTS: yahoo_all
-2017_11_05_13_03_46 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_13_04_01 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_13_05_02 : FAILED 1/2 TESTS: yahoo_all
-2017_11_05_13_28_10 : FAILED 1/140 TESTS: yahoo_all
-2017_11_05_13_55_17 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_13_56_10 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_13_56_29 : ALL 2 TESTS SUCCESSFUL
-2017_11_05_13_56_45 : ALL 2 TESTS SUCCESSFUL
-2017_11_05_13_56_57 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_13_57_47 : FAILED 1/2 TESTS: yahoo_all
-2017_11_05_13_57_52 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_13_58_34 : FAILED 1/2 TESTS: yahoo_xxxx
-2017_11_05_23_08_05 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_23_08_57 : FAILED 1/2 TESTS: yahoo_xxxx
-2017_11_05_23_14_21 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_23_15_10 : FAILED 1/2 TESTS: yahoo_xxxx
-2017_11_05_23_17_13 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_23_18_05 : FAILED 1/2 TESTS: yahoo_xxxx
-2017_11_05_23_19_14 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_23_20_02 : FAILED 1/2 TESTS: yahoo_xxxx
-2017_11_05_23_21_43 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_23_22_03 : ALL 2 TESTS SUCCESSFUL
-2017_11_05_23_25_00 : ALL 1 TESTS SUCCESSFUL
-2017_11_05_23_50_15 : ALL 140 TESTS SUCCESSFUL
-2017_11_07_01_37_46 : ALL 1 TESTS SUCCESSFUL
-2017_11_07_01_38_16 : FAILED 1/2 TESTS: yahoo_fail
-2017_11_07_01_39_12 : ALL 1 TESTS SUCCESSFUL
-2017_11_07_01_39_12 : FAILED 1/2 TESTS: yahoo_fail
-2017_11_07_01_39_37 : ALL 1 TESTS SUCCESSFUL
-2017_11_07_01_40_02 : ALL 2 TESTS SUCCESSFUL
-2017_11_16_13_04_48 : ALL 1 TESTS SUCCESSFUL
-2017_11_16_13_05_28 : ALL 2 TESTS SUCCESSFUL
-2017_11_16_13_11_13 : ALL 1 TESTS SUCCESSFUL
-2017_11_16_13_11_18 : ALL 2 TESTS SUCCESSFUL
-2017_11_16_13_12_47 : ALL 1 TESTS SUCCESSFUL
-2017_11_16_13_12_52 : ALL 2 TESTS SUCCESSFUL
-2017_11_16_13_13_30 : ALL 1 TESTS SUCCESSFUL
-2017_11_16_13_13_34 : ALL 2 TESTS SUCCESSFUL
-2017_11_28_20_41_23 : ALL 1 TESTS SUCCESSFUL
-2017_11_28_20_41_37 : ALL 2 TESTS SUCCESSFUL
-2017_11_28_20_41_54 : ALL 1 TESTS SUCCESSFUL
-2017_11_28_20_41_59 : ALL 2 TESTS SUCCESSFUL
-2017_11_28_20_42_35 : ALL 1 TESTS SUCCESSFUL
-2017_11_28_20_42_40 : ALL 2 TESTS SUCCESSFUL
-2017_11_28_20_44_47 : ALL 1 TESTS SUCCESSFUL
-2017_11_28_20_44_49 : ALL 2 TESTS SUCCESSFUL
-2017_11_28_20_47_08 : ALL 1 TESTS SUCCESSFUL
-2017_11_28_20_47_11 : FAILED 1/2 TESTS: ll_resyncflags
-2017_11_28_20_50_15 : ALL 1 TESTS SUCCESSFUL
-2017_11_28_20_50_19 : ALL 2 TESTS SUCCESSFUL
-2017_11_28_23_39_49 : ALL 1 TESTS SUCCESSFUL
-2017_11_28_23_39_54 : ALL 2 TESTS SUCCESSFUL
-2017_11_28_23_42_31 : ALL 1 TESTS SUCCESSFUL
-2017_11_28_23_42_36 : FAILED 1/2 TESTS: ll_noresyncflags
-2017_11_29_00_24_18 : ALL 1 TESTS SUCCESSFUL
-2017_11_29_00_24_23 : FAILED 1/2 TESTS: ll_noresyncflags
-2017_11_29_00_25_42 : ALL 1 TESTS SUCCESSFUL
-2017_11_29_00_25_46 : ALL 2 TESTS SUCCESSFUL
-2017_11_29_13_48_32 : ALL 1 TESTS SUCCESSFUL
-2017_11_29_13_48_51 : ALL 2 TESTS SUCCESSFUL
-2017_11_29_21_05_04 : ALL 1 TESTS SUCCESSFUL
-2017_11_29_21_06_01 : ALL 2 TESTS SUCCESSFUL
-2017_11_30_02_56_44 : ALL 1 TESTS SUCCESSFUL
-2017_11_30_02_57_12 : ALL 2 TESTS SUCCESSFUL
-2017_11_30_03_01_53 : ALL 1 TESTS SUCCESSFUL
-2017_11_30_03_14_19 : ALL 1 TESTS SUCCESSFUL
-2017_11_30_03_14_53 : ALL 2 TESTS SUCCESSFUL
-2017_11_30_03_17_15 : ALL 1 TESTS SUCCESSFUL
-2017_11_30_03_40_59 : FAILED 6/143 TESTS: xxxxx_gmail gmail_xxxxx gmail gmail_gmail gmail_gmail_INBOX gmail_gmail_folderfirst
-2017_11_30_03_53_33 : FAILED 7/143 TESTS: xxxxx_gmail gmail_xxxxx gmail gmail_gmail gmail_gmail_INBOX gmail_gmail_folderfirst free_ssl
-2017_11_30_12_38_46 : ALL 1 TESTS SUCCESSFUL
-2017_11_30_12_39_16 : FAILED 6/8 TESTS: xxxxx_gmail gmail_xxxxx gmail gmail_gmail gmail_gmail_INBOX gmail_gmail_folderfirst
-2017_12_01_04_57_24 : ALL 1 TESTS SUCCESSFUL
-2017_12_01_04_59_49 : ALL 8 TESTS SUCCESSFUL
-2017_12_01_05_00_47 : ALL 1 TESTS SUCCESSFUL
-2017_12_01_05_28_42 : ALL 143 TESTS SUCCESSFUL
-2017_12_12_12_10_35 : ALL 1 TESTS SUCCESSFUL
-2017_12_12_12_12_26 : ALL 2 TESTS SUCCESSFUL
-2017_12_12_13_02_28 : ALL 1 TESTS SUCCESSFUL
-2017_12_17_11_05_45 : ALL 1 TESTS SUCCESSFUL
-2017_12_17_11_05_48 : FAILED 1/2 TESTS: option_release_check
-2017_12_17_11_06_21 : ALL 1 TESTS SUCCESSFUL
-2017_12_17_11_06_24 : FAILED 1/2 TESTS: option_release_check
-2017_12_17_11_09_38 : ALL 1 TESTS SUCCESSFUL
-2017_12_17_11_09_38 : FAILED 1/2 TESTS: option_noreleascheck
-2017_12_17_11_09_46 : ALL 1 TESTS SUCCESSFUL
-2017_12_17_11_09_46 : FAILED 1/2 TESTS: option_noreleascheck
-2017_12_17_11_11_13 : ALL 1 TESTS SUCCESSFUL
-2017_12_17_11_11_13 : FAILED 1/2 TESTS: option_noreleascheck
-2017_12_17_11_11_43 : ALL 1 TESTS SUCCESSFUL
-2017_12_17_11_11_46 : FAILED 1/2 TESTS: option_noreleasecheck
-2017_12_17_11_23_36 : ALL 1 TESTS SUCCESSFUL
-2017_12_17_11_23_39 : ALL 2 TESTS SUCCESSFUL
-2017_12_17_11_24_57 : ALL 1 TESTS SUCCESSFUL
-2017_12_17_11_25_00 : FAILED 1/2 TESTS: option_releasecheck
-2017_12_17_12_59_11 : ALL 1 TESTS SUCCESSFUL
-2017_12_17_12_59_14 : ALL 2 TESTS SUCCESSFUL
-2017_12_17_12_59_25 : ALL 1 TESTS SUCCESSFUL
-2017_12_17_12_59_28 : ALL 2 TESTS SUCCESSFUL
-2017_12_17_14_14_37 : ALL 1 TESTS SUCCESSFUL
-2017_12_17_14_44_05 : FAILED 1/145 TESTS: yahoo_all
-2017_12_18_23_51_26 : ALL 1 TESTS SUCCESSFUL
-2017_12_19_00_12_10 : FAILED 41/145 TESTS: yahoo_all free_ssl office365_justconnect_inet4_inet6 office365_justconnect_tls_SSL_verify_mode_1 ll_ask_password ll_env_password ll_timeout ll_folder ll_folder_noexist ll_folder_mixfolders ll_nocheckselectable ll_checkselectable ll_nocheckfoldersexist ll_checkfoldersexist ll_subfolder2 ll_oneemail ll_buffersize ll_justfolders_delete1emptyfolders ll_prefix12 ll_nosyncinternaldates ll_idatefromheader ll_folder_rev ll_subscribed ll_nosubscribe ll_justfoldersizes ll_authmd5 ll_authmd51 ll_authmd52 ll_noauthmd5 ll_maxage ll_maxsize ll_skipsize ll_skipheader ll_include ll_exclude ll_exclude_INBOX ll_regextrans2 ll_regextrans2_subfolder ll_regextrans2_subfolder_02 ll_sep2 ll_abort
-2017_12_19_00_14_35 : ALL 1 TESTS SUCCESSFUL
-2017_12_19_00_15_19 : ALL 1 TESTS SUCCESSFUL
-2017_12_19_00_15_27 : ALL 2 TESTS SUCCESSFUL
-2017_12_19_00_46_05 : FAILED 1/145 TESTS: yahoo_all
-2017_12_19_00_54_59 : ALL 1 TESTS SUCCESSFUL
-2017_12_19_00_55_16 : ALL 2 TESTS SUCCESSFUL
-2017_12_19_00_58_25 : ALL 1 TESTS SUCCESSFUL
-2017_12_19_00_58_30 : ALL 2 TESTS SUCCESSFUL
-2017_12_19_01_04_18 : ALL 1 TESTS SUCCESSFUL
-2017_12_19_01_04_23 : ALL 2 TESTS SUCCESSFUL
-2017_12_19_01_08_44 : ALL 1 TESTS SUCCESSFUL
-2017_12_19_01_08_49 : ALL 2 TESTS SUCCESSFUL
-2017_12_20_05_14_31 : ALL 1 TESTS SUCCESSFUL
-2017_12_20_05_14_51 : ALL 2 TESTS SUCCESSFUL
-2017_12_20_05_16_12 : ALL 1 TESTS SUCCESSFUL
-2017_12_20_05_16_17 : ALL 2 TESTS SUCCESSFUL
-2017_12_20_05_17_10 : ALL 1 TESTS SUCCESSFUL
-2017_12_20_05_17_17 : ALL 2 TESTS SUCCESSFUL
-2017_12_20_05_20_36 : ALL 1 TESTS SUCCESSFUL
-2017_12_20_05_20_47 : ALL 2 TESTS SUCCESSFUL
-2017_12_20_05_21_09 : ALL 1 TESTS SUCCESSFUL
-2017_12_20_05_21_14 : ALL 2 TESTS SUCCESSFUL
-2018_01_09_18_27_12 : ALL 1 TESTS SUCCESSFUL
-2018_01_09_18_37_47 : ALL 1 TESTS SUCCESSFUL
-2018_01_09_18_38_48 : ALL 1 TESTS SUCCESSFUL
-2018_01_10_14_57_33 : ALL 1 TESTS SUCCESSFUL
-2018_01_10_18_16_46 : ALL 2 TESTS SUCCESSFUL
-2018_01_10_23_06_38 : ALL 1 TESTS SUCCESSFUL
-2018_01_10_23_22_19 : ALL 2 TESTS SUCCESSFUL
-2018_01_11_00_38_13 : ALL 1 TESTS SUCCESSFUL
-2018_01_11_01_06_36 : ALL 2 TESTS SUCCESSFUL
-2018_02_07_22_57_34 : ALL 1 TESTS SUCCESSFUL
-2018_02_07_23_29_27 : FAILED 1/145 TESTS: yahoo_all
-2018_02_10_21_07_12 : ALL 1 TESTS SUCCESSFUL
-2018_02_10_21_37_11 : FAILED 1/145 TESTS: yahoo_all
-2018_02_11_19_47_24 : ALL 1 TESTS SUCCESSFUL
-2018_02_11_20_17_19 : FAILED 1/145 TESTS: yahoo_all
-2018_02_12_21_31_26 : ALL 1 TESTS SUCCESSFUL
-2018_02_12_21_31_31 : FAILED 1/2 TESTS: ll_ssl_justlogin_SSL_version
-2018_02_12_21_34_16 : ALL 1 TESTS SUCCESSFUL
-2018_02_12_21_34_19 : FAILED 1/2 TESTS: ll_ssl_justlogin_SSL_version
-2018_02_12_21_37_26 : ALL 1 TESTS SUCCESSFUL
-2018_02_12_21_37_29 : FAILED 1/2 TESTS: ll_ssl_justlogin_SSL_version
-2018_02_12_21_37_50 : ALL 1 TESTS SUCCESSFUL
-2018_02_12_21_37_53 : ALL 2 TESTS SUCCESSFUL
-2018_02_12_21_41_39 : ALL 1 TESTS SUCCESSFUL
-2018_02_12_21_41_42 : FAILED 1/2 TESTS: ll_ssl_justconnect_sslargs
-2018_02_12_21_42_15 : ALL 1 TESTS SUCCESSFUL
-2018_02_12_21_42_19 : FAILED 1/2 TESTS: ll_ssl_justconnect_sslargs
-2018_02_12_21_43_46 : ALL 1 TESTS SUCCESSFUL
-2018_02_12_21_43_49 : ALL 2 TESTS SUCCESSFUL
-2018_02_12_22_57_01 : ALL 1 TESTS SUCCESSFUL
-2018_02_12_23_29_07 : FAILED 1/146 TESTS: yahoo_all
-2018_02_19_14_45_57 : ALL 1 TESTS SUCCESSFUL
-2018_02_19_14_45_59 : ALL 2 TESTS SUCCESSFUL
-2018_02_19_14_46_21 : ALL 1 TESTS SUCCESSFUL
-2018_02_19_14_46_24 : ALL 2 TESTS SUCCESSFUL
-2018_02_19_14_46_40 : ALL 1 TESTS SUCCESSFUL
-2018_02_19_14_46_46 : ALL 2 TESTS SUCCESSFUL
-2018_02_19_15_32_22 : ALL 1 TESTS SUCCESSFUL
-2018_02_19_15_32_33 : ALL 4 TESTS SUCCESSFUL
-2018_02_19_15_35_51 : ALL 1 TESTS SUCCESSFUL
-2018_02_19_15_35_57 : ALL 2 TESTS SUCCESSFUL
-2018_02_19_15_38_55 : ALL 1 TESTS SUCCESSFUL
-2018_02_19_15_39_01 : ALL 2 TESTS SUCCESSFUL
-2018_02_19_15_39_57 : ALL 1 TESTS SUCCESSFUL
-2018_02_19_15_40_08 : ALL 4 TESTS SUCCESSFUL
-2018_02_20_12_00_04 : ALL 1 TESTS SUCCESSFUL
-2018_02_20_12_00_09 : ALL 3 TESTS SUCCESSFUL
-2018_02_20_12_00_21 : ALL 1 TESTS SUCCESSFUL
-2018_02_20_12_00_24 : ALL 2 TESTS SUCCESSFUL
-2018_02_20_12_00_51 : ALL 1 TESTS SUCCESSFUL
-2018_02_20_12_00_58 : ALL 2 TESTS SUCCESSFUL
-2018_02_20_12_03_02 : ALL 1 TESTS SUCCESSFUL
-2018_02_20_12_03_09 : ALL 2 TESTS SUCCESSFUL
-2018_02_20_12_03_32 : ALL 1 TESTS SUCCESSFUL
-2018_02_20_12_03_38 : ALL 2 TESTS SUCCESSFUL
-2018_02_20_12_16_40 : ALL 1 TESTS SUCCESSFUL
-2018_02_20_12_16_45 : ALL 2 TESTS SUCCESSFUL
-2018_02_21_05_11_51 : ALL 1 TESTS SUCCESSFUL
-2018_02_21_05_11_56 : ALL 3 TESTS SUCCESSFUL
-2018_02_21_05_12_40 : ALL 1 TESTS SUCCESSFUL
-2018_02_21_05_12_45 : ALL 3 TESTS SUCCESSFUL
-2018_02_21_05_13_42 : ALL 1 TESTS SUCCESSFUL
-2018_02_21_05_13_53 : ALL 4 TESTS SUCCESSFUL
-2018_03_05_02_39_51 : ALL 1 TESTS SUCCESSFUL
-2018_03_05_02_40_14 : FAILED 1/2 TESTS: ll_simulong
-2018_03_05_02_42_14 : ALL 1 TESTS SUCCESSFUL
-2018_03_05_02_42_27 : FAILED 1/2 TESTS: ll_simulong
-2018_03_05_02_42_34 : ALL 1 TESTS SUCCESSFUL
-2018_03_05_02_42_44 : FAILED 1/2 TESTS: ll_simulong
-2018_03_05_02_43_22 : ALL 1 TESTS SUCCESSFUL
-2018_03_05_02_43_56 : FAILED 1/2 TESTS: ll_simulong
-2018_03_05_02_45_34 : ALL 1 TESTS SUCCESSFUL
-2018_03_05_02_45_43 : FAILED 1/2 TESTS: ll_simulong
-2018_03_05_02_46_15 : ALL 1 TESTS SUCCESSFUL
-2018_03_05_02_46_22 : FAILED 1/2 TESTS: ll_simulong
-2018_03_05_03_30_09 : ALL 1 TESTS SUCCESSFUL
-2018_03_05_03_30_52 : ALL 2 TESTS SUCCESSFUL
-2018_03_05_03_32_47 : ALL 1 TESTS SUCCESSFUL
-2018_03_05_03_33_31 : ALL 2 TESTS SUCCESSFUL
-2018_03_05_03_34_24 : ALL 1 TESTS SUCCESSFUL
-2018_03_05_03_34_33 : FAILED 1/2 TESTS: kk_simulong
-2018_03_05_03_44_40 : ALL 1 TESTS SUCCESSFUL
-2018_03_05_03_45_22 : ALL 2 TESTS SUCCESSFUL
-2018_03_12_02_13_48 : ALL 1 TESTS SUCCESSFUL
-2018_03_12_02_13_51 : FAILED 1/2 TESTS: kk_simulong
-2018_03_12_02_15_44 : ALL 1 TESTS SUCCESSFUL
-2018_03_12_02_22_06 : ALL 1 TESTS SUCCESSFUL
-2018_03_12_02_23_08 : ALL 1 TESTS SUCCESSFUL
-2018_03_12_02_29_51 : ALL 1 TESTS SUCCESSFUL
-2018_03_12_02_30_28 : ALL 1 TESTS SUCCESSFUL
-2018_03_12_02_30_48 : ALL 1 TESTS SUCCESSFUL
-2018_03_12_02_32_18 : ALL 1 TESTS SUCCESSFUL
-2018_03_12_02_32_18 : FAILED 1/2 TESTS: ll_sigreconnect
-2018_03_12_02_32_30 : ALL 1 TESTS SUCCESSFUL
-2018_03_12_02_32_59 : ALL 1 TESTS SUCCESSFUL
-2018_03_12_02_33_28 : FAILED 1/2 TESTS: ll_sigreconnect_CACA
-2018_03_12_02_49_52 : ALL 1 TESTS SUCCESSFUL
-2018_03_12_02_51_39 : ALL 2 TESTS SUCCESSFUL
-2018_03_12_03_14_31 : ALL 1 TESTS SUCCESSFUL
-2018_03_12_03_15_40 : ALL 2 TESTS SUCCESSFUL
-2018_03_12_03_17_25 : ALL 1 TESTS SUCCESSFUL
-2018_03_12_03_18_30 : ALL 2 TESTS SUCCESSFUL
-2018_03_12_03_22_17 : ALL 1 TESTS SUCCESSFUL
-2018_03_12_03_22_24 : FAILED 1/2 TESTS: ll_sigignore_TERM
-2018_03_12_03_22_33 : ALL 1 TESTS SUCCESSFUL
-2018_03_12_03_23_33 : ALL 2 TESTS SUCCESSFUL
-2018_03_12_18_53_28 : ALL 1 TESTS SUCCESSFUL
-2018_03_12_19_30_21 : FAILED 1/146 TESTS: yahoo_all
-2018_03_19_14_49_50 : ALL 1 TESTS SUCCESSFUL
-2018_03_19_14_50_04 : ALL 2 TESTS SUCCESSFUL
-2018_03_19_14_50_48 : ALL 1 TESTS SUCCESSFUL
-2018_03_19_14_50_53 : ALL 2 TESTS SUCCESSFUL
-2018_03_19_14_52_23 : FAILED 1/1 TESTS: perl_syntax
-2018_03_19_14_55_07 : FAILED 1/1 TESTS: perl_syntax
-2018_03_19_14_57_29 : FAILED 1/1 TESTS: perl_syntax
-2018_03_19_14_58_05 : ALL 1 TESTS SUCCESSFUL
-2018_03_19_14_58_10 : ALL 2 TESTS SUCCESSFUL
-2018_03_19_15_01_15 : ALL 1 TESTS SUCCESSFUL
-2018_03_19_15_01_19 : ALL 2 TESTS SUCCESSFUL
-2018_03_20_02_17_23 : ALL 1 TESTS SUCCESSFUL
-2018_03_20_02_17_30 : ALL 2 TESTS SUCCESSFUL
-2018_03_20_02_19_24 : FAILED 1/1 TESTS: perl_syntax
-2018_03_20_02_20_30 : FAILED 1/1 TESTS: perl_syntax
-2018_03_20_02_20_53 : FAILED 1/1 TESTS: perl_syntax
-2018_03_20_02_21_25 : FAILED 1/1 TESTS: perl_syntax
-2018_03_20_02_23_10 : FAILED 1/1 TESTS: perl_syntax
-2018_03_20_02_24_27 : ALL 1 TESTS SUCCESSFUL
-2018_03_20_02_24_31 : FAILED 1/2 TESTS: ll_folder
-2018_03_20_02_25_06 : ALL 1 TESTS SUCCESSFUL
-2018_03_20_02_25_11 : ALL 2 TESTS SUCCESSFUL
-2018_03_21_08_42_02 : ALL 1 TESTS SUCCESSFUL
-2018_03_21_08_59_47 : FAILED 35/146 TESTS: first_sync_dry first_sync ll gmail_xxxxx gmail gmail_gmail gmail_gmail_folderfirst yahoo_all ll_folder_mixfolders ll_nocheckselectable ll_checkselectable ll_nocheckfoldersexist ll_checkfoldersexist ll_subfolder2 ll_buffersize ll_subscribed ll_nosubscribe ll_justfoldersizes ll_include ll_exclude ll_exclude_INBOX ll_regextrans2_subfolder_02 ll_ssl ll_tls ll_authmech_PLAIN ll_authmech_LOGIN ll_authmech_CRAMMD5 ll_authuser ll_folderrec ll_delete2foldersonly_NEW_3 ll_delete2foldersonly ll_delete2foldersonly_tmp ll_delete2foldersbutnot testslive testslive6
-2018_03_21_17_10_43 : ALL 1 TESTS SUCCESSFUL
-2018_03_21_17_29_05 : FAILED 36/146 TESTS: first_sync_dry first_sync ll gmail_xxxxx gmail gmail_gmail gmail_gmail_folderfirst yahoo_all free_ssl ll_folder_mixfolders ll_nocheckselectable ll_checkselectable ll_nocheckfoldersexist ll_checkfoldersexist ll_subfolder2 ll_buffersize ll_subscribed ll_nosubscribe ll_justfoldersizes ll_include ll_exclude ll_exclude_INBOX ll_regextrans2_subfolder_02 ll_ssl ll_tls ll_authmech_PLAIN ll_authmech_LOGIN ll_authmech_CRAMMD5 ll_authuser ll_folderrec ll_delete2foldersonly_NEW_3 ll_delete2foldersonly ll_delete2foldersonly_tmp ll_delete2foldersbutnot testslive testslive6
-2018_03_22_13_50_14 : ALL 1 TESTS SUCCESSFUL
-2018_03_22_13_50_18 : FAILED 1/2 TESTS: testslive
-2018_03_22_13_54_42 : ALL 1 TESTS SUCCESSFUL
-2018_03_22_13_54_55 : ALL 2 TESTS SUCCESSFUL
-2018_03_22_13_57_04 : ALL 1 TESTS SUCCESSFUL
-2018_03_22_13_57_17 : ALL 2 TESTS SUCCESSFUL
-2018_03_27_04_50_19 : ALL 1 TESTS SUCCESSFUL
-2018_03_27_04_51_05 : ALL 2 TESTS SUCCESSFUL
-2018_03_27_04_54_38 : ALL 1 TESTS SUCCESSFUL
-2018_03_27_04_54_48 : ALL 2 TESTS SUCCESSFUL
-2018_03_27_04_57_15 : ALL 1 TESTS SUCCESSFUL
-2018_03_27_04_57_25 : ALL 2 TESTS SUCCESSFUL
-2018_03_27_04_58_38 : ALL 1 TESTS SUCCESSFUL
-2018_03_27_04_58_48 : ALL 2 TESTS SUCCESSFUL
-2018_03_27_05_02_02 : ALL 1 TESTS SUCCESSFUL
-2018_03_27_05_02_11 : ALL 2 TESTS SUCCESSFUL
-2018_03_28_18_42_25 : ALL 1 TESTS SUCCESSFUL
-2018_03_28_18_42_31 : ALL 2 TESTS SUCCESSFUL
-2018_03_28_18_48_03 : ALL 1 TESTS SUCCESSFUL
-2018_03_28_18_48_09 : ALL 2 TESTS SUCCESSFUL
-2018_03_28_18_51_23 : ALL 1 TESTS SUCCESSFUL
-2018_03_28_18_51_29 : ALL 2 TESTS SUCCESSFUL
-2018_03_29_06_49_03 : ALL 1 TESTS SUCCESSFUL
-2018_03_29_06_49_09 : ALL 2 TESTS SUCCESSFUL
-2018_04_10_03_39_05 : ALL 1 TESTS SUCCESSFUL
-2018_04_10_04_09_43 : FAILED 4/146 TESTS: yahoo_all ll_subscribed ll_nosubscribe ll_folderrec
-2018_04_15_17_33_03 : ALL 1 TESTS SUCCESSFUL
-2018_04_15_17_33_09 : FAILED 1/2 TESTS: ll_ssl_justconnect_sslargs_SSL_versionTLSv1_1
-2018_04_15_17_33_48 : ALL 1 TESTS SUCCESSFUL
-2018_04_15_17_33_52 : ALL 2 TESTS SUCCESSFUL
-2018_04_15_17_34_14 : ALL 1 TESTS SUCCESSFUL
-2018_04_15_17_34_18 : FAILED 2/4 TESTS: --debugssl 4
-2018_04_15_17_34_46 : ALL 1 TESTS SUCCESSFUL
-2018_04_15_17_34_49 : ALL 2 TESTS SUCCESSFUL
-2018_04_15_17_35_25 : ALL 1 TESTS SUCCESSFUL
-2018_04_15_17_35_29 : FAILED 1/2 TESTS: ll_ssl_justconnect_sslargs_SSL_versionTLSv1_1
-2018_04_15_17_36_13 : ALL 1 TESTS SUCCESSFUL
-2018_04_15_17_36_17 : ALL 2 TESTS SUCCESSFUL
-2018_04_16_04_06_58 : ALL 1 TESTS SUCCESSFUL
-2018_04_16_06_28_54 : FAILED 4/146 TESTS: yahoo_all ll_subscribed ll_nosubscribe ll_folderrec
-2018_04_18_04_39_35 : ALL 1 TESTS SUCCESSFUL
-2018_04_18_04_39_43 : FAILED 1/2 TESTS: ll_subscribed
-2018_04_18_04_41_40 : ALL 1 TESTS SUCCESSFUL
-2018_04_18_04_42_10 : ALL 1 TESTS SUCCESSFUL
-2018_04_18_04_42_16 : FAILED 1/2 TESTS: ll_subscribed
-2018_04_18_04_45_35 : ALL 1 TESTS SUCCESSFUL
-2018_04_18_18_07_34 : ALL 1 TESTS SUCCESSFUL
-2018_04_18_18_39_48 : FAILED 1/146 TESTS: yahoo_all
-2018_04_19_02_58_25 : ALL 1 TESTS SUCCESSFUL
-2018_04_19_03_29_04 : FAILED 1/146 TESTS: yahoo_all
-2018_04_20_15_03_28 : ALL 1 TESTS SUCCESSFUL
-2018_04_20_15_32_23 : FAILED 1/146 TESTS: yahoo_all
-2018_05_05_15_25_10 : ALL 1 TESTS SUCCESSFUL
-2018_05_05_15_53_23 : FAILED 2/146 TESTS: yahoo_all free_ssl
-2018_05_05_19_35_30 : ALL 1 TESTS SUCCESSFUL
-2018_05_05_19_36_47 : FAILED 1/3 TESTS: yahoo_all
-2018_05_05_22_43_19 : ALL 1 TESTS SUCCESSFUL
-2018_05_05_22_44_06 : FAILED 1/2 TESTS: yahoo_all
-2018_05_05_23_00_57 : ALL 1 TESTS SUCCESSFUL
-2018_05_05_23_01_39 : FAILED 1/2 TESTS: yahoo_all
-2018_05_05_23_03_17 : ALL 1 TESTS SUCCESSFUL
-2018_05_05_23_03_27 : FAILED 1/2 TESTS: yahoo_fail_UNAVAILABLE
-2018_05_05_23_09_36 : ALL 1 TESTS SUCCESSFUL
-2018_05_05_23_09_47 : ALL 2 TESTS SUCCESSFUL
-2018_05_05_23_09_56 : ALL 1 TESTS SUCCESSFUL
-2018_05_05_23_10_46 : ALL 2 TESTS SUCCESSFUL
-2018_05_05_23_24_40 : ALL 1 TESTS SUCCESSFUL
-2018_05_05_23_52_05 : ALL 146 TESTS SUCCESSFUL
-2018_05_06_00_52_34 : ALL 1 TESTS SUCCESSFUL
-2018_05_06_01_19_31 : ALL 146 TESTS SUCCESSFUL
-2018_05_30_05_20_20 : ALL 1 TESTS SUCCESSFUL
-2018_05_30_05_21_53 : ALL 2 TESTS SUCCESSFUL
-2018_06_19_13_52_26 : ALL 1 TESTS SUCCESSFUL
-2018_06_19_13_53_23 : ALL 2 TESTS SUCCESSFUL
-2018_06_19_13_53_30 : ALL 1 TESTS SUCCESSFUL
-2018_06_19_13_53_54 : ALL 2 TESTS SUCCESSFUL
-2018_06_22_19_26_51 : ALL 1 TESTS SUCCESSFUL
-2018_06_22_19_26_52 : ALL 2 TESTS SUCCESSFUL
-2018_06_22_19_27_59 : ALL 1 TESTS SUCCESSFUL
-2018_06_22_19_27_59 : FAILED 1/2 TESTS: dprof_bigmail
-2018_06_23_01_42_56 : ALL 1 TESTS SUCCESSFUL
-2018_06_23_01_43_15 : ALL 2 TESTS SUCCESSFUL
-2018_06_23_01_43_40 : ALL 1 TESTS SUCCESSFUL
-2018_06_23_01_44_02 : ALL 2 TESTS SUCCESSFUL
-2018_06_24_23_40_04 : ALL 1 TESTS SUCCESSFUL
-2018_06_24_23_40_31 : ALL 2 TESTS SUCCESSFUL
-2018_06_24_23_55_15 : ALL 1 TESTS SUCCESSFUL
-2018_06_25_00_10_42 : ALL 2 TESTS SUCCESSFUL
-2018_06_26_03_17_40 : ALL 1 TESTS SUCCESSFUL
-2018_06_26_03_29_35 : ALL 1 TESTS SUCCESSFUL
-2018_06_26_03_34_54 : ALL 2 TESTS SUCCESSFUL
-2018_06_26_03_40_31 : ALL 2 TESTS SUCCESSFUL
-2018_08_06_00_36_25 : ALL 1 TESTS SUCCESSFUL
-2018_08_06_01_05_47 : FAILED 3/146 TESTS: gmail_gmail gmail_gmail_INBOX gmail_gmail_folderfirst
-2018_08_06_01_15_32 : ALL 1 TESTS SUCCESSFUL
-2018_08_06_01_15_54 : FAILED 3/4 TESTS: gmail_gmail gmail_gmail_INBOX gmail_gmail_folderfirst
-2018_08_06_01_18_16 : ALL 1 TESTS SUCCESSFUL
-2018_08_06_01_19_00 : ALL 4 TESTS SUCCESSFUL
-2018_08_06_01_19_17 : ALL 1 TESTS SUCCESSFUL
-2018_08_06_01_50_47 : ALL 146 TESTS SUCCESSFUL
-2018_08_06_17_04_35 : ALL 1 TESTS SUCCESSFUL
-2018_08_06_17_33_57 : ALL 146 TESTS SUCCESSFUL
-2018_08_29_12_39_36 : ALL 1 TESTS SUCCESSFUL
-2018_08_29_12_39_43 : FAILED 1/2 TESTS: inet4_inet6
-2018_08_29_12_42_01 : ALL 1 TESTS SUCCESSFUL
-2018_08_29_12_42_05 : ALL 2 TESTS SUCCESSFUL
-2018_08_29_12_42_55 : ALL 1 TESTS SUCCESSFUL
-2018_08_29_12_43_17 : ALL 2 TESTS SUCCESSFUL
-2018_08_29_12_45_46 : ALL 1 TESTS SUCCESSFUL
-2018_08_29_12_46_01 : ALL 1 TESTS SUCCESSFUL
-2018_08_29_12_46_13 : ALL 2 TESTS SUCCESSFUL
-2018_08_29_12_47_21 : ALL 1 TESTS SUCCESSFUL
-2018_08_29_12_47_33 : ALL 2 TESTS SUCCESSFUL
-2018_08_29_12_51_27 : ALL 1 TESTS SUCCESSFUL
-2018_08_29_12_51_38 : ALL 2 TESTS SUCCESSFUL
-2018_08_30_01_05_50 : ALL 1 TESTS SUCCESSFUL
-2018_08_30_01_06_54 : ALL 1 TESTS SUCCESSFUL
-2018_08_30_01_07_41 : ALL 2 TESTS SUCCESSFUL
-2018_08_30_01_08_21 : ALL 1 TESTS SUCCESSFUL
-2018_08_30_01_08_33 : ALL 2 TESTS SUCCESSFUL
-2018_08_30_01_09_21 : ALL 1 TESTS SUCCESSFUL
-2018_08_30_01_09_31 : ALL 2 TESTS SUCCESSFUL
-2018_08_30_01_12_11 : ALL 1 TESTS SUCCESSFUL
-2018_08_30_01_12_21 : ALL 2 TESTS SUCCESSFUL
-2018_08_31_02_24_33 : ALL 1 TESTS SUCCESSFUL
-2018_08_31_02_25_00 : ALL 2 TESTS SUCCESSFUL
-2018_08_31_02_29_01 : ALL 1 TESTS SUCCESSFUL
-2018_08_31_02_29_05 : ALL 2 TESTS SUCCESSFUL
-2018_08_31_02_30_11 : ALL 1 TESTS SUCCESSFUL
-2018_08_31_02_30_17 : ALL 2 TESTS SUCCESSFUL
-2018_08_31_02_31_21 : ALL 1 TESTS SUCCESSFUL
-2018_08_31_02_31_25 : ALL 2 TESTS SUCCESSFUL
-2018_08_31_02_32_02 : ALL 1 TESTS SUCCESSFUL
-2018_08_31_02_32_07 : ALL 2 TESTS SUCCESSFUL
-2018_08_31_02_32_41 : ALL 1 TESTS SUCCESSFUL
-2018_08_31_02_32_46 : ALL 2 TESTS SUCCESSFUL
-2018_08_31_02_35_03 : ALL 1 TESTS SUCCESSFUL
-2018_08_31_02_35_10 : ALL 2 TESTS SUCCESSFUL
-2018_08_31_02_37_45 : ALL 1 TESTS SUCCESSFUL
-2018_08_31_02_37_50 : ALL 2 TESTS SUCCESSFUL
-2018_08_31_02_38_37 : ALL 1 TESTS SUCCESSFUL
-2018_08_31_02_38_42 : ALL 2 TESTS SUCCESSFUL
-2018_08_31_02_39_17 : ALL 1 TESTS SUCCESSFUL
-2018_08_31_02_39_22 : ALL 2 TESTS SUCCESSFUL
-2018_09_01_16_26_27 : ALL 1 TESTS SUCCESSFUL
-2018_09_01_16_27_55 : ALL 2 TESTS SUCCESSFUL
-2018_09_01_16_38_38 : ALL 1 TESTS SUCCESSFUL
-2018_09_01_16_38_43 : ALL 2 TESTS SUCCESSFUL
-2018_09_01_16_39_23 : ALL 1 TESTS SUCCESSFUL
-2018_09_01_16_39_28 : ALL 2 TESTS SUCCESSFUL
-2018_09_01_22_19_27 : ALL 1 TESTS SUCCESSFUL
-2018_09_01_22_19_27 : ALL 2 TESTS SUCCESSFUL
-2018_09_01_22_21_10 : ALL 1 TESTS SUCCESSFUL
-2018_09_01_22_21_10 : ALL 2 TESTS SUCCESSFUL
-2018_09_01_22_24_41 : ALL 1 TESTS SUCCESSFUL
-2018_09_01_22_24_41 : FAILED 1/2 TESTS: ll_diff
-2018_09_01_22_25_02 : ALL 1 TESTS SUCCESSFUL
-2018_09_01_22_25_12 : FAILED 1/2 TESTS: ll_diff
-2018_09_01_22_26_24 : ALL 1 TESTS SUCCESSFUL
-2018_09_01_22_26_34 : FAILED 1/2 TESTS: ll_diff
-2018_09_01_22_28_48 : ALL 1 TESTS SUCCESSFUL
-2018_09_01_22_28_53 : FAILED 1/2 TESTS: ll_diff
-2018_09_01_22_35_56 : ALL 1 TESTS SUCCESSFUL
-2018_09_01_22_36_01 : FAILED 1/2 TESTS: ll_diff
-2018_09_01_22_38_37 : ALL 1 TESTS SUCCESSFUL
-2018_09_01_22_38_42 : FAILED 1/2 TESTS: ll_diff
-2018_09_01_22_39_06 : ALL 1 TESTS SUCCESSFUL
-2018_09_01_22_39_11 : FAILED 1/2 TESTS: ll_diff
-2018_09_01_22_40_03 : ALL 1 TESTS SUCCESSFUL
-2018_09_01_22_40_50 : FAILED 1/2 TESTS: ll_diff
-2018_09_01_22_42_36 : ALL 1 TESTS SUCCESSFUL
-2018_09_01_22_43_11 : FAILED 1/2 TESTS: ll_diff
-2018_09_01_22_43_37 : ALL 1 TESTS SUCCESSFUL
-2018_09_01_22_43_38 : ALL 2 TESTS SUCCESSFUL
-2018_09_01_22_43_56 : ALL 1 TESTS SUCCESSFUL
-2018_09_01_22_44_30 : FAILED 1/2 TESTS: ll_diff
-2018_09_01_22_45_46 : ALL 1 TESTS SUCCESSFUL
-2018_09_01_22_46_21 : FAILED 1/2 TESTS: ll_diff
-2018_09_01_22_57_46 : ALL 1 TESTS SUCCESSFUL
-2018_09_01_22_57_46 : FAILED 1/2 TESTS: can_send
-2018_09_01_22_58_16 : ALL 1 TESTS SUCCESSFUL
-2018_09_01_22_58_16 : FAILED 1/2 TESTS: can_send
-2018_09_01_23_00_39 : ALL 1 TESTS SUCCESSFUL
-2018_09_01_23_01_13 : FAILED 1/2 TESTS: ll_diff
-2018_09_01_23_21_31 : ALL 1 TESTS SUCCESSFUL
-2018_09_01_23_22_07 : FAILED 1/2 TESTS: ll_diff
-2018_09_01_23_43_41 : FAILED 1/1 TESTS: perl_syntax
-2018_09_01_23_44_24 : ALL 1 TESTS SUCCESSFUL
-2018_09_01_23_44_59 : FAILED 1/2 TESTS: ll_diff
-2018_09_02_05_31_43 : ALL 1 TESTS SUCCESSFUL
-2018_09_02_06_01_25 : ALL 146 TESTS SUCCESSFUL
-2018_09_02_17_01_46 : ALL 1 TESTS SUCCESSFUL
-2018_09_02_17_03_01 : FAILED 1/2 TESTS: ll_diff
-2018_09_02_17_05_39 : ALL 1 TESTS SUCCESSFUL
-2018_09_02_17_05_43 : FAILED 1/2 TESTS: gmail_gl1_gl2_labels
-2018_09_02_17_06_31 : ALL 1 TESTS SUCCESSFUL
-2018_09_02_17_06_41 : ALL 2 TESTS SUCCESSFUL
-2018_09_02_17_06_53 : ALL 1 TESTS SUCCESSFUL
-2018_09_02_17_06_58 : FAILED 1/2 TESTS: gmail_gl1_gl2_labels
-2018_09_02_17_08_16 : ALL 1 TESTS SUCCESSFUL
-2018_09_02_17_08_19 : FAILED 1/2 TESTS: gmail_gl_gl2_sslargs
-2018_09_02_17_09_03 : ALL 1 TESTS SUCCESSFUL
-2018_09_02_17_09_08 : FAILED 1/2 TESTS: gmail_gl_gl2
-2018_09_02_17_15_31 : ALL 1 TESTS SUCCESSFUL
-2018_09_02_17_15_36 : FAILED 1/2 TESTS: gmail_gl_gl2
-2018_09_02_17_23_26 : ALL 1 TESTS SUCCESSFUL
-2018_09_02_17_23_31 : FAILED 1/2 TESTS: gmail_gl_gl2
-2018_09_02_17_23_55 : ALL 1 TESTS SUCCESSFUL
-2018_09_02_17_23_59 : FAILED 1/2 TESTS: gmail_gl1_gl2_labels
-2018_09_02_17_24_29 : ALL 1 TESTS SUCCESSFUL
-2018_09_02_17_24_33 : FAILED 1/2 TESTS: gmail_gl_gl2
-2018_09_02_19_38_08 : ALL 1 TESTS SUCCESSFUL
-2018_09_02_19_38_18 : ALL 2 TESTS SUCCESSFUL
-2018_09_02_19_38_34 : ALL 1 TESTS SUCCESSFUL
-2018_09_02_19_38_39 : FAILED 1/2 TESTS: gmail_gl1_gl2_labels
-2018_09_02_19_39_37 : ALL 1 TESTS SUCCESSFUL
-2018_09_02_19_39_42 : FAILED 1/2 TESTS: gmail_gl1_gl2_labels
-2018_09_02_19_43_11 : ALL 1 TESTS SUCCESSFUL
-2018_09_02_19_43_15 : ALL 2 TESTS SUCCESSFUL
-2018_09_02_19_46_58 : ALL 1 TESTS SUCCESSFUL
-2018_09_02_19_47_13 : ALL 2 TESTS SUCCESSFUL
-2018_09_02_19_48_00 : ALL 1 TESTS SUCCESSFUL
-2018_09_02_19_48_14 : ALL 2 TESTS SUCCESSFUL
-2018_09_02_19_50_25 : ALL 1 TESTS SUCCESSFUL
-2018_09_02_19_50_28 : FAILED 1/2 TESTS: gmail_gl1_gl2_labels
-2018_09_03_07_28_04 : ALL 1 TESTS SUCCESSFUL
-2018_09_03_07_28_06 : FAILED 1/2 TESTS: gmail_gl1_gl2_labels
-2018_09_03_07_33_26 : ALL 1 TESTS SUCCESSFUL
-2018_09_03_07_33_40 : ALL 2 TESTS SUCCESSFUL
-2018_09_03_07_35_51 : ALL 1 TESTS SUCCESSFUL
-2018_09_03_07_36_00 : ALL 2 TESTS SUCCESSFUL
-2018_09_03_07_40_49 : ALL 1 TESTS SUCCESSFUL
-2018_09_03_07_40_56 : FAILED 1/2 TESTS: gmail_gl1_gl2_labels
-2018_09_03_07_41_39 : ALL 1 TESTS SUCCESSFUL
-2018_09_03_07_41_45 : ALL 2 TESTS SUCCESSFUL
-2018_09_03_07_43_23 : ALL 1 TESTS SUCCESSFUL
-2018_09_03_07_43_30 : ALL 2 TESTS SUCCESSFUL
-2018_09_03_07_49_39 : ALL 1 TESTS SUCCESSFUL
-2018_09_03_07_49_49 : ALL 2 TESTS SUCCESSFUL
-2018_09_03_07_53_00 : ALL 1 TESTS SUCCESSFUL
-2018_09_03_07_53_07 : ALL 2 TESTS SUCCESSFUL
-2018_09_03_07_54_00 : ALL 1 TESTS SUCCESSFUL
-2018_09_03_07_54_06 : ALL 2 TESTS SUCCESSFUL
-2018_09_03_08_03_29 : ALL 1 TESTS SUCCESSFUL
-2018_09_03_08_03_35 : ALL 2 TESTS SUCCESSFUL
-2018_09_03_08_04_23 : ALL 1 TESTS SUCCESSFUL
-2018_09_03_08_04_29 : ALL 2 TESTS SUCCESSFUL
-2018_09_03_08_15_41 : ALL 1 TESTS SUCCESSFUL
-2018_09_03_08_15_47 : ALL 2 TESTS SUCCESSFUL
-2018_09_03_08_18_15 : ALL 1 TESTS SUCCESSFUL
-2018_09_03_08_18_21 : ALL 2 TESTS SUCCESSFUL
-2018_09_03_08_40_30 : ALL 1 TESTS SUCCESSFUL
-2018_09_03_08_40_48 : ALL 2 TESTS SUCCESSFUL
-2018_09_03_08_44_41 : ALL 1 TESTS SUCCESSFUL
-2018_09_03_08_44_45 : FAILED 1/2 TESTS: gmail_gl_gl2
-2018_09_03_08_45_11 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_00_59_40 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_01_00_53 : FAILED 1/2 TESTS: ll_diff
-2018_09_04_03_11_13 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_03_11_48 : FAILED 1/2 TESTS: ll_diff
-2018_09_04_03_44_02 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_03_44_19 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_03_52_50 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_03_53_00 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_04_07_15 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_04_07_27 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_04_08_25 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_04_08_35 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_04_10_10 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_04_10_21 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_04_11_03 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_04_11_14 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_04_11_19 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_04_11_28 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_04_12_44 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_04_12_54 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_04_14_06 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_04_14_18 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_04_18_06 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_04_18_12 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_04_20_06 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_04_20_13 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_04_22_22 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_04_22_22 : FAILED 1/3 TESTS: imapsync.gl1@gmail.com
-2018_09_04_04_24_21 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_04_24_21 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_04_27_36 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_04_27_42 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_04_28_26 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_04_28_34 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_04_30_47 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_04_31_00 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_04_31_31 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_04_31_31 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_04_31_58 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_04_32_08 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_04_34_27 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_04_34_27 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_04_34_59 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_04_35_09 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_04_35_29 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_04_35_29 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_04_36_20 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_04_36_20 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_04_36_27 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_04_36_40 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_04_37_46 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_04_37_46 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_04_38_18 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_04_38_29 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_04_38_33 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_04_38_34 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_04_39_14 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_04_39_24 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_04_39_38 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_04_39_38 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_04_40_15 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_04_40_25 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_05_26_11 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_05_26_12 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_05_34_23 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_05_34_34 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_05_37_11 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_05_37_11 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_05_39_58 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_05_49_35 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_05_49_49 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_05_51_10 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_05_51_11 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_05_51_52 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_05_52_05 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_05_54_07 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_05_54_31 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_05_54_41 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_05_54_57 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_05_55_33 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_05_55_50 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_05_56_01 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_05_56_26 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_05_58_15 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_05_58_43 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_05_58_48 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_05_59_07 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_06_00_02 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_06_01_36 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_06_01_55 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_06_03_14 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_06_03_42 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_06_03_46 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_06_04_04 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_06_05_38 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_07_05_08 : ALL 146 TESTS SUCCESSFUL
-2018_09_04_15_17_32 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_15_17_40 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_15_18_53 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_15_18_58 : FAILED 1/2 TESTS: office365_justlogin_2
-2018_09_04_15_35_53 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_15_35_57 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_15_37_18 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_15_37_22 : ALL 2 TESTS SUCCESSFUL
-2018_09_04_15_56_31 : ALL 1 TESTS SUCCESSFUL
-2018_09_04_15_56_35 : ALL 2 TESTS SUCCESSFUL
-2018_09_09_16_32_01 : ALL 1 TESTS SUCCESSFUL
-2018_09_09_17_06_33 : FAILED 1/146 TESTS: free_ssl
-2018_09_09_19_08_19 : ALL 1 TESTS SUCCESSFUL
-2018_09_09_19_42_45 : FAILED 1/146 TESTS: free_ssl
-2018_09_10_12_14_54 : ALL 1 TESTS SUCCESSFUL
-2018_09_10_12_15_12 : ALL 2 TESTS SUCCESSFUL
-2018_09_10_12_23_18 : ALL 1 TESTS SUCCESSFUL
-2018_09_10_12_23_27 : ALL 2 TESTS SUCCESSFUL
-2018_09_10_12_24_17 : ALL 1 TESTS SUCCESSFUL
-2018_09_10_12_24_24 : ALL 2 TESTS SUCCESSFUL
-2018_09_10_12_24_45 : ALL 1 TESTS SUCCESSFUL
-2018_09_10_12_24_51 : ALL 2 TESTS SUCCESSFUL
-2018_09_10_18_33_24 : FAILED 1/1 TESTS: perl_syntax
-2018_09_10_18_41_14 : ALL 1 TESTS SUCCESSFUL
-2018_09_10_18_41_22 : ALL 2 TESTS SUCCESSFUL
-2018_09_10_18_42_20 : ALL 1 TESTS SUCCESSFUL
-2018_09_10_18_42_27 : ALL 2 TESTS SUCCESSFUL
-2018_09_10_18_45_46 : ALL 1 TESTS SUCCESSFUL
-2018_09_10_18_45_53 : ALL 2 TESTS SUCCESSFUL
-2018_09_10_18_58_55 : ALL 1 TESTS SUCCESSFUL
-2018_09_10_18_59_01 : ALL 2 TESTS SUCCESSFUL
-2018_09_10_19_01_38 : ALL 1 TESTS SUCCESSFUL
-2018_09_10_19_01_44 : ALL 2 TESTS SUCCESSFUL
-2018_09_10_20_00_26 : FAILED 1/1 TESTS: perl_syntax
-2018_09_10_20_06_31 : ALL 1 TESTS SUCCESSFUL
-2018_09_10_20_10_34 : ALL 1 TESTS SUCCESSFUL
-2018_09_10_20_10_37 : ALL 2 TESTS SUCCESSFUL
-2018_09_10_20_11_29 : ALL 1 TESTS SUCCESSFUL
-2018_09_10_20_11_32 : FAILED 1/2 TESTS: l_office365_noregexmess
-2018_09_10_22_25_15 : ALL 1 TESTS SUCCESSFUL
-2018_09_10_22_25_20 : FAILED 1/2 TESTS: l_exchange2_flagged_flag
-2018_09_10_22_27_46 : ALL 1 TESTS SUCCESSFUL
-2018_09_10_22_32_49 : ALL 1 TESTS SUCCESSFUL
-2018_09_10_22_36_39 : ALL 1 TESTS SUCCESSFUL
-2018_09_10_22_36_42 : FAILED 1/2 TESTS: l_exchange2_noregexmess_noregxflags
-2018_09_10_22_41_56 : ALL 1 TESTS SUCCESSFUL
-2018_09_10_22_41_56 : FAILED 1/2 TESTS: l_exchange2_noregexmess_noregxflags
-2018_09_10_22_42_10 : ALL 1 TESTS SUCCESSFUL
-2018_09_10_22_42_13 : FAILED 1/2 TESTS: l_exchange2_noregexmess_noregexflags
-2018_09_10_22_43_09 : ALL 1 TESTS SUCCESSFUL
-2018_09_10_22_43_11 : FAILED 1/2 TESTS: l_exchange2_noregexmess_noregexflags
-2018_09_10_22_43_20 : ALL 1 TESTS SUCCESSFUL
-2018_09_10_22_43_20 : FAILED 1/2 TESTS: l_exchange2_noregexmess_noregexflag
-2018_09_10_22_43_59 : ALL 1 TESTS SUCCESSFUL
-2018_09_10_22_44_02 : ALL 2 TESTS SUCCESSFUL
-2018_09_10_22_44_30 : ALL 1 TESTS SUCCESSFUL
-2018_09_10_22_44_36 : ALL 2 TESTS SUCCESSFUL
-2018_09_10_22_51_51 : ALL 1 TESTS SUCCESSFUL
-2018_09_10_22_51_58 : ALL 2 TESTS SUCCESSFUL
-2018_09_10_22_55_15 : ALL 1 TESTS SUCCESSFUL
-2018_09_10_22_55_23 : ALL 2 TESTS SUCCESSFUL
-2018_09_10_23_01_23 : ALL 1 TESTS SUCCESSFUL
-2018_09_10_23_01_30 : ALL 2 TESTS SUCCESSFUL
-2018_09_10_23_02_15 : ALL 1 TESTS SUCCESSFUL
-2018_09_10_23_02_21 : ALL 2 TESTS SUCCESSFUL
-2018_09_11_01_49_17 : ALL 1 TESTS SUCCESSFUL
-2018_09_11_01_49_25 : ALL 2 TESTS SUCCESSFUL
-2018_09_11_01_52_47 : ALL 1 TESTS SUCCESSFUL
-2018_09_11_01_52_53 : ALL 2 TESTS SUCCESSFUL
-2018_09_11_01_53_32 : ALL 1 TESTS SUCCESSFUL
-2018_09_11_01_53_37 : ALL 2 TESTS SUCCESSFUL
-2018_09_11_01_54_07 : ALL 1 TESTS SUCCESSFUL
-2018_09_11_01_54_13 : ALL 2 TESTS SUCCESSFUL
-2018_09_11_02_18_17 : ALL 1 TESTS SUCCESSFUL
-2018_09_11_02_18_23 : ALL 2 TESTS SUCCESSFUL
-2018_09_11_02_19_25 : ALL 1 TESTS SUCCESSFUL
-2018_09_11_02_19_31 : ALL 2 TESTS SUCCESSFUL
-2018_09_11_02_21_16 : ALL 1 TESTS SUCCESSFUL
-2018_09_11_02_21_21 : ALL 2 TESTS SUCCESSFUL
-2018_09_11_02_21_51 : ALL 1 TESTS SUCCESSFUL
-2018_09_11_02_21_57 : ALL 2 TESTS SUCCESSFUL
-2018_09_11_02_23_02 : ALL 1 TESTS SUCCESSFUL
-2018_09_11_02_23_08 : ALL 2 TESTS SUCCESSFUL
-2018_09_11_02_23_22 : ALL 1 TESTS SUCCESSFUL
-2018_09_11_02_23_28 : ALL 2 TESTS SUCCESSFUL
-2018_09_11_02_28_43 : ALL 1 TESTS SUCCESSFUL
-2018_09_11_02_29_07 : ALL 1 TESTS SUCCESSFUL
-2018_09_11_02_58_54 : ALL 146 TESTS SUCCESSFUL
-2018_09_11_11_19_05 : ALL 1 TESTS SUCCESSFUL
-2018_09_11_11_35_50 : FAILED 51/146 TESTS: ll_justfolders_delete1emptyfolders ll_prefix12 ll_nosyncinternaldates ll_idatefromheader ll_folder_rev ll_subscribed ll_nosubscribe ll_justfoldersizes ll_maxage ll_maxsize ll_skipsize ll_skipheader ll_include ll_exclude ll_exclude_INBOX ll_regextrans2 ll_regextrans2_subfolder ll_regextrans2_subfolder_02 ll_sep2 ll_skipmess ll_skipmess_8bits ll_pipemess ll_pipemess_catcat ll_resyncflags ll_ssl ll_tls ll_authmech_PLAIN ll_authmech_LOGIN ll_authmech_CRAMMD5 ll_authuser ll_delete2 ll_delete ll_folderrec ll_newmessage ll_usecache ll_usecache_noheader ll_usecache_debugcache ll_nousecache ll_delete2foldersonly_NEW_3 ll_delete2foldersonly ll_delete2foldersonly_tmp ll_delete2foldersbutnot ll_folder_create ll_folder_create_INBOX_Inbox ll_useuid ll_noheader_force ll_noheader ll_domino1_domino2 ll_domino2 testslive testslive6
-2018_09_11_11_45_25 : ALL 1 TESTS SUCCESSFUL
-2018_09_11_11_46_39 : ALL 1 TESTS SUCCESSFUL
-2018_09_11_11_47_22 : ALL 1 TESTS SUCCESSFUL
-2018_09_11_11_47_54 : ALL 1 TESTS SUCCESSFUL
-2018_09_11_11_47_59 : FAILED 1/2 TESTS: ll
-2018_09_11_11_49_37 : ALL 1 TESTS SUCCESSFUL
-2018_09_11_11_50_11 : FAILED 1/2 TESTS: ll
-2018_09_11_11_51_37 : ALL 1 TESTS SUCCESSFUL
-2018_09_11_11_52_12 : FAILED 1/2 TESTS: ll
-2018_09_11_11_54_35 : ALL 1 TESTS SUCCESSFUL
-2018_09_11_11_55_11 : FAILED 1/2 TESTS: ll
-2018_09_11_12_02_47 : ALL 1 TESTS SUCCESSFUL
-2018_09_11_12_03_21 : ALL 1 TESTS SUCCESSFUL
-2018_09_11_12_03_56 : FAILED 1/2 TESTS: ll
-2018_09_11_12_04_50 : ALL 1 TESTS SUCCESSFUL
-2018_09_11_12_05_24 : FAILED 1/2 TESTS: ll
-2018_09_11_12_06_25 : ALL 1 TESTS SUCCESSFUL
-2018_09_11_12_07_00 : FAILED 1/2 TESTS: ll_debug
-2018_09_11_12_11_45 : ALL 1 TESTS SUCCESSFUL
-2018_09_11_12_11_50 : FAILED 1/2 TESTS: ll_debug
-2018_09_11_12_12_06 : ALL 1 TESTS SUCCESSFUL
-2018_09_11_12_12_10 : FAILED 1/2 TESTS: ll
-2018_09_11_12_12_37 : ALL 1 TESTS SUCCESSFUL
-2018_09_11_12_13_31 : ALL 2 TESTS SUCCESSFUL
-2018_09_11_14_51_57 : ALL 1 TESTS SUCCESSFUL
-2018_09_11_15_23_11 : ALL 146 TESTS SUCCESSFUL
-2018_09_11_20_47_24 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_14_59_38 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_15_01_47 : FAILED 1/2 TESTS: ll_diff
-2018_09_12_15_01_53 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_15_02_28 : FAILED 1/2 TESTS: ll_diff
-2018_09_12_15_05_14 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_15_05_50 : FAILED 1/2 TESTS: ll_diff
-2018_09_12_15_08_36 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_15_09_12 : FAILED 1/2 TESTS: ll_diff
-2018_09_12_15_21_36 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_15_21_54 : FAILED 1/2 TESTS: ll_diff
-2018_09_12_15_25_00 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_15_25_26 : FAILED 1/2 TESTS: ll_diff
-2018_09_12_15_47_07 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_15_47_25 : FAILED 1/2 TESTS: ll_diff
-2018_09_12_15_47_36 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_15_47_43 : ALL 2 TESTS SUCCESSFUL
-2018_09_12_15_48_17 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_15_48_26 : ALL 2 TESTS SUCCESSFUL
-2018_09_12_15_49_10 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_15_49_18 : ALL 2 TESTS SUCCESSFUL
-2018_09_12_15_51_47 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_15_51_55 : ALL 2 TESTS SUCCESSFUL
-2018_09_12_15_55_24 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_15_55_31 : ALL 2 TESTS SUCCESSFUL
-2018_09_12_15_55_53 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_15_56_01 : ALL 2 TESTS SUCCESSFUL
-2018_09_12_16_01_25 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_16_01_37 : ALL 2 TESTS SUCCESSFUL
-2018_09_12_16_02_54 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_16_03_05 : ALL 2 TESTS SUCCESSFUL
-2018_09_12_16_03_25 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_16_03_42 : FAILED 1/2 TESTS: ll_diff
-2018_09_12_16_04_33 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_16_05_10 : FAILED 1/2 TESTS: ll_diff
-2018_09_12_16_10_31 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_16_11_06 : FAILED 1/2 TESTS: ll_diff
-2018_09_12_17_20_06 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_17_20_13 : ALL 2 TESTS SUCCESSFUL
-2018_09_12_17_21_08 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_17_21_13 : ALL 2 TESTS SUCCESSFUL
-2018_09_12_17_25_04 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_17_25_11 : ALL 2 TESTS SUCCESSFUL
-2018_09_12_17_25_27 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_17_25_32 : ALL 2 TESTS SUCCESSFUL
-2018_09_12_17_27_31 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_17_27_36 : ALL 2 TESTS SUCCESSFUL
-2018_09_12_17_28_25 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_17_28_29 : ALL 2 TESTS SUCCESSFUL
-2018_09_12_17_36_27 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_17_36_32 : ALL 2 TESTS SUCCESSFUL
-2018_09_12_17_37_42 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_17_37_47 : ALL 2 TESTS SUCCESSFUL
-2018_09_12_17_39_31 : FAILED 1/1 TESTS: perl_syntax
-2018_09_12_17_40_02 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_17_40_08 : ALL 2 TESTS SUCCESSFUL
-2018_09_12_17_40_45 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_17_40_50 : ALL 2 TESTS SUCCESSFUL
-2018_09_12_17_41_59 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_17_42_04 : ALL 2 TESTS SUCCESSFUL
-2018_09_12_17_43_19 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_17_43_24 : ALL 2 TESTS SUCCESSFUL
-2018_09_12_17_44_48 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_17_44_56 : ALL 2 TESTS SUCCESSFUL
-2018_09_12_23_10_24 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_23_10_30 : ALL 2 TESTS SUCCESSFUL
-2018_09_12_23_12_25 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_23_12_30 : ALL 2 TESTS SUCCESSFUL
-2018_09_12_23_12_43 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_23_12_48 : ALL 2 TESTS SUCCESSFUL
-2018_09_12_23_39_47 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_23_39_52 : ALL 2 TESTS SUCCESSFUL
-2018_09_12_23_41_48 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_23_41_54 : ALL 2 TESTS SUCCESSFUL
-2018_09_12_23_42_29 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_23_42_35 : ALL 2 TESTS SUCCESSFUL
-2018_09_12_23_45_53 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_23_45_58 : ALL 2 TESTS SUCCESSFUL
-2018_09_12_23_46_34 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_23_46_40 : ALL 2 TESTS SUCCESSFUL
-2018_09_12_23_46_50 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_23_46_56 : ALL 2 TESTS SUCCESSFUL
-2018_09_12_23_49_04 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_23_49_09 : ALL 2 TESTS SUCCESSFUL
-2018_09_12_23_49_37 : ALL 1 TESTS SUCCESSFUL
-2018_09_12_23_49_42 : ALL 2 TESTS SUCCESSFUL
-2018_09_13_00_36_37 : ALL 1 TESTS SUCCESSFUL
-2018_09_13_00_36_42 : ALL 2 TESTS SUCCESSFUL
-2018_09_13_00_36_53 : ALL 1 TESTS SUCCESSFUL
-2018_09_13_00_36_58 : ALL 2 TESTS SUCCESSFUL
-2018_09_13_00_57_45 : ALL 1 TESTS SUCCESSFUL
-2018_09_13_00_57_50 : ALL 2 TESTS SUCCESSFUL
-2018_09_13_00_59_09 : ALL 1 TESTS SUCCESSFUL
-2018_09_13_00_59_14 : ALL 2 TESTS SUCCESSFUL
-2018_09_13_01_00_26 : ALL 1 TESTS SUCCESSFUL
-2018_09_13_01_00_31 : ALL 2 TESTS SUCCESSFUL
-2018_09_13_01_01_15 : ALL 1 TESTS SUCCESSFUL
-2018_09_13_01_01_20 : ALL 2 TESTS SUCCESSFUL
-2018_09_13_01_01_51 : ALL 1 TESTS SUCCESSFUL
-2018_09_13_01_01_56 : ALL 2 TESTS SUCCESSFUL
-2018_09_13_01_04_47 : ALL 1 TESTS SUCCESSFUL
-2018_09_13_01_04_52 : ALL 2 TESTS SUCCESSFUL
-2018_09_13_01_05_11 : ALL 1 TESTS SUCCESSFUL
-2018_09_13_01_05_20 : ALL 2 TESTS SUCCESSFUL
-2018_09_13_01_17_30 : FAILED 1/1 TESTS: perl_syntax
-2018_09_13_01_17_55 : ALL 1 TESTS SUCCESSFUL
-2018_09_13_01_18_00 : ALL 2 TESTS SUCCESSFUL
-2018_09_13_01_18_11 : ALL 1 TESTS SUCCESSFUL
-2018_09_13_01_18_16 : ALL 2 TESTS SUCCESSFUL
-2018_09_13_01_26_37 : ALL 1 TESTS SUCCESSFUL
-2018_09_13_01_26_42 : ALL 2 TESTS SUCCESSFUL
-2018_09_13_01_27_45 : ALL 1 TESTS SUCCESSFUL
-2018_09_13_01_27_50 : ALL 2 TESTS SUCCESSFUL
-2018_09_13_01_28_00 : ALL 1 TESTS SUCCESSFUL
-2018_09_13_01_28_05 : ALL 2 TESTS SUCCESSFUL
-2018_09_13_01_28_21 : ALL 1 TESTS SUCCESSFUL
-2018_09_13_01_28_26 : ALL 2 TESTS SUCCESSFUL
-2018_09_13_01_29_49 : ALL 1 TESTS SUCCESSFUL
-2018_09_13_01_29_53 : FAILED 1/2 TESTS: ll_syncflagsaftercopy
-2018_09_13_01_30_08 : ALL 1 TESTS SUCCESSFUL
-2018_09_13_01_30_15 : ALL 2 TESTS SUCCESSFUL
-2018_09_13_11_35_30 : ALL 1 TESTS SUCCESSFUL
-2018_09_13_11_35_41 : FAILED 1/2 TESTS: ll_syncflagsaftercopy
-2018_09_13_11_36_01 : ALL 1 TESTS SUCCESSFUL
-2018_09_13_11_36_06 : FAILED 1/2 TESTS: ll_syncflagsaftercopy
-2018_09_13_11_37_00 : ALL 1 TESTS SUCCESSFUL
-2018_09_13_11_37_05 : ALL 2 TESTS SUCCESSFUL
-2018_09_13_11_37_24 : ALL 1 TESTS SUCCESSFUL
-2018_09_13_11_37_29 : ALL 2 TESTS SUCCESSFUL
-2018_09_13_11_42_57 : ALL 1 TESTS SUCCESSFUL
-2018_09_13_11_43_58 : FAILED 1/2 TESTS: ll_diff
-2018_09_13_12_04_11 : ALL 1 TESTS SUCCESSFUL
-2018_09_13_12_33_19 : ALL 146 TESTS SUCCESSFUL
-2018_09_19_02_26_30 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_02_26_51 : FAILED 1/2 TESTS: ll_delete
-2018_09_19_02_31_21 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_02_31_30 : FAILED 1/2 TESTS: ll_delete
-2018_09_19_02_32_36 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_02_32_46 : FAILED 1/2 TESTS: ll_delete
-2018_09_19_02_34_22 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_02_34_37 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_02_37_37 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_02_37_41 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_02_37_41 : FAILED 1/2 TESTS: ll_delete
-2018_09_19_02_37_45 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_02_38_00 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_02_39_21 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_02_39_36 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_02_39_55 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_02_39_59 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_02_44_09 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_02_44_26 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_02_46_45 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_02_47_04 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_03_02_36 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_03_02_50 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_03_08_10 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_03_08_24 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_03_08_40 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_03_08_54 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_03_13_08 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_03_13_22 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_03_18_41 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_03_18_55 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_03_19_24 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_03_19_37 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_03_20_01 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_03_20_21 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_03_29_34 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_03_29_48 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_03_31_51 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_03_32_04 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_03_33_14 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_03_33_27 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_03_56_43 : FAILED 1/1 TESTS: perl_syntax
-2018_09_19_03_57_08 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_03_57_22 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_04_09_42 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_04_09_56 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_04_10_31 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_04_10_45 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_04_16_48 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_04_17_24 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_04_18_10 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_04_18_27 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_04_25_00 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_04_25_57 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_04_28_01 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_04_28_46 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_04_30_10 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_04_31_00 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_04_32_05 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_04_32_57 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_04_36_19 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_04_37_20 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_04_39_52 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_04_41_03 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_05_03_01 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_05_04_05 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_05_08_24 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_05_08_44 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_05_19_15 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_05_20_10 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_05_20_37 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_05_20_56 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_05_21_47 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_05_22_08 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_05_25_29 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_05_25_45 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_05_31_38 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_05_31_54 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_05_32_05 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_05_32_37 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_05_34_40 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_05_38_11 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_05_38_27 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_06_24_43 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_06_24_59 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_06_29_30 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_06_29_47 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_06_30_32 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_06_31_06 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_06_31_34 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_06_32_07 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_06_51_04 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_07_22_04 : ALL 146 TESTS SUCCESSFUL
-2018_09_19_13_58_59 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_13_59_23 : ALL 2 TESTS SUCCESSFUL
-2018_09_19_13_59_37 : ALL 1 TESTS SUCCESSFUL
-2018_09_19_13_59_51 : ALL 2 TESTS SUCCESSFUL
-2018_09_20_00_23_26 : ALL 1 TESTS SUCCESSFUL
-2018_09_20_00_23_41 : ALL 2 TESTS SUCCESSFUL
-2018_09_20_00_24_00 : ALL 1 TESTS SUCCESSFUL
-2018_09_20_00_24_17 : ALL 2 TESTS SUCCESSFUL
-2018_09_20_00_28_05 : ALL 1 TESTS SUCCESSFUL
-2018_09_20_00_28_32 : ALL 1 TESTS SUCCESSFUL
-2018_09_20_00_28_32 : FAILED 1/2 TESTS: ll_delete1
-2018_09_20_00_28_56 : ALL 1 TESTS SUCCESSFUL
-2018_09_20_00_28_56 : FAILED 1/2 TESTS: ll_delete1
-2018_09_20_00_29_26 : ALL 1 TESTS SUCCESSFUL
-2018_09_20_00_29_26 : FAILED 1/2 TESTS: ll_delete1
-2018_09_20_00_29_36 : ALL 1 TESTS SUCCESSFUL
-2018_09_20_00_29_36 : FAILED 1/2 TESTS: ll_delete1
-2018_09_20_00_30_07 : ALL 1 TESTS SUCCESSFUL
-2018_09_20_00_30_07 : FAILED 1/2 TESTS: ll_delete1
-2018_09_20_00_30_13 : ALL 1 TESTS SUCCESSFUL
-2018_09_20_00_30_13 : FAILED 1/2 TESTS: ll_delete1
-2018_09_20_00_30_52 : ALL 1 TESTS SUCCESSFUL
-2018_09_20_00_31_06 : ALL 2 TESTS SUCCESSFUL
-2018_09_20_00_31_18 : ALL 1 TESTS SUCCESSFUL
-2018_09_20_00_31_32 : ALL 2 TESTS SUCCESSFUL
-2018_09_20_00_33_08 : ALL 1 TESTS SUCCESSFUL
-2018_09_20_00_33_22 : ALL 2 TESTS SUCCESSFUL
-2018_09_20_00_37_02 : ALL 1 TESTS SUCCESSFUL
-2018_09_20_00_37_16 : ALL 2 TESTS SUCCESSFUL
-2018_09_20_00_39_57 : ALL 1 TESTS SUCCESSFUL
-2018_09_20_00_40_14 : ALL 2 TESTS SUCCESSFUL
-2018_09_20_00_41_15 : ALL 1 TESTS SUCCESSFUL
-2018_09_20_00_41_29 : ALL 2 TESTS SUCCESSFUL
-2018_09_20_01_09_33 : ALL 1 TESTS SUCCESSFUL
-2018_09_20_01_09_40 : FAILED 1/2 TESTS: ll_delete1_twoemails
-2018_09_20_01_10_11 : ALL 1 TESTS SUCCESSFUL
-2018_09_20_01_10_11 : FAILED 1/2 TESTS: ll_delete1_twoemails
-2018_09_20_01_10_35 : ALL 1 TESTS SUCCESSFUL
-2018_09_20_01_10_49 : ALL 2 TESTS SUCCESSFUL
-2018_09_20_01_11_15 : ALL 1 TESTS SUCCESSFUL
-2018_09_20_01_11_29 : ALL 2 TESTS SUCCESSFUL
-2018_09_20_01_12_50 : ALL 1 TESTS SUCCESSFUL
-2018_09_20_01_13_03 : ALL 2 TESTS SUCCESSFUL
-2018_09_20_01_23_08 : ALL 1 TESTS SUCCESSFUL
-2018_09_20_01_23_22 : ALL 2 TESTS SUCCESSFUL
-2018_09_20_02_03_55 : FAILED 1/1 TESTS: perl_syntax
-2018_09_20_02_05_24 : ALL 1 TESTS SUCCESSFUL
-2018_09_20_02_35_46 : ALL 147 TESTS SUCCESSFUL
-2018_09_27_11_37_07 : ALL 1 TESTS SUCCESSFUL
-2018_09_27_11_37_59 : ALL 2 TESTS SUCCESSFUL
-2018_09_28_13_14_19 : ALL 1 TESTS SUCCESSFUL
-2018_09_28_13_14_42 : ALL 2 TESTS SUCCESSFUL
-2018_09_28_13_18_28 : ALL 1 TESTS SUCCESSFUL
-2018_09_28_13_18_33 : ALL 2 TESTS SUCCESSFUL
-2018_09_28_13_19_54 : ALL 1 TESTS SUCCESSFUL
-2018_09_28_13_19_58 : ALL 2 TESTS SUCCESSFUL
-2018_09_28_13_20_56 : ALL 1 TESTS SUCCESSFUL
-2018_09_28_13_21_01 : ALL 2 TESTS SUCCESSFUL
-2018_09_28_13_21_45 : ALL 1 TESTS SUCCESSFUL
-2018_09_28_13_21_50 : ALL 2 TESTS SUCCESSFUL
-2018_09_28_16_26_23 : ALL 1 TESTS SUCCESSFUL
-2018_09_28_16_26_26 : ALL 2 TESTS SUCCESSFUL
-2018_09_28_16_26_56 : ALL 1 TESTS SUCCESSFUL
-2018_09_28_16_27_01 : ALL 2 TESTS SUCCESSFUL
-2018_10_02_08_10_54 : ALL 1 TESTS SUCCESSFUL
-2018_10_02_08_11_03 : ALL 2 TESTS SUCCESSFUL
-2018_10_02_10_43_22 : ALL 1 TESTS SUCCESSFUL
-2018_10_02_10_43_27 : ALL 2 TESTS SUCCESSFUL
-2018_10_02_10_49_32 : ALL 1 TESTS SUCCESSFUL
-2018_10_02_10_49_36 : ALL 2 TESTS SUCCESSFUL
-2018_10_02_10_53_19 : ALL 1 TESTS SUCCESSFUL
-2018_10_02_10_53_23 : ALL 2 TESTS SUCCESSFUL
-2018_10_02_10_57_34 : ALL 1 TESTS SUCCESSFUL
-2018_10_02_10_57_38 : ALL 2 TESTS SUCCESSFUL
-2018_10_02_11_02_26 : ALL 1 TESTS SUCCESSFUL
-2018_10_02_11_02_31 : FAILED 1/2 TESTS: gmail_gl1_gl2_appendlimit
-2018_10_02_11_03_38 : ALL 1 TESTS SUCCESSFUL
-2018_10_02_11_03_43 : ALL 2 TESTS SUCCESSFUL
-2018_10_02_11_07_03 : FAILED 1/1 TESTS: perl_syntax
-2018_10_02_11_07_26 : ALL 1 TESTS SUCCESSFUL
-2018_10_02_11_07_32 : ALL 2 TESTS SUCCESSFUL
-2018_10_03_23_52_52 : ALL 1 TESTS SUCCESSFUL
-2018_10_03_23_53_00 : ALL 2 TESTS SUCCESSFUL
-2018_10_04_00_18_48 : ALL 1 TESTS SUCCESSFUL
-2018_10_04_00_18_53 : ALL 2 TESTS SUCCESSFUL
-2018_10_04_00_36_45 : ALL 1 TESTS SUCCESSFUL
-2018_10_04_00_36_51 : ALL 2 TESTS SUCCESSFUL
-2018_10_04_00_51_29 : ALL 1 TESTS SUCCESSFUL
-2018_10_04_00_51_35 : ALL 2 TESTS SUCCESSFUL
-2018_10_04_00_52_04 : ALL 1 TESTS SUCCESSFUL
-2018_10_04_00_52_09 : ALL 2 TESTS SUCCESSFUL
-2018_10_04_01_01_04 : ALL 1 TESTS SUCCESSFUL
-2018_10_04_01_01_08 : ALL 2 TESTS SUCCESSFUL
-2018_10_04_01_05_13 : ALL 1 TESTS SUCCESSFUL
-2018_10_04_01_05_19 : ALL 2 TESTS SUCCESSFUL
-2018_10_04_01_06_51 : ALL 1 TESTS SUCCESSFUL
-2018_10_04_01_07_41 : ALL 2 TESTS SUCCESSFUL
-2018_10_04_01_16_33 : ALL 1 TESTS SUCCESSFUL
-2018_10_04_01_16_51 : ALL 3 TESTS SUCCESSFUL
-2018_10_04_01_47_13 : ALL 1 TESTS SUCCESSFUL
-2018_10_04_01_47_18 : ALL 2 TESTS SUCCESSFUL
-2018_10_05_21_52_20 : ALL 1 TESTS SUCCESSFUL
-2018_10_05_22_50_02 : FAILED 1/148 TESTS: memory_stress
-2018_10_18_13_42_26 : ALL 1 TESTS SUCCESSFUL
-2018_10_18_14_14_23 : FAILED 3/148 TESTS: option_tests option_tests_in_var_tmp option_tests_in_var_tmp_sub
-2018_10_18_14_55_31 : ALL 1 TESTS SUCCESSFUL
-2018_10_18_14_56_55 : ALL 1 TESTS SUCCESSFUL
-2018_10_18_15_20_50 : ALL 1 TESTS SUCCESSFUL
-2018_10_18_15_30_17 : ALL 1 TESTS SUCCESSFUL
-2018_10_18_15_40_04 : ALL 1 TESTS SUCCESSFUL
-2018_10_19_13_47_01 : ALL 1 TESTS SUCCESSFUL
-2018_10_19_13_47_08 : ALL 2 TESTS SUCCESSFUL
-2018_10_19_13_47_42 : ALL 1 TESTS SUCCESSFUL
-2018_10_19_13_47_46 : ALL 2 TESTS SUCCESSFUL
-2018_10_19_14_32_54 : ALL 1 TESTS SUCCESSFUL
-2018_10_19_14_33_07 : ALL 2 TESTS SUCCESSFUL
-2018_11_11_19_53_32 : ALL 1 TESTS SUCCESSFUL
-2018_11_11_20_23_07 : ALL 148 TESTS SUCCESSFUL
-2018_11_15_02_04_44 : ALL 1 TESTS SUCCESSFUL
-2018_11_15_02_08_53 : ALL 1 TESTS SUCCESSFUL
-2018_11_15_02_10_53 : ALL 1 TESTS SUCCESSFUL
-2018_11_16_11_10_48 : ALL 1 TESTS SUCCESSFUL
-2018_11_16_11_40_46 : ALL 148 TESTS SUCCESSFUL
-2018_11_18_13_07_04 : ALL 1 TESTS SUCCESSFUL
-2018_11_18_13_09_05 : ALL 2 TESTS SUCCESSFUL
-2018_11_18_14_44_02 : ALL 1 TESTS SUCCESSFUL
-2018_11_18_14_44_07 : ALL 2 TESTS SUCCESSFUL
-2018_11_18_15_14_35 : ALL 1 TESTS SUCCESSFUL
-2018_11_18_15_14_40 : ALL 2 TESTS SUCCESSFUL
-2018_11_18_15_16_47 : ALL 1 TESTS SUCCESSFUL
-2018_11_18_15_16_52 : ALL 2 TESTS SUCCESSFUL
-2018_11_18_15_21_34 : ALL 1 TESTS SUCCESSFUL
-2018_11_18_15_22_02 : FAILED 1/2 TESTS: ll_ask_password
-2018_11_18_15_23_59 : ALL 1 TESTS SUCCESSFUL
-2018_11_18_15_24_13 : FAILED 1/2 TESTS: ll_ask_password
-2018_11_18_15_24_25 : ALL 1 TESTS SUCCESSFUL
-2018_11_18_15_24_30 : ALL 2 TESTS SUCCESSFUL
-2018_11_18_15_27_28 : ALL 1 TESTS SUCCESSFUL
-2018_11_18_15_27_32 : ALL 2 TESTS SUCCESSFUL
-2018_11_18_15_28_46 : ALL 1 TESTS SUCCESSFUL
-2018_11_18_15_28_51 : ALL 2 TESTS SUCCESSFUL
-2018_11_18_15_32_17 : ALL 1 TESTS SUCCESSFUL
-2018_11_18_15_32_34 : FAILED 1/2 TESTS: ll_ask_password
-2018_11_18_15_34_13 : ALL 1 TESTS SUCCESSFUL
-2018_11_18_15_34_39 : ALL 2 TESTS SUCCESSFUL
-2018_11_18_15_34_43 : ALL 1 TESTS SUCCESSFUL
-2018_11_18_15_34_47 : FAILED 1/2 TESTS: ll_ask_password
-2018_11_18_15_35_19 : ALL 1 TESTS SUCCESSFUL
-2018_11_18_15_35_26 : ALL 2 TESTS SUCCESSFUL
-2018_11_18_15_36_25 : ALL 1 TESTS SUCCESSFUL
-2018_11_18_15_36_30 : ALL 2 TESTS SUCCESSFUL
-2018_11_18_15_37_08 : ALL 1 TESTS SUCCESSFUL
-2018_11_18_15_37_34 : FAILED 1/2 TESTS: ll_ask_password
-2018_11_18_15_47_28 : ALL 1 TESTS SUCCESSFUL
-2018_11_18_15_47_33 : ALL 2 TESTS SUCCESSFUL
-2018_11_18_15_53_13 : ALL 1 TESTS SUCCESSFUL
-2018_11_18_15_53_18 : ALL 2 TESTS SUCCESSFUL
-2018_11_18_15_55_35 : ALL 1 TESTS SUCCESSFUL
-2018_11_18_15_55_39 : ALL 2 TESTS SUCCESSFUL
-2018_11_18_15_56_06 : ALL 1 TESTS SUCCESSFUL
-2018_11_18_15_56_11 : ALL 2 TESTS SUCCESSFUL
-2018_11_18_15_57_59 : ALL 1 TESTS SUCCESSFUL
-2018_11_18_15_58_05 : ALL 2 TESTS SUCCESSFUL
-2018_11_20_10_14_26 : ALL 1 TESTS SUCCESSFUL
-2018_11_20_10_14_42 : ALL 2 TESTS SUCCESSFUL
-2018_11_20_10_20_47 : ALL 1 TESTS SUCCESSFUL
-2018_11_20_10_23_40 : ALL 1 TESTS SUCCESSFUL
-2018_11_20_10_58_13 : ALL 1 TESTS SUCCESSFUL
-2018_11_20_10_58_18 : ALL 2 TESTS SUCCESSFUL
-2018_11_20_11_00_41 : ALL 1 TESTS SUCCESSFUL
-2018_11_20_11_00_47 : ALL 2 TESTS SUCCESSFUL
-2018_11_20_14_18_29 : ALL 1 TESTS SUCCESSFUL
-2018_12_04_02_26_45 : ALL 1 TESTS SUCCESSFUL
-2018_12_04_02_56_30 : ALL 148 TESTS SUCCESSFUL
-2018_12_09_23_19_06 : ALL 1 TESTS SUCCESSFUL
-2018_12_09_23_49_43 : ALL 148 TESTS SUCCESSFUL
-2018_12_10_20_59_06 : ALL 1 TESTS SUCCESSFUL
-2018_12_10_20_59_23 : ALL 2 TESTS SUCCESSFUL
-2018_12_10_21_00_14 : ALL 1 TESTS SUCCESSFUL
-2018_12_10_21_00_21 : ALL 2 TESTS SUCCESSFUL
-2018_12_23_21_49_49 : ALL 1 TESTS SUCCESSFUL
-2018_12_23_21_53_37 : ALL 2 TESTS SUCCESSFUL
-2018_12_23_22_00_43 : ALL 1 TESTS SUCCESSFUL
-2018_12_23_22_00_52 : ALL 2 TESTS SUCCESSFUL
-2018_12_23_22_42_25 : ALL 1 TESTS SUCCESSFUL
-2018_12_23_23_01_10 : ALL 2 TESTS SUCCESSFUL
-2018_12_23_23_21_14 : ALL 1 TESTS SUCCESSFUL
-2018_12_23_23_21_43 : ALL 4 TESTS SUCCESSFUL
-2018_12_25_14_00_40 : ALL 1 TESTS SUCCESSFUL
-2018_12_25_14_00_59 : ALL 2 TESTS SUCCESSFUL
-2018_12_25_14_03_51 : ALL 1 TESTS SUCCESSFUL
-2018_12_25_14_03_56 : ALL 2 TESTS SUCCESSFUL
-2018_12_25_14_10_06 : ALL 1 TESTS SUCCESSFUL
-2018_12_25_14_10_13 : ALL 2 TESTS SUCCESSFUL
-2018_12_25_14_11_18 : ALL 1 TESTS SUCCESSFUL
-2018_12_25_14_11_23 : ALL 2 TESTS SUCCESSFUL
-2018_12_25_14_56_14 : ALL 1 TESTS SUCCESSFUL
-2018_12_25_14_56_19 : ALL 2 TESTS SUCCESSFUL
-2018_12_25_19_09_26 : ALL 1 TESTS SUCCESSFUL
-2018_12_25_19_09_32 : ALL 2 TESTS SUCCESSFUL
-2018_12_25_19_11_15 : ALL 1 TESTS SUCCESSFUL
-2018_12_25_19_11_21 : ALL 2 TESTS SUCCESSFUL
-2018_12_25_19_17_21 : FAILED 1/1 TESTS: perl_syntax
-2018_12_25_19_18_18 : ALL 1 TESTS SUCCESSFUL
-2018_12_25_19_18_23 : ALL 2 TESTS SUCCESSFUL
-2019_01_03_16_12_41 : ALL 1 TESTS SUCCESSFUL
-2019_01_03_16_19_03 : ALL 1 TESTS SUCCESSFUL
-2019_01_03_16_20_40 : ALL 1 TESTS SUCCESSFUL
-2019_01_03_16_21_44 : ALL 1 TESTS SUCCESSFUL
-2019_01_03_16_22_20 : ALL 1 TESTS SUCCESSFUL
-2019_01_03_16_53_42 : FAILED 3/148 TESTS: option_tests option_tests_in_var_tmp option_tests_in_var_tmp_sub
-2019_01_04_00_15_29 : ALL 1 TESTS SUCCESSFUL
-2019_01_04_00_16_07 : FAILED 3/4 TESTS: option_tests option_tests_in_var_tmp option_tests_in_var_tmp_sub
-2019_01_05_00_29_35 : ALL 1 TESTS SUCCESSFUL
-2019_01_05_01_00_34 : ALL 148 TESTS SUCCESSFUL
-2019_01_05_18_11_04 : FAILED 1/1 TESTS: perl_syntax
-2019_01_05_18_12_42 : FAILED 1/1 TESTS: perl_syntax
-2019_01_05_18_13_07 : ALL 1 TESTS SUCCESSFUL
-2019_01_05_18_13_29 : ALL 2 TESTS SUCCESSFUL
-2019_01_05_18_58_22 : ALL 1 TESTS SUCCESSFUL
-2019_01_05_18_58_36 : ALL 2 TESTS SUCCESSFUL
-2019_01_05_18_59_43 : ALL 1 TESTS SUCCESSFUL
-2019_01_05_18_59_58 : ALL 2 TESTS SUCCESSFUL
-2019_01_05_19_54_00 : ALL 1 TESTS SUCCESSFUL
-2019_01_05_20_24_01 : ALL 148 TESTS SUCCESSFUL
-2019_01_05_23_07_55 : ALL 1 TESTS SUCCESSFUL
-2019_01_05_23_09_51 : ALL 1 TESTS SUCCESSFUL
-2019_01_05_23_09_54 : FAILED 1/3 TESTS: titi
-2019_01_05_23_10_23 : ALL 1 TESTS SUCCESSFUL
-2019_01_05_23_10_24 : ALL 2 TESTS SUCCESSFUL
-2019_01_05_23_10_46 : ALL 1 TESTS SUCCESSFUL
-2019_01_05_23_11_20 : ALL 2 TESTS SUCCESSFUL
-2019_01_05_23_12_21 : ALL 1 TESTS SUCCESSFUL
-2019_01_05_23_12_37 : ALL 2 TESTS SUCCESSFUL
-2019_01_05_23_16_16 : ALL 1 TESTS SUCCESSFUL
-2019_01_05_23_16_16 : ALL 2 TESTS SUCCESSFUL
-2019_01_05_23_18_41 : ALL 1 TESTS SUCCESSFUL
-2019_01_05_23_18_49 : ALL 2 TESTS SUCCESSFUL
-2019_01_05_23_23_53 : ALL 1 TESTS SUCCESSFUL
-2019_01_05_23_24_01 : ALL 2 TESTS SUCCESSFUL
-2019_01_05_23_26_12 : ALL 1 TESTS SUCCESSFUL
-2019_01_05_23_26_19 : ALL 2 TESTS SUCCESSFUL
-2019_01_05_23_29_53 : FAILED 1/1 TESTS: perl_syntax
-2019_01_06_00_12_40 : FAILED 1/1 TESTS: perl_syntax
-2019_01_06_00_13_16 : ALL 1 TESTS SUCCESSFUL
-2019_01_06_00_13_20 : ALL 2 TESTS SUCCESSFUL
-2019_01_06_00_15_50 : ALL 1 TESTS SUCCESSFUL
-2019_01_06_00_15_55 : ALL 2 TESTS SUCCESSFUL
-2019_01_06_00_19_38 : ALL 1 TESTS SUCCESSFUL
-2019_01_06_00_19_44 : ALL 2 TESTS SUCCESSFUL
-2019_01_06_00_20_06 : ALL 1 TESTS SUCCESSFUL
-2019_01_06_00_20_07 : ALL 2 TESTS SUCCESSFUL
-2019_01_06_00_20_17 : ALL 1 TESTS SUCCESSFUL
-2019_01_06_00_20_18 : ALL 2 TESTS SUCCESSFUL
-2019_01_06_00_20_30 : ALL 1 TESTS SUCCESSFUL
-2019_01_06_00_20_38 : ALL 2 TESTS SUCCESSFUL
-2019_01_06_00_22_52 : ALL 1 TESTS SUCCESSFUL
-2019_01_06_00_22_57 : ALL 2 TESTS SUCCESSFUL
-2019_01_06_00_24_14 : ALL 1 TESTS SUCCESSFUL
-2019_01_06_00_24_19 : ALL 2 TESTS SUCCESSFUL
-2019_01_06_00_24_46 : ALL 1 TESTS SUCCESSFUL
-2019_01_06_00_24_51 : ALL 2 TESTS SUCCESSFUL
-2019_01_07_14_58_13 : ALL 1 TESTS SUCCESSFUL
-2019_01_07_14_58_28 : FAILED 1/2 TESTS: ksks_password_doublequote
-2019_01_07_14_59_00 : ALL 1 TESTS SUCCESSFUL
-2019_01_07_14_59_06 : ALL 2 TESTS SUCCESSFUL
-2019_01_07_14_59_40 : ALL 1 TESTS SUCCESSFUL
-2019_01_07_14_59_48 : FAILED 1/2 TESTS: ksks_password_doublequote
-2019_01_07_15_00_20 : ALL 1 TESTS SUCCESSFUL
-2019_01_07_15_00_30 : FAILED 1/2 TESTS: ksks_password_doublequote
-2019_01_08_21_18_45 : ALL 1 TESTS SUCCESSFUL
-2019_01_08_21_18_56 : ALL 2 TESTS SUCCESSFUL
-2019_01_08_21_21_40 : ALL 1 TESTS SUCCESSFUL
-2019_01_08_21_23_18 : ALL 1 TESTS SUCCESSFUL
-2019_01_08_21_23_53 : ALL 2 TESTS SUCCESSFUL
-2019_01_08_21_24_15 : ALL 1 TESTS SUCCESSFUL
-2019_01_08_21_24_22 : ALL 2 TESTS SUCCESSFUL
-2019_01_08_21_25_15 : ALL 1 TESTS SUCCESSFUL
-2019_01_08_21_25_26 : ALL 2 TESTS SUCCESSFUL
-2019_01_08_21_25_46 : ALL 1 TESTS SUCCESSFUL
-2019_01_08_21_25_56 : ALL 2 TESTS SUCCESSFUL
-2019_01_08_21_26_38 : ALL 1 TESTS SUCCESSFUL
-2019_01_08_21_26_47 : ALL 2 TESTS SUCCESSFUL
-2019_01_09_02_02_39 : ALL 1 TESTS SUCCESSFUL
-2019_01_09_02_02_52 : ALL 2 TESTS SUCCESSFUL
-2019_01_09_02_05_08 : ALL 1 TESTS SUCCESSFUL
-2019_01_09_02_05_18 : ALL 2 TESTS SUCCESSFUL
-2019_01_21_06_15_51 : ALL 1 TESTS SUCCESSFUL
-2019_01_21_06_18_12 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_13_42_50 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_13_47_25 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_13_47_31 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_13_49_05 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_13_49_11 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_13_50_36 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_13_50_42 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_13_51_02 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_13_51_06 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_13_52_33 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_13_52_38 : FAILED 1/2 TESTS: gigamail_1
-2019_02_05_13_53_12 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_13_53_16 : FAILED 1/2 TESTS: gigamail_1
-2019_02_05_13_53_43 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_13_53_43 : FAILED 1/2 TESTS: gigamail_1
-2019_02_05_13_54_12 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_13_54_16 : FAILED 1/2 TESTS: jong_1
-2019_02_05_13_55_12 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_13_55_19 : FAILED 1/2 TESTS: jong_1
-2019_02_05_13_57_26 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_13_57_32 : FAILED 1/2 TESTS: exchange_1
-2019_02_05_14_01_57 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_14_16_51 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_14_17_05 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_14_18_02 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_14_18_07 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_14_18_37 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_14_22_25 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_14_24_27 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_14_30_21 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_14_32_07 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_14_35_20 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_14_35_20 : FAILED 1/2 TESTS: huge_folder_2017
-2019_02_05_14_35_25 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_14_41_30 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_14_49_48 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_14_49_53 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_14_51_16 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_14_51_33 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_14_51_56 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_14_52_13 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_14_53_13 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_14_53_31 : ALL 3 TESTS SUCCESSFUL
-2019_02_05_14_57_18 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_14_57_35 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_15_01_51 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_15_01_56 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_15_04_26 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_15_04_31 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_15_05_37 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_15_06_08 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_15_07_32 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_15_07_40 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_15_11_42 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_15_11_51 : FAILED 1/2 TESTS: ll_final_diff
-2019_02_05_15_13_19 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_15_14_22 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_15_14_29 : FAILED 1/2 TESTS: ll_final_diff
-2019_02_05_15_18_50 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_15_18_58 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_15_21_05 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_15_21_13 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_15_22_28 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_15_22_36 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_15_23_28 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_15_23_36 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_15_24_15 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_15_24_23 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_15_25_00 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_15_25_12 : FAILED 1/2 TESTS: ll_final_diff
-2019_02_05_15_27_07 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_15_27_15 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_15_28_13 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_15_28_21 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_15_29_10 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_15_29_57 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_15_30_08 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_15_31_51 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_15_31_51 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_15_32_10 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_15_32_19 : ALL 4 TESTS SUCCESSFUL
-2019_02_05_15_33_20 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_15_33_28 : ALL 3 TESTS SUCCESSFUL
-2019_02_05_15_47_59 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_15_48_08 : ALL 3 TESTS SUCCESSFUL
-2019_02_05_16_15_52 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_16_21_11 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_16_35_01 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_17_02_01 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_18_39_22 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_18_42_19 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_18_42_21 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_18_44_47 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_19_17_51 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_19_20_19 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_19_21_33 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_19_23_08 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_19_24_06 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_19_25_52 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_19_31_28 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_19_32_56 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_19_40_27 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_19_40_50 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_19_44_08 : FAILED 1/1 TESTS: perl_syntax
-2019_02_05_19_45_18 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_19_45_28 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_19_47_46 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_19_47_53 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_19_49_32 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_19_49_39 : ALL 2 TESTS SUCCESSFUL
-2019_02_05_19_50_36 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_19_50_46 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_19_51_06 : ALL 3 TESTS SUCCESSFUL
-2019_02_05_19_52_45 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_19_52_53 : ALL 3 TESTS SUCCESSFUL
-2019_02_05_19_53_28 : ALL 1 TESTS SUCCESSFUL
-2019_02_05_19_53_36 : ALL 3 TESTS SUCCESSFUL
-2019_02_06_10_37_25 : ALL 1 TESTS SUCCESSFUL
-2019_02_06_10_37_52 : ALL 2 TESTS SUCCESSFUL
-2019_02_06_10_51_51 : ALL 1 TESTS SUCCESSFUL
-2019_02_06_10_51_59 : ALL 2 TESTS SUCCESSFUL
-2019_02_06_10_52_34 : ALL 1 TESTS SUCCESSFUL
-2019_02_06_10_52_42 : ALL 2 TESTS SUCCESSFUL
-2019_02_06_10_53_21 : ALL 1 TESTS SUCCESSFUL
-2019_02_06_10_53_30 : ALL 3 TESTS SUCCESSFUL
-2019_02_06_10_53_43 : ALL 1 TESTS SUCCESSFUL
-2019_02_06_10_54_57 : ALL 2 TESTS SUCCESSFUL
-2019_02_06_10_56_04 : ALL 1 TESTS SUCCESSFUL
-2019_02_06_10_56_41 : ALL 2 TESTS SUCCESSFUL
-2019_02_06_11_03_50 : ALL 1 TESTS SUCCESSFUL
-2019_02_06_11_04_32 : ALL 2 TESTS SUCCESSFUL
-2019_02_06_11_38_08 : ALL 1 TESTS SUCCESSFUL
-2019_02_06_11_38_45 : ALL 2 TESTS SUCCESSFUL
-2019_02_06_11_46_09 : ALL 1 TESTS SUCCESSFUL
-2019_02_06_11_46_25 : ALL 2 TESTS SUCCESSFUL
-2019_02_06_11_49_24 : ALL 1 TESTS SUCCESSFUL
-2019_02_06_11_49_40 : ALL 2 TESTS SUCCESSFUL
-2019_02_06_11_52_24 : ALL 1 TESTS SUCCESSFUL
-2019_02_06_11_53_02 : ALL 2 TESTS SUCCESSFUL
-2019_02_06_13_31_39 : ALL 1 TESTS SUCCESSFUL
-2019_02_06_14_02_08 : ALL 148 TESTS SUCCESSFUL
-2019_02_07_13_17_48 : ALL 1 TESTS SUCCESSFUL
-2019_02_07_13_56_16 : ALL 148 TESTS SUCCESSFUL
-2019_02_08_13_21_11 : ALL 1 TESTS SUCCESSFUL
-2019_02_08_13_21_50 : ALL 2 TESTS SUCCESSFUL
-2019_02_09_14_44_59 : FAILED 1/1 TESTS: perl_syntax
-2019_02_09_14_47_17 : FAILED 1/1 TESTS: perl_syntax
-2019_02_09_14_47_41 : ALL 1 TESTS SUCCESSFUL
-2019_02_09_14_49_13 : ALL 2 TESTS SUCCESSFUL
-2019_02_09_14_51_39 : ALL 1 TESTS SUCCESSFUL
-2019_02_09_14_56_58 : ALL 1 TESTS SUCCESSFUL
-2019_02_09_14_59_41 : ALL 1 TESTS SUCCESSFUL
-2019_02_09_15_02_00 : FAILED 1/1 TESTS: perl_syntax
-2019_02_09_15_02_20 : ALL 1 TESTS SUCCESSFUL
-2019_02_09_15_03_13 : ALL 1 TESTS SUCCESSFUL
-2019_02_09_15_03_17 : ALL 2 TESTS SUCCESSFUL
-2019_02_09_15_05_03 : ALL 1 TESTS SUCCESSFUL
-2019_02_09_15_05_08 : ALL 2 TESTS SUCCESSFUL
-2019_02_09_15_06_09 : ALL 1 TESTS SUCCESSFUL
-2019_02_09_15_06_13 : ALL 2 TESTS SUCCESSFUL
-2019_02_09_15_10_08 : ALL 1 TESTS SUCCESSFUL
-2019_02_09_15_10_13 : ALL 2 TESTS SUCCESSFUL
-2019_02_09_15_11_07 : ALL 1 TESTS SUCCESSFUL
-2019_02_09_15_11_11 : ALL 2 TESTS SUCCESSFUL
-2019_02_09_15_13_46 : ALL 1 TESTS SUCCESSFUL
-2019_02_09_15_13_50 : FAILED 1/2 TESTS: ll_authmech_X_MASTERAUTH
-2019_02_09_15_16_44 : ALL 1 TESTS SUCCESSFUL
-2019_02_09_15_16_48 : FAILED 1/2 TESTS: ll_authmech_X_MASTERAUTH
-2019_02_09_15_19_45 : ALL 1 TESTS SUCCESSFUL
-2019_02_09_15_19_49 : FAILED 1/2 TESTS: ll_authmech_X_MASTERAUTH
-2019_02_09_15_20_16 : ALL 1 TESTS SUCCESSFUL
-2019_02_09_15_20_22 : FAILED 1/2 TESTS: ll_authmech_X_MASTERAUTH
-2019_02_09_16_02_52 : ALL 1 TESTS SUCCESSFUL
-2019_02_09_16_04_36 : ALL 2 TESTS SUCCESSFUL
-2019_02_09_17_04_10 : ALL 1 TESTS SUCCESSFUL
-2019_02_09_17_13_39 : ALL 2 TESTS SUCCESSFUL
-2019_02_10_13_36_21 : ALL 1 TESTS SUCCESSFUL
-2019_02_10_14_07_36 : ALL 148 TESTS SUCCESSFUL
-2019_02_11_01_30_39 : ALL 1 TESTS SUCCESSFUL
-2019_02_11_01_32_30 : ALL 2 TESTS SUCCESSFUL
-2019_02_18_11_11_38 : ALL 1 TESTS SUCCESSFUL
-2019_02_18_11_11_53 : FAILED 1/3 TESTS: ll_errors
-2019_02_18_11_13_17 : ALL 1 TESTS SUCCESSFUL
-2019_02_18_11_14_53 : ALL 1 TESTS SUCCESSFUL
-2019_02_18_11_15_04 : FAILED 1/3 TESTS: ll_final_diff_with_errors
-2019_02_18_11_15_46 : ALL 1 TESTS SUCCESSFUL
-2019_02_18_11_15_46 : FAILED 1/3 TESTS: ll_final_diff_with_errors
-2019_02_18_11_16_03 : ALL 1 TESTS SUCCESSFUL
-2019_02_18_11_16_27 : FAILED 1/3 TESTS: ll_with_errors
-2019_02_18_11_17_24 : ALL 1 TESTS SUCCESSFUL
-2019_02_18_11_17_35 : FAILED 1/3 TESTS: ll_with_errors
-2019_02_18_11_21_46 : ALL 1 TESTS SUCCESSFUL
-2019_02_18_11_53_50 : ALL 148 TESTS SUCCESSFUL
-2019_02_19_09_28_52 : ALL 1 TESTS SUCCESSFUL
-2019_02_19_09_59_12 : ALL 148 TESTS SUCCESSFUL
-2019_02_19_21_39_46 : ALL 1 TESTS SUCCESSFUL
-2019_02_19_21_39_53 : ALL 2 TESTS SUCCESSFUL
-2019_02_21_14_02_22 : ALL 1 TESTS SUCCESSFUL
-2019_02_23_10_36_30 : ALL 1 TESTS SUCCESSFUL
-2019_02_23_10_45_30 : ALL 1 TESTS SUCCESSFUL
-2019_02_23_10_46_17 : ALL 1 TESTS SUCCESSFUL
-2019_02_23_10_50_12 : ALL 1 TESTS SUCCESSFUL
-2019_02_23_10_50_17 : ALL 2 TESTS SUCCESSFUL
-2019_02_23_10_53_18 : ALL 1 TESTS SUCCESSFUL
-2019_02_23_10_53_47 : ALL 1 TESTS SUCCESSFUL
-2019_02_23_10_54_05 : ALL 2 TESTS SUCCESSFUL
-2019_02_23_11_53_58 : ALL 1 TESTS SUCCESSFUL
-2019_02_23_11_54_08 : FAILED 1/2 TESTS: ll_append_debugimap
-2019_02_23_11_54_47 : ALL 1 TESTS SUCCESSFUL
-2019_02_23_12_00_33 : ALL 1 TESTS SUCCESSFUL
-2019_02_23_12_00_41 : FAILED 1/2 TESTS: ll_append_debugimap
-2019_02_23_12_07_01 : ALL 1 TESTS SUCCESSFUL
-2019_02_23_12_07_09 : ALL 2 TESTS SUCCESSFUL
-2019_02_23_12_13_37 : ALL 1 TESTS SUCCESSFUL
-2019_02_23_12_13_44 : ALL 2 TESTS SUCCESSFUL
-2019_02_23_12_14_04 : ALL 1 TESTS SUCCESSFUL
-2019_02_23_12_14_11 : FAILED 1/2 TESTS: ll_append_debugimap
-2019_02_24_13_32_24 : ALL 1 TESTS SUCCESSFUL
-2019_02_24_13_33_11 : ALL 2 TESTS SUCCESSFUL
-2019_02_24_13_36_51 : ALL 1 TESTS SUCCESSFUL
-2019_02_24_13_36_59 : ALL 2 TESTS SUCCESSFUL
-2019_02_27_16_21_13 : ALL 1 TESTS SUCCESSFUL
-2019_02_27_16_49_40 : ALL 148 TESTS SUCCESSFUL
-2019_03_03_19_11_40 : ALL 1 TESTS SUCCESSFUL
-2019_03_03_19_41_44 : ALL 148 TESTS SUCCESSFUL
-2019_03_06_19_20_07 : ALL 1 TESTS SUCCESSFUL
-2019_03_06_19_20_07 : FAILED 1/2 TESTS: gmail_gl1_gl2_labels_subfolder2
-2019_03_06_19_20_26 : ALL 1 TESTS SUCCESSFUL
-2019_03_06_19_20_54 : ALL 2 TESTS SUCCESSFUL
-2019_03_06_19_21_20 : ALL 1 TESTS SUCCESSFUL
-2019_03_06_19_21_28 : ALL 2 TESTS SUCCESSFUL
-2019_03_06_19_22_31 : ALL 1 TESTS SUCCESSFUL
-2019_03_06_19_22_42 : ALL 3 TESTS SUCCESSFUL
-2019_03_06_19_26_11 : ALL 1 TESTS SUCCESSFUL
-2019_03_06_19_26_11 : ALL 2 TESTS SUCCESSFUL
-2019_03_06_19_30_40 : ALL 1 TESTS SUCCESSFUL
-2019_03_06_19_31_05 : ALL 3 TESTS SUCCESSFUL
-2019_03_08_10_48_13 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_10_51_24 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_10_51_41 : FAILED 1/2 TESTS: xxxxx_gmail_06
-2019_03_08_11_03_42 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_11_03_54 : FAILED 1/2 TESTS: xxxxx_gmail_06
-2019_03_08_11_05_58 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_11_06_10 : ALL 2 TESTS SUCCESSFUL
-2019_03_08_11_42_04 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_11_42_17 : ALL 2 TESTS SUCCESSFUL
-2019_03_08_12_05_38 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_12_05_51 : ALL 2 TESTS SUCCESSFUL
-2019_03_08_13_18_48 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_13_18_49 : FAILED 1/3 TESTS: imapsync.gl1@gmail.com
-2019_03_08_13_29_57 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_13_29_58 : FAILED 1/3 TESTS: imapsync.gl1@gmail.com
-2019_03_08_13_33_22 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_13_33_40 : ALL 2 TESTS SUCCESSFUL
-2019_03_08_13_49_17 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_13_49_26 : ALL 2 TESTS SUCCESSFUL
-2019_03_08_13_50_13 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_13_50_18 : ALL 2 TESTS SUCCESSFUL
-2019_03_08_13_50_59 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_13_51_04 : ALL 2 TESTS SUCCESSFUL
-2019_03_08_14_01_46 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_14_01_51 : ALL 2 TESTS SUCCESSFUL
-2019_03_08_14_03_54 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_14_03_59 : ALL 2 TESTS SUCCESSFUL
-2019_03_08_14_05_06 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_14_05_12 : ALL 2 TESTS SUCCESSFUL
-2019_03_08_14_07_53 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_14_07_58 : ALL 2 TESTS SUCCESSFUL
-2019_03_08_14_15_16 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_14_15_21 : ALL 2 TESTS SUCCESSFUL
-2019_03_08_14_16_45 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_14_16_50 : ALL 2 TESTS SUCCESSFUL
-2019_03_08_14_17_32 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_14_17_36 : ALL 2 TESTS SUCCESSFUL
-2019_03_08_14_26_59 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_14_27_04 : ALL 2 TESTS SUCCESSFUL
-2019_03_08_14_29_28 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_14_29_32 : ALL 2 TESTS SUCCESSFUL
-2019_03_08_14_30_41 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_14_30_46 : ALL 2 TESTS SUCCESSFUL
-2019_03_08_14_31_57 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_14_32_02 : ALL 2 TESTS SUCCESSFUL
-2019_03_08_14_34_07 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_14_34_12 : ALL 2 TESTS SUCCESSFUL
-2019_03_08_14_38_43 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_14_38_48 : ALL 2 TESTS SUCCESSFUL
-2019_03_08_14_42_24 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_14_42_29 : ALL 2 TESTS SUCCESSFUL
-2019_03_08_14_43_49 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_14_43_54 : ALL 2 TESTS SUCCESSFUL
-2019_03_08_14_51_09 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_14_51_14 : ALL 2 TESTS SUCCESSFUL
-2019_03_08_14_56_41 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_14_56_45 : FAILED 1/2 TESTS: ll_regex_flag8_add_SEEN_if_not_here
-2019_03_08_14_58_29 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_14_58_34 : ALL 2 TESTS SUCCESSFUL
-2019_03_08_14_59_58 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_15_00_04 : ALL 2 TESTS SUCCESSFUL
-2019_03_08_17_20_21 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_17_20_26 : ALL 2 TESTS SUCCESSFUL
-2019_03_08_17_22_11 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_17_22_16 : ALL 2 TESTS SUCCESSFUL
-2019_03_08_17_24_17 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_17_24_21 : FAILED 1/2 TESTS: ll_regex_flag8_add_SEEN_if_not_here
-2019_03_08_17_25_05 : ALL 1 TESTS SUCCESSFUL
-2019_03_08_17_25_11 : ALL 2 TESTS SUCCESSFUL
-2019_03_13_18_51_40 : ALL 1 TESTS SUCCESSFUL
-2019_03_13_18_53_26 : ALL 2 TESTS SUCCESSFUL
-2019_03_13_18_57_38 : ALL 1 TESTS SUCCESSFUL
-2019_03_13_18_57_54 : ALL 2 TESTS SUCCESSFUL
-2019_03_13_18_59_17 : ALL 1 TESTS SUCCESSFUL
-2019_03_13_18_59_26 : ALL 2 TESTS SUCCESSFUL
-2019_03_13_18_59_47 : ALL 1 TESTS SUCCESSFUL
-2019_03_13_18_59_56 : ALL 2 TESTS SUCCESSFUL
-2019_03_14_19_07_39 : ALL 1 TESTS SUCCESSFUL
-2019_03_14_19_07_40 : ALL 2 TESTS SUCCESSFUL
-2019_03_14_19_16_33 : ALL 1 TESTS SUCCESSFUL
-2019_03_14_19_20_18 : ALL 1 TESTS SUCCESSFUL
-2019_03_14_19_20_51 : ALL 2 TESTS SUCCESSFUL
-2019_03_14_19_21_39 : ALL 1 TESTS SUCCESSFUL
-2019_03_14_19_21_39 : ALL 2 TESTS SUCCESSFUL
-2019_03_14_19_22_18 : ALL 1 TESTS SUCCESSFUL
-2019_03_14_19_24_16 : ALL 1 TESTS SUCCESSFUL
-2019_03_14_19_24_16 : ALL 2 TESTS SUCCESSFUL
-2019_03_14_19_25_06 : ALL 1 TESTS SUCCESSFUL
-2019_03_14_19_28_46 : ALL 1 TESTS SUCCESSFUL
-2019_03_14_19_28_46 : ALL 2 TESTS SUCCESSFUL
-2019_03_14_19_29_22 : ALL 1 TESTS SUCCESSFUL
-2019_03_14_19_30_00 : ALL 1 TESTS SUCCESSFUL
-2019_03_14_19_30_01 : ALL 2 TESTS SUCCESSFUL
-2019_03_14_19_30_59 : ALL 1 TESTS SUCCESSFUL
-2019_03_14_19_32_54 : ALL 1 TESTS SUCCESSFUL
-2019_03_14_19_32_54 : ALL 2 TESTS SUCCESSFUL
-2019_03_14_19_34_28 : ALL 1 TESTS SUCCESSFUL
-2019_03_14_19_34_55 : ALL 2 TESTS SUCCESSFUL
-2019_03_15_12_57_52 : ALL 1 TESTS SUCCESSFUL
-2019_03_15_12_57_53 : ALL 2 TESTS SUCCESSFUL
-2019_03_15_13_02_51 : ALL 1 TESTS SUCCESSFUL
-2019_03_15_13_08_28 : ALL 1 TESTS SUCCESSFUL
-2019_03_15_13_08_43 : ALL 2 TESTS SUCCESSFUL
-2019_03_15_13_11_34 : ALL 1 TESTS SUCCESSFUL
-2019_03_15_13_11_34 : ALL 2 TESTS SUCCESSFUL
-2019_03_15_13_12_08 : ALL 1 TESTS SUCCESSFUL
-2019_03_15_13_12_08 : ALL 2 TESTS SUCCESSFUL
-2019_03_15_13_12_14 : ALL 1 TESTS SUCCESSFUL
-2019_03_15_13_12_33 : ALL 2 TESTS SUCCESSFUL
-2019_03_15_17_13_31 : ALL 1 TESTS SUCCESSFUL
-2019_03_15_17_13_44 : ALL 2 TESTS SUCCESSFUL
-2019_03_15_17_13_57 : ALL 1 TESTS SUCCESSFUL
-2019_03_15_17_14_18 : ALL 2 TESTS SUCCESSFUL
-2019_03_15_17_21_21 : ALL 1 TESTS SUCCESSFUL
-2019_03_15_17_22_01 : ALL 2 TESTS SUCCESSFUL
-2019_03_15_17_26_31 : ALL 1 TESTS SUCCESSFUL
-2019_03_15_17_26_50 : ALL 2 TESTS SUCCESSFUL
-2019_03_15_20_06_38 : ALL 1 TESTS SUCCESSFUL
-2019_03_15_20_06_54 : ALL 2 TESTS SUCCESSFUL
-2019_03_15_20_07_28 : ALL 1 TESTS SUCCESSFUL
-2019_03_15_20_11_03 : ALL 1 TESTS SUCCESSFUL
-2019_03_15_20_11_22 : ALL 2 TESTS SUCCESSFUL
-2019_03_15_20_15_57 : ALL 1 TESTS SUCCESSFUL
-2019_03_15_20_16_10 : ALL 2 TESTS SUCCESSFUL
-2019_03_15_20_40_37 : ALL 1 TESTS SUCCESSFUL
-2019_03_15_20_40_49 : ALL 2 TESTS SUCCESSFUL
-2019_03_15_20_43_10 : ALL 1 TESTS SUCCESSFUL
-2019_03_15_20_43_31 : ALL 2 TESTS SUCCESSFUL
-2019_03_15_22_51_25 : ALL 1 TESTS SUCCESSFUL
-2019_03_15_22_52_45 : FAILED 1/2 TESTS: ll
-2019_03_15_22_53_50 : ALL 1 TESTS SUCCESSFUL
-2019_03_15_22_54_29 : ALL 2 TESTS SUCCESSFUL
-2019_03_15_23_20_35 : ALL 1 TESTS SUCCESSFUL
-2019_03_15_23_20_50 : ALL 2 TESTS SUCCESSFUL
-2019_03_16_19_55_31 : ALL 1 TESTS SUCCESSFUL
-2019_03_16_19_55_49 : ALL 2 TESTS SUCCESSFUL
-2019_03_16_22_02_56 : ALL 1 TESTS SUCCESSFUL
-2019_03_16_22_03_08 : ALL 2 TESTS SUCCESSFUL
-2019_03_16_22_03_35 : ALL 1 TESTS SUCCESSFUL
-2019_03_16_22_03_47 : ALL 2 TESTS SUCCESSFUL
-2019_03_16_22_18_39 : ALL 1 TESTS SUCCESSFUL
-2019_03_16_22_18_42 : FAILED 1/2 TESTS: gmail_gl2_gl3_labels_after_a_subfolder2_on_host1
-2019_03_18_08_14_13 : ALL 1 TESTS SUCCESSFUL
-2019_03_18_08_14_21 : FAILED 1/2 TESTS: gmail_gl2_gl3_labels_after_a_subfolder2_on_host1
-2019_03_18_08_14_49 : ALL 1 TESTS SUCCESSFUL
-2019_03_18_08_27_58 : FAILED 1/1 TESTS: perl_syntax
-2019_03_18_08_28_24 : ALL 1 TESTS SUCCESSFUL
-2019_03_18_08_28_27 : FAILED 1/2 TESTS: gmail_gl2_gl3_labels_after_a_subfolder2_on_host1
-2019_03_18_08_28_53 : ALL 1 TESTS SUCCESSFUL
-2019_03_18_08_29_04 : ALL 2 TESTS SUCCESSFUL
-2019_03_18_08_32_47 : ALL 1 TESTS SUCCESSFUL
-2019_03_18_08_32_57 : ALL 2 TESTS SUCCESSFUL
-2019_03_18_09_23_59 : ALL 1 TESTS SUCCESSFUL
-2019_03_18_09_24_10 : ALL 2 TESTS SUCCESSFUL
-2019_03_18_10_23_49 : ALL 1 TESTS SUCCESSFUL
-2019_03_18_10_23_59 : ALL 2 TESTS SUCCESSFUL
-2019_03_18_10_24_41 : ALL 1 TESTS SUCCESSFUL
-2019_03_18_10_24_50 : ALL 2 TESTS SUCCESSFUL
-2019_03_19_10_15_50 : ALL 1 TESTS SUCCESSFUL
-2019_03_19_10_15_56 : FAILED 1/2 TESTS: gmail_gl2_gl3_labels_after_a_subfolder2_on_host1
-2019_03_19_10_16_59 : ALL 1 TESTS SUCCESSFUL
-2019_03_19_10_17_10 : ALL 2 TESTS SUCCESSFUL
-2019_03_19_10_40_17 : ALL 1 TESTS SUCCESSFUL
-2019_03_19_10_40_31 : ALL 2 TESTS SUCCESSFUL
-2019_03_21_01_45_34 : ALL 1 TESTS SUCCESSFUL
-2019_03_21_02_26_50 : FAILED 4/148 TESTS: option_tests option_tests_in_var_tmp option_tests_in_var_tmp_sub office365_justconnect_inet4_inet6
-2019_03_22_14_43_04 : ALL 1 TESTS SUCCESSFUL
-2019_03_22_14_43_15 : ALL 2 TESTS SUCCESSFUL
-2019_03_22_14_43_52 : ALL 1 TESTS SUCCESSFUL
-2019_03_22_14_44_15 : ALL 2 TESTS SUCCESSFUL
-2019_03_22_14_46_20 : ALL 1 TESTS SUCCESSFUL
-2019_03_22_14_46_32 : ALL 2 TESTS SUCCESSFUL
-2019_03_22_14_48_46 : ALL 1 TESTS SUCCESSFUL
-2019_03_22_14_50_03 : ALL 1 TESTS SUCCESSFUL
-2019_03_22_14_50_23 : ALL 2 TESTS SUCCESSFUL
-2019_03_22_14_52_30 : ALL 1 TESTS SUCCESSFUL
-2019_03_22_14_53_07 : ALL 2 TESTS SUCCESSFUL
-2019_03_22_14_55_12 : ALL 1 TESTS SUCCESSFUL
-2019_03_22_14_55_30 : ALL 2 TESTS SUCCESSFUL
-2019_03_22_15_00_36 : ALL 1 TESTS SUCCESSFUL
-2019_03_22_15_00_54 : ALL 2 TESTS SUCCESSFUL
-2019_03_22_15_01_14 : ALL 1 TESTS SUCCESSFUL
-2019_03_22_15_01_32 : ALL 2 TESTS SUCCESSFUL
-2019_03_22_15_04_13 : ALL 1 TESTS SUCCESSFUL
-2019_03_22_15_04_31 : ALL 2 TESTS SUCCESSFUL
-2019_03_22_15_05_10 : ALL 1 TESTS SUCCESSFUL
-2019_03_22_15_05_28 : ALL 2 TESTS SUCCESSFUL
-2019_03_22_15_10_52 : ALL 1 TESTS SUCCESSFUL
-2019_03_22_15_51_05 : ALL 1 TESTS SUCCESSFUL
-2019_03_22_16_32_56 : FAILED 1/148 TESTS: office365_justconnect_inet4_inet6
-2019_03_23_20_16_37 : ALL 1 TESTS SUCCESSFUL
-2019_03_23_20_17_13 : FAILED 1/2 TESTS: ll_diff
-2019_03_23_20_17_25 : ALL 1 TESTS SUCCESSFUL
-2019_03_23_20_18_27 : FAILED 1/2 TESTS: ll_diff
-2019_03_23_20_19_03 : ALL 1 TESTS SUCCESSFUL
-2019_03_23_20_19_14 : FAILED 1/2 TESTS: ll_diff
-2019_03_23_20_20_52 : FAILED 1/1 TESTS: perl_syntax
-2019_03_23_20_25_59 : FAILED 1/1 TESTS: perl_syntax
-2019_03_23_20_29_39 : ALL 1 TESTS SUCCESSFUL
-2019_03_23_20_29_49 : FAILED 1/2 TESTS: ll_diff
-2019_03_23_20_39_25 : ALL 1 TESTS SUCCESSFUL
-2019_03_23_20_39_35 : FAILED 1/2 TESTS: ll_diff
-2019_03_23_20_40_34 : ALL 1 TESTS SUCCESSFUL
-2019_03_23_20_40_43 : ALL 2 TESTS SUCCESSFUL
-2019_03_24_13_18_00 : ALL 1 TESTS SUCCESSFUL
-2019_03_24_13_18_44 : ALL 3 TESTS SUCCESSFUL
-2019_03_24_13_19_06 : ALL 1 TESTS SUCCESSFUL
-2019_03_24_13_19_11 : ALL 2 TESTS SUCCESSFUL
-2019_03_24_13_20_40 : ALL 1 TESTS SUCCESSFUL
-2019_03_24_13_20_45 : ALL 2 TESTS SUCCESSFUL
-2019_03_24_13_48_53 : ALL 1 TESTS SUCCESSFUL
-2019_03_24_13_49_02 : ALL 2 TESTS SUCCESSFUL
-2019_03_25_18_29_04 : ALL 1 TESTS SUCCESSFUL
-2019_03_25_18_57_31 : FAILED 4/148 TESTS: ll_regextrans2_subfolder ll_regextrans2_subfolder_02 ll_delete2foldersonly ll_delete2foldersonly_tmp
-2019_03_25_22_08_20 : ALL 1 TESTS SUCCESSFUL
-2019_03_25_22_08_34 : ALL 2 TESTS SUCCESSFUL
-2019_03_25_22_18_42 : ALL 1 TESTS SUCCESSFUL
-2019_03_25_22_19_17 : ALL 2 TESTS SUCCESSFUL
-2019_03_25_22_21_44 : ALL 1 TESTS SUCCESSFUL
-2019_03_25_22_22_18 : ALL 2 TESTS SUCCESSFUL
-2019_03_25_22_28_46 : ALL 1 TESTS SUCCESSFUL
-2019_03_25_22_29_09 : ALL 2 TESTS SUCCESSFUL
-2019_03_25_22_32_49 : ALL 1 TESTS SUCCESSFUL
-2019_03_25_22_33_11 : ALL 2 TESTS SUCCESSFUL
-2019_03_25_23_24_13 : ALL 1 TESTS SUCCESSFUL
-2019_03_25_23_24_36 : ALL 2 TESTS SUCCESSFUL
-2019_03_25_23_27_05 : ALL 1 TESTS SUCCESSFUL
-2019_03_25_23_28_23 : ALL 1 TESTS SUCCESSFUL
-2019_03_25_23_29_24 : ALL 1 TESTS SUCCESSFUL
-2019_03_25_23_29_59 : ALL 2 TESTS SUCCESSFUL
-2019_03_25_23_31_38 : ALL 1 TESTS SUCCESSFUL
-2019_03_25_23_31_59 : ALL 2 TESTS SUCCESSFUL
-2019_03_25_23_33_24 : ALL 1 TESTS SUCCESSFUL
-2019_03_25_23_33_45 : ALL 2 TESTS SUCCESSFUL
-2019_03_25_23_34_44 : ALL 1 TESTS SUCCESSFUL
-2019_03_25_23_35_13 : FAILED 1/2 TESTS: gmail_gl3_gl1_labels_subfolder1
-2019_03_25_23_35_57 : ALL 1 TESTS SUCCESSFUL
-2019_03_25_23_36_18 : FAILED 1/2 TESTS: gmail_gl3_gl1_labels_subfolder1
-2019_03_26_11_23_25 : ALL 1 TESTS SUCCESSFUL
-2019_03_26_11_23_50 : ALL 2 TESTS SUCCESSFUL
-2019_03_26_12_03_51 : ALL 1 TESTS SUCCESSFUL
-2019_03_26_12_30_29 : FAILED 4/148 TESTS: ll_regextrans2_subfolder ll_regextrans2_subfolder_02 ll_delete2foldersonly ll_delete2foldersonly_tmp
-2019_03_26_22_35_42 : ALL 1 TESTS SUCCESSFUL
-2019_03_26_22_36_09 : ALL 2 TESTS SUCCESSFUL
-2019_03_26_23_03_51 : ALL 1 TESTS SUCCESSFUL
-2019_03_26_23_04_22 : ALL 2 TESTS SUCCESSFUL
-2019_03_26_23_06_20 : ALL 1 TESTS SUCCESSFUL
-2019_03_26_23_06_40 : ALL 2 TESTS SUCCESSFUL
-2019_03_26_23_09_22 : ALL 1 TESTS SUCCESSFUL
-2019_03_26_23_09_44 : ALL 2 TESTS SUCCESSFUL
-2019_03_26_23_10_00 : ALL 1 TESTS SUCCESSFUL
-2019_03_26_23_10_22 : ALL 2 TESTS SUCCESSFUL
-2019_03_26_23_11_05 : ALL 1 TESTS SUCCESSFUL
-2019_03_26_23_11_26 : ALL 2 TESTS SUCCESSFUL
-2019_03_26_23_11_55 : ALL 1 TESTS SUCCESSFUL
-2019_03_26_23_12_17 : ALL 2 TESTS SUCCESSFUL
-2019_03_26_23_13_18 : ALL 1 TESTS SUCCESSFUL
-2019_03_26_23_13_40 : ALL 2 TESTS SUCCESSFUL
-2019_03_26_23_13_57 : ALL 1 TESTS SUCCESSFUL
-2019_03_26_23_14_21 : ALL 2 TESTS SUCCESSFUL
-2019_03_26_23_31_11 : ALL 1 TESTS SUCCESSFUL
-2019_03_26_23_31_34 : ALL 2 TESTS SUCCESSFUL
-2019_03_26_23_32_11 : ALL 1 TESTS SUCCESSFUL
-2019_03_26_23_32_30 : ALL 2 TESTS SUCCESSFUL
-2019_03_26_23_37_49 : ALL 1 TESTS SUCCESSFUL
-2019_03_26_23_38_15 : ALL 2 TESTS SUCCESSFUL
-2019_03_26_23_45_59 : ALL 1 TESTS SUCCESSFUL
-2019_03_26_23_46_11 : ALL 2 TESTS SUCCESSFUL
-2019_03_26_23_46_33 : ALL 1 TESTS SUCCESSFUL
-2019_03_26_23_46_42 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_09_33_20 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_09_33_43 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_09_42_04 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_09_42_27 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_09_46_49 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_09_47_13 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_09_50_02 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_09_50_41 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_09_52_14 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_09_52_39 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_09_55_34 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_09_56_07 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_10_01_39 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_10_02_03 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_11_19_58 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_11_20_11 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_11_30_17 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_11_30_28 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_11_37_23 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_11_37_35 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_11_42_30 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_11_42_40 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_11_43_50 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_11_44_01 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_11_44_38 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_11_44_50 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_11_45_08 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_11_45_19 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_11_46_46 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_11_46_57 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_11_49_03 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_11_49_14 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_11_52_47 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_11_53_10 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_11_54_10 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_11_54_24 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_11_54_57 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_11_55_12 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_11_59_17 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_11_59_33 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_11_59_48 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_12_00_03 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_12_18_04 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_12_18_24 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_12_19_10 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_12_19_24 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_12_20_46 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_12_21_08 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_12_29_51 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_12_30_05 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_12_33_44 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_12_33_56 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_12_34_33 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_12_34_43 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_13_17_50 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_13_18_11 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_13_18_33 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_13_18_50 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_13_19_25 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_13_19_41 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_13_40_15 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_13_40_38 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_13_49_00 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_13_49_15 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_16_50_20 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_16_50_38 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_16_52_37 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_16_52_50 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_16_55_15 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_16_55_28 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_16_55_50 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_16_56_15 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_16_59_16 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_16_59_35 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_17_02_43 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_17_03_02 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_17_06_11 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_17_06_25 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_17_08_54 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_17_09_15 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_17_09_22 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_17_09_43 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_17_15_31 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_17_15_45 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_17_16_09 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_17_16_21 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_17_17_02 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_17_17_13 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_17_18_06 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_17_18_19 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_17_21_07 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_17_21_21 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_17_21_37 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_17_21_51 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_17_24_45 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_17_24_54 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_17_26_23 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_17_26_42 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_19_39_34 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_19_39_46 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_19_40_33 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_19_40_47 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_19_44_12 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_19_44_22 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_19_44_56 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_19_45_10 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_23_24_17 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_23_24_30 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_23_27_12 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_23_27_27 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_23_28_13 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_23_28_28 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_23_42_59 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_23_43_17 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_23_44_00 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_23_44_12 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_23_45_33 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_23_45_48 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_23_45_57 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_23_46_08 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_23_49_23 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_23_49_42 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_23_50_45 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_23_51_09 : ALL 2 TESTS SUCCESSFUL
-2019_03_27_23_51_39 : ALL 1 TESTS SUCCESSFUL
-2019_03_27_23_51_57 : ALL 2 TESTS SUCCESSFUL
-2019_03_28_10_10_14 : ALL 1 TESTS SUCCESSFUL
-2019_03_28_10_10_29 : ALL 2 TESTS SUCCESSFUL
-2019_03_28_10_11_12 : ALL 1 TESTS SUCCESSFUL
-2019_03_28_10_11_25 : ALL 2 TESTS SUCCESSFUL
-2019_03_28_10_13_23 : ALL 1 TESTS SUCCESSFUL
-2019_03_28_10_13_36 : ALL 2 TESTS SUCCESSFUL
-2019_03_28_10_14_36 : ALL 1 TESTS SUCCESSFUL
-2019_03_28_10_14_50 : ALL 2 TESTS SUCCESSFUL
-2019_03_28_10_15_06 : ALL 1 TESTS SUCCESSFUL
-2019_03_28_10_15_19 : ALL 2 TESTS SUCCESSFUL
-2019_03_28_10_18_09 : ALL 1 TESTS SUCCESSFUL
-2019_03_28_10_18_22 : ALL 2 TESTS SUCCESSFUL
-2019_03_28_10_20_24 : ALL 1 TESTS SUCCESSFUL
-2019_03_28_10_20_44 : ALL 2 TESTS SUCCESSFUL
-2019_03_28_10_21_54 : ALL 1 TESTS SUCCESSFUL
-2019_03_28_10_22_14 : ALL 2 TESTS SUCCESSFUL
-2019_03_28_10_22_20 : ALL 1 TESTS SUCCESSFUL
-2019_03_28_10_22_39 : ALL 2 TESTS SUCCESSFUL
-2019_03_28_10_23_57 : ALL 1 TESTS SUCCESSFUL
-2019_03_28_10_24_16 : ALL 2 TESTS SUCCESSFUL
-2019_03_28_10_25_03 : ALL 1 TESTS SUCCESSFUL
-2019_03_28_10_25_27 : ALL 2 TESTS SUCCESSFUL
-2019_03_28_10_45_04 : FAILED 1/1 TESTS: perl_syntax
-2019_03_28_10_45_28 : ALL 1 TESTS SUCCESSFUL
-2019_03_28_10_45_40 : ALL 2 TESTS SUCCESSFUL
-2019_03_28_10_45_58 : ALL 1 TESTS SUCCESSFUL
-2019_03_28_10_46_08 : ALL 2 TESTS SUCCESSFUL
-2019_03_28_10_46_27 : ALL 1 TESTS SUCCESSFUL
-2019_03_28_10_46_37 : ALL 2 TESTS SUCCESSFUL
-2019_03_28_11_05_03 : ALL 1 TESTS SUCCESSFUL
-2019_03_28_11_05_36 : ALL 2 TESTS SUCCESSFUL
-2019_03_28_11_16_08 : ALL 1 TESTS SUCCESSFUL
-2019_03_28_11_16_29 : ALL 2 TESTS SUCCESSFUL
-2019_03_28_11_16_34 : ALL 1 TESTS SUCCESSFUL
-2019_03_28_11_16_50 : ALL 2 TESTS SUCCESSFUL
-2019_03_28_11_18_07 : ALL 1 TESTS SUCCESSFUL
-2019_03_28_11_18_22 : ALL 2 TESTS SUCCESSFUL
-2019_03_28_11_26_50 : ALL 1 TESTS SUCCESSFUL
-2019_03_28_11_27_07 : ALL 2 TESTS SUCCESSFUL
-2019_03_28_11_32_34 : ALL 1 TESTS SUCCESSFUL
-2019_03_28_11_32_51 : ALL 2 TESTS SUCCESSFUL
-2019_03_28_11_41_02 : ALL 1 TESTS SUCCESSFUL
-2019_03_28_11_41_18 : ALL 2 TESTS SUCCESSFUL
-2019_03_28_11_43_33 : ALL 1 TESTS SUCCESSFUL
-2019_03_28_11_43_48 : ALL 2 TESTS SUCCESSFUL
-2019_03_28_11_50_45 : ALL 1 TESTS SUCCESSFUL
-2019_03_28_11_50_59 : ALL 2 TESTS SUCCESSFUL
-2019_03_28_13_16_45 : ALL 1 TESTS SUCCESSFUL
-2019_03_28_13_17_01 : ALL 2 TESTS SUCCESSFUL
-2019_03_28_13_18_34 : ALL 1 TESTS SUCCESSFUL
-2019_03_28_13_18_50 : ALL 2 TESTS SUCCESSFUL
-2019_03_28_13_20_11 : ALL 1 TESTS SUCCESSFUL
-2019_03_28_13_20_28 : ALL 2 TESTS SUCCESSFUL
-2019_03_28_18_40_47 : ALL 1 TESTS SUCCESSFUL
-2019_03_28_18_53_29 : ALL 1 TESTS SUCCESSFUL
-2019_03_28_18_53_29 : FAILED 1/2 TESTS: ../../var/pass/test1@deuscustoms.com
-2019_03_28_18_55_02 : ALL 1 TESTS SUCCESSFUL
-2019_03_28_18_55_02 : FAILED 1/2 TESTS: ../../var/pass/test1@deuscustoms.com
-2019_03_28_18_55_35 : ALL 1 TESTS SUCCESSFUL
-2019_03_28_19_09_08 : FAILED 4/148 TESTS: ll_regextrans2_subfolder ll_regextrans2_subfolder_02 ll_delete2foldersonly ll_delete2foldersonly_tmp
-2019_03_28_19_09_10 : FAILED 4/148 TESTS: ll_regextrans2_subfolder ll_regextrans2_subfolder_02 ll_delete2foldersonly ll_delete2foldersonly_tmp
-2019_04_01_00_23_45 : ALL 1 TESTS SUCCESSFUL
-2019_04_01_00_24_21 : ALL 1 TESTS SUCCESSFUL
-2019_04_01_00_24_25 : FAILED 1/2 TESTS: ll_regextrans2_subfolder
-2019_04_01_00_27_40 : ALL 1 TESTS SUCCESSFUL
-2019_04_01_00_27_45 : FAILED 1/2 TESTS: ll_delete2foldersonly
-2019_04_01_00_30_15 : ALL 1 TESTS SUCCESSFUL
-2019_04_01_00_30_45 : ALL 2 TESTS SUCCESSFUL
-2019_04_01_00_34_38 : ALL 1 TESTS SUCCESSFUL
-2019_04_01_00_34_50 : ALL 2 TESTS SUCCESSFUL
-2019_04_01_00_35_07 : ALL 1 TESTS SUCCESSFUL
-2019_04_01_00_35_22 : ALL 2 TESTS SUCCESSFUL
-2019_04_01_00_36_52 : ALL 1 TESTS SUCCESSFUL
-2019_04_01_00_37_01 : ALL 2 TESTS SUCCESSFUL
-2019_04_01_00_38_04 : ALL 1 TESTS SUCCESSFUL
-2019_04_01_00_38_32 : ALL 3 TESTS SUCCESSFUL
-2019_04_01_00_38_56 : ALL 1 TESTS SUCCESSFUL
-2019_04_01_01_17_02 : ALL 146 TESTS SUCCESSFUL
-2019_04_01_19_31_54 : ALL 1 TESTS SUCCESSFUL
-2019_04_01_20_09_14 : ALL 146 TESTS SUCCESSFUL
-2019_04_01_21_16_50 : ALL 1 TESTS SUCCESSFUL
-2019_04_01_21_23_20 : ALL 2 TESTS SUCCESSFUL
-2019_04_02_19_56_59 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_20_00_59 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_20_01_19 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_20_01_43 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_20_02_36 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_20_03_16 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_20_05_01 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_20_05_20 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_20_07_44 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_20_08_08 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_20_17_27 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_20_17_46 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_20_21_24 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_20_21_53 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_20_23_36 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_20_31_03 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_21_09_57 : FAILED 1/146 TESTS: ll_abort
-2019_04_02_22_17_30 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_22_22_52 : ALL 2 TESTS SUCCESSFUL
-2019_04_02_22_59_17 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_23_00_20 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_23_07_32 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_23_07_52 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_23_13_58 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_23_15_26 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_23_26_32 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_23_29_07 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_23_29_33 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_23_30_45 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_23_31_43 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_23_31_56 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_23_32_10 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_23_33_13 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_23_33_17 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_23_49_00 : FAILED 1/1 TESTS: perl_syntax
-2019_04_02_23_50_25 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_23_51_17 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_23_57_11 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_23_57_29 : ALL 1 TESTS SUCCESSFUL
-2019_04_02_23_59_31 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_00_00_10 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_00_02_03 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_00_02_13 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_00_02_26 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_00_03_19 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_00_03_53 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_00_05_28 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_00_07_31 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_00_16_12 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_00_16_46 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_00_20_33 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_00_20_50 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_00_22_38 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_00_25_54 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_00_26_16 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_00_28_05 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_00_29_26 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_00_30_05 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_00_30_17 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_00_31_14 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_00_33_00 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_01_08_52 : FAILED 1/146 TESTS: ll_abort
-2019_04_03_02_17_28 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_02_24_57 : ALL 2 TESTS SUCCESSFUL
-2019_04_03_14_48_08 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_14_48_57 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_14_50_10 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_14_50_14 : FAILED 1/2 TESTS: Otilio
-2019_04_03_14_51_04 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_14_51_08 : FAILED 1/2 TESTS: Otilio3
-2019_04_03_14_52_21 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_14_52_25 : FAILED 1/2 TESTS: Otilio3
-2019_04_03_14_53_24 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_14_53_27 : FAILED 1/2 TESTS: Otilio3
-2019_04_03_14_58_32 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_14_58_36 : FAILED 1/2 TESTS: Otilio3
-2019_04_03_15_01_21 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_15_05_25 : FAILED 1/2 TESTS: bluehost2
-2019_04_03_15_18_53 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_15_19_46 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_15_20_48 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_15_20_54 : FAILED 1/2 TESTS: b2btech_1
-2019_04_03_15_21_30 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_15_21_37 : FAILED 1/2 TESTS: godaddy_1
-2019_04_03_15_23_27 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_15_23_31 : ALL 2 TESTS SUCCESSFUL
-2019_04_03_15_24_30 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_15_25_26 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_15_25_34 : FAILED 1/2 TESTS: mail2World
-2019_04_03_15_27_29 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_15_27_39 : FAILED 1/2 TESTS: bug_zero_byte
-2019_04_03_15_28_13 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_15_28_19 : FAILED 1/2 TESTS: mailenable_22_host2
-2019_04_03_15_29_09 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_15_29_13 : FAILED 1/2 TESTS: mailenable_3_reverse
-2019_04_03_15_29_56 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_15_30_46 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_15_31_49 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_15_31_54 : FAILED 1/2 TESTS: exchange_hoch_1
-2019_04_03_15_32_28 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_15_32_58 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_15_33_46 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_15_33_50 : FAILED 1/2 TESTS: courier_45
-2019_04_03_15_34_19 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_15_34_35 : ALL 2 TESTS SUCCESSFUL
-2019_04_03_15_35_00 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_15_35_48 : ALL 2 TESTS SUCCESSFUL
-2019_04_03_15_41_54 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_15_42_44 : ALL 2 TESTS SUCCESSFUL
-2019_04_03_15_45_05 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_17_55_25 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_17_55_40 : ALL 2 TESTS SUCCESSFUL
-2019_04_03_18_53_38 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_18_53_56 : ALL 2 TESTS SUCCESSFUL
-2019_04_03_18_54_15 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_18_54_23 : ALL 2 TESTS SUCCESSFUL
-2019_04_03_18_55_16 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_18_55_40 : ALL 2 TESTS SUCCESSFUL
-2019_04_03_23_51_43 : ALL 1 TESTS SUCCESSFUL
-2019_04_03_23_51_44 : ALL 2 TESTS SUCCESSFUL
-2019_04_04_13_07_49 : ALL 1 TESTS SUCCESSFUL
-2019_04_04_13_07_50 : ALL 2 TESTS SUCCESSFUL
-2019_04_04_13_08_02 : ALL 1 TESTS SUCCESSFUL
-2019_04_04_13_51_21 : FAILED 1/146 TESTS: ll_abort
-2019_04_04_19_18_07 : ALL 1 TESTS SUCCESSFUL
-2019_04_04_19_19_38 : ALL 1 TESTS SUCCESSFUL
-2019_04_04_19_20_21 : FAILED 1/2 TESTS: ll_abort
-2019_04_07_17_32_51 : ALL 1 TESTS SUCCESSFUL
-2019_04_07_17_34_34 : FAILED 1/2 TESTS: ll_abort
-2019_04_07_17_50_33 : ALL 1 TESTS SUCCESSFUL
-2019_04_07_17_50_39 : FAILED 1/2 TESTS: ll_abort
-2019_04_07_22_10_27 : ALL 1 TESTS SUCCESSFUL
-2019_04_07_22_10_33 : ALL 2 TESTS SUCCESSFUL
-2019_04_07_22_10_44 : ALL 1 TESTS SUCCESSFUL
-2019_04_07_22_10_50 : ALL 2 TESTS SUCCESSFUL
-2019_04_08_10_52_03 : ALL 1 TESTS SUCCESSFUL
-2019_04_08_10_52_14 : ALL 1 TESTS SUCCESSFUL
-2019_04_08_10_54_48 : ALL 1 TESTS SUCCESSFUL
-2019_04_08_10_54_50 : FAILED 1/2 TESTS: ll_sigreconnect_INT
-2019_04_08_10_56_00 : ALL 1 TESTS SUCCESSFUL
-2019_04_08_10_56_02 : FAILED 1/2 TESTS: ll_sigreconnect_INT
-2019_04_08_10_58_49 : ALL 1 TESTS SUCCESSFUL
-2019_04_08_10_58_55 : ALL 2 TESTS SUCCESSFUL
-2019_04_08_10_59_55 : ALL 1 TESTS SUCCESSFUL
-2019_04_08_11_00_03 : ALL 2 TESTS SUCCESSFUL
-2019_04_08_11_01_45 : ALL 1 TESTS SUCCESSFUL
-2019_04_08_11_01_53 : ALL 2 TESTS SUCCESSFUL
-2019_04_08_11_03_25 : ALL 1 TESTS SUCCESSFUL
-2019_04_08_11_03_33 : ALL 2 TESTS SUCCESSFUL
-2019_04_08_12_02_20 : ALL 1 TESTS SUCCESSFUL
-2019_04_08_12_02_49 : ALL 2 TESTS SUCCESSFUL
-2019_04_08_12_06_46 : ALL 1 TESTS SUCCESSFUL
-2019_04_08_12_06_59 : ALL 2 TESTS SUCCESSFUL
-2019_04_08_12_07_40 : ALL 1 TESTS SUCCESSFUL
-2019_04_08_12_08_09 : ALL 2 TESTS SUCCESSFUL
-2019_04_08_12_08_48 : ALL 1 TESTS SUCCESSFUL
-2019_04_08_12_08_54 : ALL 2 TESTS SUCCESSFUL
-2019_04_08_12_26_55 : ALL 1 TESTS SUCCESSFUL
-2019_04_08_12_27_00 : ALL 2 TESTS SUCCESSFUL
-2019_04_08_12_27_36 : ALL 1 TESTS SUCCESSFUL
-2019_04_08_12_27_41 : ALL 2 TESTS SUCCESSFUL
-2019_04_08_12_33_37 : ALL 1 TESTS SUCCESSFUL
-2019_04_08_12_33_42 : ALL 2 TESTS SUCCESSFUL
-2019_04_08_12_35_20 : ALL 1 TESTS SUCCESSFUL
-2019_04_08_12_37_27 : ALL 1 TESTS SUCCESSFUL
-2019_04_08_12_37_35 : ALL 2 TESTS SUCCESSFUL
-2019_04_09_10_59_08 : ALL 1 TESTS SUCCESSFUL
-2019_04_09_10_59_29 : FAILED 1/2 TESTS: ll_diff
-2019_04_09_11_01_56 : ALL 1 TESTS SUCCESSFUL
-2019_04_09_11_02_07 : FAILED 1/2 TESTS: ll_diff
-2019_04_09_11_02_38 : ALL 1 TESTS SUCCESSFUL
-2019_04_09_11_02_49 : FAILED 1/2 TESTS: ll_diff
-2019_04_09_11_08_52 : ALL 1 TESTS SUCCESSFUL
-2019_04_09_11_09_04 : FAILED 1/2 TESTS: ll_diff
-2019_04_09_11_09_59 : ALL 1 TESTS SUCCESSFUL
-2019_04_09_11_10_14 : FAILED 1/2 TESTS: ll_diff
-2019_04_09_11_30_48 : ALL 1 TESTS SUCCESSFUL
-2019_04_09_11_30_59 : FAILED 1/2 TESTS: ll_diff
-2019_04_09_11_32_18 : ALL 1 TESTS SUCCESSFUL
-2019_04_09_11_32_29 : FAILED 1/2 TESTS: ll_diff
-2019_04_09_11_33_21 : ALL 1 TESTS SUCCESSFUL
-2019_04_09_11_33_32 : FAILED 1/2 TESTS: ll_diff
-2019_04_09_11_38_13 : ALL 1 TESTS SUCCESSFUL
-2019_04_09_11_38_33 : ALL 2 TESTS SUCCESSFUL
-2019_04_09_11_40_02 : ALL 1 TESTS SUCCESSFUL
-2019_04_09_11_40_09 : ALL 2 TESTS SUCCESSFUL
-2019_04_09_11_44_58 : ALL 1 TESTS SUCCESSFUL
-2019_04_09_11_45_05 : ALL 2 TESTS SUCCESSFUL
-2019_04_09_11_54_01 : ALL 1 TESTS SUCCESSFUL
-2019_04_09_11_54_09 : ALL 2 TESTS SUCCESSFUL
-2019_04_09_12_43_34 : ALL 1 TESTS SUCCESSFUL
-2019_04_09_12_43_38 : ALL 2 TESTS SUCCESSFUL
-2019_04_09_14_01_22 : ALL 1 TESTS SUCCESSFUL
-2019_04_09_14_01_33 : ALL 1 TESTS SUCCESSFUL
-2019_04_09_14_01_39 : ALL 2 TESTS SUCCESSFUL
-2019_04_09_14_04_31 : ALL 1 TESTS SUCCESSFUL
-2019_04_09_14_04_42 : ALL 2 TESTS SUCCESSFUL
-2019_04_09_14_40_38 : FAILED 1/149 TESTS: ll_abort
-2019_04_09_17_06_24 : ALL 1 TESTS SUCCESSFUL
-2019_04_09_17_53_10 : FAILED 1/150 TESTS: ll_abort
-2019_04_09_20_25_30 : ALL 1 TESTS SUCCESSFUL
-2019_04_09_20_29_54 : FAILED 1/2 TESTS: ll_abort
-2019_04_09_20_56_38 : ALL 1 TESTS SUCCESSFUL
-2019_04_09_20_56_46 : ALL 2 TESTS SUCCESSFUL
-2019_04_09_21_02_32 : ALL 1 TESTS SUCCESSFUL
-2019_04_09_21_02_39 : ALL 2 TESTS SUCCESSFUL
-2019_04_09_21_02_58 : ALL 1 TESTS SUCCESSFUL
-2019_04_09_21_03_07 : ALL 2 TESTS SUCCESSFUL
-2019_04_10_11_51_42 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_11_51_58 : ALL 2 TESTS SUCCESSFUL
-2019_04_10_12_03_39 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_12_03_48 : FAILED 1/2 TESTS: ll_authentication_failure
-2019_04_10_12_09_34 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_12_09_44 : FAILED 1/2 TESTS: ll_diff
-2019_04_10_12_10_31 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_12_10_38 : ALL 2 TESTS SUCCESSFUL
-2019_04_10_12_11_33 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_12_11_52 : FAILED 1/2 TESTS: ll_diff
-2019_04_10_12_12_10 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_12_12_28 : FAILED 1/2 TESTS: ll_diff
-2019_04_10_12_14_15 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_12_14_24 : ALL 2 TESTS SUCCESSFUL
-2019_04_10_12_20_10 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_12_20_28 : FAILED 1/2 TESTS: ll_diff
-2019_04_10_12_21_26 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_12_21_44 : FAILED 1/2 TESTS: ll_diff
-2019_04_10_12_26_33 : FAILED 1/1 TESTS: perl_syntax
-2019_04_10_12_27_03 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_12_27_21 : FAILED 1/2 TESTS: ll_diff
-2019_04_10_12_34_00 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_12_34_18 : FAILED 1/2 TESTS: ll_diff
-2019_04_10_12_34_44 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_12_37_31 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_12_37_34 : ALL 2 TESTS SUCCESSFUL
-2019_04_10_12_50_36 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_12_50_47 : ALL 2 TESTS SUCCESSFUL
-2019_04_10_12_57_42 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_12_57_53 : ALL 2 TESTS SUCCESSFUL
-2019_04_10_13_00_23 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_13_00_28 : ALL 2 TESTS SUCCESSFUL
-2019_04_10_13_00_46 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_13_00_51 : FAILED 1/2 TESTS: option_noreleasecheck
-2019_04_10_13_01_28 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_13_01_31 : FAILED 1/2 TESTS: option_bad_delete2
-2019_04_10_13_02_51 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_13_02_53 : ALL 2 TESTS SUCCESSFUL
-2019_04_10_13_03_22 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_13_03_25 : FAILED 1/2 TESTS: option_extra_arguments
-2019_04_10_13_09_09 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_13_09_17 : ALL 2 TESTS SUCCESSFUL
-2019_04_10_13_10_15 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_13_10_24 : ALL 2 TESTS SUCCESSFUL
-2019_04_10_13_12_37 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_13_12_45 : ALL 2 TESTS SUCCESSFUL
-2019_04_10_14_04_50 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_14_04_53 : ALL 2 TESTS SUCCESSFUL
-2019_04_10_16_06_29 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_16_06_33 : FAILED 1/2 TESTS: gmail_gl_gl2_delete2folders
-2019_04_10_16_06_58 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_16_07_06 : FAILED 1/2 TESTS: gmail_gl_gl2_delete2folders
-2019_04_10_16_08_14 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_16_12_18 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_16_12_29 : ALL 2 TESTS SUCCESSFUL
-2019_04_10_16_18_10 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_16_18_23 : ALL 2 TESTS SUCCESSFUL
-2019_04_10_16_20_24 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_16_22_07 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_16_52_51 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_16_54_47 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_16_56_17 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_16_57_00 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_16_57_13 : ALL 2 TESTS SUCCESSFUL
-2019_04_10_16_57_26 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_16_57_36 : ALL 2 TESTS SUCCESSFUL
-2019_04_10_17_33_53 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_18_21_31 : FAILED 1/151 TESTS: ll_authentication_failure
-2019_04_10_18_24_50 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_18_25_03 : FAILED 1/2 TESTS: ll_authentication_failure
-2019_04_10_18_25_51 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_18_26_00 : ALL 2 TESTS SUCCESSFUL
-2019_04_10_19_11_05 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_19_59_47 : FAILED 1/151 TESTS: option_tests_in_var_tmp_sub
-2019_04_10_22_04_27 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_22_04_42 : ALL 2 TESTS SUCCESSFUL
-2019_04_10_22_09_43 : ALL 1 TESTS SUCCESSFUL
-2019_04_10_22_09_54 : ALL 2 TESTS SUCCESSFUL
-2019_04_11_19_51_28 : ALL 1 TESTS SUCCESSFUL
-2019_04_11_20_40_53 : ALL 151 TESTS SUCCESSFUL
-2019_04_12_02_36_04 : ALL 1 TESTS SUCCESSFUL
-2019_04_12_03_13_27 : FAILED 1/151 TESTS: yahoo_all
-2019_04_12_04_18_42 : ALL 1 TESTS SUCCESSFUL
-2019_04_12_04_25_32 : ALL 2 TESTS SUCCESSFUL
-2019_04_13_03_32_57 : ALL 1 TESTS SUCCESSFUL
-2019_04_13_03_35_23 : ALL 2 TESTS SUCCESSFUL
-2019_04_13_03_57_56 : ALL 1 TESTS SUCCESSFUL
-2019_04_13_17_22_00 : ALL 1 TESTS SUCCESSFUL
-2019_04_13_18_00_31 : ALL 151 TESTS SUCCESSFUL
-2019_04_13_18_19_32 : ALL 1 TESTS SUCCESSFUL
-2019_04_13_19_00_55 : ALL 151 TESTS SUCCESSFUL
-2019_04_13_20_10_20 : ALL 1 TESTS SUCCESSFUL
-2019_04_13_20_15_27 : ALL 2 TESTS SUCCESSFUL
-2019_04_19_16_22_40 : ALL 1 TESTS SUCCESSFUL
-2019_04_19_17_08_01 : ALL 151 TESTS SUCCESSFUL
-2019_04_19_18_43_50 : ALL 1 TESTS SUCCESSFUL
-2019_04_19_18_47_16 : ALL 2 TESTS SUCCESSFUL
-2019_04_25_18_59_02 : ALL 1 TESTS SUCCESSFUL
-2019_04_25_18_59_24 : FAILED 1/2 TESTS: ll_usecache
-2019_04_25_18_59_50 : ALL 1 TESTS SUCCESSFUL
-2019_04_25_19_00_32 : ALL 2 TESTS SUCCESSFUL
-2019_04_25_19_00_54 : ALL 1 TESTS SUCCESSFUL
-2019_04_25_19_01_18 : ALL 2 TESTS SUCCESSFUL
-2019_04_25_19_01_29 : ALL 1 TESTS SUCCESSFUL
-2019_04_25_19_01_43 : ALL 2 TESTS SUCCESSFUL
-2019_04_25_19_14_35 : ALL 1 TESTS SUCCESSFUL
-2019_04_25_19_14_48 : ALL 2 TESTS SUCCESSFUL
-2019_04_25_19_15_20 : ALL 1 TESTS SUCCESSFUL
-2019_04_25_19_15_33 : ALL 2 TESTS SUCCESSFUL
-2019_04_26_10_29_25 : ALL 1 TESTS SUCCESSFUL
-2019_04_26_11_05_20 : FAILED 9/151 TESTS: ll_skipmess ll_resyncflags ks_justconnect_ipv6_nossl ll_justlogin ll_justconnect_devel ll_ssl ll_nousecache ll_delete2foldersonly_NEW_3 ll_abort
-2019_04_27_12_50_02 : ALL 1 TESTS SUCCESSFUL
-2019_04_27_13_29_43 : ALL 151 TESTS SUCCESSFUL
-2019_04_27_13_40_00 : ALL 1 TESTS SUCCESSFUL
-2019_04_27_13_40_25 : ALL 4 TESTS SUCCESSFUL
-2019_04_27_13_45_52 : ALL 1 TESTS SUCCESSFUL
-2019_04_27_13_46_09 : ALL 4 TESTS SUCCESSFUL
-2019_04_27_13_49_44 : ALL 1 TESTS SUCCESSFUL
-2019_04_27_13_49_47 : ALL 2 TESTS SUCCESSFUL
-2019_04_27_13_52_33 : ALL 1 TESTS SUCCESSFUL
-2019_04_27_13_52_36 : ALL 2 TESTS SUCCESSFUL
-2019_04_27_14_37_27 : ALL 1 TESTS SUCCESSFUL
-2019_04_27_14_37_30 : FAILED 1/2 TESTS: pidfile_bad
-2019_04_27_14_38_22 : ALL 1 TESTS SUCCESSFUL
-2019_04_27_14_38_24 : FAILED 1/2 TESTS: pidfile_bad
-2019_04_27_14_38_53 : ALL 1 TESTS SUCCESSFUL
-2019_04_27_14_38_56 : FAILED 1/2 TESTS: pidfile_bad
-2019_04_27_14_39_30 : ALL 1 TESTS SUCCESSFUL
-2019_04_27_14_39_46 : ALL 4 TESTS SUCCESSFUL
-2019_04_27_14_40_23 : ALL 1 TESTS SUCCESSFUL
-2019_04_27_14_40_25 : FAILED 1/2 TESTS: pidfile_bad
-2019_04_27_14_46_30 : ALL 1 TESTS SUCCESSFUL
-2019_04_27_14_46_36 : ALL 3 TESTS SUCCESSFUL
-2019_04_27_14_47_55 : ALL 1 TESTS SUCCESSFUL
-2019_04_27_14_48_01 : ALL 3 TESTS SUCCESSFUL
-2019_04_27_14_50_11 : ALL 1 TESTS SUCCESSFUL
-2019_04_27_14_50_18 : ALL 3 TESTS SUCCESSFUL
-2019_04_27_14_50_35 : ALL 1 TESTS SUCCESSFUL
-2019_04_27_14_50_44 : ALL 2 TESTS SUCCESSFUL
-2019_04_27_14_55_57 : ALL 1 TESTS SUCCESSFUL
-2019_04_27_14_56_06 : ALL 2 TESTS SUCCESSFUL
-2019_04_27_15_32_08 : ALL 1 TESTS SUCCESSFUL
-2019_04_27_15_32_17 : ALL 2 TESTS SUCCESSFUL
-2019_04_27_15_34_07 : ALL 1 TESTS SUCCESSFUL
-2019_04_27_15_34_16 : ALL 2 TESTS SUCCESSFUL
-2019_04_27_16_09_59 : ALL 1 TESTS SUCCESSFUL
-2019_04_27_16_10_02 : FAILED 1/2 TESTS: ll_pidfilelocking
-2019_04_27_16_15_20 : ALL 1 TESTS SUCCESSFUL
-2019_04_27_16_15_30 : ALL 2 TESTS SUCCESSFUL
-2019_04_27_16_16_50 : ALL 1 TESTS SUCCESSFUL
-2019_04_27_16_17_07 : ALL 5 TESTS SUCCESSFUL
-2019_04_27_16_20_22 : ALL 1 TESTS SUCCESSFUL
-2019_04_27_16_59_27 : FAILED 4/152 TESTS: option_tests option_tests_in_var_tmp option_tests_in_var_tmp_sub yahoo_all
-2019_04_28_00_24_05 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_00_24_20 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_00_25_17 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_00_25_30 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_00_26_48 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_00_26_53 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_00_28_20 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_00_28_24 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_00_30_30 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_00_30_30 : FAILED 1/2 TESTS: tail
-2019_04_28_00_30_55 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_00_30_55 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_00_31_53 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_00_31_53 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_00_40_48 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_00_40_48 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_00_45_05 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_00_45_05 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_00_59_58 : FAILED 1/1 TESTS: perl_syntax
-2019_04_28_01_05_58 : FAILED 1/1 TESTS: perl_syntax
-2019_04_28_01_07_08 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_01_07_08 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_01_11_16 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_01_11_16 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_01_14_24 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_01_14_24 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_01_23_16 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_01_23_16 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_01_24_38 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_01_24_39 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_01_27_18 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_01_27_18 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_02_08_56 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_02_08_56 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_02_10_19 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_02_10_19 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_02_10_52 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_02_10_52 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_02_19_49 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_02_19_49 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_02_20_45 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_02_20_45 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_02_21_47 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_02_21_47 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_02_22_14 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_02_22_14 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_03_08_18 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_03_08_18 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_03_10_28 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_03_10_28 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_03_11_22 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_03_11_22 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_03_12_17 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_03_12_17 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_03_17_40 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_03_17_40 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_03_18_05 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_03_18_05 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_03_18_43 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_03_18_43 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_03_34_55 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_03_34_55 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_03_40_09 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_03_40_10 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_03_42_06 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_03_42_06 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_03_44_10 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_03_44_33 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_04_01_24 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_04_01_28 : FAILED 1/2 TESTS: tail
-2019_04_28_04_01_54 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_04_01_58 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_04_02_21 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_04_02_26 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_04_02_57 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_04_03_01 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_04_04_00 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_04_04_04 : FAILED 1/2 TESTS: tail
-2019_04_28_04_04_40 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_04_05_04 : ALL 2 TESTS SUCCESSFUL
-2019_04_28_04_14_34 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_04_15_22 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_04_53_27 : FAILED 3/153 TESTS: option_tests_in_var_tmp option_tests_in_var_tmp_sub tail
-2019_04_28_05_24_29 : ALL 1 TESTS SUCCESSFUL
-2019_04_28_05_24_29 : FAILED 1/2 TESTS: tests_tail
-2019_04_29_16_06_41 : ALL 1 TESTS SUCCESSFUL
-2019_04_29_16_45_32 : FAILED 1/153 TESTS: tail
-2019_04_29_17_57_49 : ALL 1 TESTS SUCCESSFUL
-2019_04_29_18_00_48 : ALL 2 TESTS SUCCESSFUL
-2019_04_29_20_54_32 : FAILED 1/1 TESTS: perl_syntax
-2019_04_29_20_56_54 : ALL 1 TESTS SUCCESSFUL
-2019_04_29_20_57_01 : ALL 2 TESTS SUCCESSFUL
-2019_04_29_20_58_00 : ALL 1 TESTS SUCCESSFUL
-2019_04_29_20_58_06 : ALL 2 TESTS SUCCESSFUL
-2019_04_29_20_58_42 : ALL 1 TESTS SUCCESSFUL
-2019_04_29_20_58_47 : ALL 2 TESTS SUCCESSFUL
-2019_04_29_21_05_42 : ALL 1 TESTS SUCCESSFUL
-2019_04_29_21_06_42 : FAILED 1/2 TESTS: ll_abort_cgi_context
-2019_04_29_21_07_08 : ALL 1 TESTS SUCCESSFUL
-2019_04_29_21_07_14 : ALL 2 TESTS SUCCESSFUL
-2019_05_16_00_18_00 : ALL 1 TESTS SUCCESSFUL
-2019_05_16_00_18_16 : ALL 2 TESTS SUCCESSFUL
-2019_05_16_00_19_51 : ALL 1 TESTS SUCCESSFUL
-2019_05_16_00_19_59 : ALL 2 TESTS SUCCESSFUL
-2019_05_16_00_20_13 : ALL 1 TESTS SUCCESSFUL
-2019_05_16_00_20_22 : ALL 2 TESTS SUCCESSFUL
-2019_05_16_00_21_16 : ALL 1 TESTS SUCCESSFUL
-2019_05_16_00_21_22 : ALL 2 TESTS SUCCESSFUL
-2019_05_16_00_22_13 : ALL 1 TESTS SUCCESSFUL
-2019_05_16_00_22_22 : ALL 2 TESTS SUCCESSFUL
-2019_05_16_01_08_37 : ALL 1 TESTS SUCCESSFUL
-2019_05_16_21_22_13 : ALL 1 TESTS SUCCESSFUL
-2019_05_16_21_22_19 : FAILED 1/2 TESTS: ll_regexmess_truncate_long_message2
-2019_05_16_21_23_12 : ALL 1 TESTS SUCCESSFUL
-2019_05_16_21_23_16 : FAILED 1/2 TESTS: ll_regexmess_truncate_long_message2
-2019_05_16_21_24_11 : ALL 1 TESTS SUCCESSFUL
-2019_05_16_21_24_29 : ALL 2 TESTS SUCCESSFUL
-2019_05_16_21_25_07 : ALL 1 TESTS SUCCESSFUL
-2019_05_16_21_25_20 : ALL 2 TESTS SUCCESSFUL
-2019_05_17_07_28_52 : ALL 1 TESTS SUCCESSFUL
-2019_05_17_07_28_56 : FAILED 1/2 TESTS: ll_regexmess_truncate_long_message
-2019_05_17_10_13_01 : ALL 1 TESTS SUCCESSFUL
-2019_05_17_10_13_14 : ALL 2 TESTS SUCCESSFUL
-2019_05_19_11_30_24 : ALL 1 TESTS SUCCESSFUL
-2019_05_19_11_30_49 : ALL 2 TESTS SUCCESSFUL
-2019_05_21_23_51_43 : ALL 1 TESTS SUCCESSFUL
-2019_05_21_23_51_46 : FAILED 1/2 TESTS: ll_regexmess_truncate_long_message_truncmess
-2019_05_21_23_52_36 : ALL 1 TESTS SUCCESSFUL
-2019_05_21_23_52_55 : ALL 2 TESTS SUCCESSFUL
-2019_05_22_00_13_39 : ALL 1 TESTS SUCCESSFUL
-2019_05_22_00_13_47 : ALL 2 TESTS SUCCESSFUL
-2019_05_27_20_32_29 : ALL 1 TESTS SUCCESSFUL
-2019_05_27_20_32_38 : ALL 2 TESTS SUCCESSFUL
-2019_05_27_20_33_18 : ALL 1 TESTS SUCCESSFUL
-2019_05_27_20_33_23 : ALL 2 TESTS SUCCESSFUL
-2019_05_27_20_39_20 : ALL 1 TESTS SUCCESSFUL
-2019_05_27_20_39_25 : ALL 2 TESTS SUCCESSFUL
-2019_05_27_20_53_57 : ALL 1 TESTS SUCCESSFUL
-2019_05_27_20_54_08 : ALL 1 TESTS SUCCESSFUL
-2019_05_27_21_57_49 : FAILED 1/154 TESTS: tail
-2019_05_27_23_26_46 : ALL 1 TESTS SUCCESSFUL
-2019_05_27_23_27_11 : ALL 2 TESTS SUCCESSFUL
-2019_06_04_10_59_20 : ALL 1 TESTS SUCCESSFUL
-2019_06_04_11_39_40 : FAILED 1/154 TESTS: tail
-2019_06_04_14_04_20 : ALL 1 TESTS SUCCESSFUL
-2019_06_04_14_04_25 : FAILED 1/2 TESTS: tail
-2019_06_05_00_44_16 : ALL 1 TESTS SUCCESSFUL
-2019_06_05_00_44_21 : FAILED 1/2 TESTS: tail
-2019_06_05_00_48_04 : ALL 1 TESTS SUCCESSFUL
-2019_06_05_00_48_29 : ALL 2 TESTS SUCCESSFUL
-2019_06_05_00_51_32 : ALL 1 TESTS SUCCESSFUL
-2019_06_05_00_51_37 : ALL 2 TESTS SUCCESSFUL
-2019_06_05_00_54_11 : ALL 1 TESTS SUCCESSFUL
-2019_06_05_00_54_18 : ALL 1 TESTS SUCCESSFUL
-2019_06_05_00_54_23 : ALL 2 TESTS SUCCESSFUL
-2019_06_05_01_34_33 : ALL 156 TESTS SUCCESSFUL
-2019_06_13_13_52_56 : ALL 1 TESTS SUCCESSFUL
-2019_06_13_13_53_44 : ALL 2 TESTS SUCCESSFUL
-2019_06_13_13_53_50 : ALL 1 TESTS SUCCESSFUL
-2019_06_13_13_54_01 : ALL 2 TESTS SUCCESSFUL
-2019_06_13_13_58_19 : ALL 1 TESTS SUCCESSFUL
-2019_06_13_13_58_22 : FAILED 1/2 TESTS: ll_maxage_0_float_5min
-2019_06_13_13_58_50 : ALL 1 TESTS SUCCESSFUL
-2019_06_13_13_58_53 : FAILED 1/2 TESTS: ll_maxage_0_float_5min
-2019_06_13_13_59_16 : ALL 1 TESTS SUCCESSFUL
-2019_06_13_13_59_27 : ALL 2 TESTS SUCCESSFUL
-2019_06_13_14_00_02 : ALL 1 TESTS SUCCESSFUL
-2019_06_13_14_00_17 : ALL 2 TESTS SUCCESSFUL
-2019_06_13_14_00_41 : ALL 1 TESTS SUCCESSFUL
-2019_06_13_14_00_49 : ALL 2 TESTS SUCCESSFUL
-2019_06_13_14_51_49 : ALL 1 TESTS SUCCESSFUL
-2019_06_13_14_52_01 : ALL 2 TESTS SUCCESSFUL
-2019_06_13_14_52_24 : ALL 1 TESTS SUCCESSFUL
-2019_06_13_14_52_25 : ALL 2 TESTS SUCCESSFUL
-2019_06_13_14_52_31 : ALL 1 TESTS SUCCESSFUL
-2019_06_13_14_52_49 : ALL 2 TESTS SUCCESSFUL
-2019_06_13_14_54_15 : ALL 1 TESTS SUCCESSFUL
-2019_06_13_14_54_18 : FAILED 1/2 TESTS: ll_maxage_0_float_1min
-2019_06_13_14_54_36 : ALL 1 TESTS SUCCESSFUL
-2019_06_13_14_54_47 : ALL 2 TESTS SUCCESSFUL
-2019_06_13_14_54_53 : ALL 1 TESTS SUCCESSFUL
-2019_06_13_14_54_53 : ALL 2 TESTS SUCCESSFUL
-2019_06_13_14_54_57 : ALL 1 TESTS SUCCESSFUL
-2019_06_13_14_55_23 : ALL 2 TESTS SUCCESSFUL
-2019_06_14_09_06_06 : ALL 1 TESTS SUCCESSFUL
-2019_06_14_09_06_07 : ALL 2 TESTS SUCCESSFUL
-2019_06_14_09_06_11 : ALL 1 TESTS SUCCESSFUL
-2019_06_14_09_07_04 : ALL 2 TESTS SUCCESSFUL
-2019_06_17_13_52_48 : ALL 1 TESTS SUCCESSFUL
-2019_06_17_13_54_01 : ALL 2 TESTS SUCCESSFUL
-2019_06_17_14_07_25 : ALL 1 TESTS SUCCESSFUL
-2019_06_17_14_07_29 : FAILED 1/2 TESTS: l_office365_maxline_3
-2019_06_17_14_08_51 : ALL 1 TESTS SUCCESSFUL
-2019_06_17_14_08_57 : ALL 2 TESTS SUCCESSFUL
-2019_06_17_14_22_13 : ALL 1 TESTS SUCCESSFUL
-2019_06_17_14_24_33 : ALL 1 TESTS SUCCESSFUL
-2019_06_17_14_27_23 : ALL 1 TESTS SUCCESSFUL
-2019_06_17_14_27_29 : ALL 2 TESTS SUCCESSFUL
-2019_06_17_14_32_12 : ALL 1 TESTS SUCCESSFUL
-2019_06_17_14_33_16 : ALL 1 TESTS SUCCESSFUL
-2019_06_17_14_33_50 : FAILED 1/2 TESTS: l_office365_maxline_3
-2019_06_17_15_26_52 : ALL 1 TESTS SUCCESSFUL
-2019_06_17_15_27_04 : FAILED 1/2 TESTS: l_office365_maxline_3
-2019_06_17_15_28_08 : ALL 1 TESTS SUCCESSFUL
-2019_06_17_15_28_24 : ALL 2 TESTS SUCCESSFUL
-2019_06_17_15_29_48 : ALL 1 TESTS SUCCESSFUL
-2019_06_17_15_30_01 : ALL 2 TESTS SUCCESSFUL
-2019_06_17_15_30_52 : ALL 1 TESTS SUCCESSFUL
-2019_06_17_15_31_04 : FAILED 1/2 TESTS: l_office365_maxline_3
-2019_06_17_15_31_43 : ALL 1 TESTS SUCCESSFUL
-2019_06_17_15_31_56 : FAILED 1/2 TESTS: l_office365_maxline_3
-2019_06_17_15_32_30 : ALL 1 TESTS SUCCESSFUL
-2019_06_17_15_32_42 : ALL 2 TESTS SUCCESSFUL
-2019_06_17_15_34_13 : ALL 1 TESTS SUCCESSFUL
-2019_06_17_15_34_24 : FAILED 1/2 TESTS: l_office365_maxline_3
-2019_06_17_15_37_39 : ALL 1 TESTS SUCCESSFUL
-2019_06_17_15_38_05 : ALL 1 TESTS SUCCESSFUL
-2019_06_17_15_38_11 : ALL 2 TESTS SUCCESSFUL
-2019_06_17_15_38_31 : ALL 1 TESTS SUCCESSFUL
-2019_06_17_15_38_35 : ALL 2 TESTS SUCCESSFUL
-2019_06_17_15_39_07 : ALL 1 TESTS SUCCESSFUL
-2019_06_17_15_39_24 : FAILED 1/2 TESTS: l_office365_maxline_3
-2019_06_17_15_43_11 : ALL 1 TESTS SUCCESSFUL
-2019_06_17_15_43_22 : FAILED 1/2 TESTS: l_office365_maxline_3
-2019_06_17_15_43_49 : ALL 1 TESTS SUCCESSFUL
-2019_06_17_15_44_01 : FAILED 1/2 TESTS: l_office365_maxline_3
-2019_06_17_15_44_19 : ALL 1 TESTS SUCCESSFUL
-2019_06_17_15_44_30 : FAILED 1/2 TESTS: l_office365_maxline_3
-2019_06_17_15_44_44 : ALL 1 TESTS SUCCESSFUL
-2019_06_17_15_44_52 : ALL 2 TESTS SUCCESSFUL
-2019_06_17_15_48_21 : ALL 1 TESTS SUCCESSFUL
-2019_06_17_15_48_37 : FAILED 1/2 TESTS: l_office365_maxline_3
-2019_06_17_15_49_15 : ALL 1 TESTS SUCCESSFUL
-2019_06_17_15_49_27 : FAILED 1/2 TESTS: l_office365_maxline_3
-2019_06_17_15_49_40 : ALL 1 TESTS SUCCESSFUL
-2019_06_17_15_49_52 : FAILED 1/2 TESTS: l_office365_maxline_3
-2019_06_17_15_50_19 : ALL 1 TESTS SUCCESSFUL
-2019_06_17_15_50_27 : ALL 2 TESTS SUCCESSFUL
-2019_06_17_15_52_08 : ALL 1 TESTS SUCCESSFUL
-2019_06_17_15_52_57 : ALL 2 TESTS SUCCESSFUL
-2019_06_20_00_39_09 : ALL 1 TESTS SUCCESSFUL
-2019_06_20_00_39_19 : FAILED 1/2 TESTS: ksks_password_doublequote
-2019_06_20_00_40_30 : ALL 1 TESTS SUCCESSFUL
-2019_06_20_00_40_48 : FAILED 1/2 TESTS: ksks_empty_test1
-2019_06_20_00_40_58 : ALL 1 TESTS SUCCESSFUL
-2019_06_20_00_41_04 : ALL 2 TESTS SUCCESSFUL
-2019_06_20_00_46_25 : ALL 1 TESTS SUCCESSFUL
-2019_06_20_00_46_33 : ALL 2 TESTS SUCCESSFUL
-2019_06_20_00_49_08 : ALL 1 TESTS SUCCESSFUL
-2019_06_20_00_51_08 : ALL 2 TESTS SUCCESSFUL
-2019_06_20_15_57_51 : ALL 1 TESTS SUCCESSFUL
-2019_06_20_15_58_48 : FAILED 1/2 TESTS: ksks_empty_test1
-2019_06_20_15_59_14 : ALL 1 TESTS SUCCESSFUL
-2019_06_20_16_00_02 : FAILED 1/3 TESTS: ksks_empty_test2
-2019_06_20_16_00_09 : ALL 1 TESTS SUCCESSFUL
-2019_06_20_16_00_24 : ALL 3 TESTS SUCCESSFUL
-2019_06_20_17_33_46 : ALL 1 TESTS SUCCESSFUL
-2019_06_20_18_14_09 : FAILED 1/156 TESTS: ll_justfolders_delete1emptyfolders
-2019_06_25_00_21_30 : ALL 1 TESTS SUCCESSFUL
-2019_06_25_00_22_49 : ALL 2 TESTS SUCCESSFUL
-2019_06_25_00_24_33 : ALL 1 TESTS SUCCESSFUL
-2019_06_25_00_24_42 : ALL 2 TESTS SUCCESSFUL
-2019_06_25_00_26_27 : ALL 1 TESTS SUCCESSFUL
-2019_06_25_00_26_36 : ALL 2 TESTS SUCCESSFUL
-2019_06_25_00_28_25 : ALL 1 TESTS SUCCESSFUL
-2019_06_25_00_28_27 : ALL 2 TESTS SUCCESSFUL
-2019_06_25_01_15_16 : ALL 1 TESTS SUCCESSFUL
-2019_06_25_01_15_31 : ALL 2 TESTS SUCCESSFUL
-2019_06_25_01_30_58 : ALL 1 TESTS SUCCESSFUL
-2019_06_25_01_31_09 : ALL 2 TESTS SUCCESSFUL
-2019_06_25_10_33_54 : ALL 1 TESTS SUCCESSFUL
-2019_06_25_10_34_17 : ALL 2 TESTS SUCCESSFUL
-2019_06_25_17_37_19 : ALL 1 TESTS SUCCESSFUL
-2019_06_25_17_38_45 : ALL 2 TESTS SUCCESSFUL
-2019_06_25_17_39_14 : ALL 1 TESTS SUCCESSFUL
-2019_06_25_17_39_14 : FAILED 1/2 TESTS: ksks_init_test2
-2019_06_25_17_39_24 : ALL 1 TESTS SUCCESSFUL
-2019_06_25_17_39_32 : ALL 2 TESTS SUCCESSFUL
-2019_06_25_17_42_33 : ALL 1 TESTS SUCCESSFUL
-2019_06_25_17_42_41 : ALL 2 TESTS SUCCESSFUL
-2019_06_25_17_45_41 : ALL 1 TESTS SUCCESSFUL
-2019_06_25_17_45_49 : ALL 2 TESTS SUCCESSFUL
-2019_06_25_17_47_49 : ALL 1 TESTS SUCCESSFUL
-2019_06_25_17_49_03 : ALL 2 TESTS SUCCESSFUL
-2019_06_25_17_49_48 : ALL 1 TESTS SUCCESSFUL
-2019_06_25_17_49_54 : ALL 2 TESTS SUCCESSFUL
-2019_06_25_17_58_43 : ALL 1 TESTS SUCCESSFUL
-2019_06_25_17_58_51 : ALL 2 TESTS SUCCESSFUL
-2019_06_25_18_01_28 : ALL 1 TESTS SUCCESSFUL
-2019_06_25_18_01_36 : ALL 2 TESTS SUCCESSFUL
-2019_06_25_18_04_22 : ALL 1 TESTS SUCCESSFUL
-2019_06_25_18_04_32 : ALL 2 TESTS SUCCESSFUL
-2019_06_25_18_29_13 : ALL 1 TESTS SUCCESSFUL
-2019_06_25_18_29_20 : ALL 2 TESTS SUCCESSFUL
-2019_06_25_18_31_04 : ALL 1 TESTS SUCCESSFUL
-2019_06_25_18_31_11 : ALL 2 TESTS SUCCESSFUL
-2019_06_25_22_09_13 : ALL 1 TESTS SUCCESSFUL
-2019_06_25_22_09_22 : ALL 2 TESTS SUCCESSFUL
-2019_06_25_22_43_56 : ALL 1 TESTS SUCCESSFUL
-2019_06_25_22_44_04 : ALL 2 TESTS SUCCESSFUL
-2019_06_26_13_45_04 : ALL 1 TESTS SUCCESSFUL
-2019_06_26_13_45_41 : ALL 1 TESTS SUCCESSFUL
-2019_06_26_13_45_50 : ALL 2 TESTS SUCCESSFUL
-2019_06_26_21_47_41 : ALL 1 TESTS SUCCESSFUL
-2019_06_26_22_37_08 : FAILED 1/157 TESTS: ll_justfolders_delete1emptyfolders
-2019_06_26_23_13_29 : ALL 1 TESTS SUCCESSFUL
-2019_06_26_23_14_15 : FAILED 1/2 TESTS: ll_justfolders_delete1emptyfolders
-2019_06_26_23_17_13 : ALL 1 TESTS SUCCESSFUL
-2019_06_26_23_17_30 : FAILED 1/2 TESTS: ll_justfolders_delete1emptyfolders
-2019_06_26_23_22_14 : ALL 1 TESTS SUCCESSFUL
-2019_06_26_23_22_31 : FAILED 1/2 TESTS: ll_justfolders_delete1emptyfolders
-2019_06_26_23_23_41 : ALL 1 TESTS SUCCESSFUL
-2019_06_26_23_23_58 : ALL 2 TESTS SUCCESSFUL
-2019_06_26_23_35_31 : ALL 1 TESTS SUCCESSFUL
-2019_06_27_00_15_30 : ALL 157 TESTS SUCCESSFUL
-2019_06_27_00_22_07 : ALL 1 TESTS SUCCESSFUL
-2019_06_27_00_35_49 : ALL 1 TESTS SUCCESSFUL
-2019_06_27_01_15_17 : ALL 157 TESTS SUCCESSFUL
-2019_06_28_20_24_14 : FAILED 1/1 TESTS: perl_syntax
-2019_06_28_20_24_38 : ALL 1 TESTS SUCCESSFUL
-2019_06_28_20_25_22 : FAILED 1/2 TESTS: ll_with_errors
-2019_06_28_21_11_02 : ALL 1 TESTS SUCCESSFUL
-2019_06_28_21_11_12 : FAILED 1/2 TESTS: ll_with_errors
-2019_06_30_21_14_13 : ALL 1 TESTS SUCCESSFUL
-2019_06_30_21_15_23 : ALL 1 TESTS SUCCESSFUL
-2019_06_30_21_15_31 : ALL 2 TESTS SUCCESSFUL
-2019_06_30_21_18_02 : ALL 1 TESTS SUCCESSFUL
-2019_06_30_21_18_09 : ALL 2 TESTS SUCCESSFUL
-2019_06_30_21_26_15 : ALL 1 TESTS SUCCESSFUL
-2019_06_30_23_03_07 : ALL 1 TESTS SUCCESSFUL
-2019_06_30_23_32_55 : ALL 1 TESTS SUCCESSFUL
-2019_06_30_23_33_02 : ALL 2 TESTS SUCCESSFUL
-2019_06_30_23_34_34 : ALL 1 TESTS SUCCESSFUL
-2019_06_30_23_34_41 : ALL 2 TESTS SUCCESSFUL
-2019_06_30_23_41_17 : ALL 1 TESTS SUCCESSFUL
-2019_06_30_23_41_24 : ALL 2 TESTS SUCCESSFUL
-2019_06_30_23_52_35 : ALL 1 TESTS SUCCESSFUL
-2019_06_30_23_52_42 : ALL 2 TESTS SUCCESSFUL
-2019_07_01_00_12_45 : ALL 1 TESTS SUCCESSFUL
-2019_07_01_00_12_53 : ALL 2 TESTS SUCCESSFUL
-2019_07_01_00_41_17 : ALL 1 TESTS SUCCESSFUL
-2019_07_01_00_41_26 : ALL 2 TESTS SUCCESSFUL
-2019_07_01_15_17_23 : ALL 1 TESTS SUCCESSFUL
-2019_07_01_15_17_34 : ALL 2 TESTS SUCCESSFUL
-2019_07_01_16_14_26 : ALL 1 TESTS SUCCESSFUL
-2019_07_01_16_14_33 : ALL 2 TESTS SUCCESSFUL
-2019_07_01_16_14_51 : ALL 1 TESTS SUCCESSFUL
-2019_07_01_16_15_31 : ALL 2 TESTS SUCCESSFUL
-2019_07_01_16_30_47 : ALL 1 TESTS SUCCESSFUL
-2019_07_01_16_31_53 : ALL 2 TESTS SUCCESSFUL
-2019_07_01_18_12_37 : ALL 1 TESTS SUCCESSFUL
-2019_07_01_18_13_43 : ALL 2 TESTS SUCCESSFUL
-2019_07_01_18_16_24 : ALL 1 TESTS SUCCESSFUL
-2019_07_01_18_16_40 : ALL 2 TESTS SUCCESSFUL
-2019_07_01_18_17_10 : ALL 1 TESTS SUCCESSFUL
-2019_07_01_18_17_19 : ALL 2 TESTS SUCCESSFUL
-2019_07_01_18_32_44 : ALL 1 TESTS SUCCESSFUL
-2019_07_01_18_32_52 : ALL 2 TESTS SUCCESSFUL
-2019_07_01_18_41_58 : ALL 1 TESTS SUCCESSFUL
-2019_07_01_18_43_09 : ALL 1 TESTS SUCCESSFUL
-2019_07_01_18_43_33 : ALL 1 TESTS SUCCESSFUL
-2019_07_01_18_43_50 : ALL 2 TESTS SUCCESSFUL
-2019_07_01_18_44_22 : ALL 1 TESTS SUCCESSFUL
-2019_07_01_18_45_02 : ALL 2 TESTS SUCCESSFUL
-2019_07_01_18_45_21 : ALL 1 TESTS SUCCESSFUL
-2019_07_01_18_45_29 : ALL 1 TESTS SUCCESSFUL
-2019_07_01_18_45_38 : ALL 2 TESTS SUCCESSFUL
-2019_07_01_18_46_20 : ALL 2 TESTS SUCCESSFUL
-2019_07_01_18_48_42 : ALL 1 TESTS SUCCESSFUL
-2019_07_01_18_49_32 : ALL 2 TESTS SUCCESSFUL
-2019_07_01_20_18_11 : ALL 1 TESTS SUCCESSFUL
-2019_07_01_20_18_53 : ALL 2 TESTS SUCCESSFUL
-2019_07_01_22_01_40 : ALL 1 TESTS SUCCESSFUL
-2019_07_01_22_01_48 : ALL 2 TESTS SUCCESSFUL
-2019_07_01_22_05_59 : ALL 1 TESTS SUCCESSFUL
-2019_07_01_22_06_07 : ALL 2 TESTS SUCCESSFUL
-2019_07_02_21_25_57 : ALL 1 TESTS SUCCESSFUL
-2019_07_02_21_26_13 : ALL 2 TESTS SUCCESSFUL
-2019_07_02_21_28_46 : ALL 1 TESTS SUCCESSFUL
-2019_07_02_21_28_51 : ALL 2 TESTS SUCCESSFUL
-2019_07_02_21_30_00 : ALL 1 TESTS SUCCESSFUL
-2019_07_02_21_30_08 : ALL 2 TESTS SUCCESSFUL
-2019_07_02_21_30_24 : ALL 1 TESTS SUCCESSFUL
-2019_07_02_21_30_29 : ALL 2 TESTS SUCCESSFUL
-2019_07_03_14_53_16 : ALL 1 TESTS SUCCESSFUL
-2019_07_03_14_53_16 : FAILED 1/2 TESTS: ll_empty_test2
-2019_07_03_14_55_17 : ALL 1 TESTS SUCCESSFUL
-2019_07_03_14_55_30 : ALL 2 TESTS SUCCESSFUL
-2019_07_04_01_07_34 : ALL 1 TESTS SUCCESSFUL
-2019_07_04_01_07_45 : ALL 2 TESTS SUCCESSFUL
-2019_07_04_04_26_45 : ALL 1 TESTS SUCCESSFUL
-2019_07_04_04_26_53 : ALL 2 TESTS SUCCESSFUL
-2019_07_04_04_32_26 : ALL 1 TESTS SUCCESSFUL
-2019_07_04_04_32_34 : ALL 2 TESTS SUCCESSFUL
-2019_07_04_04_43_15 : ALL 1 TESTS SUCCESSFUL
-2019_07_04_04_43_23 : ALL 2 TESTS SUCCESSFUL
-2019_07_04_13_45_18 : ALL 1 TESTS SUCCESSFUL
-2019_07_04_13_45_29 : ALL 2 TESTS SUCCESSFUL
-2019_07_04_13_58_57 : ALL 1 TESTS SUCCESSFUL
-2019_07_04_13_59_06 : ALL 2 TESTS SUCCESSFUL
-2019_07_04_14_08_34 : ALL 1 TESTS SUCCESSFUL
-2019_07_04_14_08_42 : ALL 2 TESTS SUCCESSFUL
-2019_07_04_14_44_20 : ALL 1 TESTS SUCCESSFUL
-2019_07_04_14_44_28 : ALL 2 TESTS SUCCESSFUL
-2019_07_04_17_21_37 : ALL 1 TESTS SUCCESSFUL
-2019_07_04_17_21_45 : ALL 2 TESTS SUCCESSFUL
-2019_07_05_14_26_43 : ALL 1 TESTS SUCCESSFUL
-2019_07_05_14_26_53 : ALL 2 TESTS SUCCESSFUL
-2019_07_05_14_27_44 : ALL 1 TESTS SUCCESSFUL
-2019_07_05_14_29_16 : ALL 2 TESTS SUCCESSFUL
-2019_07_05_14_42_18 : ALL 1 TESTS SUCCESSFUL
-2019_07_05_14_42_27 : ALL 2 TESTS SUCCESSFUL
-2019_07_05_14_46_50 : ALL 1 TESTS SUCCESSFUL
-2019_07_05_14_46_59 : ALL 2 TESTS SUCCESSFUL
-2019_07_05_15_45_23 : ALL 1 TESTS SUCCESSFUL
-2019_07_05_15_45_31 : ALL 2 TESTS SUCCESSFUL
-2019_07_05_15_51_25 : ALL 1 TESTS SUCCESSFUL
-2019_07_05_15_52_08 : ALL 2 TESTS SUCCESSFUL
-2019_07_05_15_52_20 : ALL 1 TESTS SUCCESSFUL
-2019_07_05_15_52_27 : ALL 2 TESTS SUCCESSFUL
-2019_07_05_16_03_13 : ALL 1 TESTS SUCCESSFUL
-2019_07_05_16_03_22 : ALL 2 TESTS SUCCESSFUL
-2019_07_05_16_19_18 : ALL 1 TESTS SUCCESSFUL
-2019_07_05_16_19_27 : ALL 2 TESTS SUCCESSFUL
-2019_07_05_16_24_15 : ALL 1 TESTS SUCCESSFUL
-2019_07_05_16_24_23 : ALL 2 TESTS SUCCESSFUL
-2019_07_05_23_12_34 : ALL 1 TESTS SUCCESSFUL
-2019_07_05_23_12_43 : ALL 2 TESTS SUCCESSFUL
-2019_07_05_23_28_24 : ALL 1 TESTS SUCCESSFUL
-2019_07_05_23_28_33 : ALL 2 TESTS SUCCESSFUL
-2019_07_05_23_35_41 : ALL 1 TESTS SUCCESSFUL
-2019_07_05_23_35_51 : ALL 2 TESTS SUCCESSFUL
-2019_07_06_13_09_49 : ALL 1 TESTS SUCCESSFUL
-2019_07_06_13_09_58 : ALL 2 TESTS SUCCESSFUL
-2019_07_06_17_00_33 : ALL 1 TESTS SUCCESSFUL
-2019_07_06_17_00_42 : ALL 2 TESTS SUCCESSFUL
-2019_07_07_23_09_55 : ALL 1 TESTS SUCCESSFUL
-2019_07_07_23_10_06 : ALL 2 TESTS SUCCESSFUL
-2019_07_07_23_34_14 : ALL 1 TESTS SUCCESSFUL
-2019_07_07_23_34_22 : ALL 2 TESTS SUCCESSFUL
-2019_07_07_23_39_28 : ALL 1 TESTS SUCCESSFUL
-2019_07_07_23_39_36 : ALL 2 TESTS SUCCESSFUL
-2019_07_07_23_41_44 : ALL 1 TESTS SUCCESSFUL
-2019_07_07_23_41_50 : ALL 2 TESTS SUCCESSFUL
-2019_07_09_16_01_49 : ALL 1 TESTS SUCCESSFUL
-2019_07_09_16_02_10 : ALL 2 TESTS SUCCESSFUL
-2019_07_09_19_34_54 : ALL 1 TESTS SUCCESSFUL
-2019_07_09_19_35_34 : ALL 2 TESTS SUCCESSFUL
-2019_07_09_20_11_00 : ALL 1 TESTS SUCCESSFUL
-2019_07_09_20_11_08 : ALL 2 TESTS SUCCESSFUL
-2019_07_09_20_23_41 : ALL 1 TESTS SUCCESSFUL
-2019_07_09_20_23_48 : ALL 2 TESTS SUCCESSFUL
-2019_07_09_22_46_24 : ALL 1 TESTS SUCCESSFUL
-2019_07_09_22_46_32 : ALL 2 TESTS SUCCESSFUL
-2019_07_10_22_02_28 : ALL 1 TESTS SUCCESSFUL
-2019_07_10_22_02_37 : ALL 2 TESTS SUCCESSFUL
-2019_07_11_00_52_03 : ALL 1 TESTS SUCCESSFUL
-2019_07_11_00_53_46 : ALL 2 TESTS SUCCESSFUL
-2019_07_14_19_55_10 : FAILED 1/1 TESTS: perl_syntax
-2019_07_14_19_55_55 : ALL 1 TESTS SUCCESSFUL
-2019_07_14_19_56_35 : ALL 1 TESTS SUCCESSFUL
-2019_07_14_19_56_44 : ALL 2 TESTS SUCCESSFUL
-2019_07_15_00_11_52 : ALL 1 TESTS SUCCESSFUL
-2019_07_15_00_11_57 : ALL 2 TESTS SUCCESSFUL
-2019_07_15_00_12_57 : ALL 1 TESTS SUCCESSFUL
-2019_07_15_00_13_00 : ALL 2 TESTS SUCCESSFUL
-2019_07_15_00_13_34 : ALL 1 TESTS SUCCESSFUL
-2019_07_15_00_13_38 : ALL 2 TESTS SUCCESSFUL
-2019_07_15_00_19_14 : ALL 1 TESTS SUCCESSFUL
-2019_07_15_00_19_18 : ALL 2 TESTS SUCCESSFUL
-2019_07_15_00_23_12 : ALL 1 TESTS SUCCESSFUL
-2019_07_15_00_23_16 : ALL 2 TESTS SUCCESSFUL
-2019_07_15_00_35_20 : ALL 1 TESTS SUCCESSFUL
-2019_07_15_00_35_25 : ALL 2 TESTS SUCCESSFUL
-2019_07_15_00_39_09 : ALL 1 TESTS SUCCESSFUL
-2019_07_15_00_39_20 : ALL 2 TESTS SUCCESSFUL
-2019_07_15_00_41_37 : ALL 1 TESTS SUCCESSFUL
-2019_07_15_00_41_42 : ALL 2 TESTS SUCCESSFUL
-2019_07_15_01_59_07 : ALL 1 TESTS SUCCESSFUL
-2019_07_15_01_59_12 : ALL 2 TESTS SUCCESSFUL
-2019_07_15_01_59_24 : ALL 1 TESTS SUCCESSFUL
-2019_07_15_01_59_28 : ALL 2 TESTS SUCCESSFUL
-2019_07_15_02_06_29 : ALL 1 TESTS SUCCESSFUL
-2019_07_15_02_14_29 : ALL 1 TESTS SUCCESSFUL
-2019_07_15_02_14_33 : FAILED 1/2 TESTS: ll_authmech_X_MASTERAUTH
-2019_07_15_02_47_31 : ALL 157 TESTS SUCCESSFUL
-2019_07_15_03_06_00 : ALL 1 TESTS SUCCESSFUL
-2019_07_15_03_06_16 : ALL 2 TESTS SUCCESSFUL
-2019_07_15_03_07_37 : ALL 1 TESTS SUCCESSFUL
-2019_07_15_03_07_41 : ALL 2 TESTS SUCCESSFUL
-2019_07_15_03_12_22 : ALL 1 TESTS SUCCESSFUL
-2019_07_15_03_57_01 : ALL 157 TESTS SUCCESSFUL
-2019_07_16_05_12_39 : ALL 1 TESTS SUCCESSFUL
-2019_07_16_05_15_56 : ALL 2 TESTS SUCCESSFUL
-2019_07_17_02_48_07 : ALL 1 TESTS SUCCESSFUL
-2019_07_17_02_49_25 : ALL 2 TESTS SUCCESSFUL
-2019_07_17_02_49_31 : ALL 1 TESTS SUCCESSFUL
-2019_07_17_02_49_59 : ALL 2 TESTS SUCCESSFUL
-2019_07_17_02_51_34 : ALL 1 TESTS SUCCESSFUL
-2019_07_17_02_51_42 : ALL 2 TESTS SUCCESSFUL
-2019_07_17_02_55_58 : ALL 1 TESTS SUCCESSFUL
-2019_07_17_02_56_06 : ALL 2 TESTS SUCCESSFUL
-2019_07_17_05_57_51 : ALL 1 TESTS SUCCESSFUL
-2019_07_17_06_38_11 : FAILED 1/157 TESTS: ll_subscribed
-2019_07_17_17_05_15 : ALL 1 TESTS SUCCESSFUL
-2019_07_17_17_07_11 : ALL 2 TESTS SUCCESSFUL
-2019_07_17_17_44_05 : ALL 1 TESTS SUCCESSFUL
-2019_07_17_17_44_10 : ALL 2 TESTS SUCCESSFUL
-2019_07_17_19_56_23 : ALL 1 TESTS SUCCESSFUL
-2019_07_17_20_10_34 : ALL 1 TESTS SUCCESSFUL
-2019_07_17_20_11_31 : ALL 2 TESTS SUCCESSFUL
-2019_07_17_20_17_00 : ALL 1 TESTS SUCCESSFUL
-2019_07_17_20_17_59 : ALL 2 TESTS SUCCESSFUL
-2019_07_17_20_19_49 : ALL 1 TESTS SUCCESSFUL
-2019_07_17_20_20_46 : ALL 2 TESTS SUCCESSFUL
-2019_07_17_20_28_08 : ALL 1 TESTS SUCCESSFUL
-2019_07_17_20_29_14 : ALL 2 TESTS SUCCESSFUL
-2019_07_18_05_05_08 : ALL 1 TESTS SUCCESSFUL
-2019_07_18_05_05_18 : ALL 2 TESTS SUCCESSFUL
-2019_07_18_05_08_08 : ALL 1 TESTS SUCCESSFUL
-2019_07_18_05_08_16 : ALL 2 TESTS SUCCESSFUL
-2019_07_18_05_37_25 : ALL 1 TESTS SUCCESSFUL
-2019_07_18_05_37_33 : ALL 2 TESTS SUCCESSFUL
-2019_07_18_05_46_37 : ALL 1 TESTS SUCCESSFUL
-2019_07_18_17_20_24 : ALL 1 TESTS SUCCESSFUL
-2019_07_18_17_20_33 : ALL 2 TESTS SUCCESSFUL
-2019_07_21_02_06_10 : ALL 1 TESTS SUCCESSFUL
-2019_07_21_02_47_37 : ALL 157 TESTS SUCCESSFUL
-2019_07_21_03_24_36 : ALL 1 TESTS SUCCESSFUL
-2019_07_21_03_30_23 : ALL 2 TESTS SUCCESSFUL
-2019_07_21_10_57_49 : ALL 1 TESTS SUCCESSFUL
-2019_07_21_10_58_56 : ALL 2 TESTS SUCCESSFUL
-2019_07_21_10_59_15 : ALL 1 TESTS SUCCESSFUL
-2019_07_21_10_59_29 : ALL 2 TESTS SUCCESSFUL
-2019_07_21_11_00_47 : ALL 1 TESTS SUCCESSFUL
-2019_07_21_11_00_54 : ALL 2 TESTS SUCCESSFUL
-2019_07_21_11_07_41 : ALL 1 TESTS SUCCESSFUL
-2019_07_21_11_07_48 : ALL 2 TESTS SUCCESSFUL
-2019_07_21_11_13_51 : FAILED 1/1 TESTS: perl_syntax
-2019_07_21_11_16_19 : ALL 1 TESTS SUCCESSFUL
-2019_07_21_11_16_26 : ALL 2 TESTS SUCCESSFUL
-2019_07_21_11_40_16 : ALL 1 TESTS SUCCESSFUL
-2019_07_21_11_40_24 : ALL 2 TESTS SUCCESSFUL
-2019_07_21_11_40_45 : ALL 1 TESTS SUCCESSFUL
-2019_07_21_11_40_52 : ALL 2 TESTS SUCCESSFUL
-2019_07_21_11_41_16 : ALL 1 TESTS SUCCESSFUL
-2019_07_21_11_41_26 : ALL 2 TESTS SUCCESSFUL
-2019_07_21_11_49_34 : FAILED 1/1 TESTS: perl_syntax
-2019_07_21_11_50_36 : ALL 1 TESTS SUCCESSFUL
-2019_07_21_11_50_46 : ALL 2 TESTS SUCCESSFUL
-2019_07_21_11_51_56 : ALL 1 TESTS SUCCESSFUL
-2019_07_21_11_52_06 : ALL 2 TESTS SUCCESSFUL
-2019_07_21_11_53_28 : FAILED 1/1 TESTS: perl_syntax
-2019_07_21_11_54_28 : ALL 1 TESTS SUCCESSFUL
-2019_07_21_11_54_35 : ALL 2 TESTS SUCCESSFUL
-2019_07_21_12_00_04 : ALL 1 TESTS SUCCESSFUL
-2019_07_21_12_00_11 : ALL 2 TESTS SUCCESSFUL
-2019_07_21_12_01_37 : ALL 1 TESTS SUCCESSFUL
-2019_07_21_12_01_44 : ALL 2 TESTS SUCCESSFUL
-2019_07_22_15_33_24 : ALL 1 TESTS SUCCESSFUL
-2019_07_22_15_33_39 : ALL 2 TESTS SUCCESSFUL
-2019_07_22_15_34_05 : ALL 1 TESTS SUCCESSFUL
-2019_07_22_15_34_11 : ALL 2 TESTS SUCCESSFUL
-2019_07_22_15_36_35 : ALL 1 TESTS SUCCESSFUL
-2019_07_22_15_36_43 : ALL 2 TESTS SUCCESSFUL
-2019_07_22_15_37_43 : ALL 1 TESTS SUCCESSFUL
-2019_07_22_15_37_48 : ALL 2 TESTS SUCCESSFUL
-2019_07_22_15_40_45 : FAILED 1/1 TESTS: perl_syntax
-2019_07_22_15_43_00 : ALL 1 TESTS SUCCESSFUL
-2019_07_22_15_43_06 : ALL 2 TESTS SUCCESSFUL
-2019_07_22_15_44_17 : ALL 1 TESTS SUCCESSFUL
-2019_07_22_15_44_25 : ALL 2 TESTS SUCCESSFUL
-2019_07_22_21_03_28 : ALL 1 TESTS SUCCESSFUL
-2019_07_22_21_03_33 : ALL 2 TESTS SUCCESSFUL
-2019_07_22_21_05_45 : ALL 1 TESTS SUCCESSFUL
-2019_07_22_21_05_50 : ALL 2 TESTS SUCCESSFUL
-2019_07_22_21_10_19 : ALL 1 TESTS SUCCESSFUL
-2019_07_22_21_10_24 : ALL 2 TESTS SUCCESSFUL
-2019_07_22_21_16_30 : ALL 1 TESTS SUCCESSFUL
-2019_07_22_21_16_35 : ALL 2 TESTS SUCCESSFUL
-2019_07_22_21_17_50 : ALL 1 TESTS SUCCESSFUL
-2019_07_22_21_17_55 : ALL 2 TESTS SUCCESSFUL
-2019_07_22_21_28_22 : ALL 1 TESTS SUCCESSFUL
-2019_07_22_21_28_27 : ALL 2 TESTS SUCCESSFUL
-2019_07_22_21_28_46 : ALL 1 TESTS SUCCESSFUL
-2019_07_22_21_29_36 : ALL 1 TESTS SUCCESSFUL
-2019_07_22_21_29_40 : ALL 2 TESTS SUCCESSFUL
-2019_07_22_21_32_38 : ALL 1 TESTS SUCCESSFUL
-2019_07_22_21_32_47 : ALL 2 TESTS SUCCESSFUL
-2019_07_22_21_32_53 : ALL 1 TESTS SUCCESSFUL
-2019_07_22_21_33_58 : ALL 2 TESTS SUCCESSFUL
-2019_07_24_20_38_24 : ALL 1 TESTS SUCCESSFUL
-2019_07_24_20_39_08 : ALL 2 TESTS SUCCESSFUL
-2019_07_24_20_39_45 : ALL 1 TESTS SUCCESSFUL
-2019_07_24_20_39_52 : ALL 2 TESTS SUCCESSFUL
-2019_07_24_20_39_58 : ALL 1 TESTS SUCCESSFUL
-2019_07_24_20_41_08 : ALL 2 TESTS SUCCESSFUL
-2019_07_24_20_44_44 : ALL 1 TESTS SUCCESSFUL
-2019_07_24_20_44_51 : ALL 2 TESTS SUCCESSFUL
-2019_07_24_20_47_16 : ALL 1 TESTS SUCCESSFUL
-2019_07_24_20_47_25 : ALL 2 TESTS SUCCESSFUL
-2019_07_24_20_48_31 : ALL 1 TESTS SUCCESSFUL
-2019_07_24_20_49_19 : ALL 1 TESTS SUCCESSFUL
-2019_07_24_20_49_19 : FAILED 1/2 TESTS: ll_search2_NOT_OR_OR_UID
-2019_07_24_20_49_53 : ALL 1 TESTS SUCCESSFUL
-2019_07_24_20_51_17 : ALL 1 TESTS SUCCESSFUL
-2019_07_24_20_51_34 : ALL 2 TESTS SUCCESSFUL
-2019_07_24_20_51_49 : ALL 1 TESTS SUCCESSFUL
-2019_07_24_20_52_03 : ALL 2 TESTS SUCCESSFUL
-2019_07_24_20_52_22 : ALL 1 TESTS SUCCESSFUL
-2019_07_24_20_52_36 : ALL 2 TESTS SUCCESSFUL
-2019_07_24_20_53_19 : ALL 1 TESTS SUCCESSFUL
-2019_07_24_20_53_34 : ALL 2 TESTS SUCCESSFUL
-2019_07_24_20_53_50 : ALL 1 TESTS SUCCESSFUL
-2019_07_24_20_54_05 : ALL 2 TESTS SUCCESSFUL
-2019_07_24_21_09_40 : ALL 1 TESTS SUCCESSFUL
-2019_07_24_21_09_54 : ALL 2 TESTS SUCCESSFUL
-2019_07_24_21_12_21 : FAILED 1/1 TESTS: perl_syntax
-2019_07_24_21_12_41 : FAILED 1/1 TESTS: perl_syntax
-2019_07_24_21_12_54 : FAILED 1/1 TESTS: perl_syntax
-2019_07_24_21_13_19 : FAILED 1/1 TESTS: perl_syntax
-2019_07_24_21_13_34 : ALL 1 TESTS SUCCESSFUL
-2019_07_24_21_13_48 : ALL 2 TESTS SUCCESSFUL
-2019_07_24_21_13_53 : ALL 1 TESTS SUCCESSFUL
-2019_07_24_21_14_08 : ALL 2 TESTS SUCCESSFUL
-2019_07_24_21_14_46 : ALL 1 TESTS SUCCESSFUL
-2019_07_24_21_15_01 : ALL 2 TESTS SUCCESSFUL
-2019_07_24_21_24_54 : ALL 1 TESTS SUCCESSFUL
-2019_07_24_21_25_15 : ALL 2 TESTS SUCCESSFUL
-2019_07_24_21_32_32 : FAILED 1/1 TESTS: perl_syntax
-2019_07_24_21_33_02 : ALL 1 TESTS SUCCESSFUL
-2019_07_24_21_33_15 : ALL 2 TESTS SUCCESSFUL
-2019_07_24_21_42_22 : ALL 1 TESTS SUCCESSFUL
-2019_07_24_21_42_34 : ALL 2 TESTS SUCCESSFUL
-2019_07_25_00_23_03 : ALL 1 TESTS SUCCESSFUL
-2019_07_25_00_23_16 : ALL 2 TESTS SUCCESSFUL
-2019_07_25_14_27_42 : ALL 1 TESTS SUCCESSFUL
-2019_07_25_14_29_23 : ALL 2 TESTS SUCCESSFUL
-2019_07_25_14_38_17 : ALL 1 TESTS SUCCESSFUL
-2019_07_25_14_38_19 : FAILED 1/3 TESTS: titi
-2019_07_25_14_38_23 : ALL 1 TESTS SUCCESSFUL
-2019_07_25_14_38_23 : FAILED 1/3 TESTS: titi
-2019_07_25_14_40_21 : ALL 1 TESTS SUCCESSFUL
-2019_07_25_14_40_21 : ALL 2 TESTS SUCCESSFUL
-2019_07_25_14_40_26 : ALL 1 TESTS SUCCESSFUL
-2019_07_25_14_40_26 : ALL 2 TESTS SUCCESSFUL
-2019_07_25_14_40_29 : ALL 1 TESTS SUCCESSFUL
-2019_07_25_14_40_30 : ALL 2 TESTS SUCCESSFUL
-2019_07_25_14_40_37 : ALL 1 TESTS SUCCESSFUL
-2019_07_25_14_41_21 : ALL 2 TESTS SUCCESSFUL
-2019_07_25_14_45_43 : ALL 1 TESTS SUCCESSFUL
-2019_07_25_14_46_24 : ALL 2 TESTS SUCCESSFUL
-2019_07_25_14_50_51 : ALL 1 TESTS SUCCESSFUL
-2019_07_25_14_51_33 : ALL 2 TESTS SUCCESSFUL
-2019_07_25_14_58_33 : ALL 1 TESTS SUCCESSFUL
-2019_07_25_14_58_49 : ALL 2 TESTS SUCCESSFUL
-2019_07_25_15_01_29 : ALL 1 TESTS SUCCESSFUL
-2019_07_25_15_01_34 : ALL 2 TESTS SUCCESSFUL
-2019_07_25_15_03_07 : ALL 1 TESTS SUCCESSFUL
-2019_07_25_15_03_49 : ALL 2 TESTS SUCCESSFUL
-2019_07_25_15_04_32 : ALL 1 TESTS SUCCESSFUL
-2019_07_25_15_04_33 : ALL 2 TESTS SUCCESSFUL
-2019_07_25_15_04_36 : ALL 1 TESTS SUCCESSFUL
-2019_07_25_15_04_36 : ALL 2 TESTS SUCCESSFUL
-2019_07_25_15_17_41 : ALL 1 TESTS SUCCESSFUL
-2019_07_25_15_18_23 : ALL 2 TESTS SUCCESSFUL
-2019_07_25_16_59_13 : ALL 1 TESTS SUCCESSFUL
-2019_07_25_17_00_02 : ALL 2 TESTS SUCCESSFUL
-2019_07_25_17_51_42 : ALL 1 TESTS SUCCESSFUL
-2019_07_25_17_51_57 : ALL 2 TESTS SUCCESSFUL
-2019_07_25_18_03_44 : ALL 1 TESTS SUCCESSFUL
-2019_07_25_18_04_55 : ALL 1 TESTS SUCCESSFUL
-2019_07_25_18_05_20 : ALL 2 TESTS SUCCESSFUL
-2019_07_25_18_29_33 : ALL 1 TESTS SUCCESSFUL
-2019_07_25_19_10_24 : FAILED 3/157 TESTS: option_tests option_tests_in_var_tmp option_tests_in_var_tmp_sub
-2019_07_26_00_53_21 : ALL 1 TESTS SUCCESSFUL
-2019_07_26_00_54_27 : ALL 1 TESTS SUCCESSFUL
-2019_07_26_00_54_56 : ALL 2 TESTS SUCCESSFUL
-2019_07_26_00_56_07 : ALL 1 TESTS SUCCESSFUL
-2019_07_26_00_56_14 : ALL 2 TESTS SUCCESSFUL
-2019_07_26_00_57_35 : ALL 1 TESTS SUCCESSFUL
-2019_07_26_00_57_42 : ALL 2 TESTS SUCCESSFUL
-2019_07_26_01_02_18 : ALL 1 TESTS SUCCESSFUL
-2019_07_26_01_02_25 : ALL 2 TESTS SUCCESSFUL
-2019_07_26_01_03_16 : ALL 1 TESTS SUCCESSFUL
-2019_07_26_01_03_21 : ALL 2 TESTS SUCCESSFUL
-2019_07_26_01_05_40 : ALL 1 TESTS SUCCESSFUL
-2019_07_26_01_05_44 : ALL 2 TESTS SUCCESSFUL
-2019_07_26_01_08_05 : ALL 1 TESTS SUCCESSFUL
-2019_07_26_01_08_10 : ALL 2 TESTS SUCCESSFUL
-2019_07_26_01_16_36 : ALL 1 TESTS SUCCESSFUL
-2019_07_26_01_17_00 : ALL 2 TESTS SUCCESSFUL
-2019_07_26_01_19_59 : ALL 1 TESTS SUCCESSFUL
-2019_07_26_01_20_18 : ALL 2 TESTS SUCCESSFUL
-2019_07_26_01_22_14 : ALL 1 TESTS SUCCESSFUL
-2019_07_26_01_22_27 : ALL 2 TESTS SUCCESSFUL
-2019_07_26_01_27_55 : ALL 1 TESTS SUCCESSFUL
-2019_07_26_01_28_09 : ALL 2 TESTS SUCCESSFUL
-2019_07_26_01_31_29 : ALL 1 TESTS SUCCESSFUL
-2019_07_26_01_31_42 : ALL 2 TESTS SUCCESSFUL
-2019_07_26_01_34_01 : ALL 1 TESTS SUCCESSFUL
-2019_07_26_01_34_14 : ALL 2 TESTS SUCCESSFUL
-2019_07_26_09_29_41 : ALL 1 TESTS SUCCESSFUL
-2019_07_26_09_30_48 : ALL 2 TESTS SUCCESSFUL
-2019_07_26_09_55_25 : ALL 1 TESTS SUCCESSFUL
-2019_07_26_09_55_30 : ALL 2 TESTS SUCCESSFUL
-2019_07_26_10_34_48 : FAILED 1/1 TESTS: perl_syntax
-2019_07_26_10_36_46 : ALL 1 TESTS SUCCESSFUL
-2019_07_26_10_36_51 : ALL 2 TESTS SUCCESSFUL
-2019_07_26_10_38_35 : ALL 1 TESTS SUCCESSFUL
-2019_07_26_10_40_19 : ALL 1 TESTS SUCCESSFUL
-2019_07_26_10_40_26 : ALL 2 TESTS SUCCESSFUL
-2019_07_26_10_41_38 : ALL 1 TESTS SUCCESSFUL
-2019_07_26_10_43_20 : ALL 1 TESTS SUCCESSFUL
-2019_07_26_10_44_17 : ALL 1 TESTS SUCCESSFUL
-2019_07_26_10_45_20 : ALL 1 TESTS SUCCESSFUL
-2019_07_26_11_24_51 : ALL 1 TESTS SUCCESSFUL
-2019_07_26_11_27_32 : ALL 1 TESTS SUCCESSFUL
-2019_07_26_11_27_43 : ALL 2 TESTS SUCCESSFUL
-2019_07_26_11_30_21 : ALL 1 TESTS SUCCESSFUL
-2019_07_26_11_30_33 : ALL 2 TESTS SUCCESSFUL
-2019_07_26_11_32_28 : ALL 1 TESTS SUCCESSFUL
-2019_07_26_12_13_31 : FAILED 5/157 TESTS: first_sync_dry first_sync yahoo_all ll_justfolders_delete1emptyfolders ll_sep2
-2019_07_26_12_54_45 : ALL 1 TESTS SUCCESSFUL
-2019_07_26_13_01_33 : ALL 2 TESTS SUCCESSFUL
-2019_07_26_21_21_20 : ALL 1 TESTS SUCCESSFUL
-2019_07_26_21_21_32 : ALL 2 TESTS SUCCESSFUL
-2019_07_27_05_27_08 : FAILED 1/1 TESTS: perl_syntax
-2019_07_27_05_52_36 : FAILED 1/1 TESTS: perl_syntax
-2019_07_27_06_01_38 : ALL 1 TESTS SUCCESSFUL
-2019_07_27_06_01_49 : ALL 2 TESTS SUCCESSFUL
-2019_07_27_06_03_37 : ALL 1 TESTS SUCCESSFUL
-2019_07_27_06_03_49 : ALL 2 TESTS SUCCESSFUL
-2019_07_27_06_05_23 : ALL 1 TESTS SUCCESSFUL
-2019_07_27_06_05_35 : ALL 2 TESTS SUCCESSFUL
-2019_07_27_06_06_31 : ALL 1 TESTS SUCCESSFUL
-2019_07_27_06_06_41 : ALL 2 TESTS SUCCESSFUL
-2019_07_27_06_09_44 : ALL 1 TESTS SUCCESSFUL
-2019_07_27_06_10_02 : ALL 2 TESTS SUCCESSFUL
-2019_07_27_06_10_57 : ALL 1 TESTS SUCCESSFUL
-2019_07_27_06_11_14 : ALL 2 TESTS SUCCESSFUL
-2019_07_27_06_11_49 : ALL 1 TESTS SUCCESSFUL
-2019_07_27_06_12_12 : ALL 2 TESTS SUCCESSFUL
-2019_07_27_06_12_40 : ALL 1 TESTS SUCCESSFUL
-2019_07_27_06_12_54 : ALL 2 TESTS SUCCESSFUL
-2019_07_27_06_29_57 : ALL 1 TESTS SUCCESSFUL
-2019_07_27_06_30_07 : ALL 2 TESTS SUCCESSFUL
-2019_07_27_06_31_06 : ALL 1 TESTS SUCCESSFUL
-2019_07_27_06_31_16 : ALL 2 TESTS SUCCESSFUL
-2019_07_27_06_33_18 : ALL 1 TESTS SUCCESSFUL
-2019_07_27_06_33_25 : ALL 2 TESTS SUCCESSFUL
-2019_07_27_06_34_21 : ALL 1 TESTS SUCCESSFUL
-2019_07_27_06_41_25 : ALL 2 TESTS SUCCESSFUL
-2019_07_27_06_43_55 : ALL 1 TESTS SUCCESSFUL
-2019_07_27_06_44_03 : ALL 2 TESTS SUCCESSFUL
-2019_07_27_10_02_44 : ALL 1 TESTS SUCCESSFUL
-2019_07_27_10_03_23 : ALL 2 TESTS SUCCESSFUL
-2019_07_27_10_08_07 : ALL 1 TESTS SUCCESSFUL
-2019_07_27_10_08_14 : ALL 2 TESTS SUCCESSFUL
-2019_07_27_10_09_30 : ALL 1 TESTS SUCCESSFUL
-2019_07_27_10_09_30 : FAILED 1/2 TESTS: ll_justfoldersizes_noexist!
-2019_07_27_10_09_45 : ALL 1 TESTS SUCCESSFUL
-2019_07_27_10_09_52 : ALL 2 TESTS SUCCESSFUL
-2019_07_27_10_10_55 : ALL 1 TESTS SUCCESSFUL
-2019_07_27_10_11_03 : ALL 2 TESTS SUCCESSFUL
-2019_07_27_10_13_59 : ALL 1 TESTS SUCCESSFUL
-2019_07_27_10_14_06 : ALL 2 TESTS SUCCESSFUL
-2019_07_27_10_15_05 : ALL 1 TESTS SUCCESSFUL
-2019_07_27_10_15_16 : ALL 2 TESTS SUCCESSFUL
-2019_07_27_11_08_43 : ALL 1 TESTS SUCCESSFUL
-2019_07_27_11_08_52 : ALL 2 TESTS SUCCESSFUL
-2019_07_27_11_19_02 : ALL 1 TESTS SUCCESSFUL
-2019_07_27_11_19_09 : ALL 2 TESTS SUCCESSFUL
-2019_07_27_11_21_26 : ALL 1 TESTS SUCCESSFUL
-2019_07_27_11_21_33 : ALL 2 TESTS SUCCESSFUL
-2019_07_27_11_34_40 : ALL 1 TESTS SUCCESSFUL
-2019_07_27_11_34_47 : ALL 2 TESTS SUCCESSFUL
-2019_07_27_11_35_32 : ALL 1 TESTS SUCCESSFUL
-2019_07_27_11_36_10 : ALL 2 TESTS SUCCESSFUL
-2019_07_27_11_36_23 : ALL 1 TESTS SUCCESSFUL
-2019_07_27_11_36_37 : ALL 2 TESTS SUCCESSFUL
-2019_07_27_11_36_47 : ALL 1 TESTS SUCCESSFUL
-2019_07_27_11_36_57 : ALL 2 TESTS SUCCESSFUL
-2019_07_27_11_37_06 : ALL 1 TESTS SUCCESSFUL
-2019_07_27_11_37_17 : ALL 2 TESTS SUCCESSFUL
-2019_07_27_11_37_26 : ALL 1 TESTS SUCCESSFUL
-2019_07_27_11_37_42 : ALL 2 TESTS SUCCESSFUL
-2019_07_27_11_38_20 : ALL 1 TESTS SUCCESSFUL
-2019_07_27_11_39_03 : ALL 2 TESTS SUCCESSFUL
-2019_07_27_11_41_04 : ALL 1 TESTS SUCCESSFUL
-2019_07_27_11_41_15 : ALL 2 TESTS SUCCESSFUL
-2019_07_28_02_51_54 : ALL 1 TESTS SUCCESSFUL
-2019_07_28_02_52_19 : ALL 2 TESTS SUCCESSFUL
-2019_07_28_02_53_54 : ALL 1 TESTS SUCCESSFUL
-2019_07_28_02_54_15 : ALL 2 TESTS SUCCESSFUL
-2019_07_28_02_57_40 : ALL 1 TESTS SUCCESSFUL
-2019_07_28_02_58_20 : ALL 2 TESTS SUCCESSFUL
-2019_07_28_03_00_34 : ALL 1 TESTS SUCCESSFUL
-2019_07_28_03_01_18 : ALL 2 TESTS SUCCESSFUL
-2019_07_28_03_07_42 : ALL 1 TESTS SUCCESSFUL
-2019_07_28_03_08_24 : ALL 2 TESTS SUCCESSFUL
-2019_07_28_03_10_55 : ALL 1 TESTS SUCCESSFUL
-2019_07_28_03_11_37 : ALL 2 TESTS SUCCESSFUL
-2019_07_28_03_14_08 : ALL 1 TESTS SUCCESSFUL
-2019_07_28_03_14_17 : ALL 2 TESTS SUCCESSFUL
-2019_07_28_03_18_39 : ALL 1 TESTS SUCCESSFUL
-2019_07_28_03_18_46 : ALL 2 TESTS SUCCESSFUL
-2019_07_28_03_18_54 : ALL 1 TESTS SUCCESSFUL
-2019_07_28_03_19_26 : ALL 2 TESTS SUCCESSFUL
-2019_07_28_03_24_14 : FAILED 1/1 TESTS: perl_syntax
-2019_07_28_03_25_17 : ALL 1 TESTS SUCCESSFUL
-2019_07_28_03_25_52 : ALL 2 TESTS SUCCESSFUL
-2019_07_28_03_27_22 : ALL 1 TESTS SUCCESSFUL
-2019_07_28_03_27_52 : ALL 2 TESTS SUCCESSFUL
-2019_07_28_03_32_34 : ALL 1 TESTS SUCCESSFUL
-2019_07_28_03_32_35 : ALL 2 TESTS SUCCESSFUL
-2019_07_28_03_32_38 : ALL 1 TESTS SUCCESSFUL
-2019_07_28_03_32_39 : ALL 2 TESTS SUCCESSFUL
-2019_07_28_03_32_55 : ALL 1 TESTS SUCCESSFUL
-2019_07_28_03_33_07 : ALL 2 TESTS SUCCESSFUL
-2019_07_28_03_35_24 : ALL 1 TESTS SUCCESSFUL
-2019_07_28_03_35_24 : ALL 2 TESTS SUCCESSFUL
-2019_07_28_03_35_36 : ALL 1 TESTS SUCCESSFUL
-2019_07_28_03_36_07 : ALL 2 TESTS SUCCESSFUL
-2019_07_28_03_37_57 : ALL 1 TESTS SUCCESSFUL
-2019_07_28_03_37_57 : ALL 2 TESTS SUCCESSFUL
-2019_07_28_03_38_01 : ALL 1 TESTS SUCCESSFUL
-2019_07_28_03_38_01 : ALL 2 TESTS SUCCESSFUL
-2019_07_28_03_38_08 : ALL 1 TESTS SUCCESSFUL
-2019_07_28_03_38_09 : ALL 4 TESTS SUCCESSFUL
-2019_07_28_03_38_16 : ALL 1 TESTS SUCCESSFUL
-2019_07_28_03_38_28 : ALL 2 TESTS SUCCESSFUL
-2019_07_28_04_17_19 : ALL 1 TESTS SUCCESSFUL
-2019_07_28_04_17_20 : ALL 4 TESTS SUCCESSFUL
-2019_07_28_04_17_23 : ALL 1 TESTS SUCCESSFUL
-2019_07_28_04_17_23 : ALL 4 TESTS SUCCESSFUL
-2019_07_28_04_17_27 : ALL 1 TESTS SUCCESSFUL
-2019_07_28_04_17_42 : ALL 2 TESTS SUCCESSFUL
-2019_07_29_08_42_09 : ALL 1 TESTS SUCCESSFUL
-2019_07_29_09_26_18 : FAILED 7/157 TESTS: first_sync_dry first_sync yahoo_all ll_justfolders_delete1emptyfolders ll_sep2 ll_domino1_domino2 ll_domino2
-2019_07_29_10_11_07 : ALL 1 TESTS SUCCESSFUL
-2019_07_29_10_14_23 : ALL 2 TESTS SUCCESSFUL
-2019_07_30_00_39_42 : ALL 1 TESTS SUCCESSFUL
-2019_07_30_00_39_51 : ALL 2 TESTS SUCCESSFUL
-2019_07_30_11_17_17 : ALL 1 TESTS SUCCESSFUL
-2019_07_31_15_02_48 : ALL 1 TESTS SUCCESSFUL
-2019_07_31_15_02_55 : ALL 2 TESTS SUCCESSFUL
-2019_07_31_17_57_02 : ALL 1 TESTS SUCCESSFUL
-2019_07_31_17_57_09 : ALL 2 TESTS SUCCESSFUL
-2019_07_31_19_05_39 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_03_19_29 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_04_03_21 : FAILED 7/157 TESTS: first_sync_dry first_sync yahoo_all ll_justfolders_delete1emptyfolders ll_sep2 ll_domino1_domino2 ll_domino2
-2019_08_01_04_43_05 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_04_47_48 : ALL 2 TESTS SUCCESSFUL
-2019_08_01_18_46_50 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_18_47_21 : FAILED 1/2 TESTS: ll_regexmess_add_header
-2019_08_01_18_47_40 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_18_48_02 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_18_49_31 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_18_54_01 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_18_54_07 : FAILED 1/2 TESTS: ll_regexmess_add_header
-2019_08_01_18_54_37 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_18_54_43 : FAILED 1/2 TESTS: ll_regexmess_add_header
-2019_08_01_18_55_35 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_18_55_41 : FAILED 1/2 TESTS: ll_regexmess_add_header
-2019_08_01_18_59_33 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_18_59_38 : FAILED 1/2 TESTS: ll_regexmess_add_header
-2019_08_01_19_00_46 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_19_00_52 : ALL 2 TESTS SUCCESSFUL
-2019_08_01_19_04_07 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_19_04_12 : FAILED 1/2 TESTS: ll_regexmess_add_header_path
-2019_08_01_19_07_02 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_19_07_06 : FAILED 1/2 TESTS: ll_regexmess_add_header_path
-2019_08_01_20_35_48 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_20_35_54 : FAILED 1/2 TESTS: ll_regexmess_add_header_path
-2019_08_01_20_40_38 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_20_40_44 : FAILED 1/2 TESTS: ll_regexmess_add_header_path
-2019_08_01_20_44_20 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_20_44_29 : ALL 2 TESTS SUCCESSFUL
-2019_08_01_20_45_23 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_20_45_27 : ALL 2 TESTS SUCCESSFUL
-2019_08_01_20_46_51 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_20_46_55 : ALL 2 TESTS SUCCESSFUL
-2019_08_01_20_47_02 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_20_47_08 : FAILED 1/2 TESTS: ll_regexmess_add_header_path
-2019_08_01_20_49_16 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_20_49_19 : ALL 2 TESTS SUCCESSFUL
-2019_08_01_20_51_11 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_20_51_15 : ALL 2 TESTS SUCCESSFUL
-2019_08_01_20_52_35 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_20_52_40 : ALL 2 TESTS SUCCESSFUL
-2019_08_01_20_53_17 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_20_53_21 : ALL 2 TESTS SUCCESSFUL
-2019_08_01_20_53_44 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_20_53_48 : ALL 2 TESTS SUCCESSFUL
-2019_08_01_21_16_30 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_21_16_35 : ALL 2 TESTS SUCCESSFUL
-2019_08_01_21_23_45 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_21_23_49 : ALL 2 TESTS SUCCESSFUL
-2019_08_01_21_31_26 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_21_31_30 : ALL 2 TESTS SUCCESSFUL
-2019_08_01_21_31_41 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_21_31_46 : FAILED 1/2 TESTS: ll_regexmess_add_header_path
-2019_08_01_21_34_26 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_21_34_31 : ALL 2 TESTS SUCCESSFUL
-2019_08_01_21_37_45 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_21_37_51 : ALL 2 TESTS SUCCESSFUL
-2019_08_01_21_39_00 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_21_39_07 : FAILED 1/2 TESTS: ll_regexmess_add_header_path
-2019_08_01_21_39_35 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_21_39_41 : ALL 2 TESTS SUCCESSFUL
-2019_08_01_21_41_42 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_22_24_04 : FAILED 7/159 TESTS: first_sync_dry first_sync yahoo_all ll_justfolders_delete1emptyfolders ll_sep2 ll_domino1_domino2 ll_domino2
-2019_08_01_22_36_10 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_22_39_03 : FAILED 7/8 TESTS: first_sync_dry first_sync yahoo_all ll_justfolders_delete1emptyfolders ll_sep2 ll_domino1_domino2 ll_domino2
-2019_08_01_22_39_18 : ALL 1 TESTS SUCCESSFUL
-2019_08_01_22_39_24 : FAILED 1/2 TESTS: ll_domino2
-2019_08_02_13_58_44 : ALL 1 TESTS SUCCESSFUL
-2019_08_02_13_59_03 : ALL 2 TESTS SUCCESSFUL
-2019_08_02_14_00_38 : ALL 1 TESTS SUCCESSFUL
-2019_08_02_14_00_44 : ALL 2 TESTS SUCCESSFUL
-2019_08_02_14_01_40 : ALL 1 TESTS SUCCESSFUL
-2019_08_02_14_01_45 : ALL 2 TESTS SUCCESSFUL
-2019_08_02_14_03_56 : ALL 1 TESTS SUCCESSFUL
-2019_08_02_14_04_02 : ALL 2 TESTS SUCCESSFUL
-2019_08_02_14_04_33 : ALL 1 TESTS SUCCESSFUL
-2019_08_02_14_04_40 : ALL 2 TESTS SUCCESSFUL
-2019_08_02_14_06_14 : ALL 1 TESTS SUCCESSFUL
-2019_08_02_14_06_27 : ALL 2 TESTS SUCCESSFUL
-2019_08_02_14_17_30 : ALL 1 TESTS SUCCESSFUL
-2019_08_02_14_17_36 : FAILED 1/2 TESTS: ll_regexmess_add_header_path
-2019_08_02_14_25_00 : ALL 1 TESTS SUCCESSFUL
-2019_08_02_14_25_16 : FAILED 1/2 TESTS: ll_regexmess_add_header_path
-2019_08_02_14_25_57 : ALL 1 TESTS SUCCESSFUL
-2019_08_02_14_26_05 : FAILED 1/2 TESTS: ll_regexmess_add_header_path
-2019_08_02_15_51_14 : ALL 1 TESTS SUCCESSFUL
-2019_08_02_15_51_28 : ALL 2 TESTS SUCCESSFUL
-2019_08_02_15_52_54 : ALL 1 TESTS SUCCESSFUL
-2019_08_02_15_53_04 : FAILED 1/2 TESTS: ll_regexmess_add_header_path
-2019_08_02_15_54_40 : ALL 1 TESTS SUCCESSFUL
-2019_08_02_15_54_52 : ALL 2 TESTS SUCCESSFUL
-2019_08_02_15_55_09 : ALL 1 TESTS SUCCESSFUL
-2019_08_02_15_55_29 : ALL 2 TESTS SUCCESSFUL
-2019_08_02_15_55_49 : ALL 1 TESTS SUCCESSFUL
-2019_08_02_15_55_56 : ALL 2 TESTS SUCCESSFUL
-2019_08_02_15_57_55 : ALL 1 TESTS SUCCESSFUL
-2019_08_02_15_58_03 : ALL 2 TESTS SUCCESSFUL
-2019_08_02_15_59_16 : ALL 1 TESTS SUCCESSFUL
-2019_08_02_15_59_22 : ALL 2 TESTS SUCCESSFUL
-2019_08_02_15_59_56 : ALL 1 TESTS SUCCESSFUL
-2019_08_02_16_00_12 : ALL 2 TESTS SUCCESSFUL
-2019_08_02_16_02_10 : ALL 1 TESTS SUCCESSFUL
-2019_08_02_16_02_21 : ALL 2 TESTS SUCCESSFUL
-2019_08_02_20_59_29 : ALL 1 TESTS SUCCESSFUL
-2019_08_02_20_59_55 : ALL 2 TESTS SUCCESSFUL
-2019_08_02_21_01_38 : ALL 1 TESTS SUCCESSFUL
-2019_08_02_21_01_42 : ALL 2 TESTS SUCCESSFUL
-2019_08_02_21_03_00 : ALL 1 TESTS SUCCESSFUL
-2019_08_02_21_03_05 : FAILED 1/2 TESTS: ll_justfoldersizes_noexist
-2019_08_02_21_12_13 : FAILED 1/1 TESTS: perl_syntax
-2019_08_02_21_12_52 : ALL 1 TESTS SUCCESSFUL
-2019_08_02_21_12_56 : FAILED 1/2 TESTS: ll_justfoldersizes_noexist
-2019_08_02_21_14_24 : ALL 1 TESTS SUCCESSFUL
-2019_08_02_21_14_28 : FAILED 1/2 TESTS: ll_justfoldersizes_noexist
-2019_08_02_21_15_46 : ALL 1 TESTS SUCCESSFUL
-2019_08_02_21_15_51 : FAILED 1/2 TESTS: ll_justfoldersizes_noexist
-2019_08_02_21_17_48 : ALL 1 TESTS SUCCESSFUL
-2019_08_02_21_17_53 : FAILED 1/2 TESTS: ll_justfoldersizes_noexist
-2019_08_02_21_18_39 : ALL 1 TESTS SUCCESSFUL
-2019_08_02_21_18_44 : ALL 2 TESTS SUCCESSFUL
-2019_08_02_21_19_58 : ALL 1 TESTS SUCCESSFUL
-2019_08_02_22_18_53 : FAILED 4/160 TESTS: yahoo_all ll_sep2 ll_domino1_domino2 ll_domino2
-2019_08_02_22_22_43 : ALL 1 TESTS SUCCESSFUL
-2019_08_02_22_22_52 : ALL 2 TESTS SUCCESSFUL
-2019_08_02_22_34_41 : ALL 1 TESTS SUCCESSFUL
-2019_08_02_23_18_10 : FAILED 4/160 TESTS: first_sync_dry ll_sep2 ll_domino1_domino2 ll_domino2
-2019_08_03_01_48_18 : ALL 1 TESTS SUCCESSFUL
-2019_08_03_02_31_26 : FAILED 4/160 TESTS: first_sync_dry ll_sep2 ll_domino1_domino2 ll_domino2
-2019_08_03_03_13_59 : ALL 1 TESTS SUCCESSFUL
-2019_08_03_03_19_02 : ALL 2 TESTS SUCCESSFUL
-2019_08_10_12_36_15 : ALL 1 TESTS SUCCESSFUL
-2019_08_10_12_36_24 : ALL 2 TESTS SUCCESSFUL
-2019_08_10_12_37_08 : ALL 1 TESTS SUCCESSFUL
-2019_08_10_12_37_15 : ALL 2 TESTS SUCCESSFUL
-2019_08_10_12_38_09 : ALL 1 TESTS SUCCESSFUL
-2019_08_10_12_38_17 : ALL 2 TESTS SUCCESSFUL
-2019_08_10_12_39_26 : ALL 1 TESTS SUCCESSFUL
-2019_08_10_12_39_30 : FAILED 1/2 TESTS: firstclass
-2019_08_10_12_40_08 : ALL 1 TESTS SUCCESSFUL
-2019_08_10_12_40_33 : ALL 2 TESTS SUCCESSFUL
-2019_08_10_12_43_38 : ALL 1 TESTS SUCCESSFUL
-2019_08_10_12_44_01 : ALL 2 TESTS SUCCESSFUL
-2019_08_10_12_47_48 : ALL 1 TESTS SUCCESSFUL
-2019_08_10_12_48_12 : ALL 2 TESTS SUCCESSFUL
-2019_08_10_12_50_18 : ALL 1 TESTS SUCCESSFUL
-2019_08_10_12_50_43 : ALL 2 TESTS SUCCESSFUL
-2019_08_10_12_59_50 : ALL 1 TESTS SUCCESSFUL
-2019_08_10_12_59_52 : FAILED 1/2 TESTS: firstclass_fullfill
-2019_08_10_13_02_25 : ALL 1 TESTS SUCCESSFUL
-2019_08_10_13_02_42 : ALL 2 TESTS SUCCESSFUL
-2019_08_10_13_03_15 : ALL 1 TESTS SUCCESSFUL
-2019_08_10_13_03_43 : ALL 1 TESTS SUCCESSFUL
-2019_08_10_13_04_01 : ALL 2 TESTS SUCCESSFUL
-2019_08_10_13_04_07 : ALL 1 TESTS SUCCESSFUL
-2019_08_10_13_04_33 : ALL 2 TESTS SUCCESSFUL
-2019_08_10_13_05_29 : ALL 1 TESTS SUCCESSFUL
-2019_08_10_13_05_46 : ALL 2 TESTS SUCCESSFUL
-2019_08_10_13_06_36 : ALL 1 TESTS SUCCESSFUL
-2019_08_10_13_07_02 : ALL 2 TESTS SUCCESSFUL
-2019_08_29_11_40_36 : ALL 1 TESTS SUCCESSFUL
-2019_08_29_11_40_51 : ALL 2 TESTS SUCCESSFUL
-2019_08_29_11_42_54 : ALL 1 TESTS SUCCESSFUL
-2019_08_29_11_42_59 : ALL 2 TESTS SUCCESSFUL
-2019_08_29_11_47_58 : ALL 1 TESTS SUCCESSFUL
-2019_08_29_11_48_03 : ALL 2 TESTS SUCCESSFUL
-2019_08_29_11_49_05 : ALL 1 TESTS SUCCESSFUL
-2019_08_29_11_49_10 : FAILED 1/2 TESTS: ll_justfolders_skipemptyfolders
-2019_08_29_11_55_17 : FAILED 1/1 TESTS: perl_syntax
-2019_08_29_11_58_33 : ALL 1 TESTS SUCCESSFUL
-2019_08_29_11_58_38 : FAILED 1/2 TESTS: ll_justfolders_skipemptyfolders
-2019_08_29_19_10_36 : ALL 1 TESTS SUCCESSFUL
-2019_08_29_19_10_45 : FAILED 1/2 TESTS: ll_justfolders_skipemptyfolders
-2019_08_29_19_12_06 : ALL 1 TESTS SUCCESSFUL
-2019_08_29_19_12_45 : FAILED 1/2 TESTS: ll_delete1_delete1emptyfolders
-2019_08_29_19_15_03 : ALL 1 TESTS SUCCESSFUL
-2019_08_29_19_15_26 : ALL 2 TESTS SUCCESSFUL
-2019_08_29_19_21_00 : ALL 1 TESTS SUCCESSFUL
-2019_08_29_19_21_17 : ALL 2 TESTS SUCCESSFUL
-2019_08_29_19_21_58 : ALL 1 TESTS SUCCESSFUL
-2019_08_29_19_22_03 : FAILED 1/2 TESTS: ll_justfolders_skipemptyfolders
-2019_08_29_19_23_46 : ALL 1 TESTS SUCCESSFUL
-2019_08_29_19_23_51 : ALL 2 TESTS SUCCESSFUL
-2019_08_29_19_30_05 : ALL 1 TESTS SUCCESSFUL
-2019_08_29_19_30_12 : ALL 2 TESTS SUCCESSFUL
-2019_08_29_19_30_24 : ALL 1 TESTS SUCCESSFUL
-2019_08_29_19_30_44 : ALL 2 TESTS SUCCESSFUL
-2019_08_29_19_34_30 : ALL 1 TESTS SUCCESSFUL
-2019_08_29_19_34_47 : ALL 2 TESTS SUCCESSFUL
-2019_08_29_19_35_33 : ALL 1 TESTS SUCCESSFUL
-2019_08_29_19_39_14 : ALL 1 TESTS SUCCESSFUL
-2019_08_29_19_39_19 : ALL 2 TESTS SUCCESSFUL
-2019_08_29_19_41_34 : ALL 1 TESTS SUCCESSFUL
-2019_08_29_20_27_41 : FAILED 2/160 TESTS: yahoo_all ll_justfolders_delete1emptyfolders
-2019_08_29_22_20_12 : ALL 1 TESTS SUCCESSFUL
-2019_08_29_22_22_12 : FAILED 1/3 TESTS: ll_justfolders_delete1emptyfolders
-2019_08_29_22_23_10 : ALL 1 TESTS SUCCESSFUL
-2019_08_29_22_23_27 : FAILED 1/2 TESTS: ll_justfolders_delete1emptyfolders
-2019_08_29_22_26_52 : ALL 1 TESTS SUCCESSFUL
-2019_08_29_22_27_09 : FAILED 1/2 TESTS: ll_justfolders_delete1emptyfolders
-2019_08_29_22_40_17 : ALL 1 TESTS SUCCESSFUL
-2019_08_29_22_40_38 : FAILED 1/2 TESTS: ll_justfolders_delete1emptyfolders
-2019_08_29_22_40_55 : ALL 1 TESTS SUCCESSFUL
-2019_08_29_22_41_06 : FAILED 1/2 TESTS: ll_justfolders_delete1emptyfolders
-2019_08_29_22_41_10 : ALL 1 TESTS SUCCESSFUL
-2019_08_29_22_41_21 : FAILED 1/2 TESTS: ll_justfolders_delete1emptyfolders
-2019_08_29_22_43_49 : ALL 1 TESTS SUCCESSFUL
-2019_08_29_22_44_06 : FAILED 1/2 TESTS: ll_justfolders_delete1emptyfolders
-2019_08_29_22_48_28 : ALL 1 TESTS SUCCESSFUL
-2019_08_29_22_48_51 : ALL 2 TESTS SUCCESSFUL
-2019_08_29_22_48_58 : ALL 1 TESTS SUCCESSFUL
-2019_08_29_22_49_16 : ALL 2 TESTS SUCCESSFUL
-2019_09_11_11_12_28 : ALL 1 TESTS SUCCESSFUL
-2019_09_11_11_12_29 : FAILED 1/2 TESTS: abort_tests
-2019_09_11_13_56_05 : ALL 1 TESTS SUCCESSFUL
-2019_09_11_13_56_23 : ALL 2 TESTS SUCCESSFUL
-2019_09_11_14_05_29 : ALL 1 TESTS SUCCESSFUL
-2019_09_11_14_05_47 : ALL 2 TESTS SUCCESSFUL
-2019_09_11_14_15_14 : ALL 1 TESTS SUCCESSFUL
-2019_09_11_14_15_24 : ALL 2 TESTS SUCCESSFUL
-2019_09_11_14_19_16 : ALL 1 TESTS SUCCESSFUL
-2019_09_11_14_19_22 : ALL 2 TESTS SUCCESSFUL
-2019_09_11_17_06_50 : ALL 1 TESTS SUCCESSFUL
-2019_09_11_17_06_56 : ALL 2 TESTS SUCCESSFUL
-2019_09_11_23_13_46 : ALL 1 TESTS SUCCESSFUL
-2019_09_11_23_13_53 : ALL 2 TESTS SUCCESSFUL
-2019_09_12_02_50_23 : ALL 1 TESTS SUCCESSFUL
-2019_09_12_02_50_32 : ALL 2 TESTS SUCCESSFUL
-2019_09_12_02_58_26 : ALL 1 TESTS SUCCESSFUL
-2019_09_12_02_58_33 : ALL 2 TESTS SUCCESSFUL
-2019_09_12_02_59_21 : ALL 1 TESTS SUCCESSFUL
-2019_09_12_02_59_27 : ALL 2 TESTS SUCCESSFUL
-2019_09_12_03_15_52 : ALL 1 TESTS SUCCESSFUL
-2019_09_12_03_15_59 : ALL 2 TESTS SUCCESSFUL
-2019_09_16_21_56_34 : ALL 1 TESTS SUCCESSFUL
-2019_09_16_21_56_59 : ALL 2 TESTS SUCCESSFUL
-2019_09_17_00_22_50 : ALL 1 TESTS SUCCESSFUL
-2019_09_17_00_22_55 : FAILED 1/2 TESTS: abort_tests
-2019_09_17_00_26_25 : ALL 1 TESTS SUCCESSFUL
-2019_09_17_00_26_28 : FAILED 1/2 TESTS: ll_abort_noprocess
-2019_09_18_01_06_12 : ALL 1 TESTS SUCCESSFUL
-2019_09_18_01_06_17 : FAILED 1/2 TESTS: abort_tests
-2019_09_18_01_07_13 : ALL 1 TESTS SUCCESSFUL
-2019_09_18_01_07_26 : FAILED 1/2 TESTS: abort_tests
-2019_09_18_01_24_21 : ALL 1 TESTS SUCCESSFUL
-2019_09_18_01_24_33 : FAILED 1/2 TESTS: abort_tests
-2019_09_18_01_35_25 : ALL 1 TESTS SUCCESSFUL
-2019_09_18_01_35_40 : FAILED 1/2 TESTS: abort_tests
-2019_09_18_01_44_20 : ALL 1 TESTS SUCCESSFUL
-2019_09_18_01_44_32 : FAILED 1/2 TESTS: abort_tests
-2019_09_18_01_45_58 : ALL 1 TESTS SUCCESSFUL
-2019_09_18_01_46_07 : FAILED 1/2 TESTS: ll_abort
-2019_09_18_01_47_41 : ALL 1 TESTS SUCCESSFUL
-2019_09_18_01_47_47 : ALL 2 TESTS SUCCESSFUL
-2019_09_18_01_51_02 : ALL 1 TESTS SUCCESSFUL
-2019_09_18_01_51_08 : ALL 2 TESTS SUCCESSFUL
-2019_09_18_01_51_20 : ALL 1 TESTS SUCCESSFUL
-2019_09_18_01_51_28 : FAILED 1/2 TESTS: ll_abort
-2019_09_18_01_56_26 : ALL 1 TESTS SUCCESSFUL
-2019_09_18_01_56_34 : FAILED 1/2 TESTS: ll_abort_no_pidfile_option
-2019_09_18_01_57_51 : ALL 1 TESTS SUCCESSFUL
-2019_09_18_01_57_57 : ALL 2 TESTS SUCCESSFUL
-2019_09_18_02_05_31 : ALL 1 TESTS SUCCESSFUL
-2019_09_18_02_05_38 : ALL 2 TESTS SUCCESSFUL
-2019_09_18_02_05_49 : ALL 1 TESTS SUCCESSFUL
-2019_09_18_02_05_55 : ALL 2 TESTS SUCCESSFUL
-2019_09_18_02_07_53 : ALL 1 TESTS SUCCESSFUL
-2019_09_18_02_07_59 : ALL 2 TESTS SUCCESSFUL
-2019_09_18_02_08_49 : ALL 1 TESTS SUCCESSFUL
-2019_09_18_02_08_55 : ALL 2 TESTS SUCCESSFUL
-2019_09_18_08_45_27 : ALL 1 TESTS SUCCESSFUL
-2019_09_18_08_45_39 : ALL 2 TESTS SUCCESSFUL
-2019_09_18_09_21_21 : ALL 1 TESTS SUCCESSFUL
-2019_09_18_09_21_28 : FAILED 1/2 TESTS: ll_abort
-2019_09_18_09_24_42 : ALL 1 TESTS SUCCESSFUL
-2019_09_18_09_24_49 : FAILED 1/2 TESTS: ll_abort
-2019_09_18_09_27_49 : ALL 1 TESTS SUCCESSFUL
-2019_09_18_09_27_55 : FAILED 1/2 TESTS: ll_abort
-2019_09_18_09_29_12 : ALL 1 TESTS SUCCESSFUL
-2019_09_18_09_29_19 : ALL 2 TESTS SUCCESSFUL
-2019_09_18_09_30_23 : ALL 1 TESTS SUCCESSFUL
-2019_09_18_09_30_50 : ALL 2 TESTS SUCCESSFUL
-2019_09_18_23_48_12 : ALL 1 TESTS SUCCESSFUL
-2019_09_18_23_48_22 : ALL 2 TESTS SUCCESSFUL
-2019_09_19_09_40_54 : ALL 1 TESTS SUCCESSFUL
-2019_09_19_10_27_06 : FAILED 1/161 TESTS: option_tests
-2019_09_19_10_31_06 : ALL 1 TESTS SUCCESSFUL
-2019_09_19_10_31_37 : FAILED 1/2 TESTS: option_tests
-2019_09_19_10_33_14 : ALL 1 TESTS SUCCESSFUL
-2019_09_19_10_33_50 : FAILED 1/2 TESTS: option_tests
-2019_09_19_15_37_26 : ALL 1 TESTS SUCCESSFUL
-2019_09_19_15_37_53 : ALL 2 TESTS SUCCESSFUL
-2019_10_18_15_29_40 : ALL 1 TESTS SUCCESSFUL
-2019_10_18_15_30_11 : ALL 2 TESTS SUCCESSFUL
-2019_10_18_15_30_48 : ALL 1 TESTS SUCCESSFUL
-2019_10_18_15_31_05 : ALL 2 TESTS SUCCESSFUL
-2019_10_22_13_27_05 : ALL 1 TESTS SUCCESSFUL
-2019_10_22_13_27_22 : FAILED 1/2 TESTS: ll_regextrans2_archive_per_year_flat_hard_year
-2019_10_22_13_29_36 : ALL 1 TESTS SUCCESSFUL
-2019_11_13_23_47_26 : ALL 1 TESTS SUCCESSFUL
-2019_11_13_23_48_08 : ALL 2 TESTS SUCCESSFUL
-2019_11_13_23_49_06 : ALL 1 TESTS SUCCESSFUL
-2019_11_13_23_49_22 : ALL 2 TESTS SUCCESSFUL
-2019_11_13_23_50_00 : ALL 1 TESTS SUCCESSFUL
-2019_11_13_23_50_14 : ALL 2 TESTS SUCCESSFUL
-2019_11_13_23_51_57 : ALL 1 TESTS SUCCESSFUL
-2019_11_13_23_52_05 : ALL 2 TESTS SUCCESSFUL
-2019_11_14_12_33_13 : ALL 1 TESTS SUCCESSFUL
-2019_11_14_12_33_54 : ALL 2 TESTS SUCCESSFUL
-2019_11_14_12_34_47 : ALL 1 TESTS SUCCESSFUL
-2019_11_14_12_34_55 : ALL 2 TESTS SUCCESSFUL
-2019_11_14_12_38_16 : ALL 1 TESTS SUCCESSFUL
-2019_11_14_12_43_50 : ALL 2 TESTS SUCCESSFUL
-2019_11_15_12_39_18 : ALL 1 TESTS SUCCESSFUL
-2019_11_15_12_39_19 : FAILED 5/6 TESTS: ./W/learn/create_folder localhost titi HUwtEd INBOX.NEW_2
-2019_11_15_12_39_41 : ALL 1 TESTS SUCCESSFUL
-2019_11_15_12_40_35 : ALL 2 TESTS SUCCESSFUL
-2019_11_15_12_40_50 : ALL 1 TESTS SUCCESSFUL
-2019_11_15_12_41_07 : ALL 2 TESTS SUCCESSFUL
-2019_11_15_12_41_38 : ALL 1 TESTS SUCCESSFUL
-2019_11_15_12_41_49 : ALL 2 TESTS SUCCESSFUL
-2019_11_15_12_44_45 : ALL 1 TESTS SUCCESSFUL
-2019_11_15_12_44_54 : ALL 2 TESTS SUCCESSFUL
-2019_11_15_12_57_36 : FAILED 1/1 TESTS: perl_syntax
-2019_11_15_12_58_08 : FAILED 1/1 TESTS: perl_syntax
-2019_11_15_12_58_45 : ALL 1 TESTS SUCCESSFUL
-2019_11_15_12_58_56 : ALL 2 TESTS SUCCESSFUL
-2019_11_15_13_00_44 : ALL 1 TESTS SUCCESSFUL
-2019_11_15_13_00_59 : ALL 2 TESTS SUCCESSFUL
-2019_11_15_13_04_21 : ALL 1 TESTS SUCCESSFUL
-2019_11_15_13_04_32 : ALL 2 TESTS SUCCESSFUL
-2019_11_15_13_05_40 : ALL 1 TESTS SUCCESSFUL
-2019_11_15_13_05_55 : ALL 2 TESTS SUCCESSFUL
-2019_11_15_13_11_51 : FAILED 1/1 TESTS: perl_syntax
-2019_11_15_13_13_02 : ALL 1 TESTS SUCCESSFUL
-2019_11_15_13_13_11 : ALL 2 TESTS SUCCESSFUL
-2019_11_15_13_15_02 : ALL 1 TESTS SUCCESSFUL
-2019_11_15_13_15_18 : ALL 2 TESTS SUCCESSFUL
-2019_11_15_13_18_24 : ALL 1 TESTS SUCCESSFUL
-2019_11_15_13_18_33 : ALL 2 TESTS SUCCESSFUL
-2019_11_15_13_19_05 : ALL 1 TESTS SUCCESSFUL
-2019_11_15_13_19_18 : FAILED 1/2 TESTS: ll_delete2foldersonly_tmp
-2019_11_15_13_19_26 : ALL 1 TESTS SUCCESSFUL
-2019_11_15_13_19_37 : FAILED 1/2 TESTS: ll_delete2foldersonly_tmp
-2019_11_19_20_42_08 : ALL 1 TESTS SUCCESSFUL
-2019_11_19_20_42_44 : FAILED 1/2 TESTS: ll_delete2foldersonly_tmp
-2019_11_19_20_44_01 : ALL 1 TESTS SUCCESSFUL
-2019_11_19_20_44_07 : ALL 2 TESTS SUCCESSFUL
-2019_11_19_20_44_13 : ALL 1 TESTS SUCCESSFUL
-2019_11_19_21_32_57 : ALL 161 TESTS SUCCESSFUL
-2019_11_24_18_28_57 : ALL 1 TESTS SUCCESSFUL
-2019_11_24_18_29_21 : ALL 2 TESTS SUCCESSFUL
-2019_11_25_22_52_47 : ALL 1 TESTS SUCCESSFUL
-2019_11_25_22_53_03 : ALL 1 TESTS SUCCESSFUL
-2019_11_25_22_53_15 : ALL 2 TESTS SUCCESSFUL
-2019_11_25_23_15_06 : ALL 1 TESTS SUCCESSFUL
-2019_11_25_23_15_16 : ALL 2 TESTS SUCCESSFUL
-2019_11_25_23_27_46 : ALL 1 TESTS SUCCESSFUL
-2019_11_25_23_27_54 : ALL 2 TESTS SUCCESSFUL
-2019_11_28_12_38_36 : ALL 1 TESTS SUCCESSFUL
-2019_11_28_12_38_56 : ALL 2 TESTS SUCCESSFUL
-2019_11_28_15_56_07 : ALL 1 TESTS SUCCESSFUL
-2019_11_28_16_47_06 : FAILED 3/161 TESTS: ks_justconnect_ipv6 ks_justconnect_ipv6_nossl testslive6
-2019_11_28_16_55_34 : ALL 1 TESTS SUCCESSFUL
-2019_11_28_17_05_35 : FAILED 2/4 TESTS: ks_justconnect_ipv6 ks_justconnect_ipv6_nossl
-2019_11_29_10_00_15 : ALL 1 TESTS SUCCESSFUL
-2019_11_29_10_00_15 : FAILED 1/2 TESTS: tests_mailimapclient_connect
-2019_11_29_10_01_12 : ALL 1 TESTS SUCCESSFUL
-2019_11_29_10_01_42 : ALL 4 TESTS SUCCESSFUL
-2019_11_29_12_40_34 : ALL 1 TESTS SUCCESSFUL
-2019_11_29_14_25_16 : ALL 1 TESTS SUCCESSFUL
-2019_11_29_15_09_06 : FAILED 3/161 TESTS: yahoo_all ks_justconnect_ipv6_nossl testslive6
-2019_11_29_15_19_59 : ALL 1 TESTS SUCCESSFUL
-2019_11_29_15_24_29 : ALL 4 TESTS SUCCESSFUL
-2019_11_29_15_25_29 : ALL 1 TESTS SUCCESSFUL
-2019_11_29_15_28_32 : ALL 2 TESTS SUCCESSFUL
-2019_12_01_21_34_37 : ALL 1 TESTS SUCCESSFUL
-2019_12_01_21_38_48 : FAILED 1/4 TESTS: ks_justconnect_ipv6_nossl
-2019_12_01_22_25_15 : ALL 1 TESTS SUCCESSFUL
-2019_12_01_22_28_34 : ALL 4 TESTS SUCCESSFUL
-2019_12_02_11_28_25 : ALL 1 TESTS SUCCESSFUL
-2019_12_02_11_34_33 : FAILED 2/4 TESTS: ks_justconnect_ipv6_nossl testslive6
-2019_12_02_19_23_38 : ALL 1 TESTS SUCCESSFUL
-2019_12_02_20_08_53 : FAILED 3/159 TESTS: option_tests_in_var_tmp option_tests_in_var_tmp_sub ks_justconnect_ipv6
-2019_12_03_00_14_54 : ALL 1 TESTS SUCCESSFUL
-2019_12_03_00_16_15 : FAILED 2/4 TESTS: option_tests_in_var_tmp_sub ks_justconnect_ipv6
-2019_12_03_00_17_36 : ALL 1 TESTS SUCCESSFUL
-2019_12_03_00_18_06 : ALL 2 TESTS SUCCESSFUL
-2019_12_03_00_18_15 : ALL 1 TESTS SUCCESSFUL
-2019_12_03_00_18_29 : ALL 1 TESTS SUCCESSFUL
-2019_12_03_00_23_53 : FAILED 3/4 TESTS: option_tests_in_var_tmp option_tests_in_var_tmp_sub ks_justconnect_ipv6
-2019_12_06_10_45_32 : ALL 1 TESTS SUCCESSFUL
-2019_12_06_11_28_39 : FAILED 2/159 TESTS: option_tests_in_var_tmp ks_justconnect_ipv6
-2019_12_06_11_32_47 : ALL 1 TESTS SUCCESSFUL
-2019_12_06_12_19_04 : FAILED 3/158 TESTS: option_tests option_tests_in_var_tmp option_tests_in_var_tmp_sub
-2019_12_06_15_21_08 : ALL 1 TESTS SUCCESSFUL
-2019_12_06_15_22_30 : ALL 4 TESTS SUCCESSFUL
-2019_12_06_15_28_25 : ALL 1 TESTS SUCCESSFUL
-2019_12_06_15_31_58 : FAILED 1/4 TESTS: option_tests_in_var_tmp
-2019_12_11_20_06_54 : ALL 1 TESTS SUCCESSFUL
-2019_12_11_21_28_55 : ALL 1 TESTS SUCCESSFUL
-2019_12_11_22_10_46 : FAILED 1/158 TESTS: option_tests
-2019_12_12_15_15_00 : ALL 1 TESTS SUCCESSFUL
-2019_12_12_16_04_53 : FAILED 1/158 TESTS: option_tests_in_var_tmp_sub
-2019_12_12_16_35_25 : ALL 1 TESTS SUCCESSFUL
-2019_12_12_16_45_10 : ALL 1 TESTS SUCCESSFUL
-2019_12_12_17_40_39 : FAILED 1/158 TESTS: option_tests
-2019_12_12_19_55_25 : ALL 1 TESTS SUCCESSFUL
-2019_12_12_19_56_04 : ALL 2 TESTS SUCCESSFUL
-2019_12_12_19_56_27 : ALL 1 TESTS SUCCESSFUL
-2019_12_12_20_00_08 : FAILED 1/8 TESTS: option_tests
-2019_12_12_20_08_10 : ALL 1 TESTS SUCCESSFUL
-2019_12_12_20_11_59 : ALL 8 TESTS SUCCESSFUL
-2019_12_12_20_28_44 : ALL 1 TESTS SUCCESSFUL
-2019_12_12_21_24_43 : FAILED 1/158 TESTS: yahoo_all
-2019_12_12_21_29_30 : ALL 1 TESTS SUCCESSFUL
-2019_12_12_22_21_51 : FAILED 2/158 TESTS: option_tests ll_abort_cgi_context_tail
-2019_12_12_22_22_22 : ALL 1 TESTS SUCCESSFUL
-2019_12_12_23_12_40 : ALL 158 TESTS SUCCESSFUL
-2019_12_12_23_12_55 : ALL 1 TESTS SUCCESSFUL
-2019_12_13_00_04_24 : ALL 158 TESTS SUCCESSFUL
-2019_12_13_00_04_39 : ALL 1 TESTS SUCCESSFUL
-2019_12_13_00_58_38 : ALL 158 TESTS SUCCESSFUL
-2019_12_15_02_00_45 : ALL 1 TESTS SUCCESSFUL
-2019_12_15_02_01_28 : ALL 1 TESTS SUCCESSFUL
-2019_12_15_02_17_41 : ALL 1 TESTS SUCCESSFUL
-2019_12_15_02_18_28 : ALL 1 TESTS SUCCESSFUL
-2019_12_15_02_18_43 : ALL 2 TESTS SUCCESSFUL
-2019_12_15_02_18_56 : ALL 1 TESTS SUCCESSFUL
-2019_12_15_02_57_38 : ALL 158 TESTS SUCCESSFUL
-2019_12_15_23_49_50 : ALL 1 TESTS SUCCESSFUL
-2019_12_15_23_49_59 : FAILED 1/2 TESTS: ll_justlogin_dollar_char
-2019_12_15_23_56_02 : ALL 1 TESTS SUCCESSFUL
-2019_12_15_23_56_07 : ALL 2 TESTS SUCCESSFUL
-2019_12_15_23_56_41 : ALL 1 TESTS SUCCESSFUL
-2019_12_15_23_56_50 : FAILED 1/2 TESTS: ll_justlogin_dollar_char
-2019_12_15_23_57_15 : ALL 1 TESTS SUCCESSFUL
-2019_12_15_23_57_19 : ALL 2 TESTS SUCCESSFUL
-2019_12_17_22_20_49 : ALL 1 TESTS SUCCESSFUL
-2019_12_17_22_21_01 : FAILED 1/2 TESTS: ll_authmech_xoauth2_json_gmail_app
-2019_12_20_17_21_15 : ALL 1 TESTS SUCCESSFUL
-2019_12_20_17_59_52 : ALL 158 TESTS SUCCESSFUL
-2019_12_20_18_50_27 : ALL 1 TESTS SUCCESSFUL
-2019_12_20_18_55_47 : ALL 2 TESTS SUCCESSFUL
-2019_12_21_12_36_50 : ALL 1 TESTS SUCCESSFUL
-2019_12_21_12_42_18 : ALL 2 TESTS SUCCESSFUL
-2020_01_01_22_19_08 : ALL 1 TESTS SUCCESSFUL
-2020_01_01_22_59_11 : ALL 158 TESTS SUCCESSFUL
-2020_01_01_23_08_57 : ALL 1 TESTS SUCCESSFUL
-2020_01_01_23_18_28 : ALL 2 TESTS SUCCESSFUL
-2020_01_02_12_54_08 : ALL 1 TESTS SUCCESSFUL
-2020_01_02_12_58_26 : ALL 2 TESTS SUCCESSFUL
-2020_01_02_13_35_45 : ALL 1 TESTS SUCCESSFUL
-2020_01_02_13_38_50 : ALL 2 TESTS SUCCESSFUL
-2020_01_03_00_48_36 : ALL 1 TESTS SUCCESSFUL
-2020_01_03_00_53_07 : ALL 2 TESTS SUCCESSFUL
-2020_01_03_14_40_29 : ALL 1 TESTS SUCCESSFUL
-2020_01_03_14_45_00 : ALL 2 TESTS SUCCESSFUL
-2020_01_03_23_42_20 : ALL 1 TESTS SUCCESSFUL
-2020_01_04_00_20_39 : ALL 158 TESTS SUCCESSFUL
diff --git a/W/.valid.index.shtml b/W/.valid.index.shtml
deleted file mode 100644
index e69de29..0000000
diff --git a/W/CONCEPTION.txt b/W/CONCEPTION.txt
deleted file mode 100644
index a786035..0000000
--- a/W/CONCEPTION.txt
+++ /dev/null
@@ -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?
-
-
diff --git a/W/LOG_bat/learn_func.bat.txt b/W/LOG_bat/learn_func.bat.txt
deleted file mode 100644
index 73ca616..0000000
--- a/W/LOG_bat/learn_func.bat.txt
+++ /dev/null
@@ -1 +0,0 @@
-Failure running NOEXIST
diff --git a/W/LOG_bat/test_exe_tests.bat.txt b/W/LOG_bat/test_exe_tests.bat.txt
deleted file mode 100644
index a72f628..0000000
--- a/W/LOG_bat/test_exe_tests.bat.txt
+++ /dev/null
@@ -1 +0,0 @@
-Failure running .\imapsync.exe --tests
diff --git a/W/Mail-IMAPClient-3.42/Changes b/W/Mail-IMAPClient-3.42/Changes
deleted file mode 100644
index 3158e0c..0000000
--- a/W/Mail-IMAPClient-3.42/Changes
+++ /dev/null
@@ -1,2356 +0,0 @@
-
-== Revision History for Mail::IMAPClient
-Changes from 3.17_01 to ? made by Phil Pearl (Lobbes)
-Changes from 2.99_01 to 3.16 made by Mark Overmeer
-Changes from 0.09 to 2.99_01 made by David Kernen
- - Potential compatibility issues from 3.17+ highlighted with '*'
-
-version 3.42: Sun Feb 24 00:43:29 UTC 2019
- - rt.cpan.org#12859: has_capability() changes in 3.41 broke imap4rev1()
- [Gilles Lamiral and Gábor Leszlauer]
- - updated http:// to https:// URLs for referenced resources
- - updated copyright for 2019
-
-version 3.41: Thu Feb 21 01:47:42 UTC 2019
- - rt.cpan.org#128220: unseen(), messages() and related POD cleanup
- [Dan Jacobson]
- - rt.cpan.org#128264: parse_message() minor code/POD cleanup
- [Dan Jacobson]
- - rt.cpan.org#128215: verb missing in messages() POD
- [Gilles Lamiral and Dan Jacobson]
- - rt.cpan.org#127271: simplify capability handling via has_capability enhancements
- +* has_capability() success returns(true) with server response data, not always '1'
- + enhanced t/capability.t test cases
- + updated POD for capability() and has_capability()
- [Gilles Lamiral and Mark Overmeer]
- - rt.cpan.org#122373: use of IO::Socket::IP led to connect(empty args) regression
- [Gilles Lamiral]
- - rt.cpan.org#128127: fix minor POD typo for search()
- [Gregor Herrmann]
- - folders()/subscribed() remove mailboxes with \Noselect attribute
- [Ashley Willis]
- - fetch_hash() remove quotes around header names (seen w/outlook.com)
- [Ashley Willis]
- - use first over grep for minor efficiency gains
- - other minor POD cleanup
-
-version 3.40: Thu Dec 6 01:44:16 UTC 2018
- - rt.cpan.org#122373: support IPv6 by using IO::Socket::IP over IO::Socket::INET
- [Gilles Lamiral and Mark Overmeer]
- - rt.cpan.org#127103: flags() undef value as an ARRAY reference on a bogus message
- [Gilles Lamiral]
- - rt.cpan.org#124523: update examples/populate_mailbox.pl timegm usage
- [Bernhard M. W.]
- - t/capability.t: added first set of tests
- - t/quota.t: minor fix when tests skipped
-
-version 3.39: Fri Feb 3 00:43:00 UTC 2017
- - rt.cpan.org#115726: uninitialized value via fetch_hash
- [Malte Stretz]
- - rt.cpan.org#119523: better error reporting on failed TLS connections
- [Matthew Horsfall]
- - rt.cpan.org#114904: document noop()
- [Glenn Golden]
- - rt.cpan.org#97718: (redux) never retry DONE
- [Laurence Darby]
- - _imap_command() new doretry => 0|1 option to suppress/allow retry
- - updated copyright for 2017
-
-version 3.38: Tue Feb 9 02:48:21 UTC 2016
- - rt.cpan.org#107592: redact credentials via debug if !Showcredentials
- [Gilles Lamiral]
- - rt.cpan.org#110273: failure to quote password values
- (regression introduced in 3.36 via fix for rt.cpan.org#100601)
- [Gilles Lamiral]
- - rt.cpan.org#107593: allow getquota("")
- - *Quote() now returns qq("") for defined but empty values
- - rt.cpan.org#107011: fix folders_hash() docs and usage in is_parent()
- [Gilles Lamiral]
- - rt.cpan.org#106500: split UID EXPUNGE with a large sequence set
- - added t/quota.t and t/lib/MyTest.pm for testing
- - updated copyright for 2016
-
-version 3.37: Fri Aug 14 11:04:53 EDT 2015
- - regex fix in rt.cpan.org#96575 required Perl 5.10
- updated regex to be backwards compatible with Perl 5.8
- [Paul Howarth]
-
-version 3.36: Fri Aug 14 01:40:50 UTC 2015
- - rt.cpan.org#96575: parsing fixes for fetch_hash and bodystructure
- + better handling of data containing escaped characters
- [Ken Neighbors]
- - rt.cpan.org#97718: hang waiting for tag if DONE sent outside of IDLE
- [Laurence Darby]
- - rt.cpan.org#100683: failed literal commands hang waiting for '+'
- [Matthias Pitzl]
- - rt.cpan.org#100601: login() fails if username requires use of literals
- [Andy Lyttle]
- - *rt.cpan.org#103823: is_parent() should return undef on \NoInferiors
- [Gilles Lamiral]
- - rt.cpan.org#105456: fetch_hash fails if sequence number contains '*'
- + *no longer removing unrequested data (except UID) in returned hashes
- [Gilles Lamiral]
- - rt.cpan.org#91912: selectable broke in 3.29 due to \b around \NoSelect
- [Justin Vallon, Gilles Lamiral]
- - some documentation, test cleanup and new tests
-
-version 3.35: Fri, Nov 22, 2013 2:18:41 PM
- - *use Quote() over Massage() to avoid stripping double quotes from arg
- + removed constant NonFolderArg
- + may deprecate Massage() in a future release
- - _list_or_lsub failed to handle folder names with double quotes
- + cleanup Escaped_results()
- + new methods: Escaped_history() _escaped_trans_data()
- + removed method: _list_response_preprocess()
- [Gilles Lamiral, Victor Lé]
- - rt.cpan.org#90315: getacl on a folder returned as literal failed
- + _read_line could remove extra space when literal data was received
- [Carl Karcher]
- - rt.cpan.org#89040: typo fixes
- [David Steinbrunner]
-
-version 3.34: Fri, Sep 27, 2013 12:50:17 AM
- - make Makefile.PL use non-interactive and document test.txt usage
- - new attribute: Socketargs => [ (IO::Socket::.. args) ]
- + cleanup connect() to more flexible with IO::Socket::* args
- - untagged server data during send literal may cause client to hang
- [Arthur Wolfe, Josh Hillman]
- + _send_line() needs '+' only to know it is OK to send LITERAL data
- + created _response_code_sub() to simplify _get_response()
- - remove internal "Folders" cache
- - Allow for RFC 6154 "IMAP LIST Extension for Special-Use Mailboxes"
- [Mathias Reitinger]
- + new method: folders_hash()
- + deprecate: xlist_folders(), xlist()
-
-version 3.33: Tue, May 14, 2013 10:12:43 AM
- - more cleanup on use of $@ and $!
- - cleanup get_bodystructure / get_envelope
- - allow Ssl arg as an arrayref to pass args to IO::Socket::SSL
- [Ramana V Mokkapati]
- - no need to Massage() the folder name in uidnext()
- - rt.cpan.org#84028: get_envelope() fails when subject ends w/backslash
- [Andy Lyttle]
- - rt.cpan.org#79476: move()/copy() with sequence causes numeric warning
- [Oleg G]
- - *move()/copy() no longer sort message(s) provided by caller
-
-version 3.32: Fri, Aug 10, 2012 4:43:24 PM
- - document RFC2087 quota related calls
- [Mathias Reitinger] documentation request
- - rt.cpan.org#78474: idle/idle_data documentation error
- [Dima Kogan]
- - Quote()/Massage() now uses literals for non ascii data
- [Mathias Reitinger] reported issues with utf8 data in password
- - use Quote()/Massage() consistently now in:
- login() proxyauth() deleteacl() setacl() listrights() rename()
- - documented deleteacl() and other minor pod cleanup
- - ran Mail::IMAPClient::BodyStructure through perltidy
- - update year in README/pod to 2012
- - rt.cpan.org#74733: Fails with Parse::RecDescent >= 1.966_002
- rt.cpan.org#74593: Recent changes break Module::ExtractUse and ...
- [ANDK, TEAM, SREZIC, NBEBOUT at CPAN and nine from detonation]
- - Makefile.PL avoid buggy Parse::RecDescent 1.966_002 until 1.967_009
- - rt.cpan.org#76989: Mail::IMAPClient::BodyStructure usage/docs
- [Pierluigi Frullani]
- - fix incorrect documentation on new()
- - lots of doc verbiage updates
-
-version 3.31: Mon, Mar 19, 2012 11:11:11 AM
- - rt.cpan.org#74799: Support for partial data responses in fetch_hash
- [Philip Garrett]
- + bonus: cleaner handling of BODY.PEEK responses
- - properly handle ALL|FULL|FAST fetch macros in fetch_hash
-
-version 3.30: Fri Nov 11 09:37:00 EST 2011
- - rt.cpan.org#72347: Starttls array ref argument dereferenced twice
- [Jonathan Buhacoff]
- - during connect(): Port now defaults 143 or 993 if $self->Ssl
- [Kodi Arfer]
- - stop reconnect deep recursion if server disconnects on login
- [Luca Ferrario]
- - reconnect() now returns 1 on success; on error undef or 0=recursive
- - handle EBADF from syswrite in _send_bytes
- - rt.cpan.org#67263: add RFC4978 IMAP COMPRESS Extension support
- [SDIZ]
- + new method: compress()
- + new attributes: Compress Readmoremethod
- - general code cleanup:
- + new() now always returns $self or undef (never $sock any more)
- + Socket() now always return a socket or undef
- + login() now always return $self or undef
- + _read_more() will now use Readmoremethod if set
- - missing second arg '' for encode_base64 causing AUTHENTICATE
- PLAIN to fail on lines longer than 76 characters
- [Yoshiho Yoshida]
-
-version 3.29: Tue Aug 9 00:33:52 EDT 2011
- - rt.cpan.org#69876: ENVELOPE as part of fetch_hash convenience method
- [Chris Huttman]
- + added Mail::IMAPClient::BodyStructure::Envelope->parse_string($str)
- convenience method for handling ENVELOPE data from fetch_hash
- - rt.cpan.org#68310: folders() should not call exists()/STATUS
- [Gilles Lamiral]
- - affects folders() and subscribed() methods
- + use selectable() instead of exists() in call
- - consider removing extra call to folders()/subscribed()
- + ensure separator is set properly in folders()
- + selectable now properly checks for \Noselect flag
- + update folders() POD to match implementation behavior
- - rt.cpan.org#68648: [patch]: CAPABILITY after authenticate
- [Stef Simoens]
- + delete cache after State set to Authenticate
- - State() is no longer an auto-generated method
- - rt.cpan.org#68755: provided socket loses blocking in 3.19-3.28
- [Martin Schmitt]
-
-version 3.28: Fri Mar 4 00:17:38 EST 2011
- - rt.cpan.org#66004: internaldate() return undef if no internaldate in reply
- [Jason Long]
- - rt.cpan.org#66367: fetch_hash uses Escaped_results() in 3.26/3.27
- (redo) rt.cpan.org#63524: fetch_hash() parse errors
- [Mathias Reitinger]
- + fetch_hash: only Escape() data in parenthesized list
- + update fetch_hash test and add a new test
- - do not touch CRLF in Escape()/Unescape()
- - added Escape() method
- - rt.cpan.org#66287: flags results truncated due to Maxcommandlength
- [Erik Colson]
- - rt.cpan.org#65694: SASL PLAIN: bad order of login data
- [Willi Mann]
-
-version 3.27: Sun Feb 13 14:37:27 EST 2011
- - rt.cpan.org#65694: migrate fails
- [Erik Colson]
- - rt.cpan.org#65470: uninitialized warning in message_to_file
- [Gilles Lamiral, Mark Hedges]
- - rt.cpan.org#61835: (DOC) in LIST context undef may be returned
- [Stefan Völkel]
- + warn/highlight behavior in docs Errors section
- - updated documentation
- + migrate() documentation fixed
- + moved Custom Authentication Mechanisms toward end
- + recommended use of scalar context due to historical API behavior
-
-version 3.26: Mon Jan 31 22:15:04 EST 2011
- - *require Perl 5.8.1 as constant use is invalid on 5.6
- - rt.cpan.org#63524: fetch_hash() parse errors
- [Brian Kroth]
- + fixed handling of LITERAL values in response
- + fixed handling of field names with a dash (e.g. X-SAVEDATE)
- + fetch_hash now uses Escaped_results() method
- - *fixed Escaped_results() to properly join LITERAL data with
- the data that comes before and after it
- - *rt.cpan.org#60945: append_file() does not interpret $date as expected
- [Jason Long]
- $date should now be 1 (to use the file mtime) or a valid RFC3501 date
- - *rt.cpan.org#61292: memory consumption with message_string()/append()
- rt.cpan.org#61806: Major problem with one function in IMAPClient
- [Gilles Lamiral, Casey Duquette]
- + use @_ / $_[
] in critical places to avoid pass by
- value memory overhead
- + use in memory files in a few critical places as that code
- path in Mail::IMAPClient is significantly more efficient
- with internal memory usage
- + *new (undocumented/do-not-use-without-good-reason)
- attribute Maxappendstringlength used by append() and
- append_string() holds the size (in bytes, default 1 MiB)
- that triggers when message SCALAR(s) passed to these
- methods will be treated as an in memory file. This
- attribute will likely be removed in a future version.
- + *append() and append_string() now call append_file() and
- use an im memory file when length($message) is greater
- than Maxappendstringlength; other minor code cleanup
- + *message_string() now calls message_to_file() and uses an
- in memory file
- + refactor message_to_file() to use internal _imap_uid_command()
- + update _read_line() to be more efficient w/CPU in critical
- section by pulling isa() checks out of main loop also
- conserve memory by not storing an extra copy of LITERAL
- data if the data was put into a filehandle from the caller
- + Memory/working set (KB) comparison (Perl 5.10 cygwin Win7):
- - test: message_string on 6.1M msg and then append 6.1M msg
- version | start | after message_string | after append
- --------+-------+----------------------+-------------
- 2.2.9 | 7624 | 74404 | 131896
- 3.25 | 7716 | 74408 | 156532
- 3.26 | 7684 | 33372 | 42608
- - minor arg cleanup of noop() and tag_and_run()
- - rt.cpan.org#63444: relax get_envelope(), allow empty reply-to
- [Nikolay Kravchenko]
- - rt.cpan.org#61068: append_string can invalidate a good $date
- - rt.cpan.org#60045: Logout error if delay between BYE and tagged OK
- [Armin Wolfermann]
- no longer set an error when this happens
- - rt.cpan.org#61062: migrate() errors
- [Johan Ekenberg]
- + rewrote migrate() to be functional and simple
- - Update README and cleanup several old or out of date files
-
-version 3.25: Fri May 28 00:07:40 EDT 2010
- - fix body_string parsing bug and added tests in t/body_string.t
- [Heiko Schlittermann]
- - rt.cpan.org#57661: uninitialized value warning in IMAPClient::thread
- [Max Bowsher]
- - rt.cpan.org#57337: Correctly handle multiparts in BodyStructure.pm
- [Robert Norris]
- fixes in Mail::IMAPClient::BodyStructure::bodystructure for
- bugs still in release 3.24
- - rt.cpan.org#57659: install fails when using cPanel GUI
- [Ken Parisi]
- hack Makefile.PL to use alarm() and timeout prompt() gracefully
- - relax t/basic.t logout() error check (allow 'BYE' instead of 'OK')
- - left examples/idle.pl out of MANIFEST for 3.24
-
-version 3.24: Fri May 7 17:02:35 EDT 2010
- - rt.cpan.org#48912: wrong part numbers in multipart messages
- [Dmitry Bigunyak, Gabor Leszlauer]
- - fix Mail::IMAPClient::BodyStructure::bodystructure to
- properly assign parts for messages using multipart and also
- include .TEXT parts as well (still not including top level
- HEADER and TEXT though - bug?)
- - allow _load_module() to set $@ and LastError if module load fails
- - rt.cpan.org#55527: [no] disconnect during DESTROY
- [Stefan Seifert]
- - updated logout documentation to correctly state that DESTROY
- is not used to force an automatic logout on DESTROY despite
- documentation that indicated otherwise
- - update append* documentation to match current implementation
- - rt.cpan.org#55898: append_file can send too many bytes
- [Jeremy Robst]
- - avoid append_file corner cases operating on lines instead of buffers
- - use binmode on filehandle in append_file
- - add tests to t/basic.t for append_file
- - rt.cpan.org#57048: _quote_search() using $_ in loop instead of $v
- [Matthaus Kiem]
- - added examples/idle.pl program showing use of idle and idle_data
- - idle_data() should not read/block after server returns data
- [Marc Thielemann]
- - idle_data() _get_response regexp updated to not match errors
- - idle_data() now uses a timeout of 0 by default as documented
- - _get_response() now checks for defined($code) to allow $code==0
-
-version 3.23: Fri Jan 29 00:39:27 EST 2010
- - new beta idle_data() method to retrieve untagged messages during idle
- similar to method suggested by Daniel Richard G
- - added/updated documentation for idle, idle_data, and done
- - rt.cpan.org#53998: fix NTLM auth: call ntlm with challenge string
- [Dragoslav Mlakar]
- - report the return value from select/_read_more on errors
- - logout() again returns the success/failure of the LOGOUT command
- - set/return error when $response->() returns undef in authenticate()
- - new internal method _load_module() centralizing some 'require' calls
- - localize use $@ in several places to avoid stomping on global val
- - refactor code calling _read_more() to centralize error handling
-
-version 3.22: Thu Jan 21 15:25:54 EST 2010
- - rt.cpan.org#52313: Getting read errors if Fast_io is set to 1
- [Jukka Huhta]
- - updated Maxttemperrors docs related to EAGAIN handling
- - new starttls() method and Starttls attribute to support STARTTLS
- - update parse_headers to try harder to find UID in fetch response
-
-version 3.21: Tue Sep 22 19:45:13 EDT 2009
- - rt.cpan.org#49691: rewrite of fetch_hash to resolve several issues
- [Robert Norris]
- includes new tests via t/fetch_hash.t
- - rt.cpan.org#48980: (enhancement) add support for XLIST extension
- [Robert Norris]
- - rt.cpan.org#49024: NIL personal name returned by *_addresses methods
- [Dmitry Bigunyak]
- - rt.cpan.org#49401: IMAPClient expunge fails (unless folder arg used)
- [Gary Baluha]
- - update/clarify close and expunge documentation a little
-
-version 3.20: Fri Aug 21 17:40:40 EDT 2009
- - added file/tests in t/simple.t
- - added methods Rfc3501_date/Rfc3501_datetime
- used by deprecated methods Rfc2060_date/Rfc2060_datetime
- rt.cpan.org#48510: Rfc3501_date/Rfc3501_datetime methods do
- not exist [sedmonds]
- - login() hack to quote an empty password
- rt.cpan.org#48107: Cannot LOGIN with empty password [skunk]
-
-version 3.19: Fri Jun 19 14:59:15 EDT 2009
- - *search() backwards compat: caller must quote single arg properly
- rt.cpan.org#47044: $imap->search does not return [ekuemmer]
- - cleanup regexp in _send_line()
- - reduce extra newlines injected by _debug()
-
-version 3.19_02: Tue Jun 9 00:47:52 EDT 2009
- - _list_or_lsub() now calls _list_response_preprocess so
- consumers of this method no longer need to deal with how
- LITERAL data is represented in the returned data
- - update _list_or_lsub_response_parse handling of folder names
- that came back as literal data
- - update comments related to _list_response_preprocess
-version 3.19_01: Fri Jun 5 15:45:05 EDT 2009
- - make parse_headers more robust to errors/non-header data
-
-version 3.18: Wed Jun 3 23:07:12 EDT 2009
- - enhance fetch_hash to enable caller to specify list of messages
- suggestion by [Eugene Mamaev]
- - better handling of untagged BYE response
-
-version 3.18_02: Wed May 27 10:02:24 EDT 2009
- - *new attribute Ssl, when true causes IO::Socket::SSL to be
- used instead of IO::Socket::INET. This change allows
- Reconnectretry logic to work on SSL connections too.
- - have LastError cluck() if setting error to NO not connected
- - handle errors from imap4rev1() in multiple places
- - Reconnectretry/_imap_command enhancements/fixes
- + only run command if IsConnected
- + keep a temporary history of LastError(s)
- + sets LastError to NO not connected if ! IsConnected
- + retry =~ timeout|socket closed|* BYE| NO not connected
- - _imap_command_do reduce data logged when using APPEND
- - fetch() now handles messages() errors
- - thread(), has_capability(), capability() better error checking
- - authenticate() now uses _imap_command for retry mechanism
- - size() now sets LastError when no RFC822.SIZE is found
-
-version 3.18_01: Fri May 22 17:08:00 EDT 2009
- - *update several methods to use common _get_response() method
- - refactor most code handling imap responses
- - new internal method _get_response() to reduce code duplication
- - more regex cleanup $CR/$LF (not \r\n) per perlport/IMAP spec
- - major cleanup/fix of append_file for rt.cpan.org#42434
-
-version 3.17: Thu May 21 01:40:08 EDT 2009
- - ran all test code and lib/Mail/IMAPClient.pm through Perl::Tidy
- - plan on using perltidy to standardize format going forward
- - added 13 tests to t/basic.t to cover more methods
- - fix some broken tests
- - update Makefile.PL to provide info about optional modules
-
-version 3.17_05: Tue May 19 11:04:28 EDT 2009
- - *reset LastError for every call to _imap_command_do()
- - *run() - use _imap_command_do(), return arrayref in scalar context
- - *tag_and_run() - return arrayref in scalar context
- - *done() - use _imap_command_do(), return arrayref in scalar context
- - *search() now returns empty arrayref not undef if no matches found
- - _imap_command_do() made more flexible to avoid code duplication
- - _list_response_parse renamed _list_or_lsub_response_parse
- - updated POD with new/updated behavior
- - append_string() now uses _imap_command_do() for Reconnectretry
- - internally use defined return values instead of only LastError()
- - run() updated to use same/similar code to _imap_command_do()
- - make several return statements more consistent
- - delete() now unsets current Folder attribute on success
-
-version 3.17_04: Fri May 15 17:18:52 EDT 2009
- - updated POD with new reconnect() method and Reconnectretry attr
- - *new _imap_command() after renaming old one to _imap_command_do
- support retrying commands X times EPIPE/ECONNRESET errors
- - *new Reconnectretry attribute to control number of retry
- attempts (default is 0 - no reconnect/retry)
- - *added reconnect() method to support Reconnectretry attr
- reconnect and updated _imap_command() method
- - *_imap_command_do will return undef if command given has no TAG
- - fixed message_string() logic/errors for failed size() calls
- - local-ize $! anywhere we use Carp routines as older versions
- of Carp could cause $! to be reset
- - several 'BUG?' comments -- raising red flag for future work
- - minor cleanup of sort() logic
- - reduce duplicate code, hopefully improved error handling:
- new _list_or_lsub() for list() and lsub()
- new _folders_or_subscribed() for folders() and subscribed()
- + new _list_response_preprocess() keeping old code/logic in
- for now, but may remove in the future (for buggy servers?)
- - some updates for migrate() but this method needs much work
- - body_string() now handles fetch() errors
- - tag_and_run now handles _imap_command() errors
- - changed non-timeout CORE::select() timeout from 0.001 to 0.025
- - minor cleanup of _read_line() error handling/debug output
- - get_bodystructure() handle more fetch() errors
- - expunge() handle select() errors
- - restore_message() handle store() errors
- - uidvalidity() handle status() errors
- - uidnext() handle status() errors
- - is_parent() use _list_response_preprocess() for parsing
- - move() send delete_message() errors to stderr
- - simplify size() method
-
-version 3.17_03: Fri May 8 16:37:08 EDT 2009
- - *added uidexpunge() for UID EXPUNGE UIDPLUS support
- - *search() now DWIM: auto-escapes args, SCALAR refs not escaped
- rt.cpan.org#44936 [cjhenck]
- - _quote_search() provides auto-escape capability for search()
- - many POD updates as well as some major reformatting (incomplete)
- - login now fails if passwd and user are not defined
- - _sysread(): $self was in args to 'Readmethod' twice
- - authenticate() return undef on scheme eq "" or LOGIN
- - "require" instead "use" Digest::HMAC_MD5 for CRAM-MD5 support
-
-version 3.17_02: Fri May 1 16:44:21 EDT 2009
- - cleanup of use/imported data
- - use Socket $CRLF in many cases not \r\n per perlport/IMAP spec
- - *new Keepalive attribute used via new()/Socket() enables SO_KEEPALIVE
- - LastError now uses Carp::confess for stack trace if Debug is true
- - Maxcommandlength now defaults to 1000 per RFC2683 section 3.2.1.5
- - added noop() to support IMAP NOOP
- - _imap_command now sets LastError if a OK/$good response is not seen
- - fixed fetch_hash() to return FLAGS as "" not () when no FLAGS set
-
-version 3.17_01: Fri Apr 24 18:36:45 EDT 2009
- - *new attribute Maxcommandlength used by fetch() to limit
- length of commands sent to a server. This should removes
- need for utilities like imapsync to create their own split()
- functions and instead allows Mail::IMAPClient to hopefully
- "do the right thing"
- - remove extra 'use' calls for Carp and Data::Dumper
- - _read_more() improperly initialized vector causing select
- errors, thus timeouts were not working properly (now they
- work...)
- - *change default timeout 30s => 600s: 30s seems too short in
- practice
- - *explicit import of encode_base64 and decode_base64 from
- MIME::Base64 note the code forces a disconnect from the
- server on timeout as we can not easily recover from this
- situation right now in the code
- - *numerous changes of error messages, removing superfluous
- text and now relying on LastError instead of $! or $@ when
- appropriate
- - separator():
- + now return undef if an error occured for NAMESPACE or LIST calls
- + *no longer defaults to '/' if NAMESPACE call does not succeed
- - new internal _list_response_parse() method for parsing LIST
- responses
- - handle ECONNRESET errors on syswrite and mark connection as
- Unconnected
- + error "Connection lost" changed to "Write failed"
- - previously untrapped syswrite error now generate "Write
- failed" errors
- - fix in _imap_command where LastError would be erroneously
- set on LOGOUT
- - _record() no longer tries to infer errors based on data
- being "recorded"
- - _send_line()
- + cleanup in watching for: +|NO|BAD|BYE
- + now sets LastError when an unexpected response is seen
- - _read_line()
- + handle select errors instead of ignoring them
- + forcefully _disconnect() on timeouts as this breaks app logic
- + reduced duplication of code on error handling
- - added _disconnect() method to brute force drop connections
- on timeout
- - added _list_response_parse() to reduce duplicate code for
- LIST parsing
- - added _split_sequence() to support new Maxcommandlength argument
- - fetch()
- + use new Maxcommandlength to split a request into multiple
- subrequests then aggregate results before passing them
- back to the caller
- - fetch_hash(): added checks for failed IMAP commands
- - parse_headers()
- + properly check if fetch fails
- + handle cases where $header and/or $field are not defined
- - size():
- + return undef if LastError is set
- + fix case where SIZE is not found and return undef as expected
-
-version 3.16: Mon Apr 6 12:03:41 CEST 2009
-
- Fixes:
-
- - set LastError when the imap_command receives an unexpected 'BYE' answer.
- rt.cpan.org#44762 [Phil Lobbes]
-
- - handle SIGPIPE cleanly.
- rt.cpan.org#43414 [Phil Lobbes]
-
- - improve handling of quotes in folder names
- rt.cpan.org#43445 [Phil Lobbes]
-
- - do not use $socket->eof(), because IO::Socket::SSL does not support it.
- rt.cpan.org#43415 [Phil Lobbes]
-
- - remove excessive reconfiguration of fastio in _read_line()
- rt.cpan.org#43413 [Phil Lobbes]
-
- Improvements:
-
- - remove experied docs about automatically created calls, which
- do not exist since 3.00
-
- - remove verbose explanation about reporting bugs.
-
-version 3.15: Fri Mar 20 13:20:39 CET 2009
-
- Fixes:
-
- - manual-page was using POD syntax incorrectly, which caused many
- broken links on search.cpan.org
- rt.cpan.org #44212 [R Hubbell]
-
-version 3.14: Mon Feb 16 14:18:09 CET 2009
-
- Fixes:
-
- - isparent() when list() returns nothing.
- rt.cpan.org#42932 [Phil Lobbes]
-
- - Quote more characters in Massage(): add CTL, [, ], % and *
- rt.cpan.org#42932 [Phil Lobbes]
-
- - message_string() will only complain about a difference between
- reported message size and actually received size; it will not
- try to correct it anymore.
- rt.cpan.org#42987 [Phil Lobbes]
-
- - No error when empty text in append_string()
- rt.cpan.org#42987 [Phil Lobbes]
-
- - login() should not try authenticate() if auth is empty or undef
- rt.cpan.org#43277 [Phil Lobbes]
-
-version 3.13: Thu Jan 15 10:29:04 CET 2009
-
- Fixes:
-
- - "othermessage" in bodystructure parser should expect an MD5,
- not bodyparams. Fix and test(!) by [Michael Stok]
-
- Improvement:
-
- - minor simplifications in code of run() and _imap_command()
-
- - get_bodystructure trace message fix [Michael Stok]
-
- - add Domain option for NTLM authentication.
-
-version 3.12: Mon Nov 24 15:34:58 CET 2008
-
- Improvement:
-
- - major performance improvement in append_message(), avoiding
- reading the whole file in memory as the docs promised but the
- code didn't do. [David Podolsky]
-
-version 3.11: Wed Oct 8 10:57:31 CEST 2008
-
- Fixes:
-
- - some SSL connections process more bytes then needed, which
- made the select() timeout. Nice fix by [David Sansome]
- rt.cpan.org#39776
-
- Improvements:
-
- - improved example imap_to_mbox by [Ralph Sobek]
-
-version 3.10: Sun Aug 24 21:26:27 CEST 2008
-
- Fixes:
-
- - INET socket scope error, introduced by 3.09
- rt.cpan.org#38689 [Matt Moen]
-
-version 3.09: Fri Aug 22 16:38:25 CEST 2008
-
- Fixes:
-
- - return status of append_message reversed.
- rt.cpan.org#36726 [Jakob Hirsch]
-
- - no line-breaks in base64 encoded strings when logging-in
- rt.cpan.org#36879 [David Jonas]
-
- - fix MD5 authentication.
- rt.cpan.org#38654 [Thomas Jarosch]
-
- Improvements:
-
- - extensions and clean-ups in examples/imap_to_mbox.pl by
- [Ralph Sobek]
-
- - an absolute path as Server setting will open a local ::UNIX
- socket, not an ::INET
- rt.cpan.org#38655 [Thomas Jarosch]
-
-version 3.08: Tue Jun 3 09:36:24 CEST 2008
-
- Fixes:
-
- - message_to_file used wrong command.
- rt.cpan.org#36184 [Parse Int]
-
- - oops, distribution released with OODoc/oodist, not make dist.
- [Randy Harmon]
-
- - fix parsing of body-structure information for multi-parts.
- rt.cpan.org#36279 [Doug Claar]
-
- Improvements:
-
- - Updated README and TODO (Was 'Todo')
-
-version 3.07: Mon Apr 28 09:17:30 CEST 2008
-
- Fixes:
-
- - expunge with no folder specified produced "use of undef"
- error. Fixed by [André Warnier]
-
- - additional arguments for create [Michael Bacon]
-
- - accepts LIST answer with multiple lines [Michael Bacon]
-
- - ::BodyStructure::_address() should be _addresses()
- Fixed by rt.cpan.org#35471 [Brian Kelly]
-
-version 3.06: Mon Apr 14 23:44:03 CEST 2008
-
- Fixes:
-
- - expunge without argument must use selected folder. [John W]
-
- - expunge with folder does not select it. [John W]
-
- - the documentation still spoke about "autogenerated methods",
- but they were removed with 2.99 [John W]
-
- - append_string needs LF -> CRLF translations, for some
- servers. rt.cpan.org #35031 [Jonathan Kamens]
-
- Improvements:
-
- - added ::setquota(), thanks to [Jappe Reuling]
-
-version 3.05: Wed Feb 20 08:59:37 CET 2008
-
- Fixes:
-
- - match ENVELOPE and BODYSTRUCTURE more strict in the
- grammar, to avoid confusion. [Zach Levow]
-
- - get_envelope and get_bodystructure failed for servers which
- did not return the whole answer in one piece. [Zach Levow]
-
- - do not produce parser errors when get_envelope does not
- return an envelope. [Zach Levow]
-
- - PLAIN login response possibly solely a '+' [Zach] and [Nick]
-
-version 3.04: Fri Jan 25 09:25:51 CET 2008
-
- Fixes:
-
- - read_header fix for UID on Windows Server 2003.
- rt.cpan.org#32398 [Michiel Stelman]
-
- Improvements:
-
- - doc update on authentication, by [Thomas Jarosch]
-
-version 3.03: Wed Jan 9 22:11:36 CET 2008
-
- Fixes:
-
- - LIST (f.i. used by folders()) did not return anything when the
- passed argument had a trailing separator. [Gunther Heintze]
-
- - Rfc2060_datetime() must include a zone.
- rt.cpan.org#31971 [David Golden]
-
- - folders() uses LIST, and then calls a STATUS on each of the
- names found. This is superfluous, and will cause problems when
- the STATUS fails... for instance because of ACL limitations
- on the sub-folder.
- rt.cpan.org#31962 [Thomas Jarosch]
-
- - fixed a zillion of problems in the BodyStructure parser. The
- original author did not understand parsing, nor Perl.
-
- - part numbering wrong when nested messages contained multiparts
-
- Improvements:
-
- - implementation of DIGEST-MD5 authentication [Thomas Jarosch]
-
- - removed call for status() in Massage(), which hopefully speeds-up
- things without destroying anything. It removed a possible deep
- recursion, which no-one reported (so should be ok to remove it)
-
- - simplified folders() algorithm.
-
- - merged folder commands, like subscribe into one.
-
- - added unsubscribe()
- rt.cpan.org#31268 [G Miller]
-
- - lazy-load Digest::HMAC_MD5
-
-version 3.02: Wed Dec 5 21:33:17 CET 2007
-
- Fixes:
-
- - Another attempt to get get FETCH UID right. Patch by [David Golden]
-
-version 3.01: Wed Dec 5 09:55:43 CET 2007
-
- Changes:
-
- - removed version number from ::BodyStructure
-
- Fixes:
-
- - quote password at login.
- rt.cpan.org#31035 [Andy Harriston]
-
- - empty return of flags command should be empty list, not undef.
- rt.cpan.org#31195 [David Golden]
-
- - UID command does not work with folder management commands
- rt.cpan.org#31182 [Robbert Norris]
-
- - _read_line simplifications avoids timeouts.
- rt.cpan.org#31221 [Robbert Norris]
-
- - FETCH did not detect the UID of a message anymore.
- [David Golden]
-
- Improvements:
-
- - proxyauth for SUN/iPlanet/NetScape IMAP servers.
- patch by rt.cpan.org#31152 [Robbert Norris]
-
- - use grep in stead of map in one occasion in MessageSet.pm
- [Yves Orton]
-
-version 3.00: Wed Nov 28 09:56:54 CET 2007
-
- Fixes:
-
- - "${peek}[]" should be "$peek\[]" for perl 5.6.1
- rt.cpan.org#30900 [Gerald Richter]
-
-version 2.99_07: Wed Nov 14 09:54:46 CET 2007
-
- Fixes:
-
- - forgot to update the translate grammar.
-
-version 2.99_06: Mon Nov 12 23:21:58 CET 2007
-
- Fixes:
-
- - body structure can have any number of optional parameters.
- Patch by [Gerald Richter].
-
- - get_bodystructure did not take the output correctly [Gerald Richter]
-
- - parser of body-structure did not handle optional body parameters
- Patch by [Gerald Richter], rt.cpan.org#4479 [Geoffrey D. Bennet]
-
-version 2.99_05: Mon Nov 12 00:17:42 CET 2007
-
- Fixes:
-
- - pod error in MessageSet.pm
-
- - folders() without argument failed. [Gerald Richter]
-
- Improvements:
-
- - better use of format syntax in date formatting.
-
- - Rfc2060_datetime also contains the time.
-
- - append_file() now has options to pass flags and time of file
- in one go. [Thomas Jarosch]
-
-version 2.99_04: Sat Nov 10 20:55:18 CET 2007
-
- Changes:
-
- - Simplified initiation of IMAP object with own Socket with a new
- option: RawSocket [Flavio Poletti]
-
- Fixes:
-
- - fixed read_line [Flavio Poletti]
-
- - fixed test-run in t/basic.t [Flavio Poletti]
-
-version 2.99_03: Thu Nov 1 12:36:44 CET 2007
-
- Fixes:
-
- - Remove note about optional Parse::RecDescent by Makefile.PL;
- it is not optional anymore
-
- Improvements:
-
- - When syswrite() returns 0, that might be caused by an error
- as well. Take the timeout/maxtemperrors track.
- rt.cpan.org#4701 [C Meyer]
-
- - add NTLM support for logging-in, cleanly intergrated. Requires
- the user to install Authen::NTLM.
-
-version 2.99_02: Fri Oct 26 11:47:35 CEST 2007
-
- The whole Mail::IMAPClient was rewritten, hopefully without
- breaking the interface. Nearly no line was untouched.
-
- The following things happened:
- - use warnings, use strict everywhere
- - removed many lines which were commented out, over the years
- - $self->_debug if $self->Debug checked debug flag twice
- - $self->LogError calls where quite inconsequent wrt $@ and carp
- - consequent layout, changed sporadic tabs in blanks
- - consequent calling convensions
- - \0x0d\0x0a is always \r\n
- - zillions of minor syntactical improvements
- - a few major algorithmic rewrites to simplify the code, still
- many oppotunities for improvements.
- - expanded "smart" accessor methods, search abbreviations,
- and autoloaded methods into separate subs. In total much
- shorter, and certainly better understandable!
- - fixed many potential bugs.
- - labeled some weird things with #????
- Over 1000 lines (30%!) and 25kB smaller in size
- Needs to be tested!!!! Volunteers?
-
- Fixes:
-
- - Exchange 2007 only works with new parameter: IgnoreSizeErrors
- rt.cpan.org#28933 [Dregan], #5297 [Kevin P. Fleming]
-
- - Passed socket did not get selected.
- debian bug #401144, rt.cpan.org# [Alexander Zanger],
- #8480 [Karl Gaissmaier], #8481 [Karl Gaissmaier],
- #7298 [Herbert Engelmann]
- http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=401144
-
- - Seperator not correctly extracted from list command.
- rt.cpan.org#9236 [Eugene Koontz], #4662 [Rasjid]
-
- - migrate() Massage'd foldername twice
- rt.cpan.org#20703 [Peter J. Holzer]
-
- - migrate() could loop because error in regexp.
- rt.cpan.org#20703 [Peter J. Holzer]
-
- - migrate() append_string result not tested.
- rt.cpan.org#8577 [guest]
-
- - Failing fetch() returned undef, not empty list.
- rt.cpan.org#18361 [Robert Terzi]
-
- - Fix "use of uninitialised" warning when expunge is called
- rt.cpan.org#15002 [Matt Jackson]
-
- - Fix count subfolders in is_parent, regexp did not take care
- of regex special characters in foldername and seperator.
- rt.cpan.org#12883 [Mike Porter]
-
- - In fetch_hash(), the capturing of UID was too complicated
- (and simply wrong)
- rt.cpan.org#9341 [Gilles Lamiral]
-
- - overload in MessageSet treated the 3rd arg (reverse) as
- message-set.
-
- - do not send the password on a different line as the username
- in LOGIN. Suggested by many people, amongst them
- rt.cpan.org#4449 [Lars Uffmann]
-
- - select() with $timeout==0 (no timeout) returns immediately.
- Should be 'undef' as 4th select parameter.
- rt.cpan.org#5962 [Colin Robertson] and [Jules Agee]
-
- - examine() remembers Massage()d folder name, not the unescaped
- version. rt.cpan.org#7859 [guest]
-
- Improvements:
-
- - PREAUTH support by rt.cpan.org#17693 [Danny Siu]
-
- - Option "SupportedFlags", useful when the source supports
- different flags than the peer in migrate().
- Requested by rt.cpan.org#12961 [Don Christensen]
-
- - Fast_io did not clear $@ on unimportant errors.
- rt.cpan.org#9835 [guest] and #11220 [Brian Helterline]
-
- - Digest::HMAC_MD5 and MIME::Base64 are now prerequisits.
- rt.cpan.org#6391 [David Greaves]
-
- - PLAIN (SASL) authentication added, option Proxy
- rt.cpan.org#5706 [Carl Provencher]
-
- - removed Bodystructure.grammar and IMAPClient.cleanup from dist.
-
- - reworked Bodystructure and MessageSet as well.
-
- - EnableServerResponseInLiteral now autodetect (hence ignored)
-
-version 2.99_01:
-
- After 4 years of silence, Mark Overmeer took maintenance. David
- Kernen could not be reached. Please let him contact the new
- maintainer.
-
- A considerable clean-up took place, fixing bug and adapting the
- distribution to current best practices.
-
- - use "prompt" in Makefile.PL, to please CPAN-testers
-
- - removed old Parse::RecDescent grammars
-
- - include Artistic and Copying (GPL) into COPYRIGHT file
-
- - remove INSTALL_perl5.80
-
- - removed all the seperate Makefile.PLs and test directories
-
- - removed the hard-copy of all involved RFCs: there are better
- sources for those.
-
- - converted tests to use "Test::More"
-
- - Authmechanism eq 'LOGIN' understood.
-
- - test for CRAM-MD5 removed, because conflicts with test params
- from Makefile.PL
-
- - test for fast-io removed, it is Perl core functionality
-
- - require IO::Socket::INET 1.26 to avoid Port number work-around.
-
- - Parse::RecDescent is required, and the grammars are pre-parsed
- in the distribution. This makes the whole installation process
- a lot easier.
-
- - Update Todo, and many other texts.
-
- - added pod tester in t/pod.t
-
- - cleaned-up the rt.cpan.org bug-list from spam. The next
- release will contain fixes for the real reports.
-
-Changes in version 2.2.9
-------------------------
-Fixed problem in migrate that caused problems in versions of perl earlier
-than 5.6. Thanks go to Steven Roberts for reporting the problem and
-identifying its cause.
-
-Fixed problem in the make process that caused tests for BodyStructure
-subclass to fail if the grammer had been compiled under a different
-version of Parse::RecDescent. This problem was detected by the dedicated
-people at testers@cpan.org.
-
-Fixed a compatibility problem using Parse::RecDescent version 1.94.
-This caused BodyStructure and Thread to fail for 5.8.x users. A number of
-people reported this bug to CPAN but it took me a while to realize what
-was going on. Really it took me a while to realize my Parse::RecDescent
-was out of date. ;-) Now this module is delivered with two versions of
-each of the affected grammars and Makefile.PL determines which version
-to use. Upgrading to Parse::RecDescent 1.94 will require you to re-run
-Makefile.PL and reinstall Mail::IMAPClient.
-
-Changes in version 2.2.8
-------------------------
-Change the login method so that it always send password as a literal
-to get around problem 2544 reported by Phil Tracy which caused
-passwords containing asterisks to fail on some systems (but not any of
-mine...). Good catch, Phil.
-
-Added a new example that demonstrates the use of imtest (a utility
-that comes with Cyrus IMAP) and Mail::IMAPClient together. The
-example uses imtest to do secure authentication and then "passes" the
-connection over to Mail::IMAPClient (but imtest is still brokering
-the encryption/decryption). This example comes from an idea of
-Tara L. Andrews', whose brainstorm it was to use imtest to broker
-secure connections. (But I still want to get encryption working with
-Mail::IMAPClient some day!)
-
-Fixed an error in which a "+" was used as a conncatenation error instead
-of a ".". Thanks to Andrew Bramble for reporting this, even though he
-mistakenly identified it as a "typo". It is not a typo; a plus sign is the
-correct concatenation operator, as any decent Java book will tell you ;-)
-
-Fixed an error in the login method when the password contains a special
-character (such as an asterisk.) Thanks to Phil Tracey for reporting
-this bug.
-
-Fixed some bugs in _send_line (the "O" side of the I/O engine) that were
-reported by Danny Smith.
-
-Fixed a bug in the migrate method in the optimization code (which
-gets called when socket writes are delayed due to a slow or busy target
-host, aka EAGAIN errors). Thanks to Pedro Carvalho for identifying
-this bug and its cause.
-
-Fixed a bug in migrate that caused migration of unread messages to fail.
-This was due to the way Mail::IMAPClient's migrate method would try to send
-an empty list of flags to the target server in the APPEND. Thanks to
-Stephen Fralich at Syracuse University and for reporting this bug.
-
-Fixed another bug in the migrate method that caused flags to get lost. Thanks
-go to Jean-Michel Besnard for reporting this.
-
-Fixed a bug in migrate that caused
-Fixed a bug in get_envelope that caused it to fail under certain conditions.
-Thanks go to Bob Brown for reporting this bug.
-
-
-Changes in version 2.2.7
-------------------------
-
-Added some new parameters to support alternate authentication mechanisms:
-
- Prewritemethod
- Readmethod
-
-Mail::IMAPClient has supported cram-md5 authentication "out of the box"
-as of 2.2.6 (courtesy of Ville Skyttä). I also have digest-md5 working
-in my lab with quality of protection levels "auth" and "integrity", but
-not "confidentiality". I'm hoping to get the confidentiality part working
-soon but so far have only managed to authenticate, send an encrypted command,
-and receive and decrypt the response. This may sound like enough but I can't
-seem to send a second command or receive a second response;-( In any event
-2.2.8 will support at least qop=auth and qop=auth-int but maybe not
-qop=auth-conf.
-
-Fixed a bug reported by Adrian that caused get_bodystructure to
-fail if the server returned a bodystructure with an embedded
-literal. Also fixed the same bug in get_envelope, so I guess now
-everyone knows that get_envelope was just a tinkered-with copy of
-get_bodystructure...
-
-Fixed two related bugs in Parser.pm that caused
-get_bodystructure and get_envelope to fail if the
-UID nnnnn part of a fetch response follows all the
-other stuff. Thanks to Raphaël Langella for reporting this bug.
-
-Enhanced several methods to use MessageSets when the
-Ranges parameter is true. There are still more methods that
-need to be retrofitted to take advantage of the Range method
-(and its underlying MessageSet object). In the meantime, if you
-need to get the functionality of the shorter message ranges provided
-by the Range method from a method that does not honor the Ranges
-parameter, then you should a) create a message set by passing the
-messages to the Range method and then pass the scalar as a string
-to the method you want to use. For example, if you want to move
-a whole lot of messages to Trash, do something like this:
->
->my $range = $imap->Range(scalar($imap->search("SentBefore", "01-Jan-2000")));
->$imap->move("Trash","$range");
->
-This will cause the range object to stringify out to what looks like
-a non-reference scalar before the move method gets the argument. If you
-omit the quotes around "$range" then this won't work.
-
-Fixed a bug in the list method that caused LIST "" "" to fail miserably.
-Thanks to John W Sopko Jr. for reporting this bug.
-
-Fixed a bug in the test suite that caused the cram-md5 tests to fail
-if you are not running the extended tests. (Introduced in 2.2.6)
-
-Fixed a bug that affected users on platforms that do not support
-fcntl (i.e. NT). Thanks to Raphaël Langella for reporting this bug.
-
-Changes in version 2.2.6
-------------------------
-
-Fixed a bug in the migrate method that caused the internaldate
-of migrated messages to sometimes be wrong. Credit goes to Jen Wu
-for identifying both bug and fix.
-
-Added a new method, "get_header", to provide a short-cut for a common
-use of parse_headers. Added two other methods, "subject" and "date",
-to provide shortcuts to get_header.
-
-Changed the Mail::IMAPClient::MessageSet module to override array
-dereferencing. (See below.)
-
-Changed fetch and search methods to use the Range method (and thus the
-Mail::IMAPClient::MessageSet module) for messages. The fetch method will
-use MessageSet objects all the time, but the search method will only
-return MessageSet objects if you specify "Ranges => 1" (with Ranges being
-a new parameter). The default will be "Ranges => 0" (which preserves
-the old behavior) but this default will go away in some future release.
-There should be no need to override the fetch method's new behavior, since
-it will be transparent to you unless you tend to fetch a lot of messages
-at once, in which case your fetches may be faster and perhaps less likely
-to fail due to the request exceeding your server's line limit. If you set
-the Ranges parameter to true, then you still should not see a difference,
-because a) when fetch is called in a list context then you will not get
-a MessageSet object, you'll get the same list as always, and b) the
-MessageSet objects now override array de-referencing operations, so if you
-treat the returned MessageSet object as if it were an array then the object
-will humour you and act like a reference to an array of messages sequence
-numbers or message uids.
-
-Also changed the flags method to use the Range method. This should also
-be transparent since the methods arguments and return values do not change.
-
-Added built-in support for CRAM-MD5 authentication. This authentication
-method will in this release be used only when requested. In future releases
-the default authentication will probably be the strongest authentication
-supported "out of the box" that is available on your server. Since CRAM-MD5
-is the only authentication other than plain text that is currently supported
-"out of the box", it will be the default authentication mechanism for any
-server that supports it. See the pod for the Authmechanism and Authcallback
-parameters (which were also added in this release) and the doc for the
-authenticate method (which has been around a while). Many thanks to Ville Skyttä
-for providing the code that makes up the heart of this new support, as well
-as to Gisle Aas for the Digest::HMAC_MD5 and MIME::Base64.
-
-Made minor tweaks to the documentation. Again. (Will it ever be 100% right?)
-
-Changes in version 2.2.5
-------------------------
-Added the Range method to convert a bunch of message UID's or sequence numbers
-into compact ranges. Also added a supporting class for the returned range
-objects with overloaded operators that support stringifying, adding to, and
-deleting from a range object's message set (Mail::IMAPClient::MessageSet).
-I also wrote documentation for same, so check it out. In future releases,
-I will probably enhance the base module to use MessageSet objects when
-feasible (i.e. whenever I know that the argument in question should in fact
-be a message specification). But I'll let you find all the bugs in the
-MessageSet module first ;-) Thanks goes to Stefan Schmidt, who is the first
-to report using a server that restricted the size of a client request to
-something smaller than what Mail::IMAPClient was generating for him.
-(Originally the Range method was just supposed condense a message set into
-the shortest possible RFC2060-compliant string, but then I got all happy and
-started adding features. You know how it is...)
-
-
-Changes in version 2.2.4
--------------------------
-Fixed a bug in the done method (new in 2.2.3).
-
-Added tests for idle and done. (That's how I found the bug in the done method, above.)
-
-Fixed minor bugs in test suite. (The test suite worked but wasn't always using the options
-I wanted tested. )
-
-
-Changes in version 2.2.3
--------------------------
-
-NOTE: This version was distributed to beta testers only.
-
-Fixed the "Changes in version 2.2.2" section so that it correctly specifies
-version 2.2.2 (instead of being yet another 2.2.1 section).
-
-Fixed a bug in the migrate method that affected folders with spaces in their
-names.
-
-Fixed a bug in the Massage method that affected folders with braces ({}) in
-their names.
-
-Added a new class method, "Quote", that will quote your arguments for you. (So you
-no longer have to worry so much about quoting your quotes.
-
-Added optimizations to the migrate method and to the core I/O engine inspired
-by Jules Agee. (Actually they were not so much inspired by him as they were
-lifted right out of a patch he had out on sourceForge.net. I had to refit them
-for this version, and reformat his comments so they could fit in my window. Thanks
-Jules, wherever you are.)
-
-Added the fetch_hash method, which will fetch an entire folder's contents into a
-hash indexed by message UID (or message sequence number if that's all you've got).
-
-Added a new example to the examples subdirectory, and corrected some minor bugs
-in existing examples.
-
-Added the idle and done methods, which together implement the IMAP IDLE extension
-(RFC2177), at John Rudd's suggestion.
-
-Changes in version 2.2.2
-------------------------
-Fixed a bug in Massage method (generally only used by other IMAPClient methods)
-that broke folder names with parens.
-
-Updated bug reporting procedures. Also added a section in the documentation
-for REPORTING THINGS THAT ARE NOT BUGS. Bug tracking is now done via
-rt.cpan.org, which I stumbled upon quite by accident and with which I am
-really pleased. A lot of credit goes to _somebody_ for putting this
-out on CPAN. Unfortunately as of this writing I don't whom.
-
-Fixed a bug in the documentation regarding the logoff method, which is never
-implicitly invoked anymore; I gave up on that because the DESTROY method would
-sometimes be called after the Socket handle was already destroyed. (This is
-especially likely at program exit, when everything still in scope goes out of
-scope at the same time.) You should always log off explicitly if you want to
-be a well behaviod IMAP client.
-
-Changes in version 2.2.1
-------------------------
-Updated append_string to wrap the date argument in double quotes if the argument was
-provided without quotes. Thanks to Grant Waldram for pointing out that some IMAP
-servers require this behavior.
-
-Added a new method, selectable, which returns a true value if a folder is selectable.
-
-Documented in this Changes file a change that was actually made for 2.2.0, in which
-newlines are chomped off of $@ (but not LastError).
-
-Added pointers in the documentation to point to Mark Bush's Authen::NTLM module. This
-module will allow you to use NTML authentication with Mail::IMAPClient connections.
-Also changed the authenticate method so that it will work with Authen::NTML without
-the update mentioned in NTLM::Authen's README.
-
-Added a second example on using the new migrate method,
-migrate_mail2.pl. This example demonstrates more advanced techniques
-then the first, such as using the separator method to massage folder
-names and stuff like that.
-
-Added support for the IMAP THREAD extension. Added
-Mail::IMAPClient::Thread.pm to support this. (This pm file is generated
-during make from Thread/Thread.grammar.) This new function should be
-considered experimental. Note also that this extension has nothing to do
-with threaded perl or anything like that. This is still on the TODO list.
-
-Updated the search, sort, and thread methods to set $@ to "" before
-attempting their respective operations so that text in $@ won't be left
-over from some other error and therefore always indicative of an error
-in search, sort, or thread, respectively.
-
-Made many many tweaks to the documentation, including adding more examples
-(albeit simple ones) and fixing some errors.
-
-Changes in version 2.2.0
-------------------------
-Fixed some tests so that they are less likely to give false negatives. For
-example, test 41 would fail if the test account happened to have an
-empty inbox.
-
-Made improvements to Mail::IMAPClient::BodyStructure and renamed
-Mail::IMAPClient::Parse to Mail::IMAPClient::BodyStructure::Parse. (This
-should be transparent to apps since the ...Parse helper module is
-used by BodyStructure.pm only.) I also resumed my earlier practice of
-using ...Parse.pm from within BodyStructure.pm to avoid the overhead of
-compiling the grammar every time you use BodyStructure.pm. (Parse.pm is
-just the output from saving the compiled Parse::RecDescent grammar.) In a
-related change, I've moved the grammar into its own file (Parse.grammar)
-and taught Makefile.PL how to write a Makefile that converts the .grammar
-file into a .pm file. This work includes a number of fixes to how a body
-structure gets parsed and the parts list returned by the parts method,
-among other things. I was able to successfully parse every bodystructure
-I could get my hands on, and that's a lot.
-
-Also added a bunch of new methods to Mail::IMAPClient::BodyStructure
-and its child classes. The child classes don't even have files of their
-own yet; they still live with their parent class! Notable amoung these
-changes is support for the FETCH ENVELOPE IMAP command (which was easy
-to build in once the BODYSTRUCTURE stuff was working) and some helper
-modules to get at the envelope info (as well as envelope information
-for MESSAGE/RFC822 attachments from the BODYSTRUCTURE output). Have a
-look at the documentation for Mail::IMAPClient::BodyStructure for more
-information.
-
-Fixed a bug in the folders method regarding quotes and folders with
-spaces in the names. The bug must have been around for a while but
-rarely manifested itself because of the way methods that take folder
-name arguments always try to get the quoting right anyway but it was
-still there. Noticing it was the hard part (none of you guys reported
-it to me!).
-
-Fixed a bug reported by Jeremy Hinton regarding how the search method
-handles dates. It was screwing it all up but it should be much better now.
-
-Added the get_envelope method which is like the get_bodystructure method
-except for in ways in which it's different.
-
-Added the messages method (a suggestion from Danny Carroll), which is
-functionally equivalent to $imap->search("ALL") but easier to type.
-
-Added new arguments to the bodypart_string method so that you can get
-just a part of a part (or a part of a subpart for that matter...) I did
-this so I could verify BodyStructure's parts method by fetching the first
-few bytes of a part (just to prove that the part has a valid part number).
-
-Added new tests to test the migrate function and to do more thorough
-testing of the BodyStructure stuff. Also added a test to make sure that
-searches that come up empty handed return an undef instead of an empty
-array (reference), regardless of context. Which reminds me...
-
-Fixed a bug in which searches that don't find any hits would return a
-reference to an empty array instead of undef when called in a scalar
-context. This bug sounds awfully familiar, which is why I added the test
-mentioned above...
-
-
-Changes in version 2.1.5
-------------------------
-Fixed the migrate method so now it not only works, but also works
-as originally planned (i.e. without requiring source messages to
-be read entirely into memory). If the message is smaller than
-the value in the Buffer parameter (default is 4096) then a normal
-$imap2->append($folder,$imap1->message_string) is done. However, if
-the message is over the buffer size then it is retrieved and written a
-bufferful at a time until the whole message has been read and sent. (The
-receiving server still expects the entire message at once, but it
-will have to wait because the message is being read from the source in
-smaller chunks and then written to the destination a chunk at a time.)
-This needs extensive testing before I'd be willing to trust it (or at
-least extensive logging so you know when something has gone terribly
-wrong) and I consider this method to be in BETA in this release. (Numerous
-people wrote complaining that migrate didn't work, and some even included
-patches to make it work, but the real bug in the last release wasn't
-that migrate was broken but that I had inadvertently included the pod for
-the method which I knew perfectly well was not ready to be released. My
-apologies to anyone who was affected by this.) The migrate method does
-seem to work okay on iPlanet (i.e. Netscape) Messenger Server 4.x. Please
-let me know if you have any issues on this or any other platform.
-
-Added a new example, migrate_mbox.pl, which will demonstrate the migrate method.
-
-Fixed a bug that will cause Mail::IMAPClient's message reading methods to misbehave if
-the last line of the email message starts with a number followed by a space and either
-"OK", "NO", or "BAD". This bug was originally introduced in 1.04 as a fix for another
-bug, but since the fix supports noncompliant behavior I'm disabling this behavior by
-default. If your IMAP clients start hanging every time you try to read literal text
-(i.e. a message's test, or a folder name with spaces or funky characters) then you
-may want to turn this on with the EnableServerResponseInLiteral parameter. Thanks go
-to Manpreet Singh for reporting this bug.
-
-Fixed a bug in imap_to_mbox.pl that has been there since 2.0.0 (when the Uid
-parameter started defaulting to "True"). Thanks to Christoph Viethen for reporting
-the bug and suggesting the fix. BUT NOTE THIS: I often don't test the example programs,
-so you should think of them as examples and not free production programs. Eventually
-I would like to add tests to my test suite (either the 'make test' test suite that you
-run or my own more extensive test suite) but it's not a super high priority right now.
-
-Significant improvements to the whole Mail::IMAPClient::BodyStructure module
-were contributed by Pedro Melo Cunha. It's really much better now.
-
-Bullet-proofing added to some private methods. (Private meaning they are undocumented
-and not part of the module's API. This is perl not java.)
-
-Fix applied to unset_flag to support user-defined flags (thanks to E.Priogov
-for submitting the bug report and patch).
-
-
-Changes in version 2.1.4
-------------------------
-Added Paul Warren's bugfix to the sort method.
-
-Added Mike Halderman's bugfix for the get_bodystructure method.
-
-Fixed a localization problem reported by Ivo Panecek. Because of this fix,
-the Errno.pm file is now a prerequisite to this module. This way I can just
-test to see if the error is an "EAGAIN" error (as defined in sys/errno.h and thus
-Errno.pm) instead of awkwardly checking the string value of $!.
-
-I also renamed the MaxTempErrors parameter to Maxtemperrors in response the same
-bug report. Added a "MaxTempErrors" accessor method that will set and return
-Maxtemperrors for backwards compatibility. Also, the number of temporary errors
-gets reset after each successful I/O, so that the socket i/o operation fails only if
-you if your temporary I/O errors happen more than "Maxtemperrors" times in a row.
-The old behavior was to continue incrementing the count of temporary errors until
-either the entire message was written or until a total of Maxtemperrors had occurred,
-regardless of how many intervening successful syswrites occurred. This was a bug, but
-Ivo politely suggested the new behavior as an enhancement. ;-) Also, you can now
-specify "UNLIMITED" as the Maxtemperrors, in which case these errors will be ignored.
-And the default for Maxtemperrors is now 100, but I'm open to any feedback you may
-have in this regard.
-
-I also fixed the operator precedence problem that was reported by many folks in that
-very same part of the code. (As you may have guessed, that code was new in the last
-version!)
-
-One of the people who reported the precedence problem was Jules Agee, who also submitted
-a patch that may in the end provide an optimal solution to handling EAGAIN errors.
-Unfortunately I have not had time to retrofit his patch into the current version of the
-module. But if I can manage to do this soon and it tests well I'll include it in the next
-release, in which case the Maxtemperrors parameter will be of interest only to historians.
-
-I also received a patch from John Ello that adds support for Netscape's proprietary
-PROXYAUTH IMAP client command. I haven't included that support in this release because
-you can already use the proxyauth method. It's one of those famous "default" methods
-that, despite their fame and my documentation, nobody seems to know about. But you
-can always say "$imap->proxyauth($uid)", for example, providing that $imap and $uid
-are already what they're supposed to be. (I've been doing this myself for years.)
-
-However, John's patch does provide a cleaner interface (it remembers who you are as
-well as who you were, for example) so I may include it later as part of a separate
-module that extends Mail::IMAPClient. This would also give me an excuse for providing
-the framework for plugging in Administrative methods that are proprietary to other imap
-servers, so if you have a technique for acquiring administrative access to your users'
-mailboxes (besides proxyauth) please let me know what it is. Perhaps we'll get something cool out of it, like a document on how to write administrative scripts for various
-platforms and a suite of supporting methods for each.
-
-Changes in version 2.1.3
-------------------------
-Added the new method append_string. It works similarly to append but will allow extra
-arguments to supply the flags and internal date of the appended message. See the pod
-for more details.
-
-(Thanks to Federico Edelman Anaya for suggesting this fix.)
-
-Fixed a bug in the AUTOLOAD subroutine that caused "myrights" (and possibly other
-non-existant methods) to fail. Thanks go to Larry Rosenbaum for reporting the bug
-and identifying the fix.
-
-Added the new method Escaped_results, which preprocesses results so that data
-containing certain special characters are returned quoted with special characters
-(like quotes!) escaped. (I needed this for the bodystructure stuff, below.)
-
-NEW! Added support for parsing bodystructures (as provided in the server response to
-FETCH BODYSTRUCTURE). This support requires Parse::RecDescent and is implemented via two
-new modules, Mail::IMAPClient::BodyStructure and Mail::IMAPClient::Parse. Note that
-the latter module is used by the former; your programs need not and should not use it
-directly so don't. Also, these modules are ALPHA and EXPERIMENTAL so no screaming when
-they don't work. (Polite bug reports will of course be gratefully accepted.) Many
-thanks to Damian Conway, the author of Parse::RecDescent, without which this feature
-would not have been possible (or at least not very likely).
-
-Enhanced support for DOS systems (and DOS's offspring, such as windows) by removing
-the "\c\n"s and replacing them with "\x0d\x0a". Thanks go to Marcio Marchini for his
-help with this effort.
-
-Fixed the list of symbols imported along with Fcntl.pm. (Paul Linder asked me to put
-this in the last release but I forgot.)
-
-Changes in version 2.1.2
-------------------------
-
-Fixed a bug in the is_parent method which made it inaccurate on some servers.
-
-Added new method "sort", which implements the SORT extenstion and which was contributed
-by Josh Rotenberg. The SORT extension is documented at
-http://search.ietf.org/internet-drafts/draft-ietf-imapext-sort-06.txt. A copy of the
-draft is also included with the Mail::IMAPClient distribution, which means I also:
-
-Added draft-ietf-imapext-sort-06.txt to the docs subdirectory of the distribution.
-
-Fixed a bug in the folders method and the subscribed method (same bug, appeared twice)
-which broke these methods under some conditions. Thanks again Josh Rotenberg for supplying the fix.
-
-Fixed bugs in getacl and listacl. Changed the interface for getacl significantly;
-existing scripts using getacl will not behave the same way. But then on the other hand,
-getacl was never documented before, so how could you be using it?
-
-Implemented improvements to reduce memory usage by up to 30%. Thanks go Paul Linder,
-who developed the memory usage patch after a considerable amount of analysis. The
-improvements include the use of 'use constant', so your perl needs to support that
-pragma in order to use Mail::IMAPClient.
-
-Added a new parameter, MaxTempErrors, which allows the programmer to control the number
-of consecutive "Resource Temporarily Unavailable" errors that can occur before a write
-to the server will fail. Also changed the behavior of the client when one of these
-errors occurs. Previously, Mail::IMAPClient waited .25 seconds (a quarter of one
-second) before retrying the read operation. Now it will wait (.25 * the number of
-consecutive temporary errors) seconds before retrying the read.
-
-Documented the "Buffer" parameter, which has been secretly available for some time. I
-just forgot to document it. It sets the size of the read buffer when Fast_io is turned
-on. (NOTE: As of version 2.1.5 it also controls the size of the buffer used by the
-migrate method.)
-
-Updated the Todo file. It was nice to see that a number of lines in the "Todo" file were now deletable. It was depressing to see that a number of original lines need to stay
-in there.
-
-
-Changes in version 2.1.1
-------------------------
-Added the "mark", "unmark", and imap4rev1 methods.
-
-Updated the documentation to include the new methods and to document "create", "store",
-and "delete".
-
-Updated "message_string" to be smart about whether you're using IMAP4 or IMAP4REV1.
-
-Updated "message_to_file" to be smart about whether you're using IMAP4 or IMAP4REV1.
-
-Added several bug fixes to authenticate method. Many thanks to Daniel Wright who
-reported these bugs and provided the information necessary to fix them.
-
-
-Changes in version 2.1.0
-------------------------
-
-Fixed a serious bug introduced in 2.0.9 when appending large messages.
-
-Made minor changes to improve the cyrus_expunge.pl example script.
-
-Made the set_flags routine RFC2060-compliant. Previously it prepended flag names with
-backslashes, even if the flags were not reserved flags. This broke support for
-user-defined flags, which I didn't realize was supposed to even be there until Scott
-Renner clued me in. (Thanks, Scott.)
-
-Promoted the release level to "1".
-
-Added a new 'internaldate' method. (Thanks to the folks at jwm3.org for donating the
-code!)
-
-Added a new example, cyrus_expire.pl.
-
-Changes in version 2.0.8/2.0.9
-------------------------------
-Made minor changes to the tests in t/basic.t so that folders are explicitly closed
-before they are deleted. (Don't worry, only folders created by the tests are
-deleted. :-) Thanks go to Alan Young for reporting that some servers require this.
-
-Changed the routine that massages folder names into IMAP-compliant strings so that
-single-quotes in a name do not force the folder to go through as "LITERAL" strings
-(as defined in RFC2060). This shouldn't cause a problem for anybody (and in fact
-should make life easier for some folks) but if you do have any trouble with
-single-quotes in folder names PLEASE LET ME KNOW ASAP!!
-
-Divided the sending of literal strings into two I/O operations (as required by RFC2060).
-This should correct problems with sending literals to some servers that will not read
-any data sent before they reply with the "+ go ahead" message. (Thanks go to Keith Clay,
-who reported seeing this problem with the M-Store IMAP server.)
-
-Changed the "create" method so that it will autoquote the first argument to create
-rather than the last. Normally the first argument is the last, but Cyrus users can
-specify an optional 2nd argument, except when using pre-2.0.8 versions of
-Mail::IMAPClient ;-) Thank you Chris Stratford for reporting this bug and
-identifying its cause.
-
-Fixed a bug in body_string when the message is empty. (Thanks go to Vladimir Jebelev for
-finding this bug and providing the fix.)
-
-Added a new example to the examples subdirectory. cyrus_expunge.pl is a script you
-can use (after making minor tweaks) to periodically expunge your server's mail store.
-
-Changes in version 2.0.7
-------------------------
-Fixed a bug in message_count. Thanks go to Alistair Adams for reporting this bug.
-
-Fixed a bug in folders that caused some foldernames to not be reported in the
-returned array.
-
-Changes in version 2.0.6
-------------------------
-
-Applied patches from Phil Lobbe to tighten up sysreads and 'writes and to correct a
-bug in the I/O engine.
-
-Changes in version 2.0.5
-------------------------
-
-Fixed bug in parse_headers so that RFC822 headers now match the pattern /(\S*):\s*/
-instead of /(\S*): /. Thanks go to Paul Warren for reporting this bug and providing the
-fix.
-
-Added more robust error checking to prevent infinite loops during read attempts and
-fixed bugs in parse_headers. Thanks go to Phil Lobbes, who provided several useful
-patches and who performed valuable pre-release testing.
-
-Changes in version 2.0.4
-------------------------
-
-Fixed bug in parse_headers when connected to an Exchange server with UID=>1. (Kudos to
-Wilber Pol for that fix.)
-
-Fixed bugs in parse_headers and tightened reliability of I/O engine by implementing
-many improvements suggested by Phil Lobbes, who also provided code for same.
-
-Added bugfix that under certain conditions caused server responses to be "repeated"
-when fast_io is turned on. Thanks to Jason Hellman for providing bug report and
-diagnostic data to fix this.
-
-Added a "LastIMAPCommand" method, which returns the last IMAP client command that
-was sent to the server.
-
-Removed the "=begin debugging" paragraph that somehow got included in CPAN's
-html pages (even though it shouldn't have).
-
-Began a process of redesigning the documentation. I would like to be able to present
-a more formal syntax for the various methods and hope to have that ready for the next
-release.
-
-Tested successfully against Cyrus v 2.0.7.
-
-Tested unsuccessfully against mdaemon. This appears to be due to mdaemon's
-noncompliance with rfc2060 so future support for mdaemon should not be expected
-any time soon. ;-(
-
-
-Changes in version 2.0.3
-------------------------
-
-Did major rewrite of message_string method, which should now be both cleaner
-and more reliable.
-
-Fixed bug in move method that caused some folders to be incorrectly quoted.
-Thanks go to Felix Finch for reporting this bug. Also, at his suggestion I
-added information to move documentation explaining the need to expunge.
-
-Made many fixes and tweaks to pod text.
-
-Added a new method, Rfc2060_date, which takes times in the "seconds since 1/1/1970"
-format and returns a string in RFC2060's "dd-Mon-yyyy" format (which is the format
-you need to use in IMAP SEARCH commands).
-
-Changes in version 2.0.2
-------------------------
-Fixed bug that caused a compile error on some earlier versions of perl5.
-
-Noticed that some older versions of perl give spurious "Ambiguous use" warnings
-here and there, mostly because I'm not quoting the name of the "History" member
-of the underlying Mail::IMAPClient hash. These warnings will go away when you upgrade
-perl. (I may fix them later, or maybe not. Depends on if I have time.)
-
-Added new parameter (and eponymous method) Peek, along with new tests for 'make test'
-for same. See the pod for further info.
-
-Added some error checking to avoid trying to read or write with an
-unconnected IMAPClient object.
-
-Made bug fixes to parse_headers and flags.
-
-Added missing documentation for the exciting new message_to_file method (oops).
-Also cleaned up a few typos in the pod while I happened to be there. (I'm sure
-there are still plenty left.)
-
-Fixed bugs in append and append_file. (Thanks to Mauro Bartolomeoli and to the people
-at jwm3.org for reporting these bugs.)
-
-Made changes to call to syswrite to guarantee delivery of entire message. (Only affects
-appends of very large messages.)
-
-Added the 'close' method to the list of lower-case-is-okay methods (see the section
-under version 2.0.0 on "NEW ERROR MESSAGES").
-
-Changes in version 2.0.1
-------------------------
-Several bug fixes related to the flags method and to spurious warning messages
-when run with warnings turned on.
-
-A new method, message_to_file, writes message text directly into a file. This
-bypasses saving the text in the history buffer and the overhead that entails, which
-could be especially important when processing big ass messages. Of course the bad news
-is that now you'll have to write all that shtuff out to a filehandle, but maybe you
-wanted to do that anyway. Anyhow, between append_file and message_to_file, both
-of which take filehandle arguments, there should be a way to "short circuit" the
-copying of mail between two imap sessions. I just haven't got it completely figured
-out yet how it would work. Got any ideas? Anyhow, this method is currently considered
-experimental.
-
-A couple of new tests have been added to go along with our new little method.
-
-I've added a whole bunch more IMAP-related rfc's to the docs/ subdirectory. Trust me,
-you are going to need them.
-
-Changes in version 2.0.0
------------------------
-NEW I/O ENGINE
-This version includes a major rewrite of the I/O engine. It's now cleaner and more
-reliable. Also, output processing is less likely to match patterns that look like
-server output but are really, say, message text contained in a literal or something
-like that. Also, various problems with blank lines at the ends of messages either
-magically appearing or disappearing should now go away. Basically, it's much better
-is what I'm trying to say.
-
-NEW DEFAULT
-The Uid parameter now defaults to true. This should be transparent to existing scripts
-(except for those scripts that produce embarrassing results because someone forgot to
-specify Uid=>1, in which case they'll magically start behaving somehow).
-
-NEW METHOD
-The namespace method has been added, thus implementing RFC2342. If you have any scripts
-that rely on the old, "default method" style of namespace implementation then you should
-rename those method calls to be mixed case (thus forcing the AUTOLOADed default method).
-
-NEW ERROR MESSAGES
-Mail::IMAPClient now issues a lot more warning messages when run in warn mode
-(i.e. $^W is true). Of particular interest are methods implemented via the "default
-method" AUTOLOAD hack. They will generate a warning telling you to use mixed- or
-upper-case method names (but only if warnings are turned on, say with the -w switch
-or $^W++ or something). The exceptions are certain unimplemented yet quite popular
-methods that, if ever explicitly implemented, will behave the same way as they do via
-the default method. (Or at least they will remain downwardly compatible. I may add
-bells and whistles by not by default.) Those methods are listed in the pod and right
-here: store, copy, subscribe, close, create, delete and expunge.
-
-NEW VERSION NUMBERING SCHEME
-Changed the version numbering scheme to match perl's (as of perl v5.6.0).
-
-NEW INSTALLATION TESTS
-Added a few new tests to the test suite. (Still need more, though.) Also changed fast_io
-and uidplus test suites so that they just "do" the basic tests but with different
-options set (i.e. Fast_io and Uid, respectively).
-
-OTHER CHANGES
-- The expunge method now optionally accepts the name of the folder to be expunged. It's
-also been documented, even though it technically doesn't exist. (That won't stop it from
-working, though.) Since expunge deletes messages that you thought were already deleted,
-it's only appropriate to use a method that you thought existed but really doesn't, don't
-you think? And if you're wondering how I managed to change the behavior of a method that
-doesn't exist, well, I don't want to talk about it.
-
-- Speaking of methods that don't exist (also known as methods implemented via "the
-default method"), effective with this release there are a number of unimplemented
-methods that are guaranteed to always exhibit their current behavior. In other words,
-even if I do eventually implement these methods explicitly, they will continue to
-accept the same arguments and return the same results that they do now via the default
-method. (Why I would even bother to do that is specifically not addressed in this
-document.) Currently this means that these methods will not trigger warnings when
-called via all-lowercase letters (see "NEW ERROR MESSAGES", above). In the future I
-hope that it will also mean that these non-existant but functioning methods will also
-be documented in the pod.
-
-- Fixed a bug in the flags method introduced in 1.19. (Thanks to the people at jwm3.org
-for reporting this!)
-
-
-Changes in version 1.19
------------------------
-Fixed a bug in which the Folder parameter returned quoted folder names, which sometimes
-caused other methods to requote the folders an extra time. (The IMAP protocol is real
-picky about that.) Thanks go to Felix Finch for both reporting the bug and identifying
-the fix.
-
-Siggy Thorarinsson contributed the new "unseen_count" method and suggested a new
-"peek mode" parameter. I have not yet gotten around to implementing the new parameter
-but have included the unseen_count method, since a) he was kind enough to write it, and
-b) it tests well.
-
-In the meantime, you cannot tell methods like "parse_headers" and "message_string" and
-so forth whether or not you want them to mark messages as "\Seen". So, to make life
-easier for you in particular I added a bunch of new methods: set_flag, unset_flag,
-see, and deny_seeing. The latter two are derivitives of the former two, respectively,
-which should make this sentence almost as difficult to parse as an IMAP conversation.
-
-Fixed bug in which "BAD" "OK" or "NO" lines prefixed by an asterisk (*) instead of the
-tag are not handled correctly. This is especially likely when LOGIN to a UW IMAP server
-fails. Thanks go to Phil Lobbes for squashing this bug.
-
-Fixed bug in logout that caused the socket handle to linger. Credit goes to
-Jean-Philippe Bouchard for reporting this bug and for identifying the fix.
-
-Fixed bug in uidvalidity method where folder has special characters in it.
-
-Made several bug fixes to the example script examples/find_dup_msgs.pl. Thanks to Steve
-Mayer for identifying these bugs.
-
-Changed Fast_io to automatically turn itself off if running on a platform that does
-not provide the necessary fcntl macros (I won't mention any names, but it's initials
-are "NT"). This will occur silently unless warnings are turned on or unless the Debug
-parameter is set to true. Previously scripts running on this platform had to turn off
-fast_io by hand, which is lame. (Thank you Kevin Cutts for reporting this problem.)
-
-Updated logic that X's out login credentials when printing debug output so that funky
-characters in "User" or "Password" parameters won't break the regexp. (Kevin Cutts found
-this one, too.)
-
-Tinkered with the Strip_cr method so it can accept multiple arguments OR an array
-reference as an argument. See the updated pod for more info.
-
-Fixed a typo in the documentation in the section describing the fetch method. There
-has been an entire paragraph missing from this section for who knows how long. Thanks
-to Adam Wells, who reported this documentation error.
-
-Fixed bug in seen, recent, and unseen methods that caused them to return empty arrays
-erroneously under certain conditions.
-
-Changes in version 1.18
------------------------
-Timeouts during read operations now work correctly.
-
-Fixed several bugs in the I/O engine. This should correct various problems with Fast_io
-turned on (which is now the default).
-
-Reworked message_string and body_string methods to avoid bugs when Uid set to true.
-
-Changes in version 1.17
------------------------
-
-Added support for the Oracle IMAP4r1 server.
-
-Tinkered with the DESTROY method so that it does a local($@) before doing its evals.
-This will perserve the value of $@ when the "new" method fails during a login but the
-DESTROY's "logout" succeeds. The module was setting the $@ variable, but on some
-versions of perl the DESTROY method would clobber $@ before anything useful could be
-done with it! Thanks to Kimmo Hovi for reporting this problem, which was harder to
-debug than you might think.
-
-Changes in version 1.16
------------------------
-
-IMPORTANT: Made Fast_IO the default. You must specify Fast_io => 0 in your new method
-call or invoke the Fast_io method (and supply 0 as an arg) to get the old behavior.
-(This should be transparent to most users, but as always your mileage may vary.)
-
-Reduced the number of debug msgs printed in the _read_line internal method and added a
-debug msg to report perl and Mail::IMAPClient versions.
-
-The message_count method will now return the number of messages in the currently select
-folder if no folder argument is supplied.
-
-The message_string method now does an IMAP FETCH RFC822 (instead of a
-FETCH RFC822.HEADERS and a FETCH RFC822.TEXT), which should eliminate missing blank
-lines at the ends of some messages on some IMAP server platforms. It also returns undef
-if for some reason the underlying FETCH fails (i.e. there is no folder selected),
-thanks to a suggestion by Pankaj Garg. It has also been slightly re-worked to support
-the changes in the I/O engine from version 1.14.
-
-Re-worked the body_string method to support the I/O engine changes from v1.14.
-
-Fixed a bug in parse_headers when used with multiple headers and the Uid parameter set
-to a true value.
-
-Documented in this file a fix for a bug in the flags method with the Uid parameter
-turned on. (Belated thanks to Michael Lieberman for reporting this bug.)
-
-Changes in version 1.15
------------------------
-Fixes the test suite, which in v1.14 had an "exit" stmt that caused early termination
-of the tests. (I had put that "exit" in there on purpose, and left it in there by
-accident.)
-
-Changes in version 1.14
------------------------
-Fixed a bug in the _readline subroutine (part of the I/O engine) that was caused by my
-less-than-perfect interpretation of RFC2060. This fix will allow the Mail::IMAPClient
-module to function correctly with servers that imbed literal datatypes in the middle
-of response lines (rather than just at the end of them). Thanks to Pankaj Garg for
-reporting this problem and providing the debugging output necessary to correct it.
-
-Fixed a bug in parse_headers that was introduced with the fix to the I/O engine
-described above.
-
-Changes in version 1.13
------------------------
-Changed the parse_headers method so that it uses BODY.PEEK instead of BODY. This
-prevents the parse_headers method from implicitly setting the "\Seen" flag for messages
-that have not been otherwise read. This change could produce an incompatibility in
-scripts that relied on the parse_headers previous behavior.
-
-Fixed a bug in the flags method with the Uid parameter turned on. (Thanks to Michael
-Lieberman for reporting this bug.)
-
-Changes in version 1.12
------------------------
-Fixed a bug in the folders method when called first with a second arg and then without
-a second arg.
-
-Tested sucessfully with perl-5.6.0.
-
-Added a section to the pod documentation on how to report bugs. I've had to ask for
-output from scripts with "Debug => 1" so many times that I eventually decided to
-include the procedure for documenting bugs in the distribution. (Duh! It only took me
-11 releases to come up with that brainstorm.) Often following the procedures to obtain
-the documentation is enough; once people see what's going on (by turning on Debug =>1)
-they no longer want to report a bug.
-
-Did I mention it's a good idea to turn on debugging when trying to figure out why a
-script isn't working? (It is.)
-
-In order to make the Debug parameter friendlier, it now prints to STDERR by default.
-You can override this by supplying the spanking brand new Debug_fh parameter, which
-if supplied had better well point to a filehandle (either by glob or by reference),
-and by 'filehandle' I mean something besides STDIN!
-
-Debugging mode will now also X-out the login credentials used to login. This will make
-it easier to share your debugging output.
-
-Added documentation for the State parameter, which must be set manually by programmers
-who are not using Mail::IMAPClient's connect and/or login methods but who are instead
-making their own connections and then using the Socket parameter to turn their
-connections into IMAP clients.
-
-Fixed bug in parse_headers with Uid turned on.
-
-Fixed bug in parse_headers when using the argument "ALL".
-
-Changes in version 1.11
------------------------
-Added new example script, copy_folder.pl, to demonstrate one way to copy entire
-folders between imap accounts (which may or may not be on the same server). This
-example is right next to all the others, in the examples/ subdirectory of the
-distribution.
-
-Changed error handling slightly. $@ now contains pretty much the same stuff as what
-gets returned by LastError, even when LastError won't work (i.e. when an implicit
-connect or login fails and so no object reference is returned by new). You can thank
-John Milton for the friendly nagging that got me to do this.
-
-Added new test suite for the fast_io engine. This should make it easier to determine
-whether or not the fast_io engine will work on your platform.
-
-Implemented a work-around to allow the Port parameter to default despite a known bug in
-IO::Socket::INET version 1.25 (distributed with perl 5.6.0).
-
-Fixed a bug in the message_string method in which the resulting text string for some
-mime messages to be incompatible with append.
-
-Fixed a bug in the Fast_io i/o engine that could cause hangs during an append operation.
-
-Changed a number of regular expressions to accept mixed-case "Ok", "No" or "Bad"
-responses from the server and to do multi-line matching.
-
-Fixed a bug in the append method that was causing extra carriage returns to appear in
-messages whose lines were already terminated with the CR-LF sequence. Thanks to Heather
-Adkins for reporting this bug.
-
-Enhanced the parse_headers routine so that it is less sensitive to variations of
-case in message headers. Now, the case of the returned key matches the case of the
-field as specified in the parse_headers method's arguments, regardless of its case
-in the message being parsed. (You can thank Heather Atkins for this suggestion as
-well.) See below for more changes to parse_headers in this release.
-
-Improved the append method so that it has better error handling and error recovery.
-Thanks to Mark Keisler for pointing out some bugs in the error handling code in
-this method.
-
-Added the append_file method, which is like the append method but it works on files
-instead of strings. The file provided to append must contain an RFC822-formatted
-message. Use of the append_file method avoids having to stuff huge messages into
-variables before appending them. Thanks to jwmIII (http://jwm3.org) for suggesting
-this method.
-
-Changed the flags method and the parse_headers method so that a reference to an array
-of message sequence numbers (or message UIDS if the Uid parameter is turned on) can
-optionally be passed instead of a single message sequence number (or UID). Use of this
-enhancement will change your return values so be sure to read the pod. Thanks to
-Adrian Smith (adrian.smith@ucpag.com) for delivering this enhancement.
-
-Fixed a bug in "message_string" that caused the blank lines between headers and body
-to fall out of the string.
-
-Tinkered with the undocumented _send_line method to permit an optional argument
-to suppress the automatic insertion of at the end of strings being sent.
-(NOTE: I'm telling you this because I'm a nice guy. This doesn't mean that _send_line
-is now a programming interface.)
-
-Changes in version 1.10
------------------------
-
-Added two new methods, lsub and subscribed. lsub replaces the behavior of the default
-method and should be downwardly compatible. The subscribed method works like the
-folders method but the results include only subscribed folders. Thanks to Alexei
-Kharchenko for providing the code for lsub (which is the foundation upon which
-'subscribed' was built).
-
-Changes in version 1.09
------------------------
-
-Changed login method so that values for the User parameter that do not start and end
-with quotes will be quoted when sent to the server. This is to support user id's
-with embedded spaces, which are legal on some platforms.
-
-Changed name of test input file created by perl Makefile.PL and used by 'make test'
-from .test to test.txt to support weird, offbeat OS platforms that cannot handle
-filenames beginning with a dot.
-
-Fixed bugs in seen, unseen, and recent methods. (These are almost the same method
-anyway; they are dynamically created at compile time from the same code, with
-variable substitution filling in the places where "seen", "unseen", or "recent"
-belong.) The bug caused these methods to return the transaction number of the
-search as if it were the last message sequence number (or message uid) in
-the result set.
-
-Added the 'since' method, which accepts a date in either standard perl format (seconds
-since 1/1/1970, or as output by time and as accepted by localtime) or in the date_text
-format as defined in RFC2060 (dd-Mon-yyyy, where Mon is the English-language
-three-letter abbreviation for the month). It searches for items in the currently
-selected folder for messages sent since the day whose date is provided as an argument.
-
-Added 'sentsince', 'senton', 'sentbefore', 'on', and 'before' methods which are
-totally 100% just like the 'since' method, except that they run different searches.
-(Did I mention that it's useful to have RFC2060 handy when writing IMAP clients?)
-
-Added two new methods, run and tag_and_run, to allow IMAP client programmers finer
-control over the IMAP conversation. These methods allow the programmer to compose
-the entire IMAP command string and pass it as-is to the IMAP server. The difference
-between these two methods is that the run method requires that the string include
-the tag while the tag_and_run method requires that it does not.
-
-To a similar end, the pre-existing Socket parameter and eponymous accessor method
-has been documented to allow direct access to the IMAP socket handle and to allow
-the socket handle to be replaced with some other file handle, presumably one derived
-from a more interesting technology (such as SSL).
-
-Fixed a bug that caused blank lines to be removed from 'literal' output (as defined
-in RFC2060) when fast_io was not used. This bug was especially likely to show up in
-routines that fetched a message's body text. The fact that this bug did not occur
-in the newer fast_io code may indicate that I've learned something, but on the other
-hand we shouldn't jump to rash conclusions.
-
-I've run benchmarks on the fast_io code to determine whether or not it is faster and,
-if so, under what circumstances. It appears that the fast_io code is quite faster,
-except when reading large 'literal' strings (i.e. message bodies), in which case it
-appears to take the same amount of time as the older i/o code but at the cost of
-more cpu cycles (which means it may actually be slower on cpu-constrained systems).
-The reason for this is that reads of literal strings are by their nature already
-optimized, but without the overhead of fcntl calls. So if you expect to be doing
-lots of message text (or multipart message body parts) fetching you should not use
-fast_io, but in pretty much any other case you should go ahead and use it. In any
-event, a number of people have tested fast_io so I no longer consider it
-experimental, unless you're running perl on NT or CP/M or something funky like that,
-in which case let me know how you make out!
-
-Changes in version 1.08
------------------------
-
-Maintenance release 1.08a fixes a bug in the folders method when supplying the
-optional argument (see "Enhanced folders method..." below) with some IMAP servers.
-
-Added option to build_ldif.pl (in the examples subdirectory) to allow new options and
-to better handle quoted comments in e-mail addresses. Thanks to Jeffrey Fiedl,
-whose book _Mastering Regular Expressions_ (O'Reilly) helped me to figure out a
-good way to do this.
-
-Fixed documentation error that failed to mention constraints on when the append
-method will return the uid of the appended message. (This feature only works with
-servers that have the UIDPLUS capability.)
-
-Added/improved documentation somewhat.
-
-The copy method now returns a comma-separated list of uids if successful and if the
-IMAP server supports UIDPLUS extentions. The move method now works similarly.
-
-Added new method uidnext, which accepts the name of a folder as an argument and returns
-the next available message UID for that folder.
-
-The exists and append methods now will handle unquoted foldernames with embedded
-spaces or quotes or whatever. Including quotes as part of the argument string is no
-longer required but is still supported for backwards compatibility reasons. In other
-words, $imap->exists(q("Some Folder")) is now no longer necessary (but will still work). $imap->exists(some folder) is good enough.
-
-Mail::IMAPClient has been tested successfully on Mirapoint 2.0.2. (Thanks to Jim
-Hickstein.)
-
-I've now installed the UW imapd IMAP4rev1 v12.264 on one of my machines so I'm better
-able to certify that platform. All the tests in 'make test' work there (or are at least
-gently skipped).
-
-Fixed bug in getacl in which folder names were quoted twice. (Thanks to Albert Chin for
-squashing this bug.) Similar bugs existed in the other ACL methods and were similarly
-fixed.
-
-Fixed a bug in message_uid that basically caused it to not work. Muchos gracias to
-Luvox (aka fluvoxamine hydrochloride) for providing me with just the help I needed to
-discover and fix this bug.
-
-Enhanced folders method to allow an argument. If an argument is supplied, then
-the folders method will restrict its results to subfolders of the supplied argument
-(which should be the name of a parent folder, IMHO). This is implemented by supplying
-arguments to the LIST IMAP Client command so we are optimizing network I/O at the
-expense of possible server incompatibilities. If you find server incompatibilities
-with this then please let me know, and in the meantime you can always
-grep(/^parent/,$imap->folders) or something. Or re-implement the folders
-method yourself.
-
-
-Changes in version 1.07
------------------------
-Added a new parameter, Fast_io, which, if set to a true value, will attempt to
-implement a faster I/O engine. USE THIS AT YOUR OWN RISK. It is alpha code. I don't
-even know yet if it even helps.
-
-Added support for spaces in folder names for the autoloaded subscribe method.
-
-Added new methods setacl, getacl, deleteacl, and listrights. These methods are not yet
-fully tested and should be considered beta for this release.
-
-Enhanced support for the myrights method (which is implemented via the default method).
-
-Fixed bug in append method that caused it to hang if server replied to original APPEND
-with a NO (because, say, the mailbox's quota has been exceeded).
-
-Removed the autodiscovery of the folder hierarchy from the login method. This will
-speed up logging in but may delay certain other methods later (but see the next item,
-below).
-
-Updated the exists method to issue a "STATUS" IMAP Client command, rather than depend
-on the folder hierarchy being discovered via 'LIST "" "*"'. Apparently this speeds
-things up a lot for some configurations, although the difference will be negligable to
-many.
-
-Updated Makefile.PL to support the PREFIX=~/ directive. Thanks to Henry C. Barta
-(hbarta@wwa.com) for this fix.
-
-Added the Timeout parameter and eponymous accessor method, which, if set to a true
-value, causes reads to time out after the number of seconds specified in the Timeout
-parameter. The value can be in fractions of a second. This has not been fully tested
-though, so use of this parameter is strictly "Beta".
-
-Enhanced support for the UID IMAP client command. Setting the new Uid parameter to a
-true value will now cause the object to treat all message numbers as message UID
-numbers rather than message sequence numbers. Setting the Uid parameter to a false
-value will turn off this behavior again.
-
-Updated test suite to handle servers that cannot do UIDPLUS and to add tests for
-the Uid parameter.
-
-Incorporated bug fixes for recent_count and message_count in which some servers are
-sticking in extra \r's, and updated DESTROY to remove spurious warning messages under
-some versions of perl (thanks to Scott Wilson for catching and killing these bugs).
-
-
-Changes in version 1.06
------------------------
-Changed folders method so that it correctly handles mail folders whose names start and
-end with quotes.
-
-Changed append method so that it returns the uid of the newly appended message if
-successful. Since the uid is a "true" value this should not affect the behavior of
-existing scripts, although it may enhance the behavior of new scripts ;-)
-
-Fixed bug in parse_headers that could cause script to die if there were no headers of
-the type requested and if there was a space on the blank line returned from FETCH.
-(Some blank lines are blanker than others...)
-
-Added the "flags" method, which returns an array (or array reference if called in scalar
-context) containing the flags that have been set for the message whose sequence number
-has been provided as the argument to the method.
-
-Added the "message_string" method, which accepts a message sequence number as an
-argument and returns the contents of the message (including RFC822 headers) as a
-single string.
-
-Added the "body_string" method, which accepts a message sequence number as an argument
-and returns the contents of the message (not including RFC822 headers) as a single
-string.
-
-Changes in version 1.05
------------------------
-
-Patched the 'make test' basic test to work correctly on systems that do not
-support double quotes in folder names. Thanks to Rex Walters for this fix.
-
-Added a new example script, build_dist.pl, that rumages through a folder
-(specified on the command line) and collects the "From:" address, and then
-appends a message to that folder with all those addresses in both the To: field
-and the text, to facilitate cuting and pasting (or dragging and dropping)
-into address books and so forth. (Note that the message doesn't actually get
-sent to all those people; it just kind of looks that way.)
-
-Also added another example, build_ldif.pl, that is similar to build_dist.pl
-except that instead of listing addresses in the message text, it creates a
-MIME attachment and attaches a text file in LDIF format, which can then be
-imported into any address book that supports LDIF as an import file format.
-This example requires the MIME::Lite module. MIME::Lite was written by Eryq
-(okay, Erik Dorfman is his legal name), and is totally available on CPAN.
-
-This distribution has now been tested on Mirapoint Message Server Appliances
-(versions 1.6.1 and 1.7.1). Many thanks to Rex Walters for certifying this
-platform and for providing a test account for future releases.
-
-Changes in version 1.04
------------------------
-
-Fixed situation in which servers that include the " OK\r\n" line
-as part of a literal (i.e. text delivered via {}\r\n bytes\r\n)
-caused the module to hang. This situation is pretty rare; I've only run across
-one server that does it. I'm sure it's a bug; I'm not sure whose. ;-}
-Many thanks to Thomas Stromberg for 1) pointing out this bug and 2) providing
-me with facilities to find and fix it!
-
-Fixed potential bug in I/O engine that could cause module to hang when reading
-a literal if the first read did not capture the entire literal.
-
-Cleaned up some unnecessary runtime warnings when a script is executed with
-the -w switch.
-
-Added new tests to 'make test'. I just can't keep my hands off it! ;-)
-
-Enhanced the append method and several tests in 'make test' to be more widely
-compatible. Successfully tested on UW-IMAP, Cyrus v1.5.19, Netscape Messenger
-4.1, and Netscape Messenger v3.6. If you know of others please add them to
-the list!
-
-Fixed a bug in the separator method (new in 1.03) that caused it to fail if
-'inbox' was specified in lowercase characters as the method's argument.
-
-Added a new example, imap_to_mbox.pl, contributed by Thomas Stromberg. This
-example converts a user's IMAP folders on an IMAP server into mbox format.
-
-Changes in version 1.03
------------------------
-Reworked several methods to support double-quote characters within folder
-names. This was kind of hard. This has been successfully tested with create,
-delete, select, and folders, to name the ones that come to mind.
-
-Reworked the undocumented method that reads the socket to accept and handle
-more gracefully lines ending in {nnn}\r\n ( where nnn is a number of
-characters to read). This seems to be part of the IMAP protocol although I
-am at a total loss as to where it's explained, other than a brief description
-of a "literal's" bnf syntax, which hardly counts.
-
-Added separator object method, which returns the separator character in use
-by the current server.
-
-Added is_parent method, which returns 1, 0, or undef depending on whether a
-folder has children, has no children, or is not permitted to have children.
-
-Added tests to 'make test' to test new function. Also changed 'make test' to
-support IMAP systems that allow folders to be created only in the user's INBOX
-(which is the exact opposite of what my IMAP server allows...oh, well).
-
-Fixed a bug that caused search to return an array of one undef'ed element
-rather than undef if there were no hits.
-
-Changes in version 1.02
------------------------
-Fixed bugs in search and folders methods.
-
-Fixed bug in new method that ignored Clear => 0 when specified as arguments to
-new.
-
-Changes in version 1.01
------------------------
-Fixed a bug in test.pl that caused tests to fail if the extended tests were not used.
-
-Added method 'parse_headers' to parse the header fields of a message in the
-IMAP store into a perl data structure.
-
-Changes in version 1.00
------------------------
-Made cosmetic changes to documentation.
-
-Fixed a bug introduced into the 'folders' method in .99.
-
-Changed 'new' method so that it returns undef if an implicit connection or
-login is attempted but fails. Previous releases returned a Mail::IMAPClient
-object that was not connected or not logged in, depending on what failed.
-
-Changed installation script so that it reuses the parameter file for test.pl
-if it finds one. Installation can be run in the background if the test.txt file
-exists. Touching it is good enough to prevent prompts; having a correctly
-formatted version (as described in test_template.txt) is even better, as it will
-allow you to do a thorough 'make test'.
-
-Changes in version .99
-----------------------
-Added the Rfc822_date class method to create RFC822-compliant date fields in
-messages being appended with the append method.
-
-Added the recent, seen, and unseen methods to return an array of sequence
-numbers from a SEARCH RECENT, SEARCH SEEN, or SEARCH UNSEEN method call.
-These methods are shortcuts to $imap->search("RECENT"), etc.
-
-Added the recent_count method to return the number of RECENT messages in a
-folder. Contributed by Rob Deker.
-
-Added 'use strict' compliance, courtesy of Mihai Ibanescu.
-
-Fixed a bug in the search method that resulted in a list with one empty member
-being returned if a search had no hits. The search method now returns undef
-if there are no hits.
-
-Added 'authenticate' method to provide very crude support for the IMAP
-AUTHENTICATE command. The previous release didn't support AUTHENTICATE at all,
-unless you used very low-level (and undocumented) methods. With the
-'authenticate' method, the programmer still has to figure out how to
-respond to the server's challenge. I hope to make it friendlier in the
-next release. Or maybe the one after that. This method is at least a start,
-albeit a pretty much untested one.
-
-Added Rfc822_date class method to facilitate creation of "Date:" header
-field when creating text for the "append" method, although the method may
-come in handy whenever you're creating a Date: header, even if it's not
-in conjuction with an IMAP session.
-
-Added more tests, which will optionally run at 'make test' time, provided all
-the necessary data (like username, hostname, password for testing an IMAP
-session) are available.
-
-
-Changes in version 0.09
------------------------
-Thu Aug 26 14:10:03 1999 - original version; created by h2xs 1.19
-
-# $Id: Changes,v 20001010.18 2003/06/12 21:35:48 dkernen Exp $
diff --git a/W/Mail-IMAPClient-3.42/MANIFEST b/W/Mail-IMAPClient-3.42/MANIFEST
deleted file mode 100644
index 6015af3..0000000
--- a/W/Mail-IMAPClient-3.42/MANIFEST
+++ /dev/null
@@ -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)
diff --git a/W/Mail-IMAPClient-3.42/META.json b/W/Mail-IMAPClient-3.42/META.json
deleted file mode 100644
index b09c60e..0000000
--- a/W/Mail-IMAPClient-3.42/META.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
- "abstract" : "IMAP4 client library",
- "author" : [
- "Phil Pearl (Lobbes) "
- ],
- "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"
-}
diff --git a/W/Mail-IMAPClient-3.42/META.yml b/W/Mail-IMAPClient-3.42/META.yml
deleted file mode 100644
index 6adb776..0000000
--- a/W/Mail-IMAPClient-3.42/META.yml
+++ /dev/null
@@ -1,37 +0,0 @@
----
-abstract: 'IMAP4 client library'
-author:
- - 'Phil Pearl (Lobbes) '
-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'
diff --git a/W/Mail-IMAPClient-3.42/Makefile.PL b/W/Mail-IMAPClient-3.42/Makefile.PL
deleted file mode 100644
index 5d9cc3f..0000000
--- a/W/Mail-IMAPClient-3.42/Makefile.PL
+++ /dev/null
@@ -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) ',
- 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 < 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 Output".
-
-=head1 SYNTAX
-
-b I<-h>
-
-b 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 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
-#
diff --git a/W/Mail-IMAPClient-3.42/examples/build_ldif.pl b/W/Mail-IMAPClient-3.42/examples/build_ldif.pl
deleted file mode 100755
index 72e8d8d..0000000
--- a/W/Mail-IMAPClient-3.42/examples/build_ldif.pl
+++ /dev/null
@@ -1,235 +0,0 @@
-#!/usr/local/bin/perl
-#$Id$
-use Mail::IMAPClient;
-use MIME::Lite;
-use Data::Dumper;
-
-=head1 DESCRIPTION
-
-B 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 field of the message header and in an
-LDIF-format attachment.
-
-B requires B.
-
-=head1 SYNTAX
-
-B I<-h>
-
-B 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 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
-#
diff --git a/W/Mail-IMAPClient-3.42/examples/cleanTest.pl b/W/Mail-IMAPClient-3.42/examples/cleanTest.pl
deleted file mode 100755
index a60f780..0000000
--- a/W/Mail-IMAPClient-3.42/examples/cleanTest.pl
+++ /dev/null
@@ -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
-
diff --git a/W/Mail-IMAPClient-3.42/examples/copy_folder.pl b/W/Mail-IMAPClient-3.42/examples/copy_folder.pl
deleted file mode 100755
index 93193b2..0000000
--- a/W/Mail-IMAPClient-3.42/examples/copy_folder.pl
+++ /dev/null
@@ -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
-#
diff --git a/W/Mail-IMAPClient-3.42/examples/cyrus_expire.pl b/W/Mail-IMAPClient-3.42/examples/cyrus_expire.pl
deleted file mode 100755
index 52a97d7..0000000
--- a/W/Mail-IMAPClient-3.42/examples/cyrus_expire.pl
+++ /dev/null
@@ -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
-#
diff --git a/W/Mail-IMAPClient-3.42/examples/cyrus_expunge.pl b/W/Mail-IMAPClient-3.42/examples/cyrus_expunge.pl
deleted file mode 100755
index 2921832..0000000
--- a/W/Mail-IMAPClient-3.42/examples/cyrus_expunge.pl
+++ /dev/null
@@ -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
-#
-#
diff --git a/W/Mail-IMAPClient-3.42/examples/find_dup_msgs.pl b/W/Mail-IMAPClient-3.42/examples/find_dup_msgs.pl
deleted file mode 100755
index 21b41b8..0000000
--- a/W/Mail-IMAPClient-3.42/examples/find_dup_msgs.pl
+++ /dev/null
@@ -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
-#
diff --git a/W/Mail-IMAPClient-3.42/examples/idle.pl b/W/Mail-IMAPClient-3.42/examples/idle.pl
deleted file mode 100755
index 1761307..0000000
--- a/W/Mail-IMAPClient-3.42/examples/idle.pl
+++ /dev/null
@@ -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= *IMAP server name/IP
- --o User= *User account to login to
- --o Password= *Password to use for the User account
- (see security note below)
- --o Port= port on Server to connect to
- --o Ssl= use SSL on this connection
- --o Starttls= call STARTTLS on this connection
- --o Debug= enable debugging in Mail::IMAPClient
- --o ImapclientKey=Val any other Mail::IMAPClient attribute/value pair
- --folder folder (mailbox) to IMAP SELECT (INBOX)
- --maxidle 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=
-
-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
-
-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
- # - 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= 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;
-}
diff --git a/W/Mail-IMAPClient-3.42/examples/imap_to_mbox.pl b/W/Mail-IMAPClient-3.42/examples/imap_to_mbox.pl
deleted file mode 100755
index 61acfe7..0000000
--- a/W/Mail-IMAPClient-3.42/examples/imap_to_mbox.pl
+++ /dev/null
@@ -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.
-#
-
-# 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 Server specification (default $SERVER)
- -u User login (default $USER)
- -p User password
- -P
Server Port (default $PORT)
- -i INBOX save path (default $INBOX_PATH)
- -I skip INBOX (default $DOINBOX)
- -f Save path for other folders (default $FOLDERS_PATH)
- -m Regexp for IMAP folders not to be saved:
- $DONT_MOVE
- -r Read delimiter (default \"$READ_DELIMITER\")
- -w Write Delimiter (default \"$WRITE_DELIMITER\")
- -b Banned chars (default \"$BANNED_CHARS\")
- -c Strip CRs from saved files [for Unix] (default \"$CR\")
- -n Receive only 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
diff --git a/W/Mail-IMAPClient-3.42/examples/imtestExample.pl b/W/Mail-IMAPClient-3.42/examples/imtestExample.pl
deleted file mode 100755
index 27938e9..0000000
--- a/W/Mail-IMAPClient-3.42/examples/imtestExample.pl
+++ /dev/null
@@ -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 "<<>>\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 "<<>>\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
-
diff --git a/W/Mail-IMAPClient-3.42/examples/migrate_mail2.pl b/W/Mail-IMAPClient-3.42/examples/migrate_mail2.pl
deleted file mode 100755
index df3b673..0000000
--- a/W/Mail-IMAPClient-3.42/examples/migrate_mail2.pl
+++ /dev/null
@@ -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
-#
diff --git a/W/Mail-IMAPClient-3.42/examples/migrate_mbox.pl b/W/Mail-IMAPClient-3.42/examples/migrate_mbox.pl
deleted file mode 100755
index 1b5129a..0000000
--- a/W/Mail-IMAPClient-3.42/examples/migrate_mbox.pl
+++ /dev/null
@@ -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
-#
-#
diff --git a/W/Mail-IMAPClient-3.42/examples/populate_mailbox.pl b/W/Mail-IMAPClient-3.42/examples/populate_mailbox.pl
deleted file mode 100755
index 86fcb96..0000000
--- a/W/Mail-IMAPClient-3.42/examples/populate_mailbox.pl
+++ /dev/null
@@ -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 = <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 .= <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
diff --git a/W/Mail-IMAPClient-3.42/examples/sharedFolder.pl b/W/Mail-IMAPClient-3.42/examples/sharedFolder.pl
deleted file mode 100755
index dca8e38..0000000
--- a/W/Mail-IMAPClient-3.42/examples/sharedFolder.pl
+++ /dev/null
@@ -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
-#
-#
diff --git a/W/Mail-IMAPClient-3.42/lib/Mail/IMAPClient.pm b/W/Mail-IMAPClient-3.42/lib/Mail/IMAPClient.pm
deleted file mode 100644
index 5808181..0000000
--- a/W/Mail-IMAPClient-3.42/lib/Mail/IMAPClient.pm
+++ /dev/null
@@ -1,3580 +0,0 @@
-
-# _{name} methods are undocumented and meant to be private.
-
-require 5.008_001;
-
-use strict;
-use warnings;
-
-package Mail::IMAPClient;
-our $VERSION = '3.42';
-
-use Mail::IMAPClient::MessageSet;
-
-use IO::Socket qw(:crlf SOL_SOCKET SO_KEEPALIVE);
-use IO::Select ();
-use Carp qw(carp); #local $SIG{__WARN__} = \&Carp::cluck; #DEBUG
-
-use Fcntl qw(F_GETFL F_SETFL O_NONBLOCK);
-use Errno qw(EAGAIN EBADF ECONNRESET EPIPE);
-use List::Util qw(first min max sum);
-use MIME::Base64 qw(encode_base64 decode_base64);
-use File::Spec ();
-
-use constant APPEND_BUFFER_SIZE => 1024 * 1024;
-
-use constant {
- Unconnected => 0,
- Connected => 1, # connected; not logged in
- Authenticated => 2, # logged in; no mailbox selected
- Selected => 3, # mailbox selected
-};
-
-use constant {
- INDEX => 0, # Array index for output line number
- TYPE => 1, # Array index for line type (OUTPUT, INPUT, or LITERAL)
- DATA => 2, # Array index for output line data
-};
-
-my %SEARCH_KEYS = map { ( $_ => 1 ) } qw(
- ALL ANSWERED BCC BEFORE BODY CC DELETED DRAFT FLAGGED
- FROM HEADER KEYWORD LARGER NEW NOT OLD ON OR RECENT
- SEEN SENTBEFORE SENTON SENTSINCE SINCE SMALLER SUBJECT
- TEXT TO UID UNANSWERED UNDELETED UNDRAFT UNFLAGGED
- UNKEYWORD UNSEEN);
-
-# modules require(d) during runtime when applicable
-my %Load_Module = (
- "Compress-Zlib" => "Compress::Zlib",
- "INET" => "IO::Socket::INET",
- "IP" => "IO::Socket::IP",
- "SSL" => "IO::Socket::SSL",
- "UNIX" => "IO::Socket::UNIX",
- "BodyStructure" => "Mail::IMAPClient::BodyStructure",
- "Envelope" => "Mail::IMAPClient::BodyStructure::Envelope",
- "Thread" => "Mail::IMAPClient::Thread",
-);
-
-sub _load_module {
- my $self = shift;
- my $modkey = shift;
- my $module = $Load_Module{$modkey} || $modkey;
-
- my $err = do {
- local ($@);
- eval "require $module";
- $@;
- };
- if ($err) {
- $self->LastError("Unable to load '$module': $err");
- return undef;
- }
- return $module;
-}
-
-sub _debug {
- my $self = shift;
- return unless $self->Debug;
-
- my $text = join '', @_;
- $text =~ s/$CRLF/\n /og;
- $text =~ s/\s*$/\n/;
-
- #use POSIX (); $text = POSIX::strftime("%F %T ", localtime).$text; #DEBUG
- my $fh = $self->{Debug_fh} || \*STDERR;
- print $fh $text;
-}
-
-BEGIN {
-
- # set-up accessors
- foreach my $datum (
- qw(Authcallback Authmechanism Authuser Buffer Count Compress
- Debug Debug_fh Domain Folder Ignoresizeerrors Keepalive
- Maxappendstringlength Maxcommandlength Maxtemperrors
- Password Peek Port Prewritemethod Proxy Ranges Readmethod
- Readmoremethod Reconnectretry Server Showcredentials
- Socketargs Ssl Starttls Supportedflags Timeout Uid User)
- )
- {
- no strict 'refs';
- *$datum = sub {
- @_ > 1 ? ( $_[0]->{$datum} = $_[1] ) : $_[0]->{$datum};
- };
- }
-}
-
-sub LastError {
- my $self = shift;
- @_ or return $self->{LastError};
- my $err = shift;
-
- # allow LastError to be reset with undef
- if ( defined $err ) {
- $err =~ s/$CRLF$//og;
- local ($!); # old versions of Carp could reset $!
- $self->_debug( Carp::longmess("ERROR: $err") );
-
- # hopefully this is rare...
- if ( $err =~ /NO not connected/ ) {
- my $lerr = $self->{LastError} || "";
- my $emsg = "Trying command when NOT connected!";
- $emsg .= " LastError was: $lerr" if $lerr;
- Carp::cluck($emsg);
- }
- }
-
- # 2.x API support requires setting $@
- $@ = $self->{LastError} = $err;
-}
-
-sub Fast_io(;$) {
- my ( $self, $use ) = @_;
- defined $use
- or return $self->{Fast_io};
-
- my $socket = $self->{Socket}
- or return undef;
-
- local ( $@, $! ); # avoid stomping on globals
- unless ($use) {
- eval { fcntl( $socket, F_SETFL, delete $self->{_fcntl} ) }
- if exists $self->{_fcntl};
- $self->{Fast_io} = 0;
- return undef;
- }
-
- my $fcntl = eval { fcntl( $socket, F_GETFL, 0 ) };
- if ($@) {
- $self->{Fast_io} = 0;
- $self->_debug("not using Fast_IO; not available on this platform")
- unless $self->{_fastio_warning_}++;
- return undef;
- }
-
- $self->{Fast_io} = 1;
- my $newflags = $self->{_fcntl} = $fcntl;
- $newflags |= O_NONBLOCK;
- fcntl( $socket, F_SETFL, $newflags );
-}
-
-# removed
-sub EnableServerResponseInLiteral { undef }
-
-sub Wrap { shift->Clear(@_) }
-
-# The following class method is for creating valid dates in appended msgs:
-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);
-
-sub Rfc822_date {
- my $class = shift;
- my $date = $class =~ /^\d+$/ ? $class : shift; # method or function?
- my @date = gmtime($date);
-
- #Date: Fri, 09 Jul 1999 13:10:55 -0000
- sprintf(
- "%s, %02d %s %04d %02d:%02d:%02d -%04d",
- $dow[ $date[6] ],
- $date[3],
- $mnt[ $date[4] ],
- $date[5] + 1900,
- $date[2], $date[1], $date[0], $date[8]
- );
-}
-
-# The following methods create valid dates for use in IMAP search strings
-# - provide Rfc2060* methods/functions for backwards compatibility
-sub Rfc2060_date {
- $_[0] =~ /^\d+$/ ? Rfc3501_date(@_) : shift->Rfc3501_date(@_);
-}
-
-sub Rfc3501_date {
- my $class = shift;
- my $stamp = $class =~ /^\d+$/ ? $class : shift;
- my @date = gmtime($stamp);
-
- # 11-Jan-2000
- sprintf( "%02d-%s-%04d", $date[3], $mnt[ $date[4] ], $date[5] + 1900 );
-}
-
-sub Rfc2060_datetime($;$) {
- $_[0] =~ /^\d+$/ ? Rfc3501_datetime(@_) : shift->Rfc3501_datetime(@_);
-}
-
-sub Rfc3501_datetime($;$) {
- my $class = shift;
- my $stamp = $class =~ /^\d+$/ ? $class : shift;
- my $zone = shift || '+0000';
- my @date = gmtime($stamp);
-
- # 11-Jan-2000 04:04:04 +0000
- sprintf(
- "%02d-%s-%04d %02d:%02d:%02d %s",
- $date[3],
- $mnt[ $date[4] ],
- $date[5] + 1900,
- $date[2], $date[1], $date[0], $zone
- );
-}
-
-# Change CRLF into \n
-sub Strip_cr {
- my $class = shift;
- if ( !ref $_[0] && @_ == 1 ) {
- ( my $string = $_[0] ) =~ s/$CRLF/\n/og;
- return $string;
- }
-
- return wantarray
- ? map { s/$CRLF/\n/og; $_ } ( ref $_[0] ? @{ $_[0] } : @_ )
- : [ map { s/$CRLF/\n/og; $_ } ( ref $_[0] ? @{ $_[0] } : @_ ) ];
-}
-
-# The following defines a special method to deal with the Clear parameter:
-sub Clear {
- my ( $self, $clear ) = @_;
- defined $clear or return $self->{Clear};
-
- my $oldclear = $self->{Clear};
- $self->{Clear} = $clear;
-
- my @keys = reverse $self->_trans_index;
-
- for ( my $i = $clear ; $i < @keys ; $i++ ) {
- delete $self->{History}{ $keys[$i] };
- }
-
- return $oldclear;
-}
-
-# read-only access to the transaction number
-sub Transaction { shift->Count }
-
-# remove doubles from list
-sub _remove_doubles(@) {
- my %seen;
- grep { !$seen{ $_->{name} }++ } @_;
-}
-
-# the constructor:
-sub new {
- my $class = shift;
- my $self = {
- LastError => "",
- Uid => 1,
- Count => 0,
- Clear => 2,
- Keepalive => 0,
- Maxappendstringlength => 1024**2,
- Maxcommandlength => 1000,
- Maxtemperrors => undef,
- State => Unconnected,
- Authmechanism => 'LOGIN',
- Timeout => 600,
- History => {},
- };
- while (@_) {
- my $k = ucfirst lc shift;
- my $v = shift;
- $self->{$k} = $v if defined $v;
- }
- bless $self, ref($class) || $class;
-
- # Fast_io is enabled by default when not given a socket
- unless ( exists $self->{Fast_io} || $self->{Socket} || $self->{Rawsocket} )
- {
- $self->{Fast_io} = 1;
- }
-
- if ( my $sup = $self->{Supportedflags} ) { # unpack into case-less HASH
- my %sup = map { m/^\\?(\S+)/ ? lc $1 : () } @$sup;
- $self->{Supportedflags} = \%sup;
- }
-
- $self->{Debug_fh} ||= \*STDERR;
- CORE::select( ( select( $self->{Debug_fh} ), $|++ )[0] );
-
- if ( $self->Debug ) {
- $self->_debug( "Started at " . localtime() );
- $self->_debug("Using Mail::IMAPClient version $VERSION on perl $]");
- }
-
- # BUG? return undef on Socket() failure?
- $self->Socket( $self->{Socket} )
- if $self->{Socket};
-
- if ( $self->{Rawsocket} ) {
- my $sock = delete $self->{Rawsocket};
-
- # Ignore Rawsocket if Socket is set. BUG? should we carp/croak?
- $self->RawSocket($sock) unless $self->{Socket};
- }
-
- if ( !$self->{Socket} && $self->{Server} ) {
- $self->connect or return undef;
- }
- return $self;
-}
-
-sub connect(@) {
- my $self = shift;
-
- # BUG? We should restrict which keys can be passed/set here.
- %$self = ( %$self, @_ ) if @_;
-
- my @sockargs = $self->Timeout ? ( Timeout => $self->Timeout ) : ();
- push( @sockargs, $self->Debug ? ( Debug => $self->Debug ) : () );
-
- # give caller control of IO::Socket::... args to new if desired
- if ( $self->Socketargs and ref $self->Socketargs eq "ARRAY" ) {
- push( @sockargs, @{ $self->Socketargs } );
- }
-
- # if no server, use " " to induce a non-fatal error
- my $server = $self->Server || " ";
- my $port = $self->Port || $self->Port( $self->Ssl ? "993" : "143" );
- my ( $ioclass, $sock );
-
- if ( File::Spec->file_name_is_absolute($server) ) {
- $ioclass = $self->_load_module("UNIX");
- unshift( @sockargs, Peer => $server );
- }
- else {
- unshift(
- @sockargs,
- PeerAddr => $server,
- PeerPort => $port,
- Proto => "tcp",
- );
-
- # pass SSL args if requested; default to IO::Socket::(IP|INET)
- if ( $self->Ssl ) {
- $ioclass = $self->_load_module("SSL");
- push( @sockargs, @{ $self->Ssl } ) if ref $self->Ssl eq "ARRAY";
- }
- else {
- $ioclass = $self->_load_module("IP");
- $ioclass = $self->_load_module("INET") unless $ioclass;
- }
- }
-
- if ($ioclass) {
- $self->_debug("Connecting with $ioclass @sockargs");
- $sock = $ioclass->new(@sockargs);
- }
-
- if ($sock) {
- $self->_debug( "Connected to $server" . ( $! ? " errno($!)" : "" ) );
- return $self->Socket($sock);
- }
- else {
- my $lasterr = $self->LastError;
- if ( !$lasterr and $self->Ssl and $ioclass ) {
- $lasterr = $ioclass->errstr;
- }
- $lasterr ||= "";
- $self->LastError("Unable to connect to $server: $lasterr");
- return undef;
- }
-}
-
-sub RawSocket(;$) {
- my ( $self, $sock ) = @_;
- defined $sock
- or return $self->{Socket};
-
- $self->{Socket} = $sock;
- $self->{_select} = IO::Select->new($sock);
-
- delete $self->{_fcntl};
- $self->Fast_io( $self->Fast_io );
-
- return $sock;
-}
-
-sub Socket($) {
- my ( $self, $sock ) = @_;
- defined $sock
- or return $self->{Socket};
-
- $self->RawSocket($sock);
- $self->State(Connected);
-
- setsockopt( $sock, SOL_SOCKET, SO_KEEPALIVE, 1 ) if $self->Keepalive;
-
- # LastError may be set by _read_line via _get_response
- # look for "* (OK|BAD|NO|PREAUTH)"
- my $code = $self->_get_response( '*', 'PREAUTH' ) or return undef;
-
- if ( $code eq 'BYE' || $code eq 'NO' ) {
- $self->State(Unconnected);
- return undef;
- }
- elsif ( $code eq 'PREAUTH' ) {
- $self->State(Authenticated);
- return $self;
- }
-
- if ( $self->Starttls ) {
- $self->starttls or return undef;
- }
-
- if ( defined $self->User && defined $self->Password ) {
- $self->login or return undef;
- }
-
- return $self->{Socket};
-}
-
-# RFC2595 section 3.1
-sub starttls {
- my ($self) = @_;
-
- # BUG? RFC requirement checks commented out for now...
- #if ( $self->IsUnconnected or $self->IsAuthenticated ) {
- # $self->LastError("NO must be connected but not authenticated");
- # return undef;
- #}
-
- # BUG? strict check on capability commented out for now...
- #return undef unless $self->has_capability("STARTTLS");
-
- $self->_imap_command("STARTTLS") or return undef;
-
- # MUST discard cached capability info; should re-issue capability command
- delete $self->{CAPABILITY};
-
- my $ioclass = $self->_load_module("SSL") or return undef;
- my $sock = $self->RawSocket;
- my $blocking = $sock->blocking;
-
- # BUG: force blocking for now
- $sock->blocking(1);
-
- # give caller control of args to start_SSL if desired
- my @sslargs =
- ( $self->Starttls and ref( $self->Starttls ) eq "ARRAY" )
- ? ( @{ $self->Starttls } )
- : ( Timeout => 30 );
-
- unless ( $ioclass->start_SSL( $sock, @sslargs ) ) {
- $self->LastError( "Unable to start TLS: " . $ioclass->errstr );
- return undef;
- }
-
- # return blocking to previous setting
- $sock->blocking($blocking);
-
- return $self;
-}
-
-# RFC4978 COMPRESS
-sub compress {
- my ($self) = @_;
-
- # BUG? strict check on capability commented out for now...
- #my $can = $self->has_capability("COMPRESS")
- #return undef unless $can and $can eq "DEFLATE";
-
- $self->_imap_command("COMPRESS DEFLATE") or return undef;
-
- my $zcl = $self->_load_module("Compress-Zlib") or return undef;
-
- # give caller control of args if desired
- $self->Compress(
- [
- -WindowBits => -$zcl->MAX_WBITS(),
- -Level => $zcl->Z_BEST_SPEED()
- ]
- ) unless ( $self->Compress and ref( $self->Compress ) eq "ARRAY" );
-
- my ( $rc, $do, $io );
-
- ( $do, $rc ) = Compress::Zlib::deflateInit( @{ $self->Compress } );
- unless ( $rc == $zcl->Z_OK ) {
- $self->LastError("deflateInit failed (rc=$rc)");
- return undef;
- }
-
- ( $io, $rc ) =
- Compress::Zlib::inflateInit( -WindowBits => -$zcl->MAX_WBITS() );
- unless ( $rc == $zcl->Z_OK ) {
- $self->LastError("inflateInit failed (rc=$rc)");
- return undef;
- }
-
- $self->{Prewritemethod} = sub {
- my ( $imap, $string ) = @_;
-
- my ( $rc, $out1, $out2 );
- ( $out1, $rc ) = $do->deflate($string);
- ( $out2, $rc ) = $do->flush( $zcl->Z_PARTIAL_FLUSH() )
- unless ( $rc != $zcl->Z_OK );
-
- unless ( $rc == $zcl->Z_OK ) {
- $self->LastError("deflate/flush failed (rc=$rc)");
- return undef;
- }
-
- return $out1 . $out2;
- };
-
- # need to retain some state for Readmoremethod/Readmethod calls
- my ( $Zbuf, $Ibuf ) = ( "", "" );
-
- $self->{Readmoremethod} = sub {
- my $self = shift;
- return 1 if ( length($Zbuf) || length($Ibuf) );
- $self->__read_more(@_);
- };
-
- $self->{Readmethod} = sub {
- my ( $imap, $fh, $buf, $len, $off ) = @_;
-
- # get more data, but empty $Ibuf first if any data is left
- my ( $lz, $li ) = ( length $Zbuf, length $Ibuf );
- if ( $lz || !$li ) {
- my $ret = sysread( $fh, $Zbuf, $len, length $Zbuf );
- $lz = length $Zbuf;
- return $ret if ( !$ret && !$lz ); # $ret is undef or 0
- }
-
- # accumulate inflated data in $Ibuf
- if ($lz) {
- my ( $tbuf, $rc ) = $io->inflate( \$Zbuf );
- unless ( $rc == $zcl->Z_OK ) {
- $self->LastError("inflate failed (rc=$rc)");
- return undef;
- }
- $Ibuf .= $tbuf;
- }
-
- # pull desired length of data from $Ibuf
- my $tbuf = substr( $Ibuf, 0, $len );
- substr( $Ibuf, 0, $len ) = "";
- substr( $$buf, $off ) = $tbuf;
-
- return length $tbuf;
- };
-
- return $self;
-}
-
-sub login {
- my $self = shift;
- my $auth = $self->Authmechanism;
-
- if ( $auth && $auth ne 'LOGIN' ) {
- $self->authenticate( $auth, $self->Authcallback )
- or return undef;
- }
- else {
- my $user = $self->User;
- my $passwd = $self->Password;
-
- return undef unless ( defined($passwd) and defined($user) );
-
- # if user is passed as a literal:
- # 1. send passwd as a literal
- # 2. empty literal passwd are sent as an blank line ($CRLF)
- $user = $self->Quote($user);
- if ( $user =~ /^{/ ) {
- my $nopasswd = ( $passwd eq "" ) ? 1 : 0;
- $passwd = $self->Quote( $passwd, 1 ); # force literal
- $passwd .= $CRLF if ($nopasswd); # blank line
- }
- else {
- $passwd = $self->Quote($passwd);
- }
-
- $self->_imap_command("LOGIN $user $passwd")
- or return undef;
- }
-
- $self->State(Authenticated);
- if ( $self->Compress ) {
- $self->compress or return undef;
- }
- return $self;
-}
-
-sub noop {
- my ($self) = @_;
- $self->_imap_command("NOOP") ? $self->Results : undef;
-}
-
-sub proxyauth {
- my ( $self, $user ) = @_;
- $user = $self->Quote($user);
- $self->_imap_command("PROXYAUTH $user") ? $self->Results : undef;
-}
-
-sub separator {
- my ( $self, $target ) = @_;
- unless ( defined $target ) {
-
- # separator is namespace's 1st thing's 1st thing's 2nd thing:
- my $ns = $self->namespace or return undef;
- if ($ns) {
- my $sep = $ns->[0][0][1];
- return $sep if $sep;
- }
- $target = '';
- }
-
- return $self->{separators}{$target}
- if exists $self->{separators}{$target};
-
- my $list = $self->list( undef, $target ) or return undef;
-
- foreach my $line (@$list) {
- my $rec = $self->_list_or_lsub_response_parse($line);
- next unless defined $rec->{name};
- $self->{separators}{ $rec->{name} } = $rec->{delim};
- }
- return $self->{separators}{$target};
-}
-
-# BUG? caller gets empty list even if Error
-# - returning an array with a single undef value seems even worse though
-sub sort {
- my ( $self, $crit, @a ) = @_;
-
- $crit =~ /^\(.*\)$/ # wrap criteria in parens
- or $crit = "($crit)";
-
- my @hits;
- if ( $self->_imap_uid_command( SORT => $crit, @a ) ) {
- my @results = $self->History;
- foreach (@results) {
- chomp;
- s/$CR$//;
- s/^\*\s+SORT\s+// or next;
- push @hits, grep /\d/, split;
- }
- }
- return wantarray ? @hits : \@hits;
-}
-
-sub _list_or_lsub {
- my ( $self, $cmd, $reference, $target ) = @_;
- defined $reference or $reference = '';
- defined $target or $target = '*';
- length $target or $target = '""';
-
- $target eq '*' || $target eq '""'
- or $target = $self->Quote($target);
-
- $self->_imap_command(qq($cmd "$reference" $target))
- or return undef;
-
- return wantarray ? $self->Escaped_history : $self->Escaped_results;
-}
-
-sub list { shift->_list_or_lsub( "LIST", @_ ) }
-sub lsub { shift->_list_or_lsub( "LSUB", @_ ) }
-
-# deprecated 3.34
-sub xlist {
- my ($self) = @_;
- return undef unless $self->has_capability("XLIST");
- shift->_list_or_lsub( "XLIST", @_ );
-}
-
-sub _folders_or_subscribed {
- my ( $self, $method, $what ) = @_;
- my @folders;
-
- # do BLOCK allowing use of "last if undef/error" and avoiding dup code
- do {
- {
- my @list;
- if ($what) {
- my $sep = $self->separator($what) || $self->separator(undef);
- last unless defined $sep;
-
- my $whatsub = $what =~ m/\Q${sep}\E$/ ? "$what*" : "$what$sep*";
-
- my $tref = $self->$method( undef, $whatsub ) or last;
- shift @$tref; # remove command
- push @list, @$tref;
-
- # BUG?: this behavior has been around since 2.x, why?
- my $cansel = $self->selectable($what);
- last unless defined $cansel;
- if ($cansel) {
- $tref = $self->$method( undef, $what ) or last;
- shift @$tref; # remove command
- push @list, @$tref;
- }
- }
- else {
- my $tref = $self->$method( undef, undef ) or last;
- shift @$tref; # remove command
- push @list, @$tref;
- }
-
- foreach my $resp (@list) {
- my $rec = $self->_list_or_lsub_response_parse($resp);
- next unless defined $rec->{name};
- next if first { lc($_) eq '\noselect' } @{ $rec->{attrs} };
- push @folders, $rec;
- }
- }
- };
-
- my @clean = _remove_doubles @folders;
- return wantarray ? @clean : \@clean;
-}
-
-sub folders {
- my ( $self, $what ) = @_;
-
- my @folders =
- map( $_->{name}, $self->_folders_or_subscribed( "list", $what ) );
- return wantarray ? @folders : \@folders;
-}
-
-sub folders_hash {
- my ( $self, $what ) = @_;
-
- my @folders_hash = $self->_folders_or_subscribed( "list", $what );
- return wantarray ? @folders_hash : \@folders_hash;
-}
-
-# deprecated 3.34
-sub xlist_folders {
- my ($self) = @_;
- my $xlist = $self->xlist;
- return undef unless defined $xlist;
-
- my %xlist;
- my $xlist_re = qr/\A\\(Inbox|AllMail|Trash|Drafts|Sent|Spam|Starred)\Z/;
-
- for my $resp (@$xlist) {
- my $rec = $self->_list_or_lsub_response_parse($resp);
- next unless defined $rec->{name};
- for my $attr ( @{ $rec->{attrs} } ) {
- $xlist{$1} = $rec->{name} if ( $attr =~ $xlist_re );
- }
- }
-
- return wantarray ? %xlist : \%xlist;
-}
-
-sub subscribed {
- my ( $self, $what ) = @_;
- my @folders =
- map( $_->{name}, $self->_folders_or_subscribed( "lsub", $what ) );
- return wantarray ? @folders : \@folders;
-}
-
-sub deleteacl {
- my ( $self, $target, $user ) = @_;
- $target = $self->Quote($target);
- $user = $self->Quote($user);
-
- $self->_imap_command(qq(DELETEACL $target $user))
- or return undef;
-
- return wantarray ? $self->History : $self->Results;
-}
-
-sub setacl {
- my ( $self, $target, $user, $acl ) = @_;
- $target ||= $self->Folder;
- $target = $self->Quote($target);
-
- $user ||= $self->User;
- $user = $self->Quote($user);
- $acl = $self->Quote($acl);
-
- $self->_imap_command(qq(SETACL $target $user $acl))
- or return undef;
-
- return wantarray ? $self->History : $self->Results;
-}
-
-sub getacl {
- my ( $self, $target ) = @_;
- defined $target or $target = $self->Folder;
- my $mtarget = $self->Quote($target);
- $self->_imap_command(qq(GETACL $mtarget))
- or return undef;
-
- my @history = $self->History;
- my $hash;
- for ( my $x = 0 ; $x < @history ; $x++ ) {
- next if $history[$x] !~ /^\* ACL/;
-
- my $perm =
- $history[$x] =~ /^\* ACL $/
- ? $history[ ++$x ] . $history[ ++$x ]
- : $history[$x];
-
- $perm =~ s/\s?$CRLF$//o;
- until ( $perm =~ /\Q$target\E"?$/ || !$perm ) {
- $perm =~ s/\s([^\s]+)\s?$// or last;
- my $p = $1;
- $perm =~ s/\s([^\s]+)\s?$// or last;
- my $u = $1;
- $hash->{$u} = $p;
- $self->_debug("Permissions: $u => $p");
- }
- }
- return $hash;
-}
-
-sub listrights {
- my ( $self, $target, $user ) = @_;
- $target ||= $self->Folder;
- $target = $self->Quote($target);
-
- $user ||= $self->User;
- $user = $self->Quote($user);
-
- $self->_imap_command(qq(LISTRIGHTS $target $user))
- or return undef;
-
- my $resp = first { /^\* LISTRIGHTS/ } $self->History;
- my @rights = split /\s/, $resp;
- my $rights = join '', @rights[ 4 .. $#rights ];
- $rights =~ s/"//g;
- return wantarray ? split( //, $rights ) : $rights;
-}
-
-sub select {
- my ( $self, $target ) = @_;
- defined $target or return undef;
-
- my $qqtarget = $self->Quote($target);
- my $old = $self->Folder;
-
- $self->_imap_command("SELECT $qqtarget")
- or return undef;
-
- $self->State(Selected);
- $self->Folder($target);
- return $old || $self; # ??$self??
-}
-
-sub message_string {
- my ( $self, $msg ) = @_;
-
- return undef unless defined $self->imap4rev1;
- my $peek = $self->Peek ? '.PEEK' : '';
- my $cmd = $self->imap4rev1 ? "BODY$peek\[]" : "RFC822$peek";
-
- my $string;
- $self->message_to_file( \$string, $msg );
-
- unless ( $self->Ignoresizeerrors ) { # Check size with expected size
- my $expected_size = $self->size($msg);
- return undef unless defined $expected_size;
-
- # RFC822.SIZE may be wrong, see RFC2683 3.4.5 "RFC822.SIZE"
- if ( length($string) != $expected_size ) {
- $self->LastError( "message_string() "
- . "expected $expected_size bytes but received "
- . length($string)
- . " you may need the IgnoreSizeErrors option" );
- return undef;
- }
- }
-
- return $string;
-}
-
-sub bodypart_string {
- my ( $self, $msg, $partno, $bytes, $offset ) = @_;
-
- unless ( $self->imap4rev1 ) {
- $self->LastError( "Unable to get body part; server "
- . $self->Server
- . " does not support IMAP4REV1" )
- unless $self->LastError;
- return undef;
- }
-
- $offset ||= 0;
- my $cmd = "BODY"
- . ( $self->Peek ? '.PEEK' : '' )
- . "[$partno]"
- . ( $bytes ? "<$offset.$bytes>" : '' );
-
- $self->fetch( $msg, $cmd )
- or return undef;
-
- $self->_transaction_literals;
-}
-
-# message_to_file( $self, $file, @msgs )
-sub message_to_file {
- my ( $self, $file, @msgs ) = @_;
-
- # $file can be a name or a scalar reference (for in memory file)
- # avoid IO::File bug handling scalar refs in perl <= 5.8.8?
- # - buggy: $fh = IO::File->new( $file, 'r' )
- my $fh;
- if ( ref $file and ref $file ne "SCALAR" ) {
- $fh = $file;
- }
- else {
- $$file = "" if ( ref $file eq "SCALAR" and !defined $$file );
- local ($!);
- open( $fh, ">>", $file );
- unless ( defined($fh) ) {
- $self->LastError("Unable to open file '$file': $!");
- return undef;
- }
- }
-
- binmode($fh);
-
- unless (@msgs) {
- $self->LastError("message_to_file: NO messages specified!");
- return undef;
- }
-
- my $peek = $self->Peek ? '.PEEK' : '';
- $peek = sprintf( $self->imap4rev1 ? "BODY%s\[]" : "RFC822%s", $peek );
-
- my @args = ( join( ",", @msgs ), $peek );
-
- return $self->_imap_uid_command( { outref => $fh }, "FETCH" => @args )
- ? $self
- : undef;
-}
-
-sub message_uid {
- my ( $self, $msg ) = @_;
-
- my $ref = $self->fetch( $msg, "UID" ) or return undef;
- foreach (@$ref) {
- return $1 if m/\(UID\s+(\d+)\s*\)$CR?$/o;
- }
- return undef;
-}
-
-# cleaned up and simplified but see TODO in code...
-sub migrate {
- my ( $self, $peer, $msgs, $folder ) = @_;
-
- unless ( $peer and $peer->IsConnected ) {
- $self->LastError( ( $peer ? "Invalid" : "Unconnected" )
- . " target "
- . ref($self)
- . " object in migrate()"
- . ( $peer ? ( ": " . $peer->LastError ) : "" ) );
- return undef;
- }
-
- # sanity check to see if $self is same object as $peer
- if ( $self eq $peer ) {
- $self->LastError("dest must not be the same object as self");
- return undef;
- }
-
- $folder = $self->Folder unless ( defined $folder );
- unless ($folder) {
- $self->LastError("No folder selected on source mailbox.");
- return undef;
- }
-
- unless ( $peer->exists($folder) or $peer->create($folder) ) {
- $self->LastError( "Create folder '$folder' on target host failed: "
- . $peer->LastError );
- return undef;
- }
-
- if ( !defined $msgs or uc($msgs) eq "ALL" ) {
- $msgs = $self->search("ALL") or return undef;
- }
-
- # message size and (internal) date
- my @headers = qw(RFC822.SIZE INTERNALDATE FLAGS);
- my $range = $self->Range($msgs);
-
- $self->_debug("Messages to migrate from '$folder': $range");
-
- foreach my $mid ( $range->unfold ) {
-
- # fetch size internaldate and flags of original message
- # - TODO: add flags here...
- my $minfo = $self->fetch_hash( $mid, @headers )
- or return undef;
-
- my ( $size, $date ) = @{ $minfo->{$mid} }{@headers};
- return undef unless ( defined $size and defined $date );
-
- $self->_debug("Copy message $mid (sz=$size,dt=$date) from '$folder'");
-
- my @flags = grep !/\\Recent/i, $self->flags($mid);
- my $flags = join ' ', $peer->supported_flags(@flags);
-
- # TODO: - use File::Temp tempfile if $msg > bufferSize?
- # read message to $msg
- my $msg;
- $self->message_to_file( \$msg, $mid )
- or return undef;
-
- my $newid = $peer->append_file( $folder, \$msg, undef, $flags, $date );
-
- unless ( defined $newid ) {
- $self->LastError(
- "Append to '$folder' on target failed: " . $peer->LastError );
- return undef;
- }
-
- $self->_debug("Copied UID $mid in '$folder' to target UID $newid");
- }
-
- return $self;
-}
-
-# Optimization of wait time between syswrite calls only runs if syscalls
-# run too fast and fill the buffer causing "EAGAIN: Resource Temp. Unavail"
-# errors. The premise is that $maxwrite will be approx. the same as the
-# smallest buffer between the sending and receiving side. Waiting time
-# between syscalls should ideally be exactly as long as it takes the
-# receiving side to empty that buffer, minus a little bit to prevent it
-# from emptying completely and wasting time in the select call.
-
-sub _optimal_sleep($$$) {
- my ( $self, $maxwrite, $waittime, $last5writes ) = @_;
-
- push @$last5writes, $waittime;
- shift @$last5writes if @$last5writes > 5;
-
- my $bufferavail = ( sum @$last5writes ) / @$last5writes;
-
- if ( $bufferavail < .4 * $maxwrite ) {
-
- # Buffer is staying pretty full; we should increase the wait
- # period to reduce transmission overhead/number of packets sent
- $waittime *= 1.3;
- }
- elsif ( $bufferavail > .9 * $maxwrite ) {
-
- # Buffer is nearly or totally empty; we're wasting time in select
- # call that could be used to send data, so reduce the wait period
- $waittime *= .5;
- }
-
- CORE::select( undef, undef, undef, $waittime );
- $waittime;
-}
-
-sub body_string {
- my ( $self, $msg ) = @_;
- my $ref =
- $self->fetch( $msg, "BODY" . ( $self->Peek ? ".PEEK" : "" ) . "[TEXT]" )
- or return undef;
-
- my $string = join '', map { $_->[DATA] }
- grep { $self->_is_literal($_) } @$ref;
-
- return $string
- if $string;
-
- my $head;
- while ( $head = shift @$ref ) {
- $self->_debug("body_string: head = '$head'");
-
- last
- if $head =~
- /(?:.*FETCH .*\(.*BODY\[TEXT\])|(?:^\d+ BAD )|(?:^\d NO )/i;
- }
-
- unless (@$ref) {
- $self->LastError(
- "Unable to parse server response from " . $self->LastIMAPCommand );
- return undef;
- }
-
- my $popped;
- $popped = pop @$ref
- until ( $popped && $popped =~ /^\)$CRLF$/o )
- || !grep /^\)$CRLF$/o, @$ref;
-
- if ( $head =~ /BODY\[TEXT\]\s*$/i ) { # Next line is a literal
- $string .= shift @$ref while @$ref;
- $self->_debug("String is now $string")
- if $self->Debug;
- }
-
- $string;
-}
-
-sub examine {
- my ( $self, $target ) = @_;
- defined $target or return undef;
-
- $self->_imap_command( 'EXAMINE ' . $self->Quote($target) )
- or return undef;
-
- my $old = $self->Folder;
- $self->Folder($target);
- $self->State(Selected);
- $old || $self;
-}
-
-sub idle {
- my $self = shift;
- my $good = '+';
- my $count = $self->Count + 1;
- $self->_imap_command( "IDLE", $good ) ? $count : undef;
-}
-
-sub idle_data {
- my $self = shift;
- my $timeout = scalar(@_) ? shift : 0;
- my $socket = $self->Socket;
-
- # current index in Results array
- my $trans_c1 = $self->_next_index;
-
- # look for all untagged responses
- my ( $rc, $ret );
-
- do {
- $ret =
- $self->_read_more( { error_on_timeout => 0 }, $socket, $timeout );
-
- # set rc on first pass or on errors
- $rc = $ret if ( !defined($rc) or $ret < 0 );
-
- # not using /\S+/ because that can match 0 in "* 0 RECENT"
- # leading the library to act as if things failed
- if ( $ret > 0 ) {
- $self->_get_response( '*', qr/(?!BAD|BYE|NO)(?:\d+\s+\w+|\S+)/ )
- or return undef;
- $timeout = 0; # check for more data without blocking!
- }
- } while $ret > 0 and $self->IsConnected;
-
- # select returns -1 on errors
- return undef if $rc < 0;
-
- my $trans_c2 = $self->_next_index;
-
- # if current index in Results array has changed return data
- my @res;
- if ( $trans_c1 < $trans_c2 ) {
- @res = $self->Results;
- @res = @res[ $trans_c1 .. ( $trans_c2 - 1 ) ];
- }
- return wantarray ? @res : \@res;
-}
-
-sub done {
- my $self = shift;
- my $count = shift || $self->Count;
-
- # DONE looks like a tag when sent and not already in IDLE
- $self->_imap_command(
- { addtag => 0, tag => qr/(?:$count|DONE)/, doretry => 0 }, "DONE" )
- or return undef;
- return $self->Results;
-}
-
-# tag_and_run( $self, $string, $good )
-sub tag_and_run {
- my $self = shift;
- $self->_imap_command(@_) or return undef;
- return $self->Results;
-}
-
-sub reconnect {
- my $self = shift;
-
- if ( $self->IsAuthenticated ) {
- $self->_debug("reconnect called but already authenticated");
- return 1;
- }
-
- # safeguard from deep recursion via connect
- if ( $self->{_doing_reconnect} ) {
- $self->_debug("recursive call to reconnect, returning 0\n");
- $self->LastError("unexpected reconnect recursion")
- unless $self->LastError;
- return 0;
- }
-
- my $einfo = $self->LastError || "";
- $self->_debug( "reconnecting to ", $self->Server, ", last error: $einfo" );
- $self->{_doing_reconnect} = 1;
-
- # reconnect and select appropriate folder
- my $ret;
- if ( $self->connect ) {
- $ret = 1;
- if ( defined $self->Folder ) {
- $ret = defined( $self->select( $self->Folder ) ) ? 1 : undef;
- }
- }
-
- delete $self->{_doing_reconnect};
- return $ret ? 1 : $ret;
-}
-
-# wrapper for _imap_command_do to enable retrying on lost connections
-# options:
-# doretry => 0|1 - suppress|allow retry after reconnect
-sub _imap_command {
- my $self = shift;
- my $opt = ref( $_[0] ) eq "HASH" ? $_[0] : {};
-
- my $tries = 0;
- my $retry = $self->Reconnectretry || 0;
- my ( $rc, @err );
-
- # LastError (if set) will be overwritten masking any earlier errors
- while ( $tries++ <= $retry ) {
-
- # do command on the first try or if Connected (reconnect ongoing)
- if ( $tries == 1 or $self->IsConnected ) {
- $rc = $self->_imap_command_do(@_);
- push( @err, $self->LastError ) if $self->LastError;
- }
-
- if ( !defined($rc) and $retry and $self->IsUnconnected ) {
- last
- unless (
- $! == EPIPE
- or $! == ECONNRESET
- or $self->LastError =~ /(?:error\(.*?\)|timeout) waiting\b/
- or $self->LastError =~ /(?:socket closed|\* BYE)\b/
-
- # BUG? reconnect if caller ignored/missed earlier errors?
- # or $self->LastError =~ /NO not connected/
- );
- my $ret = $self->reconnect;
- if ($ret) {
- $self->_debug("reconnect success($ret) on try #$tries/$retry");
- last if exists $opt->{doretry} and !$opt->{doretry};
- }
- elsif ( defined $ret and $ret == 0 ) { # escaping recursion
- return undef;
- }
- else {
- $self->_debug("reconnect failure on try #$tries/$retry");
- push( @err, $self->LastError ) if $self->LastError;
- }
- }
- else {
- last;
- }
- }
-
- unless ($rc) {
- my ( %seen, @keep, @info );
-
- foreach my $str (@err) {
- my ( $sz, $len ) = ( 96, length($str) );
- $str =~ s/$CR?$LF$/\\n/omg;
- if ( !$self->Debug and $len > $sz * 2 ) {
- my $beg = substr( $str, 0, $sz );
- my $end = substr( $str, -$sz, $sz );
- $str = $beg . "..." . $end;
- }
- next if $seen{$str}++;
- push( @keep, $str );
- }
- foreach my $msg (@keep) {
- push( @info, $msg . ( $seen{$msg} > 1 ? " ($seen{$msg}x)" : "" ) );
- }
- $self->LastError( join( "; ", @info ) );
- }
-
- return $rc;
-}
-
-# _imap_command_do runs a command, inserting a tag and CRLF as requested
-# options:
-# addcrlf => 0|1 - suppress adding CRLF to $string
-# addtag => 0|1 - suppress adding $tag to $string
-# tag => $tag - use this $tag instead of incrementing $self->Count
-# outref => ... - see _get_response()
-sub _imap_command_do {
- my $self = shift;
- my $opt = ref( $_[0] ) eq "HASH" ? shift : {};
- my $string = shift or return undef;
- my $good = shift;
-
- my @gropt = ( $opt->{outref} ? { outref => $opt->{outref} } : () );
-
- $opt->{addcrlf} = 1 unless exists $opt->{addcrlf};
- $opt->{addtag} = 1 unless exists $opt->{addtag};
-
- # reset error in case the last error was non-fatal but never cleared
- if ( $self->LastError ) {
-
- #DEBUG $self->_debug( "Reset LastError: " . $self->LastError );
- $self->LastError(undef);
- }
-
- my $clear = $self->Clear;
- $self->Clear($clear)
- if $self->Count >= $clear && $clear > 0;
-
- my $count = $self->Count( $self->Count + 1 );
- my $tag = $opt->{tag} || $count;
- $string = "$tag $string" if $opt->{addtag};
-
- # for APPEND (append_string) only log first line of command
- my $logstr = ( $string =~ /^($tag\s+APPEND\s+.*?)$CR?$LF/ ) ? $1 : $string;
-
- # BUG? use $self->_next_index($tag) ? or 0 ???
- # $self->_record($tag, [$self->_next_index($tag), "INPUT", $logstr] );
- $self->_record( $count, [ 0, "INPUT", $logstr ] );
-
- # $suppress (adding CRLF) set to 0 if $opt->{addcrlf} is TRUE
- unless ( $self->_send_line( $string, $opt->{addcrlf} ? 0 : 1 ) ) {
- $self->LastError( "Error sending '$logstr': " . $self->LastError );
- return undef;
- }
-
- # look for " (OK|BAD|NO|$good)" (or "+..." if $good is '+')
- my $code = $self->_get_response( @gropt, $tag, $good ) or return undef;
-
- if ( $code eq 'OK' ) {
- return $self;
- }
- elsif ( $good and $code eq $good ) {
- return $self;
- }
- else {
- return undef;
- }
-}
-
-sub _response_code_sub {
- my ( $self, $tag, $good ) = @_;
-
- # tag/good can be a ref (compiled regex) otherwise quote it
- my $qtag = ref($tag) ? $tag : defined($tag) ? quotemeta($tag) : undef;
- my $qgood = ref($good) ? $good : defined($good) ? quotemeta($good) : undef;
-
- # using closure, a variable alias, and sub returns on first match
- # - $_[0] is $o->[DATA]
- # - returns list ( $code, $byemsg )
- my $getcodesub = sub {
- if ( defined $qgood ) {
- if ( $good eq '+' and $_[0] =~ /^$qgood/ ) {
- return ($good);
- }
- if ( defined $qtag and $_[0] =~ /^$qtag\s+($qgood)/i ) {
- return ( ref($qgood) ? $1 : uc($1) );
- }
- }
- if ( defined $qtag ) {
- if ( $tag eq '+' and $_[0] =~ /^$qtag/ ) {
- return ($tag);
- }
- if ( $_[0] =~ /^$qtag\s+(OK|BAD|NO)\b/i ) {
- my $code = uc($1);
- $self->LastError( $_[0] ) unless ( $code eq 'OK' );
- return ($code);
- }
- }
- if ( $_[0] =~ /^\*\s+(BYE)\b/i ) {
- return ( uc($1), $_[0] ); # ( 'BYE', $byemsg )
- }
- return (undef);
- };
-
- return $getcodesub;
-}
-
-# _get_response get IMAP response optionally send data somewhere
-# options:
-# outref => GLOB|CODE - reference to send output to (see _read_line)
-sub _get_response {
- my $self = shift;
- my $opt = ref( $_[0] ) eq "HASH" ? shift : {};
- my $tag = shift;
- my $good = shift;
-
- my $outref = $opt->{outref};
- my @readopt = defined($outref) ? ($outref) : ();
- my $getcode = $self->_response_code_sub( $tag, $good );
-
- my ( $count, $out, $code, $byemsg ) = ( $self->Count, [], undef, undef );
- until ( defined $code ) {
- my $output = $self->_read_line(@readopt) or return undef;
- $out = $output; # keep last response just in case
-
- # not using last on first match? paranoia or right thing?
- # only uc() when match is not on case where $tag|$good is a ref()
- foreach my $o (@$output) {
- $self->_record( $count, $o );
- $self->_is_output($o) or next;
- my ( $tcode, $tbyemsg ) = $getcode->( $o->[DATA] );
- $code = $tcode if ( defined $tcode );
- $byemsg = $tbyemsg if ( defined $tbyemsg );
- }
- }
-
- if ( defined $code ) {
- $code =~ s/$CR?$LF?$//o;
- $code = uc($code) unless ( $good and $code eq $good );
-
- # RFC 3501 7.1.5: $code on successful LOGOUT is OK not BYE
- # sometimes we may fail to wait long enough to read a tagged
- # OK so don't be strict about setting an error on LOGOUT!
- if ( $code eq 'BYE' ) {
- $self->State(Unconnected);
- if ($byemsg) {
- $self->LastError($byemsg)
- unless ( $good and $code eq $good );
- }
- }
- }
- elsif ( !$self->LastError ) {
- my $info = "unexpected response: " . join( " ", @$out );
- $self->LastError($info);
- }
-
- return $code;
-}
-
-sub _imap_uid_command {
- my $self = shift;
- my @opt = ref( $_[0] ) eq "HASH" ? (shift) : ();
- my $cmd = shift;
-
- my $args = @_ ? join( " ", '', @_ ) : '';
- my $uid = $self->Uid ? 'UID ' : '';
- $self->_imap_command( @opt, "$uid$cmd$args" );
-}
-
-sub run {
- my $self = shift;
- my $string = shift or return undef;
-
- my $tag = $string =~ /^(\S+) / ? $1 : undef;
- unless ($tag) {
- $self->LastError("No tag found in string passed to run(): $string");
- return undef;
- }
-
- $self->_imap_command( { addtag => 0, addcrlf => 0, tag => $tag }, $string )
- or return undef;
-
- $self->{History}{$tag} = $self->{History}{ $self->Count }
- unless $tag eq $self->Count;
-
- return $self->Results;
-}
-
-# _record saves the conversation into the History structure:
-sub _record {
- my ( $self, $count, $array ) = @_;
- if ( $array->[DATA] =~ /^\d+ LOGIN/i && !$self->Showcredentials ) {
- $array->[DATA] =~ s/LOGIN.*/LOGIN XXXXXXXX XXXXXXXX/i;
- }
-
- push @{ $self->{History}{$count} }, $array;
-}
-
-# try to avoid exposing auth info via debug unless Showcredentials is true
-sub _redact_line {
- my ( $self, $string ) = @_;
- $self->Showcredentials and return undef;
-
- my ( $tag, $cmd ) = ( $self->Count, undef );
- my $retext = "[Redact: Count=$tag Showcredentials=OFF]";
- my $show = $retext;
-
- # tagged command?
- if ( $string =~ s/^($tag\s+(\S+)\s+)// ) {
- ( $show, $cmd ) = ( $1, $2 );
-
- # login
- if ( $cmd =~ /login/i ) {
-
- # username as literal
- if ( $string =~ /^{/ ) {
- $show .= $string;
- }
-
- # username (possibly quoted) string, then literal? password
- elsif ( $string =~ s/^((?:"(?>(?:(?>[^"\\]+)|\\.)*)"|\S+)\s*)// ) {
- $show .= $1;
- $show .= ( $string =~ /^{/ ) ? $string : $retext;
- }
- }
- elsif ( $cmd =~ /^auth/i ) {
- $show .= $string;
- }
- else {
- return undef; # show it all
- }
- }
-
- return $show;
-}
-
-# _send_line handles literal data and supports the Prewritemethod
-sub _send_line {
- my ( $self, $string, $suppress ) = @_;
-
- $string =~ s/$CR?$LF?$/$CRLF/o
- unless $suppress;
-
- # handle case where string contains a literal
- if ( $string =~ s/^([^$LF\{]*\{\d+\}$CRLF)(?=.)//o ) {
- my $first = $1;
- if ( $self->Debug ) {
- my $dat =
- ( $self->IsConnected and !$self->IsAuthenticated )
- ? $self->_redact_line($string)
- : undef;
- $self->_debug( "Sending literal: $first\tthen: ", $dat || $string );
- }
- $self->_send_line($first) or return undef;
-
- # look for "$tag NO" or "+ ..."
- my $code = $self->_get_response( $self->Count, '+' ) or return undef;
- return undef unless $code eq '+';
- }
-
- # non-literal part continues...
- if ( my $prew = $self->Prewritemethod ) {
- $string = $prew->( $self, $string );
- }
-
- if ( $self->Debug ) {
- my $dat =
- ( $self->IsConnected and !$self->IsAuthenticated )
- ? $self->_redact_line($string)
- : undef;
- $self->_debug( "Sending: ", $dat || $string );
- }
-
- unless ( $self->IsConnected ) {
- $self->LastError("NO not connected");
- return undef;
- }
-
- $self->_send_bytes( \$string );
-}
-
-sub _send_bytes($) {
- my ( $self, $byteref ) = @_;
- my ( $total, $temperrs, $maxwrite ) = ( 0, 0, 0 );
- my $waittime = .02;
- my @previous_writes;
-
- my $maxagain = $self->Maxtemperrors;
- undef $maxagain if $maxagain and lc($maxagain) eq 'unlimited';
-
- local $SIG{PIPE} = 'IGNORE'; # handle SIGPIPE as normal error
-
- my $socket = $self->Socket;
- while ( $total < length $$byteref ) {
- my $written =
- syswrite( $socket, $$byteref, length($$byteref) - $total, $total );
-
- if ( defined $written ) {
- $temperrs = 0;
- $total += $written;
- next;
- }
-
- if ( $! == EAGAIN ) {
- if ( defined $maxagain && $temperrs++ > $maxagain ) {
- $self->LastError("Persistent error '$!'");
- return undef;
- }
-
- $waittime =
- $self->_optimal_sleep( $maxwrite, $waittime, \@previous_writes );
- next;
- }
-
- # Unconnected might be apropos for more than just these?
- my $emsg = $! ? "$!" : "no error caught";
- $self->State(Unconnected)
- if ( $! == EPIPE or $! == ECONNRESET or $! == EBADF );
- $self->LastError("Write failed '$emsg'");
-
- return undef; # no luck
- }
-
- $self->_debug("Sent $total bytes");
- return $total;
-}
-
-# _read_line: read one line from the socket
-#
-# $output = $self->_read_line($literal_callback)
-# literal_callback is optional, but if supplied it must be either
-# be a filehandle, coderef, or undef.
-#
-# Returns a reference to an array of arrays, i.e.:
-# $output = [
-# [ $index, 'OUTPUT|LITERAL', $output_line ],
-# [ $index, 'OUTPUT|LITERAL', $output_line ],
-# ...
-# \];
-
-# BUG?: make memory more efficient
-sub _read_line {
- my ( $self, $literal_callback ) = @_;
-
- my $socket = $self->Socket;
- unless ( $self->IsConnected && $socket ) {
- $self->LastError("NO not connected");
- return undef;
- }
-
- my $iBuffer = "";
- my $oBuffer = [];
- my $index = $self->_next_index;
- my $timeout = $self->Timeout;
- my $readlen = $self->Buffer || 4096;
- my $transno = $self->Transaction;
-
- my $literal_cbtype = "";
- if ($literal_callback) {
- if ( UNIVERSAL::isa( $literal_callback, "GLOB" ) ) {
- $literal_cbtype = "GLOB";
- }
- elsif ( UNIVERSAL::isa( $literal_callback, "CODE" ) ) {
- $literal_cbtype = "CODE";
- }
- else {
- $self->LastError( "'$literal_callback' is an "
- . "invalid callback; must be a filehandle or CODE" );
- return undef;
- }
- }
-
- my $temperrs = 0;
- my $maxagain = $self->Maxtemperrors;
- undef $maxagain if $maxagain and lc($maxagain) eq 'unlimited';
-
- until (
- @$oBuffer # there's stuff in output buffer:
- && $oBuffer->[-1][TYPE] eq 'OUTPUT' # that thing is an output line:
- && $oBuffer->[-1][DATA] =~
- /$CR?$LF$/o # the last thing there has cr-lf:
- && !length $iBuffer # and the input buffer has been MT'ed:
- )
- {
-
- if ($timeout) {
- my $rc = $self->_read_more( $socket, $timeout );
- return undef unless ( $rc > 0 );
- }
-
- my $emsg;
- my $ret =
- $self->_sysread( $socket, \$iBuffer, $readlen, length $iBuffer );
-
- if ($timeout) {
- if ( defined $ret ) {
- $temperrs = 0;
- }
- else {
- $emsg = "error while reading data from server: $!";
- if ( $! == ECONNRESET ) {
- $self->State(Unconnected);
- }
- elsif ( $! == EAGAIN ) {
- if ( defined $maxagain && $temperrs++ >= $maxagain ) {
- $emsg .= " ($temperrs)";
- }
- else {
- next; # try again
- }
- }
- }
- }
-
- if ( defined $ret && $ret == 0 ) { # Caught EOF...
- $emsg = "socket closed while reading data from server";
- $self->State(Unconnected);
- }
-
- # save errors and return
- if ($emsg) {
- $self->LastError($emsg);
- $self->_record(
- $transno,
- [
- $self->_next_index($transno), "ERROR", "$transno * NO $emsg"
- ]
- );
- return undef;
- }
-
- while ( $iBuffer =~ s/^(.*?$CR?$LF)//o ) # consume line
- {
- my $current_line = $1;
- if ( $current_line !~ s/\{(\d+)\}$CR?$LF$//o ) {
- push @$oBuffer, [ $index++, 'OUTPUT', $current_line ];
- next;
- }
-
- push @$oBuffer, [ $index++, 'OUTPUT', $current_line ];
-
- ## handle LITERAL
- # BLAH BLAH {nnn}$CRLF
- # [nnn bytes of literally transmitted stuff]
- # [part of line that follows literal data]$CRLF
-
- my $expected_size = $1;
-
- $self->_debug( "LITERAL: received literal in line "
- . "$current_line of length $expected_size; attempting to "
- . "retrieve from the "
- . length($iBuffer)
- . " bytes in: $iBuffer" );
-
- my $litstring;
- if ( length $iBuffer >= $expected_size ) {
-
- # already received all data
- $litstring = substr $iBuffer, 0, $expected_size, '';
- }
- else { # literal data still to arrive
- $litstring = $iBuffer;
- $iBuffer = '';
-
- my $litreadb = length($litstring);
- my $temperrs = 0;
- my $maxagain = $self->Maxtemperrors;
- undef $maxagain if $maxagain and lc($maxagain) eq 'unlimited';
-
- while ( $expected_size > $litreadb ) {
- if ($timeout) {
- my $rc = $self->_read_more( $socket, $timeout );
- return undef unless ( $rc > 0 );
- }
- else { # 25 ms before retry
- CORE::select( undef, undef, undef, 0.025 );
- }
-
- # $litstring is emptied when $literal_cbtype is GLOB
- my $ret =
- $self->_sysread( $socket, \$litstring,
- $expected_size - $litreadb,
- length($litstring) );
-
- if ($timeout) {
- if ( defined $ret ) {
- $temperrs = 0;
- }
- else {
- $emsg = "error while reading data from server: $!";
- if ( $! == ECONNRESET ) {
- $self->State(Unconnected);
- }
- elsif ( $! == EAGAIN ) {
- if ( defined $maxagain
- && $temperrs++ >= $maxagain )
- {
- $emsg .= " ($temperrs)";
- }
- else {
- undef $emsg;
- next; # try again
- }
- }
- }
- }
-
- # EOF: note IO::Socket::SSL does not support eof()
- if ( defined $ret and $ret == 0 ) {
- $emsg = "socket closed while reading data from server";
- $self->State(Unconnected);
- }
- elsif ( defined $ret and $ret > 0 ) {
- $litreadb += $ret;
-
- # conserve memory when using literal_callback GLOB
- if ( $literal_cbtype eq "GLOB" ) {
- print $literal_callback $litstring;
- $litstring = "" unless ($emsg);
- }
- }
-
- $self->_debug( "Received ret="
- . ( defined($ret) ? $ret : "" )
- . " $litreadb of $expected_size" );
-
- # save errors and return
- if ($emsg) {
- $self->LastError($emsg);
- $self->_record(
- $transno,
- [
- $self->_next_index($transno), "ERROR",
- "$transno * NO $emsg"
- ]
- );
- $litstring = "" unless defined $litstring;
- $self->_debug( "ERROR while processing LITERAL, "
- . " buffer=\n"
- . $litstring
- . "\n" );
- return undef;
- }
- }
- }
-
- if ( defined $litstring ) {
- if ( $literal_cbtype eq "GLOB" ) {
- print $literal_callback $litstring;
- }
- elsif ( $literal_cbtype eq "CODE" ) {
- $literal_callback->($litstring);
- }
- }
-
- push @$oBuffer, [ $index++, 'LITERAL', $litstring ]
- if ( $literal_cbtype ne "GLOB" );
- }
- }
-
- $self->_debug( "Read: " . join "", map { "\t" . $_->[DATA] } @$oBuffer )
- if ( $self->Debug );
-
- @$oBuffer ? $oBuffer : undef;
-}
-
-sub _sysread {
- my ( $self, $fh, $buf, $len, $off ) = @_;
- my $rm = $self->Readmethod;
- $rm ? $rm->(@_) : sysread( $fh, $$buf, $len, $off );
-}
-
-sub _read_more {
- my $self = shift;
- my $rm = $self->Readmoremethod;
- $rm ? $rm->( $self, @_ ) : $self->__read_more(@_);
-}
-
-sub __read_more {
- my $self = shift;
- my $opt = ref( $_[0] ) eq "HASH" ? shift : {};
- my ( $socket, $timeout ) = @_;
-
- # IO::Socket::SSL buffers some data internally, so there might be some
- # data available from the previous sysread of which the file-handle
- # (used by select()) doesn't know of.
- return 1 if $socket->isa("IO::Socket::SSL") && $socket->pending;
-
- my $rvec = '';
- vec( $rvec, fileno($socket), 1 ) = 1;
-
- my $rc = CORE::select( $rvec, undef, $rvec, $timeout );
-
- # fast track success
- return $rc if $rc > 0;
-
- # by default set an error on timeout
- my $err_on_timeout =
- exists $opt->{error_on_timeout} ? $opt->{error_on_timeout} : 1;
-
- # $rc is 0 then we timed out
- return $rc if !$rc and !$err_on_timeout;
-
- # set the appropriate error and return
- my $transno = $self->Transaction;
- my $msg =
- ( $rc ? "error($rc)" : "timeout" )
- . " waiting ${timeout}s for data from server"
- . ( $! ? ": $!" : "" );
- $self->LastError($msg);
- $self->_record( $transno,
- [ $self->_next_index($transno), "ERROR", "$transno * NO $msg" ] );
- $self->_disconnect; # BUG: can not handle timeouts gracefully
- return $rc;
-}
-
-sub _trans_index() {
- sort { $a <=> $b } keys %{ $_[0]->{History} };
-}
-
-# all default to last transaction
-sub _transaction(;$) {
- @{ $_[0]->{History}{ $_[1] || $_[0]->Transaction } || [] };
-}
-
-sub _trans_data(;$) {
- map { $_->[DATA] } $_[0]->_transaction( $_[1] );
-}
-
-sub _escaped_trans_data(;$) {
- my ( $self, $trans ) = @_;
- my @a;
- my $prevwasliteral = 0;
- foreach my $line ( $self->_transaction($trans) ) {
- next unless defined $line;
-
- my $data = $line->[DATA];
-
- # literal is appended to previous data
- if ( $self->_is_literal($line) ) {
- $data = $self->Escape($data);
- $a[-1] .= qq("$data");
- $prevwasliteral = 1;
- }
- else {
- if ($prevwasliteral) {
- $a[-1] .= $data;
- }
- else {
- push( @a, $data );
- }
- $prevwasliteral = 0;
- }
- }
-
- return wantarray ? @a : \@a;
-}
-
-sub Report {
- my $self = shift;
- map { $self->_trans_data($_) } $self->_trans_index;
-}
-
-sub LastIMAPCommand(;$) {
- my ( $self, $trans ) = @_;
- my $msg = ( $self->_transaction($trans) )[0];
- $msg ? $msg->[DATA] : undef;
-}
-
-sub History(;$) {
- my ( $self, $trans ) = @_;
- my ( $cmd, @a ) = $self->_trans_data($trans);
- return wantarray ? @a : \@a;
-}
-
-sub Results(;$) {
- my ( $self, $trans ) = @_;
- my @a = $self->_trans_data($trans);
- return wantarray ? @a : \@a;
-}
-
-sub _transaction_literals() {
- my $self = shift;
- join '', map { $_->[DATA] }
- grep { $self->_is_literal($_) } $self->_transaction;
-}
-
-sub Escaped_history {
- my ( $self, $trans ) = @_;
- my ( $cmd, @a ) = $self->_escaped_trans_data($trans);
- return wantarray ? @a : \@a;
-}
-
-sub Escaped_results {
- my ( $self, $trans ) = @_;
- my @a = $self->_escaped_trans_data($trans);
- return wantarray ? @a : \@a;
-}
-
-sub Escape {
- my $data = $_[1];
- $data =~ s/([\\\"])/\\$1/og;
- return $data;
-}
-
-sub Unescape {
- my $data = $_[1];
- $data =~ s/\\([\\\"])/$1/og;
- return $data;
-}
-
-sub logout {
- my $self = shift;
- my $rc = $self->_imap_command( "LOGOUT", "BYE" );
- $self->_disconnect;
- return $rc;
-}
-
-sub _disconnect {
- my $self = shift;
-
- delete $self->{CAPABILITY};
- delete $self->{_IMAP4REV1};
- $self->State(Unconnected);
- if ( my $sock = delete $self->{Socket} ) {
- local ($@);
- eval { $sock->close };
- }
- return $self;
-}
-
-# LIST/XLIST/LSUB Response
-# Contents: name attributes, hierarchy delimiter, name
-# Example: * LIST (\Noselect) "/" ~/Mail/foo
-# NOTE: liberal matching as folder name data may be Escape()d
-sub _list_or_lsub_response_parse {
- my ( $self, $resp ) = @_;
-
- return undef unless defined $resp;
- my %info;
-
- $resp =~ s/\015?\012$//;
- if (
- $resp =~ / ^\* \s+ (?:LIST|XLIST|LSUB) \s+ # * LIST|XLIST|LSUB
- \( ([^\)]*) \) \s+ # (attrs)
- (?: \" ([^"]*) \" | NIL ) \s # "delimiter" or NIL
- (?:\s*\" (.*) \" | (.*) ) # "name" or name
- /ix
- )
- {
- @info{qw(attrs delim name)} =
- ( [ split( / /, $1 ) ], $2, defined($3) ? $self->Unescape($3) : $4 );
- }
- return wantarray ? %info : \%info;
-}
-
-sub exists {
- my ( $self, $folder ) = @_;
- $self->status($folder) ? $self : undef;
-}
-
-# Updated to handle embedded literal strings
-sub get_bodystructure {
- my ( $self, $msg ) = @_;
-
- my $class = $self->_load_module("BodyStructure") or return undef;
-
- my $out = $self->fetch( $msg, "BODYSTRUCTURE" ) or return undef;
-
- my $bs = "";
- my $output = first { /BODYSTRUCTURE\s+\(/i } @$out;
-
- unless ( $output =~ /$CRLF$/o ) {
- $output = '';
- $self->_debug("get_bodystructure: reassembling original response");
- my $started = 0;
- foreach my $o ( $self->_transaction ) {
- next unless $self->_is_output_or_literal($o);
- $started++ if $o->[DATA] =~ /BODYSTRUCTURE \(/i;
- $started or next;
-
- if ( length($output) && $self->_is_literal($o) ) {
- my $data = $o->[DATA];
- $data =~ s/"/\\"/g;
- $data =~ s/\(/\\\(/g;
- $data =~ s/\)/\\\)/g;
- $output .= qq("$data");
- }
- else {
- $output .= $o->[DATA];
- }
- }
- $self->_debug("get_bodystructure: reassembled output=$output");
- }
-
- {
- local ($@);
- $bs = eval { $class->new($output) };
- }
-
- $self->_debug(
- "get_bodystructure: msg $msg returns: " . ( $bs || "UNDEF" ) );
- $bs;
-}
-
-# Updated to handle embedded literal strings
-sub get_envelope {
- my ( $self, $msg ) = @_;
-
- # Envelope class is defined within BodyStructure
- my $class = $self->_load_module("BodyStructure") or return undef;
- $class .= "::Envelope";
-
- my $out = $self->fetch( $msg, 'ENVELOPE' ) or return undef;
-
- my $bs = "";
- my $output = first { /ENVELOPE \(/i } @$out;
-
- unless ( $output =~ /$CRLF$/o ) {
- $output = '';
- $self->_debug("get_envelope: reassembling original response");
- my $started = 0;
- foreach my $o ( $self->_transaction ) {
- next unless $self->_is_output_or_literal($o);
- $started++ if $o->[DATA] =~ /ENVELOPE \(/i;
- $started or next;
-
- if ( length($output) && $self->_is_literal($o) ) {
- my $data = $o->[DATA];
- $data =~ s/"/\\"/g;
- $data =~ s/\(/\\\(/g;
- $data =~ s/\)/\\\)/g;
- $output .= qq("$data");
- }
- else {
- $output .= $o->[DATA];
- }
- }
- $self->_debug("get_envelope: reassembled output=$output");
- }
-
- {
- local ($@);
- $bs = eval { $class->new($output) };
- }
-
- $self->_debug( "get_envelope: msg $msg returns: " . ( $bs || "UNDEF" ) );
- $bs;
-}
-
-# fetch( [{option},] [$seq_set|ALL], @msg_data_items )
-# options:
-# escaped => 0|1 # return Results or Escaped_results
-sub fetch {
- my $self = shift;
- my $opt = ref( $_[0] ) eq "HASH" ? shift : {};
- my $what = shift || "ALL";
-
- my $take = $what;
- if ( $what eq 'ALL' ) {
- my $msgs = $self->messages or return undef;
- $take = $self->Range($msgs);
- }
- elsif ( ref $what || $what =~ /^[,:\d]+\w*$/ ) {
- $take = $self->Range($what);
- }
-
- my ( @data, $cmd );
- my ( $seq_set, @fetch_att ) = $self->_split_sequence( $take, "FETCH", @_ );
-
- for ( my $x = 0 ; $x <= $#$seq_set ; $x++ ) {
- my $seq = $seq_set->[$x];
- $self->_imap_uid_command( FETCH => $seq, @fetch_att, @_ )
- or return undef;
- my $res = $opt->{escaped} ? $self->Escaped_results : $self->Results;
-
- # only keep last command and last response (* OK ...)
- $cmd = shift(@$res);
- pop(@$res) if ( $x != $#{$seq_set} );
- push( @data, @$res );
- }
-
- if ( $cmd and !wantarray ) {
- $cmd =~ s/^(\d+\s+.*?FETCH\s+)\S+(\s*)/$1$take$2/;
- unshift( @data, $cmd );
- }
-
- #wantarray ? $self->History : $self->Results;
- return wantarray ? @data : \@data;
-}
-
-# Some servers have a maximum command length. If Maxcommandlength is
-# set, split a sequence to fit within the length restriction.
-sub _split_sequence {
- my ( $self, $take, @args ) = @_;
-
- # split take => sequence-set and (optional) fetch-att
- my ( $seq, @att ) = split( / /, $take, 2 );
-
- # use the entire sequence unless Maxcommandlength is set
- my @seqs;
- my $maxl = $self->Maxcommandlength;
- if ($maxl) {
-
- # estimate command length, the sum of the lengths of:
- # tag, command, fetch-att + $CRLF
- push @args, $self->Transaction, $self->Uid ? "UID" : (), "\015\012";
-
- # do not split on anything smaller than 64 chars
- my $clen = length join( " ", @att, @args );
- my $diff = $maxl - $clen;
- my $most = $diff > 64 ? $diff : 64;
-
- @seqs = ( $seq =~ m/(.{1,$most})(?:,|$)/g ) if defined $seq;
- $self->_debug( "split_sequence: length($maxl-$clen) parts: ",
- $#seqs + 1 )
- if ( $#seqs != 0 );
- }
- else {
- push( @seqs, $seq ) if defined $seq;
- }
- return \@seqs, @att;
-}
-
-# fetch_hash( [$seq_set|ALL], @msg_data_items, [\%msg_by_ids] )
-# - TODO: make more efficient use of memory on large fetch results
-sub fetch_hash {
- my $self = shift;
- my $uids = ref $_[-1] ? pop @_ : {};
- my @words = @_;
-
- # take an optional leading list of messages argument or default to
- # ALL let fetch turn that list of messages into a msgref as needed
- # fetch has similar logic for dealing with message list
- my $msgs = 'ALL';
- if ( defined $words[0] ) {
- if ( ref $words[0] ) {
- $msgs = shift @words;
- }
- else {
- if ( $words[0] eq 'ALL' ) {
- $msgs = shift @words;
- }
- elsif ( $words[0] =~ s/^([*,:\d]+)\s*// ) {
- $msgs = $1;
- shift @words if $words[0] eq "";
- }
- }
- }
-
- # message list (if any) is now removed from @words
- my $what = ( @words > 1 or $words[0] =~ /\s/ ) ? "(@words)" : "@words";
-
- # RFC 3501:
- # fetch = "FETCH" SP sequence-set SP ("ALL" / "FULL" / "FAST" /
- # fetch-att / "(" fetch-att *(SP fetch-att) ")")
- my $output = $self->fetch( $msgs, $what )
- or return undef;
-
- my $asked_for_uid = $what =~ /[\s(]UID[)\s]/i;
-
- while ( my $l = shift @$output ) {
- next if $l !~ m/^\*\s(\d+)\sFETCH\s\(/g;
- my ( $mid, $entry ) = ( $1, {} );
- my ( $key, $value );
- ATTR:
- while ( $l and $l !~ m/\G\s*\)\s*$/gc ) {
- if ( $l =~ m/\G\s*([^\s\[]+(?:\[[^\]]*\])?(?:<[^>]*>)?)\s*/gc ) {
- $key = uc($1);
-
- # strip quotes around header names - seen w/outlook.com
- if ( $key =~ /^BODY\[HEADER\.FIELDS \("[^"]+".*?\)\]$/ ) {
- $key =~ s/"//g;
- }
- }
- elsif ( !defined $key ) {
-
- # some kind of malformed response
- $self->LastError("Invalid item name in FETCH response: $l");
- return undef;
- }
- if ( $l =~ m/\G\s*$/gc ) {
- $value = shift @$output;
- $entry->{$key} = $value;
- $l = shift @$output;
- next ATTR;
- }
- elsif (
- $l =~ m/\G(?:"((?>(?:(?>[^"\\]+)|\\.)*))"|([^()\s]+))\s*/gc )
- {
- $value = defined $1 ? $1 : $2;
- $entry->{$key} = $value;
- next ATTR;
- }
- elsif ( $l =~ m/\G\(/gc ) {
- my $depth = 1;
- $value = "";
- while ( $l =~
- m/\G("((?>(?:(?>[^"\\]+)|\\.)*))"\s*|[()]|[^()"]+)/gc )
- {
- my $stuff = $1;
- if ( $stuff eq "(" ) {
- $depth++;
- $value .= "(";
- }
- elsif ( $stuff eq ")" ) {
- $depth--;
- if ( $depth == 0 ) {
- $entry->{$key} = $value;
- next ATTR;
- }
- $value .= ")";
- }
- else {
- $value .= $stuff;
- }
-
- # consume literal data if any
- if ( $l =~ m/\G\s*$/gc and scalar(@$output) ) {
- my $elit = $self->Escape( shift @$output );
- $l = shift @$output;
- $value .= ( length($value) ? " " : "" ) . qq{"$elit"};
- }
- }
- $l =~ m/\G\s*/gc;
- }
- else {
- $self->LastError("Invalid item value in FETCH response: $l");
- return undef;
- }
- }
-
- # NOTE: old code tried to remove any "unrequested" data in $entry
- # - UID is sometimes not explicitly requested, are there others?
- # - rt#115726: Uid and $entry->{UID} not set, ignore unsolicited data
- if ( $self->Uid ) {
- if ( $entry->{UID} ) {
- $uids->{ $entry->{UID} } = $entry;
- delete $entry->{UID} unless $asked_for_uid;
- }
- else {
- $self->_debug("ignoring unsolicited response: $l");
- }
- }
- else {
- $uids->{$mid} = $entry;
- }
- }
-
- return wantarray ? %$uids : $uids;
-}
-
-sub store {
- my ( $self, @a ) = @_;
- $self->_imap_uid_command( STORE => @a )
- or return undef;
- return wantarray ? $self->History : $self->Results;
-}
-
-sub _imap_folder_command($$@) {
- my ( $self, $command ) = ( shift, shift );
- my $folder = $self->Quote(shift);
-
- $self->_imap_command( join ' ', $command, $folder, @_ )
- or return undef;
-
- return wantarray ? $self->History : $self->Results;
-}
-
-sub subscribe($) { shift->_imap_folder_command( SUBSCRIBE => @_ ) }
-sub unsubscribe($) { shift->_imap_folder_command( UNSUBSCRIBE => @_ ) }
-sub create($) { shift->_imap_folder_command( CREATE => @_ ) }
-
-sub delete($) {
- my $self = shift;
- $self->_imap_folder_command( DELETE => @_ ) or return undef;
- $self->Folder(undef);
- return wantarray ? $self->History : $self->Results;
-}
-
-# rfc2086
-sub myrights($) { $_[0]->_imap_folder_command( MYRIGHTS => $_[1] ) }
-
-sub close {
- my $self = shift;
- $self->_imap_command('CLOSE')
- or return undef;
- return wantarray ? $self->History : $self->Results;
-}
-
-sub expunge {
- my ( $self, $folder ) = @_;
-
- return undef unless ( defined $folder or defined $self->Folder );
-
- my $old = defined $self->Folder ? $self->Folder : '';
-
- if ( !defined($folder) || $folder eq $old ) {
- $self->_imap_command('EXPUNGE')
- or return undef;
- }
- else {
- $self->select($folder) or return undef;
- my $succ = $self->_imap_command('EXPUNGE');
-
- # if $old eq '' IMAP4 select should close $folder without EXPUNGE
- return undef unless ( $self->select($old) and $succ );
- }
-
- return wantarray ? $self->History : $self->Results;
-}
-
-sub uidexpunge {
- my ( $self, $msgspec ) = ( shift, shift );
-
- return undef unless $self->has_capability("UIDPLUS");
- unless ( $self->Uid ) {
- $self->LastError("Uid must be enabled for uidexpunge");
- return undef;
- }
-
- my $msg =
- UNIVERSAL::isa( $msgspec, 'Mail::IMAPClient::MessageSet' )
- ? $msgspec
- : $self->Range($msgspec);
-
- $msg->cat(@_) if @_;
-
- my ( @data, $cmd );
- my ($seq_set) = $self->_split_sequence( $msg, "UID EXPUNGE" );
-
- for ( my $x = 0 ; $x <= $#$seq_set ; $x++ ) {
- my $seq = $seq_set->[$x];
- $self->_imap_uid_command( "EXPUNGE" => $seq )
- or return undef;
- my $res = $self->Results;
-
- # only keep last command and last response (* OK ...)
- $cmd = shift(@$res);
- pop(@$res) if ( $x != $#{$seq_set} );
- push( @data, @$res );
- }
-
- if ( $cmd and !wantarray ) {
- $cmd =~ s/^(\d+\s+.*?EXPUNGE\s+)\S+(\s*)/$1$msg$2/;
- unshift( @data, $cmd );
- }
-
- #wantarray ? $self->History : $self->Results;
- return wantarray ? @data : \@data;
-}
-
-sub rename {
- my ( $self, $from, $to ) = @_;
-
- $from = $self->Quote($from);
- $to = $self->Quote($to);
-
- $self->_imap_command(qq(RENAME $from $to)) ? $self : undef;
-}
-
-sub status {
- my ( $self, $folder ) = ( shift, shift );
- defined $folder or return undef;
-
- my $which = @_ ? join( " ", @_ ) : 'MESSAGES';
-
- my $box = $self->Quote($folder);
- $self->_imap_command("STATUS $box ($which)")
- or return undef;
-
- return wantarray ? $self->History : $self->Results;
-}
-
-sub flags {
- my ( $self, $msgspec ) = ( shift, shift );
- my $msg =
- UNIVERSAL::isa( $msgspec, 'Mail::IMAPClient::MessageSet' )
- ? $msgspec
- : $self->Range($msgspec);
-
- $msg->cat(@_) if @_;
-
- # Send command
- my $ref = $self->fetch( $msg, "FLAGS" ) or return undef;
-
- my $u_f = $self->Uid;
- my $flagset = {};
-
- # Parse results, setting entry in result hash for each line
- foreach my $line (@$ref) {
- $self->_debug("flags: line = '$line'");
- if (
- $line =~ /\* \s+ (\d+) \s+ FETCH \s+ # * nnn FETCH
- \(
- (?:\s* UID \s+ (\d+) \s* )? # optional: UID nnn
- FLAGS \s* \( (.*?) \) \s* # FLAGS (\Flag1 \Flag2)
- (?:\s* UID \s+ (\d+) \s* )? # optional: UID nnn
- \)
- /x
- )
- {
- my $mailid = $u_f ? ( $2 || $4 ) : $1;
- $flagset->{$mailid} = [ split " ", $3 ];
- }
- }
-
- # Return a hash from msgid to flag array?
- return $flagset
- if ref $msgspec;
-
- # Or, just one response? Return it if so
- my $flagsref = $flagset->{$msgspec};
- return wantarray ? @{ $flagsref || [] } : $flagsref;
-}
-
-# reduce a list, stripping undeclared flags. Flags with or without
-# leading backslash.
-sub supported_flags(@) {
- my $self = shift;
- my $sup = $self->Supportedflags
- or return @_;
-
- return map { $sup->($_) } @_
- if ref $sup eq 'CODE';
-
- grep { $sup->{ /^\\(\S+)/ ? lc $1 : () } } @_;
-}
-
-sub parse_headers {
- my ( $self, $msgspec, @fields ) = @_;
- my $fields = join ' ', @fields;
- my $msg = ref $msgspec eq 'ARRAY' ? $self->Range($msgspec) : $msgspec;
- my $peek = !defined $self->Peek || $self->Peek ? '.PEEK' : '';
-
- my $string = "$msg BODY$peek"
- . ( $fields eq 'ALL' ? '[HEADER]' : "[HEADER.FIELDS ($fields)]" );
-
- my $raw = $self->fetch($string) or return undef;
- my $cmd = shift @$raw;
-
- my %headers; # message ids to headers
- my $h; # fields for current msgid
- my $field; # previous field name, for unfolding
- my %fieldmap = map { ( lc($_) => $_ ) } @fields;
- my $msgid;
-
- # BUG: parsing this way is prone to be buggy but works most of the time
- # some example responses:
- # * OK Message 1 no longer exists
- # * 1 FETCH (UID 26535 BODY[HEADER] "")
- # * 5 FETCH (UID 30699 BODY[HEADER] {1711}
- # header: value...
- foreach my $header ( map { split /$CR?$LF/o } @$raw ) {
-
- # Windows2003/Maillennium/others? have UID after headers
- if (
- $header =~ s/^\* \s+ (\d+) \s+ FETCH \s+
- \( (.*?) BODY\[HEADER (?:\.FIELDS)? .*? \]\s*//ix
- )
- { # start new message header
- ( $msgid, my $msgattrs ) = ( $1, $2 );
- $h = {};
- if ( $self->Uid ) { # undef when win2003
- $msgid = $msgattrs =~ m/\b UID \s+ (\d+)/x ? $1 : undef;
- }
- $headers{$msgid} = $h if $msgid;
- }
- $header =~ /\S/ or next; # skip empty lines.
-
- # ( for vi
- if ( $header =~ /^\)/ ) { # end of this message
- undef $h; # inbetween headers
- next;
- }
- elsif ( !$msgid && $header =~ /^\s*UID\s+(\d+).*\)$/ ) {
- $headers{$1} = $h; # found UID win2003/Maillennium
-
- undef $h;
- next;
- }
-
- unless ( defined $h ) {
- $self->_debug("found data between fetch headers: $header");
- next;
- }
-
- if ( $header and $header =~ s/^(\S+)\:\s*// ) {
- $field = $fieldmap{ lc $1 } || $1;
- push @{ $h->{$field} }, $header;
- }
- elsif ( $field and ref $h->{$field} eq 'ARRAY' ) { # folded header
- $h->{$field}[-1] .= $header;
- }
- else {
-
- # show data if it is not like '"")' or '{123}'
- $self->_debug("non-header data between fetch headers: $header")
- if ( $header !~ /^(?:\s*\"\"\)|\{\d+\})$CR?$LF$/o );
- }
- }
-
- # if we asked for one message, just return its hash,
- # otherwise, return hash of numbers => header hash
- ref $msgspec eq 'ARRAY' ? \%headers : $headers{$msgspec};
-}
-
-sub subject { $_[0]->get_header( $_[1], "Subject" ) }
-sub date { $_[0]->get_header( $_[1], "Date" ) }
-sub rfc822_header { shift->get_header(@_) }
-
-sub get_header {
- my ( $self, $msg, $field ) = @_;
- my $headers = $self->parse_headers( $msg, $field );
- $headers ? $headers->{$field}[0] : undef;
-}
-
-sub recent_count {
- my ( $self, $folder ) = ( shift, shift );
-
- $self->status( $folder, 'RECENT' )
- or return undef;
-
- my $r =
- first { s/\*\s+STATUS\s+.*\(RECENT\s+(\d+)\s*\)/$1/ } $self->History;
- chomp $r;
- $r;
-}
-
-sub message_count {
- my $self = shift;
- my $folder = shift || $self->Folder;
-
- $self->status( $folder, 'MESSAGES' )
- or return undef;
-
- foreach my $result ( $self->Results ) {
- return $1 if $result =~ /\(MESSAGES\s+(\d+)\s*\)/i;
- }
-
- undef;
-}
-
-sub recent() { shift->search('recent') }
-sub seen() { shift->search('seen') }
-sub unseen() { shift->search('unseen') }
-sub messages() { shift->search('ALL') }
-
-sub sentbefore($$) { shift->_search_date( sentbefore => @_ ) }
-sub sentsince($$) { shift->_search_date( sentsince => @_ ) }
-sub senton($$) { shift->_search_date( senton => @_ ) }
-sub since($$) { shift->_search_date( since => @_ ) }
-sub before($$) { shift->_search_date( before => @_ ) }
-sub on($$) { shift->_search_date( on => @_ ) }
-
-sub _search_date($$$) {
- my ( $self, $how, $time ) = @_;
- my $imapdate;
-
- if ( $time =~ /\d\d-\D\D\D-\d\d\d\d/ ) {
- $imapdate = $time;
- }
- elsif ( $time =~ /^\d+$/ ) {
- my @ltime = localtime $time;
- $imapdate = sprintf( "%2.2d-%s-%4.4d",
- $ltime[3],
- $mnt[ $ltime[4] ],
- $ltime[5] + 1900 );
- }
- else {
- $self->LastError("Invalid date format supplied for '$how': $time");
- return undef;
- }
-
- $self->_imap_uid_command( SEARCH => $how, $imapdate )
- or return undef;
-
- my @hits;
- foreach ( $self->History ) {
- chomp;
- s/$CR?$LF$//o;
- s/^\*\s+SEARCH\s+//i or next;
- push @hits, grep /\d/, split;
- }
- $self->_debug("Hits are: @hits");
- return wantarray ? @hits : \@hits;
-}
-
-sub or {
- my ( $self, @what ) = @_;
- if ( @what < 2 ) {
- $self->LastError("Invalid number of arguments passed to or()");
- return undef;
- }
-
- my $or =
- "OR " . $self->Quote( shift @what ) . " " . $self->Quote( shift @what );
-
- $or = "OR $or " . $self->Quote($_) for @what;
-
- $self->_imap_uid_command( SEARCH => $or )
- or return undef;
-
- my @hits;
- foreach ( $self->History ) {
- chomp;
- s/$CR?$LF$//o;
- s/^\*\s+SEARCH\s+//i or next;
- push @hits, grep /\d/, split;
- }
- $self->_debug("Hits are now: @hits");
-
- return wantarray ? @hits : \@hits;
-}
-
-sub disconnect { shift->logout }
-
-sub _quote_search {
- my ( $self, @args ) = @_;
- my @ret;
- foreach my $v (@args) {
- if ( ref($v) eq "SCALAR" ) {
- push( @ret, $$v );
- }
- elsif ( exists $SEARCH_KEYS{ uc($v) } ) {
- push( @ret, $v );
- }
- elsif ( @args == 1 ) {
- push( @ret, $v ); # <3.17 compat: caller responsible for quoting
- }
- else {
- push( @ret, $self->Quote($v) );
- }
- }
- return @ret;
-}
-
-sub search {
- my ( $self, @args ) = @_;
-
- @args = $self->_quote_search(@args);
-
- $self->_imap_uid_command( SEARCH => @args )
- or return undef;
-
- my @hits;
- foreach ( $self->History ) {
- chomp;
- s/$CR?$LF$//o;
- s/^\*\s+SEARCH\s+(?=.*?\d)// or next;
- push @hits, grep /^\d+$/, split;
- }
-
- @hits
- or $self->_debug("Search successful but found no matching messages");
-
- # return empty list
- return
- wantarray ? @hits
- : !@hits ? \@hits
- : $self->Ranges ? $self->Range( \@hits )
- : \@hits;
-}
-
-# returns a Thread data structure
-my $thread_parser;
-
-sub thread {
- my $self = shift;
-
- return undef unless defined $self->has_capability("THREAD=REFERENCES");
- my $algorythm = shift
- || (
- $self->has_capability("THREAD=REFERENCES")
- ? 'REFERENCES'
- : 'ORDEREDSUBJECT'
- );
-
- my $charset = shift || 'UTF-8';
- my @a = @_ ? @_ : 'ALL';
-
- $a[-1] = $self->Quote( $a[-1], 1 )
- if @a > 1 && !exists $SEARCH_KEYS{ uc $a[-1] };
-
- $self->_imap_uid_command( THREAD => $algorythm, $charset, @a )
- or return undef;
-
- unless ($thread_parser) {
- return if ( defined($thread_parser) and $thread_parser == 0 );
-
- my $class = $self->_load_module("Thread");
- unless ($class) {
- $thread_parser = 0;
- return undef;
- }
- $thread_parser = $class->new;
- }
-
- my $thread;
- foreach ( $self->History ) {
- /^\*\s+THREAD\s+/ or next;
- s/$CR?$LF|$LF+/ /og;
- $thread = $thread_parser->start($_);
- }
-
- unless ($thread) {
- $self->LastError(
-"Thread search completed successfully but found no matching messages"
- );
- return undef;
- }
-
- $thread;
-}
-
-sub delete_message {
- my $self = shift;
- my @msgs = map { ref $_ eq 'ARRAY' ? @$_ : split /\,/ } @_;
-
- $self->store( join( ',', @msgs ), '+FLAGS.SILENT', '(\Deleted)' )
- ? scalar @msgs
- : undef;
-}
-
-sub restore_message {
- my $self = shift;
- my $msgs = join ',', map { ref $_ eq 'ARRAY' ? @$_ : split /\,/ } @_;
-
- $self->store( $msgs, '-FLAGS', '(\Deleted)' ) or return undef;
- scalar grep /^\*\s\d+\sFETCH\s\(.*FLAGS.*(?!\\Deleted)/, $self->Results;
-}
-
-sub uidvalidity {
- my ( $self, $folder ) = @_;
- $self->status( $folder, "UIDVALIDITY" ) or return undef;
- my $line = first { /UIDVALIDITY/i } $self->History;
- defined $line && $line =~ /\(UIDVALIDITY\s+([^\)]+)/ ? $1 : undef;
-}
-
-sub uidnext {
- my ( $self, $folder ) = @_;
- $self->status( $folder, "UIDNEXT" ) or return undef;
- my $line = first { /UIDNEXT/i } $self->History;
- defined $line && $line =~ /\(UIDNEXT\s+([^\)]+)/ ? $1 : undef;
-}
-
-# sort @caps for consistency?
-sub capability {
- my $self = shift;
-
- if ( $self->{CAPABILITY} ) {
- my @caps = keys %{ $self->{CAPABILITY} };
- return wantarray ? @caps : \@caps;
- }
-
- $self->_imap_command('CAPABILITY')
- or return undef;
-
- my @caps = map { split } grep /^\*\s+CAPABILITY\s+/, $self->History;
- splice( @caps, 0, 2 ); # remove * CAPABILITY from array
-
- # use iterator as we may append to @caps for CAPA=VALUE
- for ( my $i = 0 ; $i < @caps ; $i++ ) {
- $self->{CAPABILITY}->{ uc $caps[$i] } ||= [];
- my ( $capa, $cval ) = split( /=/, $caps[$i], 2 );
- if ( defined $cval ) {
- $capa = uc $capa;
- push( @caps, $capa ) unless exists $self->{CAPABILITY}->{$capa};
- push( @{ $self->{CAPABILITY}->{$capa} }, $cval );
- }
- }
-
- return wantarray ? @caps : \@caps;
-}
-
-# use "" not undef when lookup fails to differentiate imap command
-# failure vs lack of capability
-sub has_capability {
- my ( $self, $which ) = @_;
- $self->capability or return undef;
- my $aref = [];
-
- # exists in CAPABILITIES? possibly in CAPA=VALUE format?
- if ( defined $which ) {
- $which = uc $which;
- if ( exists $self->{CAPABILITY}{$which} ) {
- if ( @{ $self->{CAPABILITY}{$which} } ) {
- $aref = $self->{CAPABILITY}{$which};
- }
- else {
- $aref = [$which];
- }
- }
- }
-
- return @$aref if wantarray;
- return scalar @$aref ? $aref : "";
-}
-
-sub imap4rev1 {
- my $self = shift;
- return $self->{_IMAP4REV1} if exists $self->{_IMAP4REV1};
- $self->{_IMAP4REV1} = $self->has_capability('IMAP4REV1');
-}
-
-#??? what a horror!
-sub namespace {
-
- # Returns a nested list as follows:
- # [
- # [
- # [ $user_prefix, $user_delim ] (,[$user_prefix2 ,$user_delim ],...),
- # ],
- # [
- # [ $shared_prefix,$shared_delim] (,[$shared_prefix2,$shared_delim],... ),
- # ],
- # [
- # [$public_prefix, $public_delim] (,[$public_prefix2,$public_delim],...),
- # ],
- # ];
-
- my $self = shift;
- unless ( $self->has_capability("NAMESPACE") ) {
- $self->LastError( "NO NAMESPACE not supported by " . $self->Server )
- unless $self->LastError;
- return undef;
- }
-
- my $got = $self->_imap_command("NAMESPACE") or return undef;
- my @namespaces = map { /^\* NAMESPACE (.*)/ ? $1 : () } $got->Results;
-
- my $namespace = shift @namespaces;
- $namespace =~ s/$CR?$LF$//o;
-
- my ( $personal, $shared, $public ) = $namespace =~ m#
- (NIL|\((?:\([^\)]+\)\s*)+\))\s
- (NIL|\((?:\([^\)]+\)\s*)+\))\s
- (NIL|\((?:\([^\)]+\)\s*)+\))
- #xi;
-
- my @ns;
- $self->_debug("NAMESPACE: pers=$personal, shared=$shared, pub=$public");
- foreach ( $personal, $shared, $public ) {
- uc $_ ne 'NIL' or next;
- s/^\((.*)\)$/$1/;
-
- my @pieces = m#\(([^\)]*)\)#g;
- $self->_debug("NAMESPACE pieces: @pieces");
-
- push @ns, [ map { [m#"([^"]*)"\s*#g] } @pieces ];
- }
-
- return wantarray ? @ns : \@ns;
-}
-
-sub internaldate {
- my ( $self, $msg ) = @_;
- $self->_imap_uid_command( FETCH => $msg, 'INTERNALDATE' )
- or return undef;
- my $hist = join '', $self->History;
- return $hist =~ /\bINTERNALDATE "([^"]*)"/i ? $1 : undef;
-}
-
-sub is_parent {
- my ( $self, $folder ) = @_;
- my $list = $self->list( undef, $folder ) or return undef;
-
- my $attrs;
- foreach my $resp (@$list) {
- my $rec = $self->_list_or_lsub_response_parse($resp);
- next unless defined $rec->{attrs};
- $self->_debug("unexpected attrs data: @$list\n") if $attrs;
- $attrs = $rec->{attrs};
- }
-
- if ($attrs) {
- return undef if first { lc($_) eq '\noinferiors' } @$attrs;
- return 1 if first { lc($_) eq '\haschildren' } @$attrs;
- return 0 if first { lc($_) eq '\hasnochildren' } @$attrs;
- }
- else {
- $self->_debug( join( "\n\t", "no attrs for '$folder' in:", @$list ) );
- }
-
- # BUG? This may be overkill for normal use cases...
- # flag not supported or not returned for some reason, try via folders()
- my $sep = $self->separator($folder) || $self->separator(undef);
- return undef unless defined $sep;
-
- my $lead = $folder . $sep;
- my $len = length $lead;
- scalar grep { $lead eq substr( $_, 0, $len ) } $self->folders;
-}
-
-sub selectable {
- my ( $self, $f ) = @_;
- my $info = $self->list( "", $f ) or return undef;
- return not( grep /[\s(]\\Noselect[)\s]/i, @$info );
-}
-
-# append( $self, $folder, $text [, $optmsg] )
-# - conserve memory and use $_[0] to avoid copying $text (it may be huge!)
-# - BUG?: should deprecate this method in favor of append_string
-sub append {
- my $self = shift;
- my $folder = shift;
-
- # $message_string is whatever is left in @_
- $self->append_string( $folder, ( @_ > 1 ? join( $CRLF, @_ ) : $_[0] ) );
-}
-
-sub _clean_flags {
- my ( $self, $flags ) = @_;
- $flags =~ s/^\s+//;
- $flags =~ s/\s+$//;
- $flags = "($flags)" if $flags !~ /^\(.*\)$/;
- return $flags;
-}
-
-# RFC 3501: date-day-fixed = (SP DIGIT) / 2DIGIT
-sub _clean_date {
- my ( $self, $date ) = @_;
- $date =~ s/^\s+// if $date !~ /^\s\d/;
- $date =~ s/\s+$//;
- $date = qq("$date") if $date !~ /^"/;
- return $date;
-}
-
-sub _append_command {
- my ( $self, $folder, $flags, $date, $length ) = @_;
- return join( " ",
- "APPEND $folder",
- ( $flags ? $flags : () ),
- ( $date ? $date : () ),
- "{" . $length . "}",
- );
-}
-
-# append_string( $self, $folder, $text, $flags, $date )
-# - conserve memory and use $_[2] to avoid copying $text (it may be huge!)
-sub append_string($$$;$$) {
- my ( $self, $folder, $flags, $date ) = @_[ 0, 1, 3, 4 ];
-
- #my $text = $_[2]; # conserve memory and use $_[2] instead!
- my $maxl = $self->Maxappendstringlength;
-
- # on "large" strings use append_file to conserve memory
- if ( $_[2] and $maxl and length( $_[2] ) > $maxl ) {
- $self->_debug("append_string: using in memory file");
- return $self->append_file( $folder, \( $_[2] ), undef, $flags, $date );
- }
-
- my $text = defined( $_[2] ) ? $_[2] : '';
-
- $folder = $self->Quote($folder);
- $flags = $self->_clean_flags($flags) if ( defined $flags );
- $date = $self->_clean_date($date) if ( defined $date );
- $text =~ s/\r?\n/$CRLF/og;
-
- my $cmd = $self->_append_command( $folder, $flags, $date, length($text) );
- $cmd .= $CRLF . $text . $CRLF;
-
- $self->_imap_command( { addcrlf => 0 }, $cmd ) or return undef;
-
- my $data = join '', $self->Results;
-
- # look for something like return size or self if no size found:
- # OK [APPENDUID ] APPEND completed
- my $ret = $data =~ m#\s+(\d+)\]# ? $1 : $self;
-
- return $ret;
-}
-
-# BUG?: not much/any savings on cygwin perl 5.10 when using in memory file
-# BUG?: we do not retry if sending data fails after getting the OK to send
-sub append_file {
- my ( $self, $folder, $file, $control, $flags, $date ) = @_;
-
- my @err;
- push( @err, "folder not specified" )
- unless ( defined($folder) and $folder ne "" );
-
- my $fh;
- if ( !defined($file) ) {
- push( @err, "file not specified" );
- }
- elsif ( ref($file) and ref($file) ne "SCALAR" ) {
- $fh = $file; # let the caller pass in their own file handle directly
- }
- elsif ( !ref($file) and !-f $file ) {
- push( @err, "file '$file' not found" );
- }
- else {
-
- # $file can be a name or a scalar reference (for in memory file)
- # avoid IO::File bug handling scalar refs in perl <= 5.8.8?
- # - buggy: $fh = IO::File->new( $file, 'r' )
- local ($!);
- open( $fh, "<", $file )
- or push( @err, "Unable to open file '$file': $!" );
- }
-
- if (@err) {
- $self->LastError( join( ", ", @err ) );
- return undef;
- }
-
- binmode($fh);
-
- $folder = $self->Quote($folder) if ( defined $folder );
- $flags = $self->_clean_flags($flags) if ( defined $flags );
-
- # allow the date to be specified or even use mtime on file
- if ($date) {
- $date = $self->Rfc3501_datetime( ( stat($fh) )[9] ) if ( $date eq "1" );
- $date = $self->_clean_date($date);
- }
-
- # BUG? seems wasteful to do this always, provide a "fast path" option?
- my $length = 0;
- {
- local $/ = "\n"; # just in case global is not default
- while ( my $line = <$fh> ) { # do no read the whole file at once!
- $line =~ s/\r?\n$/$CRLF/;
- $length += length($line);
- }
- seek( $fh, 0, 0 );
- }
-
- my $cmd = $self->_append_command( $folder, $flags, $date, $length );
- my $rc = $self->_imap_command( $cmd, '+' );
- unless ($rc) {
- $self->LastError( "Error sending '$cmd': " . $self->LastError );
- return undef;
- }
-
- # Now send the message itself
- my ( $buffer, $buflen ) = ( "", 0 );
- until ( !$buflen and eof($fh) ) {
-
- if ( $buflen < APPEND_BUFFER_SIZE ) {
- FILLBUFF:
- while ( my $line = <$fh> ) {
- $line =~ s/\r?\n$/$CRLF/;
- $buffer .= $line;
- $buflen = length($buffer);
- last FILLBUFF if ( $buflen >= APPEND_BUFFER_SIZE );
- }
- }
-
- # exit loop entirely if we are out of data
- last unless $buflen;
-
- # save anything over desired buffer size for next iteration
- my $savebuff =
- ( $buflen > APPEND_BUFFER_SIZE )
- ? substr( $buffer, APPEND_BUFFER_SIZE )
- : undef;
-
- # reduce buffer to desired size
- $buffer = substr( $buffer, 0, APPEND_BUFFER_SIZE );
-
- my $bytes_written = $self->_send_bytes( \$buffer );
- unless ($bytes_written) {
- $self->LastError( "Error appending message: " . $self->LastError );
- return undef;
- }
-
- # retain any saved data and continue loop
- $buffer = defined($savebuff) ? $savebuff : "";
- $buflen = length($buffer);
- }
-
- # finish off append
- unless ( $self->_send_bytes( \$CRLF ) ) {
- $self->LastError( "Error appending CRLF: " . $self->LastError );
- return undef;
- }
-
- # Now for the crucial test: Did the append work or not?
- # look for " (OK|BAD|NO)"
- my $code = $self->_get_response( $self->Count ) or return undef;
-
- if ( $code eq 'OK' ) {
- my $data = join '', $self->Results;
-
- # look for something like return size or self if no size found:
- # OK [APPENDUID ] APPEND completed
- my $ret = $data =~ m#\s+(\d+)\]# ? $1 : $self;
-
- return $ret;
- }
- else {
- return undef;
- }
-}
-
-# BUG? we should retry if "socket closed while..." but do not currently
-sub authenticate {
- my ( $self, $scheme, $response ) = @_;
- $scheme ||= $self->Authmechanism;
- $response ||= $self->Authcallback;
- my $clear = $self->Clear;
- $self->Clear($clear)
- if $self->Count >= $clear && $clear > 0;
-
- if ( !$scheme ) {
- $self->LastError("Authmechanism not set");
- return undef;
- }
- elsif ( $scheme eq 'LOGIN' ) {
- $self->LastError("Authmechanism LOGIN is invalid, use login()");
- return undef;
- }
-
- my $string = "AUTHENTICATE $scheme";
-
- # use _imap_command for retry mechanism...
- $self->_imap_command( $string, '+' ) or return undef;
-
- my $count = $self->Count;
- my $code;
-
- # look for "+ " or just "+"
- foreach my $line ( $self->Results ) {
- if ( $line =~ /^\+\s*(.*?)\s*$/ ) {
- $code = $1;
- last;
- }
- }
-
- # BUG? use _load_module for these too?
- if ( $scheme eq 'CRAM-MD5' ) {
- $response ||= sub {
- my ( $code, $client ) = @_;
- require Digest::HMAC_MD5;
- my $hmac =
- Digest::HMAC_MD5::hmac_md5_hex( decode_base64($code),
- $client->Password );
- encode_base64( $client->User . " " . $hmac, '' );
- };
- }
- elsif ( $scheme eq 'DIGEST-MD5' ) {
- $response ||= sub {
- my ( $code, $client ) = @_;
- require Authen::SASL;
- require Digest::MD5;
-
- my $authname =
- defined $client->Authuser ? $client->Authuser : $client->User;
-
- my $sasl = Authen::SASL->new(
- mechanism => 'DIGEST-MD5',
- callback => {
- user => $client->User,
- pass => $client->Password,
- authname => $authname
- }
- );
-
- # client_new is an empty function for DIGEST-MD5
- my $conn = $sasl->client_new( 'imap', 'localhost', '' );
- my $answer = $conn->client_step( decode_base64 $code);
-
- encode_base64( $answer, '' )
- if defined $answer;
- };
- }
- elsif ( $scheme eq 'PLAIN' ) { # PLAIN SASL
- $response ||= sub {
- my ( $code, $client ) = @_;
- encode_base64( # [authname] user password
- join(
- chr(0),
- defined $client->Proxy
- ? ( $client->User, $client->Proxy )
- : ( "", $client->User ),
- defined $client->Password ? $client->Password : "",
- ),
- ''
- );
- };
- }
- elsif ( $scheme eq 'NTLM' ) {
- $response ||= sub {
- my ( $code, $client ) = @_;
-
- require Authen::NTLM;
- Authen::NTLM::ntlm_user( $client->User );
- Authen::NTLM::ntlm_password( $client->Password );
- Authen::NTLM::ntlm_domain( $client->Domain ) if $client->Domain;
- Authen::NTLM::ntlm($code);
- };
- }
-
- my $resp = $response->( $code, $self );
- unless ( defined($resp) ) {
- $self->LastError( "Error getting $scheme data: " . $self->LastError );
- return undef;
- }
- unless ( $self->_send_line($resp) ) {
- $self->LastError( "Error sending $scheme data: " . $self->LastError );
- return undef;
- }
-
- # this code may be a little too custom to try and use _get_response()
- # look for "+ " (not just "+") otherwise " (OK|BAD|NO)"
- undef $code;
- until ($code) {
- my $output = $self->_read_line or return undef;
- foreach my $o (@$output) {
- $self->_record( $count, $o );
- $code = $o->[DATA] =~ /^\+\s+(.*?)\s*$/ ? $1 : undef;
-
- if ($code) {
- unless ( $self->_send_line( $response->( $code, $self ) ) ) {
- $self->LastError(
- "Error sending $scheme data: " . $self->LastError );
- return undef;
- }
- undef $code; # clear code as we are not finished yet
- }
-
- if ( $o->[DATA] =~ /^$count\s+(OK|NO|BAD)\b/i ) {
- $code = uc($1);
- $self->LastError( $o->[DATA] ) unless ( $code eq 'OK' );
- }
- elsif ( $o->[DATA] =~ /^\*\s+BYE/ ) {
- $self->State(Unconnected);
- $self->LastError( $o->[DATA] );
- return undef;
- }
- }
- }
-
- return undef unless $code eq 'OK';
-
- Authen::NTLM::ntlm_reset()
- if $scheme eq 'NTLM';
-
- $self->State(Authenticated);
- return $self;
-}
-
-# UIDPLUS response from a copy: [COPYUID (uidvalidity) (origuid) (newuid)]
-sub copy {
- my ( $self, $target, @msgs ) = @_;
-
- my $msgs =
- $self->Ranges
- ? $self->Range(@msgs)
- : join ',', map { ref $_ ? @$_ : $_ } @msgs;
-
- $self->_imap_uid_command( COPY => $msgs, $self->Quote($target) )
- or return undef;
-
- my @results = $self->History;
-
- my @uids;
- foreach (@results) {
- chomp;
- s/$CR?$LF$//o;
- s/^.*\[COPYUID\s+\d+\s+[\d:,]+\s+([\d:,]+)\].*/$1/ or next;
- push @uids, /(\d+):(\d+)/ ? ( $1 ... $2 ) : ( split /\,/ );
-
- }
- return @uids ? join( ",", @uids ) : $self;
-}
-
-sub move {
- my ( $self, $target, @msgs ) = @_;
-
- $self->exists($target)
- or $self->create($target) && $self->subscribe($target);
-
- my $uids =
- $self->copy( $target, map { ref $_ eq 'ARRAY' ? @$_ : $_ } @msgs )
- or return undef;
-
- unless ( $self->delete_message(@msgs) ) {
- local ($!); # old versions of Carp could reset $!
- carp $self->LastError;
- }
-
- return $uids;
-}
-
-sub set_flag {
- my ( $self, $flag, @msgs ) = @_;
- @msgs = @{ $msgs[0] } if ref $msgs[0] eq 'ARRAY';
- $flag = "\\$flag"
- if $flag =~ /^(?:Answered|Flagged|Deleted|Seen|Draft)$/i;
-
- my $which = $self->Ranges ? $self->Range(@msgs) : join( ',', @msgs );
- return $self->store( $which, '+FLAGS.SILENT', "($flag)" );
-}
-
-sub see {
- my ( $self, @msgs ) = @_;
- @msgs = @{ $msgs[0] } if ref $msgs[0] eq 'ARRAY';
- return $self->set_flag( '\\Seen', @msgs );
-}
-
-sub mark {
- my ( $self, @msgs ) = @_;
- @msgs = @{ $msgs[0] } if ref $msgs[0] eq 'ARRAY';
- return $self->set_flag( '\\Flagged', @msgs );
-}
-
-sub unmark {
- my ( $self, @msgs ) = @_;
- @msgs = @{ $msgs[0] } if ref $msgs[0] eq 'ARRAY';
- return $self->unset_flag( '\\Flagged', @msgs );
-}
-
-sub unset_flag {
- my ( $self, $flag, @msgs ) = @_;
- @msgs = @{ $msgs[0] } if ref $msgs[0] eq 'ARRAY';
-
- $flag = "\\$flag"
- if $flag =~ /^(?:Answered|Flagged|Deleted|Seen|Draft)$/i;
-
- return $self->store( join( ",", @msgs ), "-FLAGS.SILENT ($flag)" );
-}
-
-sub deny_seeing {
- my ( $self, @msgs ) = @_;
- @msgs = @{ $msgs[0] } if ref $msgs[0] eq 'ARRAY';
- return $self->unset_flag( '\\Seen', @msgs );
-}
-
-sub size {
- my ( $self, $msg ) = @_;
- my $data = $self->fetch( $msg, "(RFC822.SIZE)" ) or return undef;
-
- # beware of response like: * NO Cannot open message $msg
- my $cmd = shift @$data;
- my $err;
- foreach my $line (@$data) {
- return $1 if ( $line =~ /RFC822\.SIZE\s+(\d+)/ );
- $err = $line if ( $line =~ /\* NO\b/ );
- }
-
- if ($err) {
- my $info = "$err was returned for $cmd";
- $info =~ s/$CR?$LF//og;
- $self->LastError($info);
- }
- elsif ( !$self->LastError ) {
- my $info = "no RFC822.SIZE found in: " . join( " ", @$data );
- $self->LastError($info);
- }
- return undef;
-}
-
-sub getquotaroot {
- my ( $self, $what ) = @_;
- my $who = defined $what ? $self->Quote($what) : "INBOX";
- return $self->_imap_command("GETQUOTAROOT $who") ? $self->Results : undef;
-}
-
-# BUG? using user/$User here and INBOX in quota/quota_usage
-sub getquota {
- my ( $self, $what ) = @_;
- my $who = defined $what ? $self->Quote($what) : "user/" . $self->User;
- return $self->_imap_command("GETQUOTA $who") ? $self->Results : undef;
-}
-
-# usage: $self->setquota($quotaroot, storage => 512, ...)
-sub setquota(@) {
- my ( $self, $what ) = ( shift, shift );
- my $who = defined $what ? $self->Quote($what) : "user/" . $self->User;
- my @limits;
- while (@_) {
- my ( $k, $v ) = ( $self->Quote( uc( shift @_ ) ), shift @_ );
- push( @limits, "($k $v)" );
- }
- my $limits = join( ' ', @limits );
- $self->_imap_command("SETQUOTA $who $limits") ? $self->Results : undef;
-}
-
-sub quota {
- my ( $self, $what ) = ( shift, shift || "INBOX" );
- my $tref = $self->getquota($what) or return undef;
- shift @$tref; # pop off command
- return ( map { /.*STORAGE\s+\d+\s+(\d+).*\n$/ ? $1 : () } @$tref )[0];
-}
-
-sub quota_usage {
- my ( $self, $what ) = ( shift, shift || "INBOX" );
- my $tref = $self->getquota($what) or return undef;
- shift @$tref; # pop off command
- return ( map { /.*STORAGE\s+(\d+)\s+\d+.*\n$/ ? $1 : () } @$tref )[0];
-}
-
-# rfc3501:
-# atom-specials = "(" / ")" / "{" / SP / CTL / list-wildcards /
-# quoted-specials / resp-specials
-# list-wildcards = "%" / "*"
-# quoted-specials = DQUOTE / "\"
-# resp-specials = "]"
-# rfc2060:
-# CTL ::=
-# Paranoia/safety:
-# encode strings with "}" / "[" / "]" / non-ascii chars
-sub Quote($;$) {
- my ( $self, $name, $force ) = @_;
- if ( $force or $name =~ /["\\[:^ascii:][:cntrl:]]/s ) {
- return "{" . length($name) . "}" . $CRLF . $name;
- }
- elsif ( $name =~ /[(){}\s%*\[\]]/s or $name eq "" ) {
- return qq("$name");
- }
- else {
- return $name;
- }
-}
-
-# legacy behavior: strip double quote around folder name args!
-sub Massage($;$) {
- my ( $self, $name, $notFolder ) = @_;
- $name =~ s/^\"(.*)\"$/$1/s unless $notFolder;
- return $self->Quote($name);
-}
-
-sub unseen_count {
- my ( $self, $folder ) = ( shift, shift );
- $folder ||= $self->Folder;
- $self->status( $folder, 'UNSEEN' ) or return undef;
-
- my $r =
- first { s/\*\s+STATUS\s+.*\(UNSEEN\s+(\d+)\s*\)/$1/ } $self->History;
-
- $r =~ s/\D//g;
- return $r;
-}
-
-sub State($) {
- my ( $self, $state ) = @_;
-
- if ( defined $state ) {
- $self->{State} = $state;
-
- # discard cached capability info after authentication
- delete $self->{CAPABILITY} if ( $state == Authenticated );
- }
-
- return defined( $self->{State} ) ? $self->{State} : Unconnected;
-}
-
-sub Status { shift->State }
-sub IsUnconnected { shift->State == Unconnected }
-sub IsConnected { shift->State >= Connected }
-sub IsAuthenticated { shift->State >= Authenticated }
-sub IsSelected { shift->State == Selected }
-
-# The following private methods all work on an output line array.
-# _data returns the data portion of an output array:
-sub _data { ref $_[1] && defined $_[1]->[TYPE] ? $_[1]->[DATA] : undef }
-
-# _index returns the index portion of an output array:
-sub _index { ref $_[1] && defined $_[1]->[TYPE] ? $_[1]->[INDEX] : undef }
-
-# _type returns the type portion of an output array:
-sub _type { ref $_[1] && $_[1]->[TYPE] }
-
-# _is_literal returns true if this is a literal:
-sub _is_literal { ref $_[1] && $_[1]->[TYPE] && $_[1]->[TYPE] eq 'LITERAL' }
-
-# _is_output_or_literal returns true if this is an
-# output line (or the literal part of one):
-
-sub _is_output_or_literal {
- ref $_[1]
- && defined $_[1]->[TYPE]
- && ( $_[1]->[TYPE] eq "OUTPUT" || $_[1]->[TYPE] eq "LITERAL" );
-}
-
-# _is_output returns true if this is an output line:
-sub _is_output { ref $_[1] && $_[1]->[TYPE] && $_[1]->[TYPE] eq "OUTPUT" }
-
-# _is_input returns true if this is an input line:
-sub _is_input { ref $_[1] && $_[1]->[TYPE] && $_[1]->[TYPE] eq "INPUT" }
-
-# _next_index returns next_index for a transaction; may legitimately
-# return 0 when successful.
-sub _next_index { my $r = $_[0]->_transaction( $_[1] ); $r }
-
-sub Range {
- my ( $self, $targ ) = ( shift, shift );
-
- UNIVERSAL::isa( $targ, 'Mail::IMAPClient::MessageSet' )
- ? $targ->cat(@_)
- : Mail::IMAPClient::MessageSet->new( $targ, @_ );
-}
-
-1;
diff --git a/W/Mail-IMAPClient-3.42/lib/Mail/IMAPClient.pod b/W/Mail-IMAPClient-3.42/lib/Mail/IMAPClient.pod
deleted file mode 100644
index 4298f64..0000000
--- a/W/Mail-IMAPClient-3.42/lib/Mail/IMAPClient.pod
+++ /dev/null
@@ -1,4033 +0,0 @@
-=head1 NAME
-
-Mail::IMAPClient - An IMAP Client API
-
-=head1 SYNOPSIS
-
- use Mail::IMAPClient;
-
- my $imap = Mail::IMAPClient->new(
- Server => 'localhost',
- User => 'username',
- Password => 'password',
- Ssl => 1,
- Uid => 1,
- );
-
- my $folders = $imap->folders
- or die "List folders error: ", $imap->LastError, "\n";
- print "Folders: @$folders\n";
-
- $imap->select( $Opt{folder} )
- or die "Select '$Opt{folder}' error: ", $imap->LastError, "\n";
-
- $imap->fetch_hash("FLAGS", "INTERNALDATE", "RFC822.SIZE")
- or die "Fetch hash '$Opt{folder}' error: ", $imap->LastError, "\n";
-
- $imap->logout
- or die "Logout error: ", $imap->LastError, "\n";
-
-=head1 DESCRIPTION
-
-This module provides methods implementing the IMAP protocol to support
-interacting with IMAP message stores.
-
-The module is used by constructing or instantiating a new IMAPClient
-object via the L constructor method. Once the object has been
-instantiated, the L method is either implicitly or
-explicitly called. At that point methods are available that implement
-the IMAP client commands as specified in B. When processing
-is complete, the L object method should be called.
-
-This documentation is not meant to be a replacement for RFC3501 nor
-any other IMAP related RFCs.
-
-Note that this documentation uses the term I in place of
-RFC3501's use of I. This documentation reserves the use of
-the term I to refer to the set of folders owned by a specific
-IMAP id.
-
-=head2 Connection State
-
-RFC3501 defines four possible states for an IMAP connection: not
-authenticated, authenticated, selected, and logged out. These
-correspond to the IMAPClient constants C, C,
-C, and C, respectively. These constants can be
-used in conjunction with the L method to determine the status
-of an IMAPClient object and its underlying IMAP session.
-
-Note that an IMAPClient object can be in the C state both
-before a server connection is made and after it has ended. This
-differs slightly from RFC3501, which does not define a pre-connection
-status. For a discussion of the methods available for examining the
-IMAPClient object's status, see the section labeled
-L"Status Methods">, below.
-
-=head2 Advanced Authentication Mechanisms
-
-RFC3501 defines two commands for authenticating to an IMAP server:
-
-=over 4
-
-=item LOGIN
-
-LOGIN is for plain text authentication.
-
-=item AUTHENTICATE
-
-AUTHENTICATE for more advanced and/or secure authentication mechanisms.
-
-=back
-
-Mail::IMAPClient supports the following AUTHENTICATE mechanisms:
-
-=over 4
-
-=item DIGEST-MD5
-
-DIGEST-MD5 authentication requires the L and
-L modules. See also L.
-
-=item CRAM-MD5
-
-CRAM-MD5 requires the L module.
-
-=item PLAIN (SASL)
-
-PLAIN (SASL) authentication allows the optional use of the L
-parameter. RFC 4616 documents this syntax for SASL PLAIN:
-
- message = [authzid] UTF8NUL authcid UTF8NUL passwd
-
-When L is defined, L
is used as 'authzid' and L
-is used as 'authcid'. Otherwise, L is used as 'authcid'.
-
-=item NTLM
-
-NTLM authentication requires the L module. See also
-L.
-
-=back
-
-=head2 Errors
-
-If you attempt an operation that results in an error, then you can
-retrieve the text of the error message by using the L
-method. However, the L method is an object method (not a
-class method) and can only be used once an object is successfully
-created. In cases where an object is not successfully created the
-C<$@> variable is set with an error message.
-
-Mail::IMAPClient resets C<$@> and L to undef before most
-IMAP requests, so the values only have a short lifespan.
-L will always contain error info from the last error,
-until another error is encountered, another IMAP command is issued or
-it is explicitly cleared.
-
-Please note that the use of C<$@> is subject to change in the future
-release so it is best to use L for error checking once a
-Mail::IMAPClient object has been created.
-
-Errors in the L method can prevent your object from ever being
-created. If the L , L, and L parameters are
-supplied to L, it will attempt to call L and
-L. Any of these methods could fail and cause the L
-method call to return C and leaving the variable C<$@> is set
-to an error message.
-
-WARNING: (due to historical API behavior) on errors, many methods may
-return undef regardless of LIST/SCALAR context. Therefore, it may be
-wise to use most methods in a scalar context. Regardless, check
-L for details on errors.
-
-=head2 Transactions
-
-RFC3501 requires that each line in an IMAP conversation be prefixed
-with a tag. A typical conversation consists of the client issuing a
-tag-prefixed command string, and the server replying with one of more
-lines of output. Those lines of output will include a command
-completion status code prefixed by the same tag as the original
-command string.
-
-The IMAPClient module uses a simple counter to ensure that each client
-command is issued with a unique tag value. This tag value is referred
-to by the IMAPClient module as the transaction number. A history is
-maintained by the IMAPClient object documenting each transaction. The
-L method returns the number of the last transaction, and
-can be used to retrieve lines of text from the object's history.
-
-The L parameter is used to control the size of the session
-history so that long-running sessions do not eat up unreasonable
-amounts of memory. See the discussion of L parameter for more
-information.
-
-The L transaction returns the history of the entire IMAP
-session since the initial connection or for the last L
-transactions. This provides a record of the entire conversation,
-including client command strings and server responses, and is a
-wonderful debugging tool as well as a useful source of raw data for
-custom parsing.
-
-=head1 CLASS METHODS
-
-There are a couple of methods that can be invoked as class methods.
-Generally they can be invoked as an object method as well. Note that
-if the L method is called as an object method, the object
-returned is identical to what have would been returned if L had
-been called as a class method. It doesn't give you a copy of the
-original object.
-
-=head2 new
-
-Example:
-
- my $imap = Mail::IMAPClient->new(%args)
- or die "new failed: $@\n";
-
-The L method creates a new instance of an IMAPClient object.
-
-If the L parameter is passed as an argument to B, then
-B will implicitly call the L method, placing the new
-object in the I state. If L and L values
-are also provided, then L will in turn call L, and
-the resulting object will be returned from B in the
-I state.
-
-If the L parameter is not supplied then the IMAPClient
-object is created in the I state.
-
-If the B method is passed arguments then those arguments will be
-treated as a list of key=>value pairs. The key should be one of the
-parameters as documented under L"Parameters"> below.
-
-Here are some examples:
-
- use Mail::IMAPClient;
-
- # returns an unconnected Mail::IMAPClient object:
- my $imap = Mail::IMAPClient->new;
- # ...
- # intervening code using the 1st object, then:
- # (returns a new, authenticated Mail::IMAPClient object)
- $imap = Mail::IMAPClient->new(
- Server => $host,
- User => $id,
- Password => $pass,
- Clear => 5, # Unnecessary since '5' is the default
- # ... # Other key=>value pairs go here
- ) or die "Cannot connect to $host as $id: $@";
-
-See also L, L and L for more
-information on how to manually connect and login after B.
-
-=head2 Quote
-
-Example:
-
- $imap->search( HEADER => 'Message-id' => \$imap->Quote($msg_id) );
-
-The B method accepts a value as an argument and returns its
-argument as a correctly quoted string or a literal string. Since
-version 3.17 Mail::IMAPClient automatically quotes search arguments we
-use a SCALARREF so search will not modify or re-quote the value
-returned by B.
-
-Note this method should not be used on folder names for
-Mail::IMAPClient methods, since methods that accept folder names as an
-argument will quote the folder name arguments automatically.
-
-If you are getting unexpected results when running methods with values
-that have (or might have) embedded spaces, double quotes, braces, or
-parentheses, then calling B may be necessary. This method
-should B be used with arguments that are wrapped in quotes or
-parens if those quotes or parens are required by RFC3501. For
-example, if the RFC requires an argument in this format:
-
- ( argument )
-
-and the argument is (or might be) "pennies (from heaven)", then one
-could use:
-
- $argument = "(" . $imap->Quote($argument) . ")"
-
-Of course, the fact that sometimes these characters are sometimes
-required delimiters is precisely the reason you must quote them when
-they are I delimiting.
-
-However, there are times when a method fails unexpectedly and may
-require the use of B to work. Should this happen, you can
-probably file a bug/enhancement request for Mail::IMAPClient to
-safeguard the particular call/case better.
-
-An example is RFC822 Message-id's, which I don't contain
-quotes or parens. When dealing with these it is usually best to take
-proactive, defensive measures from the very start and use B.
-
-=head2 Range
-
-Example:
-
- my $parsed = $imap->parse_headers(
- $imap->Range( $imap->messages ), "Date", "Subject"
- );
-
-The B method will condense a list of message sequence numbers
-or message UID's into the most compact format supported by RFC3501.
-It accepts one or more arguments, each of which can be:
-
-=over 4
-
-=item a) a message number,
-
-=item b) a comma-separated list of message numbers,
-
-=item c) a colon-separated range of message numbers (i.e. "$begin:$end")
-
-=item d) a combination of messages and message ranges, separated by commas
-(i.e. 1,3,5:8,10), or
-
-=item e) a reference to an array whose elements are like I through I.
-
-=back
-
-The B method returns a L object.
-The object uses L and if treated as a string it will act
-like a string. This means you can ignore its objectivity and just
-treat it like a string whose value is your message set expressed in
-compact format.
-
-This method provides an easy way to add or remove messages from a
-message set.
-
-For more information see L.
-
-=head2 Rfc3501_date
-
-Example:
-
- $Rfc3501_date = $imap->Rfc3501_date($seconds);
- # or:
- $Rfc3501_date = Mail::IMAPClient->Rfc3501_date($seconds);
-
-The B method accepts one input argument, a number of
-seconds since the epoch date. It returns an RFC3501 compliant date
-string for that date (as required in date-related arguments to SEARCH,
-such as "since", "before", etc.).
-
-=head2 Rfc3501_datetime
-
-Example:
-
- $date = $imap->Rfc3501_datetime($seconds);
- # or:
- $date = Mail::IMAPClient->Rfc3501_datetime($seconds);
-
-The B method accepts one or two arguments: a
-obligatory timestamp and an optional zone. The zone shall be
-formatted as C<< [+-]\d{4} >>, and defaults to C<< +0000 >>. The
-timestamp follows the definition of the output of the platforms
-specific C, usually in seconds since Jan 1st 1970. However, you
-have to correct the number yourself for the zone.
-
-=head2 Rfc822_date
-
-Example:
-
- $Rfc822_date = $imap->Rfc822_date($seconds);
- # or:
- $Rfc822_date = Mail::IMAPClient->Rfc822_date($seconds);
-
-The B method accepts one input argument, a number of
-seconds since the epoch date. It returns an RFC822 compliant date
-string for that date (without the 'Date:' prefix). Useful for putting
-dates in message strings before calling L, L, etc.
-
-=head2 Strip_cr
-
-Examples:
-
- my $stripped = $imap->Strip_cr($string);
- # or:
- my @list = $imap->some_imap_method;
- @list = $imap->Strip_cr(@list);
- # or:
- my $list = [ $imap->some_imap_method ]; # returns an array ref
- $list = $imap->Strip_cr($list);
-
-The B method strips carriage returns from input and returns
-the new string to the caller. This method accepts one or more lines
-of text as arguments, and returns those lines with all
-sequences changed to . Any input argument with no carriage
-returns is returned unchanged. If the first argument (not counting
-the class name or object reference) is an array reference, then
-members of that array are processed as above and subsequent arguments
-are ignored. If the method is called in scalar context then an array
-reference is returned instead of an array of results.
-
-NOTE: B does not remove new line characters.
-
-=head1 OBJECT METHODS
-
-Object methods must be invoked against objects created via the L
-method and cannot be invoked as class methods.
-
-There object methods typically fall into one of two categories. There
-are mailbox methods which participate in the IMAP session's
-conversation (i.e. they issue IMAP client commands) and object control
-methods which do not result in IMAP commands but which may affect
-later commands or provide details of previous ones.
-
-This object control methods can be further broken down into two
-types, Parameter accessor methods, which affect the behavior of future
-mailbox methods, and L"Status Methods">, which report on the affects
-of previous mailbox methods.
-
-Methods that do not result in new IMAP client commands being issued
-(such as the L, L, and L methods) all
-begin with an uppercase letter, to distinguish them from methods that
-do correspond to IMAP client commands. Class methods and eponymous
-parameter methods likewise begin with an uppercase letter because they
-also do not correspond to an IMAP client command.
-
-As a general rule, mailbox control methods return C on failure
-and something besides C when they succeed. This rule is
-modified in the case of methods that return search results. When
-called in a list context, searches that do not find matching results
-return an empty list. When called in a scalar context, searches with
-no hits return 'undef' instead of an array reference. If you want to
-know why you received no hits, you should check L or
-C<$@>, which will be empty if the search was successful but had no
-matching results but populated with an error message if the search
-encountered a problem (such as invalid parameters).
-
-A number of IMAP commands do not have corresponding Mail::IMAPClient
-methods. Patches are welcome. In the pre-2.99 releases of this
-module, they were automatically created (AUTOLOAD), but that was very
-error-prone and stalled the progress of this module.
-
-=head1 Mailbox Control Methods
-
-=head2 append
-
-Example:
-
- my $uid_or_true = $imap->append( $folder, $msgtext )
- or die "Could not append: ", $imap->LastError;
-
-WARNING: This method may be deprecated in the future, consider using
-L instead of this method.
-
-The B method adds a message to the specified folder. See
-L for details as it is effectively an alias for that
-method.
-
-DEPRECATED BEHAVIOR: Additional arguments are added to the message
-text, separated with .
-
-=head2 append_string
-
-Example:
-
- # brackets indicate optional arguments (not array refs):
- my $uidort = $imap->append_string( $folder, $msgtext [,$flags [,$date ] ] )
- or die "Could not append_string: ", $imap->LastError;
-
-Arguments:
-
-=over 4
-
-=item $folder
-
-the name of the folder to append the message to
-
-=item $msgtext
-
-the message text (including headers) of the message
-
-=item $flags
-
-An optional list of flags to set. The list must be specified as
-a space-separated list of flags, including any backslashes that may be
-necessary and optionally enclosed by parenthesis.
-
-=item $date
-
-An optional RFC3501 date argument to set as the internal date. It
-should be in the format described for I fields in RFC3501,
-i.e. "dd-Mon-yyyy hh:mm:ss +0000".
-
-If you want to specify a date/time but you don't want any flags then
-specify I as the third ($flags) argument.
-
-=back
-
-Returns:
-
-=over 4
-
-=item error: undef
-
-On error, undef can be returned regardless of LIST/SCALAR context.
-Check L for details.
-
-=item success: UID or $imap
-
-With UIDPLUS the UID of the new message is returned otherwise a true
-value (currently $self) is returned.
-
-=back
-
-To protect against "bare newlines", B will insert a carriage
-return before any newline that is "bare".
-
-=head2 append_file
-
-Example:
-
- my $new_msg_uid = $imap->append_file(
- $folder,
- $file,
- [ undef, $flags, $date ] # optional
- ) or die "Could not append_file: ", $imap->LastError;
-
-The B method adds a message to the specified folder.
-Note: The brackets in the example indicate optional arguments; they do
-not mean that the argument should be an array reference.
-
-Arguments:
-
-=over 4
-
-=item $folder
-
-the name of the folder to append the message to
-
-=item $file
-
-a filename, filehandle or SCALAR reference which holds an
-RFC822-formatted message
-
-=item undef
-
-a deprecated argument used as a place holder for backwards
-compatibility
-
-=item $flags
-
-The optional argument is handled the same as append_string.
-
-=item $date
-
-The optional argument is handled the same as append_string (RFC3501
-date), with the exception that if $date is "1" (one) then the
-modification time (mtime) of the file will be used.
-
-=back
-
-Returns:
-
-=over 4
-
-=item error: undef
-
-On error, undef can be returned regardless of LIST/SCALAR context.
-Check L for details.
-
-=item success: UID or $imap
-
-With UIDPLUS the UID of the new message is returned otherwise a true
-value (currently $self) is returned.
-
-=back
-
-To protect against "bare newlines", B will insert a
-carriage return before any newline that is "bare".
-
-The B method provides a mechanism for allowing large
-messages to be appended without holding the whole file in memory.
-
-Version note: In 2.x an optional third argument to use for
-C was allowed, however this argument is
-ignored/not supported as of 3.x.
-
-=head2 authenticate
-
-Example:
-
- $imap->authenticate( $authentication_mechanism, $coderef )
- or die "Could not authenticate: ", $imap->LastError;
-
-This method implements the AUTHENTICATE IMAP client command. It can
-be called directly or may be called by L if the
-L parameter is set to anything except 'LOGIN'.
-
-The B method accepts two arguments, an authentication
-type to be used (ie CRAM-MD5) and a code or subroutine reference to
-execute to obtain a response. The B method assumes that
-the authentication type specified in the first argument follows a
-challenge-response flow. The B method issues the IMAP
-Client AUTHENTICATE command and receives a challenge from the server.
-That challenge (minus any tag prefix or enclosing '+' characters but
-still in the original base64 encoding) is passed as the only argument
-to the code or subroutine referenced in the second argument. The
-return value from the 2nd argument's code is written to the server as
-is, except that a sequence is appended if necessary.
-
-If one or both of the arguments are not specified in the call to
-B but their corresponding parameters have been set
-(L and L, respectively) then the parameter
-values are used. Arguments provided to the method call however will
-override parameter settings.
-
-If you do not specify a second argument and you have not set the
-L parameter, then the first argument must be
-one of the authentication mechanisms for which Mail::IMAPClient
-has built in support.
-
-See also the L method, which is the simplest form of
-authentication defined by RFC3501.
-
-=head2 before
-
-Example:
-
- my @msgs = $imap->before($Rfc3501_date)
- or warn "No messages found before $Rfc3501_date.\n";
-
-The B method works just like the L"since"> method, below,
-except it returns a list of messages whose internal system dates are
-before the date supplied as the argument to the B method.
-
-=head2 body_string
-
-Example:
-
- my $string = $imap->body_string($msgId)
- or die "body_string failed: ", $imap->LastError;
-
-The B method accepts a message sequence number (or a
-message UID, if the L parameter is set to true) as an argument
-and returns the message body as a string. The returned value contains
-the entire message in one scalar variable, without the message
-headers.
-
-=head2 bodypart_string
-
-Example:
-
- my $string = $imap->bodypart_string(
- $msgid, $part_number, $length, $offset
- ) or die "Could not get bodypart string: ", $imap->LastError;
-
-The B method accepts a message sequence number (or a
-message UID, if the L parameter is set to true) and a body part
-as arguments and returns the message part as a string. The returned
-value contains the entire message part (or, optionally, a portion of
-the part) in one scalar variable.
-
-If an optional third argument is provided, that argument is the number
-of bytes to fetch. (The default is the whole message part.) If an
-optional fourth argument is provided then that fourth argument is the
-offset into the part at which the fetch should begin. The default is
-offset zero, or the beginning of the message part.
-
-If you specify an offset without specifying a length then the offset
-will be ignored and the entire part will be returned.
-
-B will return C if it encounters an error.
-
-=head2 capability
-
-Example:
-
- my $features = $imap->capability
- or die "Could not determine capability: ", $imap->LastError;
-
-The B method returns an array (or arrayref in scalar
-context) of capabilities as returned by the CAPABILITY IMAP client
-command. If the CAPABILITY IMAP client command fails for any reason
-then the B method will return C. Supported
-capabilities are cached by the client, however, this cache is deleted
-after a connection is set to I and when L is
-called.
-
-See also L.
-
-=head2 close
-
-Example:
-
- $imap->close or die "Could not close: $@\n";
-
-The B method is used to close the currently selected folder via
-the CLOSE IMAP client command. According to RFC3501, the CLOSE
-command performs an implicit EXPUNGE, which means that any messages
-that are flagged as I<\Deleted> (i.e. with the L
-method) will now be deleted. If you haven't deleted any messages then
-B can be thought of as an "unselect".
-
-Note: this closes the currently selected folder, not the IMAP session.
-
-See also L, L, and RFC3501.
-
-=head2 compress
-
-Example:
-
- $imap->compress or die "Could not enable RFC4978 compression: $@\n";
-
-The B method accepts no arguments. This method is used to
-instruct the server to use the DEFLATE (RFC1951) compression
-extension. See the L attribute for how to specify
-arguments for use during the initialization process.
-
-Version note: method added in Mail::IMAPClient 3.30
-
-=head2 connect
-
-Example:
-
- $imap->connect or die "Could not connect: $@\n";
-
-The B method connects an imap object to the server. It
-returns C if it fails to connect for any reason. If values are
-available for the L and L parameters at the time
-that B is invoked, then B will call the L
-method after connecting and return the result of the L method
-to B's caller. If either or both of the L and
-L parameters are unavailable but the connection to the
-server succeeds then B returns a pointer to the IMAPClient
-object.
-
-The L parameter must be set (either during L method
-invocation or via the L object method) before invoking
-B. When the parameter is an absolute file path, an UNIX
-socket will get opened. If the L parameter is supplied to
-the L method then B is implicitly called during object
-construction.
-
-The B method sets the state of the object to C if
-it successfully connects to the server. It returns C on
-failure.
-
-=head2 copy
-
-Example:
-
- # Here brackets indicate optional arguments:
- my $uidList = $imap->copy($folder, $msg_1 [ , ... , $msg_n ])
- or die "Could not copy: $@\n";
-
-Or:
-
- # Now brackets indicate an array ref!
- my $uidList = $imap->copy($folder, [ $msg_1, ... , $msg_n ])
- or die "Could not copy: $@\n";
-
-The B method requires a folder name as the first argument, and a
-list of one or more messages sequence numbers (or messages UID's, if
-the I parameter is set to a true value). The message sequence
-numbers or UID's should refer to messages in the currently selected
-folder. Those messages will be copied into the folder named in the
-first argument.
-
-The B method returns C on failure and a true value if
-successful. If the server to which the current Mail::IMAPClient
-object is connected supports the UIDPLUS capability then the true
-value returned by B will be a comma separated list of UID's,
-which are the UID's of the newly copied messages in the target folder.
-
-=head2 create
-
-Example:
-
- $imap->create($new_folder)
- or die "Could not create $new_folder: $@\n";
-
-The B method accepts one argument, the name of a folder (or
-what RFC3501 calls a "mailbox") to create. If you specify additional
-arguments to the B method and your server allows additional
-arguments to the CREATE IMAP client command then the extra argument(s)
-will be passed to your server.
-
-If you specify additional arguments to the B method and your
-server does not allow additional arguments to the CREATE IMAP client
-command then the extra argument(s) will still be passed to your server
-and the create will fail.
-
-B returns a true value on success and C on failure.
-
-=head2 date
-
-Example:
-
- my $date = $imap->date($msg);
-
-The B method accepts one argument, a message sequence number (or
-a message UID if the L parameter is set to a true value). It
-returns the date of message as specified in the message's RFC822
-"Date: " header, without the "Date: " prefix.
-
-The B method is a short-cut for:
-
- my $date = $imap->get_header($msg,"Date");
-
-=head2 delete
-
-Example:
-
- $imap->delete($folder) or die "Could not delete $folder: $@\n";
-
-The B method accepts a single argument, the name of a folder
-to delete. It returns a true value on success and C on
-failure.
-
-=head2 deleteacl
-
-Example:
-
- $imap->deleteacl( $folder, $userid )
- or die "Could not delete acl: $@\n";
-
-The B method accepts two input arguments, a folder name, a
-user id (or authentication identifier, to use the terminology of
-RFC2086). See RFC2086 for more information. (This is somewhat
-experimental and its implementation may change.)
-
-=head2 delete_message
-
-Example:
-
- my @msgs = $imap->seen;
- scalar(@msgs) and $imap->delete_message(\@msgs)
- or die "Could not delete_message: $@\n";
-
-The above could also be rewritten like this:
-
- # scalar context returns array ref
- my $msgs = scalar($imap->seen);
-
- scalar(@$msgs) and $imap->delete_message($msgs)
- or die "Could not delete_message: $@\n";
-
-Or, as a one-liner:
-
- $imap->delete_message( scalar($imap->seen) )
- or warn "Could not delete_message: $@\n";
- # just give warning in case failure is
- # due to having no 'seen' msgs in the 1st place!
-
-The B method accepts a list of arguments. If the
-L parameter is not set to a true value, then each item in the
-list should be either:
-
-=over 4
-
-=item *
-
-a message sequence number,
-
-=item *
-
-a comma-separated list of message sequence numbers,
-
-=item *
-
-a reference to an array of message sequence numbers, or
-
-=back
-
-If the L parameter is set to a true value, then each item in the
-list should be either:
-
-=over 4
-
-=item *
-
-a message UID,
-
-=item *
-
-a comma-separated list of UID's, or
-
-=item *
-
-a reference to an array of message UID's.
-
-=back
-
-The messages identified by the sequence numbers or UID's will be
-deleted. If successful, B returns the number of
-messages it was told to delete. However, since the delete is done by
-issuing the I<+FLAGS.SILENT> option of the STORE IMAP client command,
-there is no guarantee that the delete was successful for every
-message. In this manner the B method sacrifices
-accuracy for speed. Generally, though, if a single message in a list
-of messages fails to be deleted it's because it was already deleted,
-which is what you wanted anyway so why worry about it? If there is a
-more severe error, i.e. the server replies "NO", "BAD", or, banish the
-thought, "BYE", then B will return C.
-
-If you must have guaranteed results then use the IMAP STORE client
-command (via the default method) and use the +FLAGS (\Deleted) option,
-and then parse your results manually.
-
-Eg:
-
- $imap->store( $msg_id, '+FLAGS (\Deleted)' );
- my @results = $imap->History( $imap->Transaction );
- ... # code to parse output goes here
-
-(Frankly I see no reason to bother with any of that; if a message
-doesn't get deleted it's almost always because it's already not there,
-which is what you want anyway. But 'your mileage may vary' and all
-that.)
-
-The IMAPClient object must be in C status to use the
-B method.
-
-B: All the messages identified in the input argument(s) must be in
-the currently selected folder. Failure to comply with this
-requirement will almost certainly result in the wrong message(s) being
-deleted.
-
-B: In the grand tradition of the IMAP protocol,
-deleting a message doesn't actually delete the message. Really. If
-you want to make sure the message has been deleted, you need to
-expunge the folder (via the L method, which is implemented
-via the default method). Or at least L it. This is generally
-considered a feature, since after deleting a message, you can change
-your mind and undelete it at any time before your L or
-L.
-
-See also: the L method, to delete a folder, the L
-method, to expunge a folder, the L method to
-undelete a message, and the L method (implemented here via the
-default method) to close a folder. Oh, and don't forget about RFC3501.
-
-=head2 deny_seeing
-
-Example:
-
- # Reset all read msgs to unread
- # (produces error if there are no seen msgs):
- $imap->deny_seeing( scalar($imap->seen) )
- or die "Could not deny_seeing: $@\n";
-
-The B method accepts a list of one or more message
-sequence numbers, or a single reference to an array of one or more
-message sequence numbers, as its argument(s). It then unsets the
-"\Seen" flag for those messages (so that you can "deny" that you ever
-saw them). Of course, if the L parameter is set to a true value
-then those message sequence numbers should be unique message id's.
-
-Note that specifying C<$imap-Edeny_seeing(@msgs)> is just a
-shortcut for specifying C<$imap-Eunset_flag("Seen",@msgs)>.
-
-=head2 disconnect
-
-Example:
-
- $imap->disconnect or warn "Could not logout: $@\n";
-
-This method calls L, see L for details.
-
-=head2 done
-
-Example:
-
- my $tag = $imap->idle or warn "idle failed: $@\n";
- doSomethingA();
- my $idlemsgs = $imap->idle_data() or warn "idle_data error: $@\n";
- doSomethingB();
- my $results = $imap->done($tag) or warn "Error from done: $@\n";
-
-The B method tells the IMAP server to terminate the IDLE
-command. The only argument is the I (identifier) received from
-the previous call to L. If I is not specified a default
-I based on the B attribute is assumed to be the I to
-look for in the response from the server.
-
-If an invalid I is specified, or the default I is wrong,
-then B will hang indefinitely or until a timeout occurs.
-
-If B is called when an L command is not active then the
-server will likely respond with an error like I<* BAD Invalid tag>.
-
-On failure is returned and L is set.
-
-See also L, L and L.
-
-=head2 examine
-
-Example:
-
- $imap->examine($folder) or die "Could not examine: $@\n";
-
-The B method selects a folder in read-only mode and changes
-the object's state to "Selected". The folder selected via the
-B method can be examined but no changes can be made unless it
-is first selected via the L method.
-
-The B method accepts one argument, which is the name of the
-folder to select.
-
-=head2 exists
-
-Example:
-
- $imap->exists($folder) or warn "$folder not found: $@\n";
-
-Accepts one argument, a folder name. Returns true if the folder
-exists or false if it does not exist.
-
-=head2 expunge
-
-Example:
-
- $imap->expunge($folder) or die "Could not expunge: $@\n";
-
-The B method accepts one optional argument, a folder name.
-It expunges the folder specified as the argument, or the currently
-selected folder (if any) when no argument is supplied.
-
-Although RFC3501 does not permit optional arguments (like a folder
-name) to the EXPUNGE client command, the L method does.
-Note: expunging a folder deletes the messages that have the \Deleted
-flag set (i.e. messages flagged via L).
-
-See also the L method, which "deselects" as well as expunges.
-
-=head2 fetch
-
-Usage:
-
- $imap->fetch( [$seq_set|ALL], @msg_data_items )
-
-Example:
-
- my $output = $imap->fetch(@args) or die "Could not fetch: $@\n";
-
-The B method implements the FETCH IMAP client command. It
-accepts a list of arguments, which will be converted into a
-space-delimited list of arguments to the FETCH IMAP client command.
-If no arguments are supplied then B does a FETCH ALL. If the
-L parameter is set to a true value then the first argument will
-be treated as a UID or list of UID's, which means that the UID FETCH
-IMAP client command will be run instead of FETCH. (It would really be
-a good idea at this point to review RFC3501.)
-
-If called in array context, B will return an array of output
-lines. The output lines will be returned just as they were received
-from the server, so your script will have to be prepared to parse out
-the bits you want. The only exception to this is literal strings,
-which will be inserted into the output line at the point at which they
-were encountered (without the {nnn} literal field indicator). See
-RFC3501 for a description of literal fields.
-
-If B is called in a scalar context, then a reference to an array
-(as described above) is returned instead of the entire array.
-
-B returns C on failure. Inspect L or C<$@>
-for an explanation of your error.
-
-=head2 fetch_hash
-
-Usage:
-
- $imap->fetch_hash( [$seq_set|ALL], @msg_data_items, [\%msg_by_ids] )
-
-Examples:
-
- my $hashref = $imap->fetch_hash("RFC822.SIZE");
-
- OR
-
- my $hashref = {};
- $imap->fetch_hash( "RFC822.SIZE", $hashref );
- print "Msg #$_ is $hashref->{$_}->{'RFC822.SIZE'} bytes\n" for (keys %$hashref);
-
-The B method accepts a list of message attributes to be
-fetched (as described in RFC3501). It returns a hash whose keys are
-all the messages in the currently selected folder and whose values are
-key-value pairs of fetch keywords and the message's value for that
-keyword (see sample output below).
-
-If B is called in scalar context, it returns a reference
-to the hash instead of the hash itself. If the last argument is a hash
-reference, then that hash reference will be used as the place where
-results are stored (and that reference will be returned upon
-successful completion). If the last argument is not a reference then
-it will be treated as one of the FETCH attributes and a new hash will
-be created and returned (either by value or by reference, depending on
-the context in which B was called).
-
-For example, if you have a folder with 3 messages and want the size
-and internal date for each of them, you could do the following:
-
- use Mail::IMAPClient;
- use Data::Dumper;
- # ... other code goes here
- $imap->select($folder);
- my $hash = $imap->fetch_hash( "RFC822.SIZE", "INTERNALDATE" );
- # (Same as:
- # my $hash = $imap->fetch_hash("RFC822.SIZE");
- # $imap->fetch_hash( "INTERNALDATE", $hash );
- # ).
- print Data::Dumper->Dumpxs( [$hash], ['$hash'] );
-
-This would result in L output similar to the following:
-
- $hash = {
- '1' => {
- 'INTERNALDATE' => '21-Sep-2002 18:21:56 +0000',
- 'RFC822.SIZE' => '1586',
- },
- '2' => {
- 'INTERNALDATE' => '22-Sep-2002 11:29:42 +0000',
- 'RFC822.SIZE' => '1945',
- },
- '3' => {
- 'INTERNALDATE' => '23-Sep-2002 09:16:51 +0000',
- 'RFC822.SIZE' => '134314',
- }
- };
-
-By itself this method may be useful for tasks like obtaining the size
-of every message in a folder. It issues one command and receives one
-(possibly long!) response from the server.
-
-If the fetch request causes the server to return data in a
-parenthesized list, the data within the parenthesized list may be
-escaped via the Escape() method. Use the Unescape() method to get the
-raw values back in this case.
-
-=head2 flags
-
-Example:
-
- my $flags = $imap->flags($msgid)
- or die "flags failed: $@\n";
-
-The B method implements the FETCH IMAP client command to list a
-single message's flags. It accepts one argument, a message sequence
-number (or a message UID, if the L parameter is true), and
-returns an array (or a reference to an array, if called in scalar
-context) listing the flags that have been set. Flag names are
-provided with leading backslashes.
-
-As of version 1.11, you can supply either a list of message id's or a
-reference to an array of message id's (which means either sequence
-number, if the Uid parameter is false, or message UID's, if the Uid
-parameter is true) instead of supplying a single message sequence
-number or UID. If you do, then the return value will not be an array
-or array reference; instead, it will be a hash reference, with each
-key being a message sequence number (or UID) and each value being a
-reference to an array of flags set for that message.
-
-For example, if you want to display the flags for every message in the
-folder where you store e-mail related to your plans for world
-domination, you could do something like this:
-
- use Mail::IMAPClient;
- my $imap = Mail::IMAPClient->new(
- Server => $imaphost,
- User => $login,
- Password => $pass,
- Uid => 1, # optional
- );
-
- $imap->select("World Domination");
- # get the flags for every message in my 'World Domination' folder
- $flaghash = $imap->flags( scalar( $imap->search("ALL") ) );
-
- # pump through sorted hash keys to print results:
- for my $k ( sort { $flaghash->{$a} <=> $flaghash->{$b} } keys %$flaghash ) {
- # print: Message 1: \Flag1, \Flag2, \Flag3
- print "Message $k:\t", join( ", ", @{$flaghash->{$k}} ), "\n";
- }
-
-=head2 folders
-
-Example:
-
- $imap->folders or die "Could not list folders: $@\n";
-
-The B method returns an array listing the available folders.
-It will only be successful if the object is in the I or
-I states.
-
-The B method accepts one optional argument, which is a
-prefix. If a prefix is supplied to the B method, then only
-folders beginning with the prefix will be returned.
-
-For example:
-
- print join( ", ", $imap->folders ), ".\n";
- # Prints:
- # INBOX, Sent, Projects, Projects/Completed, Projects/Ongoing, Projects Software.
- print join( ", ", $imap->folders("Projects") ), ".\n";
- # Prints:
- # Projects, Projects/Completed, Projects/Ongoing, Projects Software.
- print join( ", ", $imap->folders("Projects" . $imap->separator) ), ".\n";
- # Prints:
- # Projects/Completed, Projects/Ongoing
-
-Please note that documentation previously suggested that if you just
-want to list a folder's subfolders (and not the folder itself), then
-you need to include the hierarchy separator character (as returned by
-the L method). However, this does not match the behavior
-of the existing implementation, so you will need to manually exclude
-the parent folder from the results.
-
-=head2 folders_hash
-
- my @fhashes = $imap->folders_hash
- or die "Could not get list of folder hashes.\n";
-
-The B method accepts one optional argument, which is a
-prefix. If a prefix is supplied to the B method, then
-only folders beginning with the prefix will be returned.
-
-An array(ref) of hashes is returned that contain information about the
-requested folders. Each hash contains three keys (name, attrs, delim)
-and looks like the following:
-
- {
- name => 'Mail/Box/Name',
- attrs => [ '\Marked', '\HasNoChildren' ],
- delim => '/',
- }
-
-IMAP servers implementing RFC6154 return attributes to be used to
-identify special-use mailboxes (folders).
-
- my $sattr_re = /\A\\(?:All|Archive|Drafts|Flagged|Junk|Sent|Trash)\Z/;
- foreach my $fhash (@fhashes) {
- next unless defined $fhash->{name};
- my @special = grep { $sattr_re } @{ $fhash->{attrs} };
- print("special: $fhash->{name} : @special\n") if (@special);
- }
-
-Version note: method added in Mail::IMAPClient 3.34
-
-=head2 xlist_folders (DEPRECATED)
-
-This method is deprecated as of version 3.34. Please use folders_hash
-instead. See RFC6154 for attributes to be used to identify
-special-use mailboxes (folders).
-
-Example:
-
- my $xlist = $imap->xlist_folders
- or die "Could not get xlist folders.\n";
-
-IMAP servers implementing the XLIST extension (such as Gmail)
-designate particular folders to be used for particular functions.
-This is useful in the case where you want to know which folder should
-be used for Trash when the actual folder name can't be predicted
-(e.g. in the case of Gmail, the folder names change depending on the
-user's locale settings).
-
-The B method returns a hash listing any "xlist" folder
-names, with the values listing the actual folders that should be used
-for those names. For example, using this method with a Gmail user
-using the English (US) locale might give this output from
-L:
-
- $VAR1 = {
- 'Inbox' => 'Inbox',
- 'AllMail' => '[Gmail]/All Mail',
- 'Trash' => '[Gmail]/Trash',
- 'Drafts' => '[Gmail]/Drafts',
- 'Sent' => '[Gmail]/Sent Mail',
- 'Spam' => '[Gmail]/Spam',
- 'Starred' => '[Gmail]/Starred'
- };
-
-The same list for a user using the French locale might look like this:
-
- $VAR1 = {
- 'Inbox' => 'Bo&AO4-te de r&AOk-ception',
- 'AllMail' => '[Gmail]/Tous les messages',
- 'Trash' => '[Gmail]/Corbeille',
- 'Drafts' => '[Gmail]/Brouillons',
- 'Sent' => '[Gmail]/Messages envoy&AOk-s',
- 'Spam' => '[Gmail]/Spam',
- 'Starred' => '[Gmail]/Suivis'
- };
-
-Mail::IMAPClient recognizes the following "xlist" folder names:
-
-=over 4
-
-=item Inbox
-
-=item AllMail
-
-=item Trash
-
-=item Drafts
-
-=item Sent
-
-=item Spam
-
-=item Starred
-
-=back
-
-These are currently the only ones supported by Gmail. The XLIST
-extension is not documented, and there are no other known
-implementations other than Gmail, so this list is based on what Gmail
-provides.
-
-If the server does not support the XLIST extension, this method
-returns undef.
-
-Version note: method added in Mail::IMAPClient 3.21
-
-=head2 has_capability
-
-Example:
-
- my $has_feature = $imap->has_capability($feature)
- or die "Could not do has_capability($feature): $@\n";
-
-Returns:
-
-=over 4
-
-=item C
-
-If the underlying L calls fails then C is
-returned.
-
-=item C<""> or C<()>
-
-If the server does not have the requested capability, then either an
-empty string (C<""> in scalar context) or an empty list (C<()> in list
-context) is returned.
-
-=item a I value
-
-If the server has the requested capability, then a I value is
-returned. The I value depends upon the server response for the
-capability requested. The value will be an array reference in scalar
-context or an array in list context. The returned data is useful for
-understanding more about specific capabilities. For example, consider
-the following server CAPABILITY response:
-
- * CAPABILITY IMAP4rev1 SORT SORT=DISPLAY I18NLEVEL=1 AUTH=PLAIN AUTH=XTEST
-
-Results are returned as shown by the trailing comments:
-
- $c = $imap->has_capability("IMAP4rev1"); # [ "IMAP4rev1" ]
- @c = $imap->has_capability("IMAP4rev1"); # ( "IMAP4rev1" )
- $c = $imap->has_capability("SORT"); # [ "DISPLAY" ]
- @c = $imap->has_capability("SORT=DISPLAY"); # ( "SORT=DISPLAY" )
- $c = $imap->has_capability("AUTH"); # [ "PLAIN", "XTEST" ]
- @c = $imap->has_capability("AUTH"); # ( "PLAIN", "XTEST" )
- $c = $imap->has_capability("AUTH=XTEST"); # [ "AUTH=XTEST" ]
- @c = $imap->has_capability("AUTH=XTEST"); # ( "AUTH=XTEST" )
- $c = $imap->has_capability("AUTH=NADA"); # ''
- @c = $imap->has_capability("AUTH=NADA"); # ()
- $c = $imap->has_capability("NADA"); # ''
- @c = $imap->has_capability("NADA"); # ()
-
-=back
-
-=head2 idle
-
-Example:
-
- my $tag = $imap->idle or warn "idle failed: $@\n";
- doSomethingA();
- my $idlemsgs = $imap->idle_data() or warn "idle_data error: $@\n";
- doSomethingB();
- my $results = $imap->done($tag) or warn "Error from done: $@\n";
-
-The B method tells the IMAP server the client is ready to accept
-unsolicited mailbox update messages (on the selected folder/mailbox).
-This method is only valid on servers that support the IMAP IDLE
-extension, see RFC2177 for details.
-
-The B method accepts no arguments and returns the I
-(identifier) that was sent by the client for this command. This tag
-should be supplied as the argument to L when ending the IDLE
-command.
-
-On failure is returned and L is set.
-
-The method L may be used once B has been successful.
-However, no mailbox operations may be called until the B command
-has been terminated by calling L . Failure to do so will result
-in an error and the idle command will typically be terminated by the
-server.
-
-See also L and L .
-
-=head2 idle_data
-
-Usage:
-
- # an optional timeout in seconds may be specified
- $imap->idle_data( [$timeout] )
-
-Example:
-
- my $tag = $imap->idle or warn "idle failed: $@\n";
- doSomethingA();
- my $idlemsgs = $imap->idle_data() or warn "idle_data error: $@\n";
- doSomethingB();
- my $results = $imap->done($tag) or warn "Error from done: $@\n";
-
-The B method can be used to accept any unsolicited mailbox
-update messages that have been sent by the server during an L
-command. This method does not send any commands to the server, it
-simply looks for and optionally waits for data from the server and
-returns that data to the caller.
-
-The B method accepts an optional $timeout argument and
-returns an array (or an array reference if called in scalar context)
-with the messages from the server.
-
-By default a timeout of 0 seconds is used (do not block). Internally
-the timeout is passed to L. The timeout controls how
-long the select call blocks if there are no messages waiting to be
-read from the server.
-
-On failure is returned and L is set.
-
-See also L and L.
-
-Version note: method added in Mail::IMAPClient 3.23
-Warning: this method is considered experimental and the
-interface/output may change in a future version.
-
-=head2 imap4rev1
-
-Example:
-
- $imap->imap4rev1 or die "Could not imap4rev1: $@\n";
-
-Returns true if the IMAP server to which the IMAPClient object is
-connected has the IMAP4REV1 capability. If the server does not have
-the capability then the empty string "" is returned, if the underlying
-L calls fails then undef is returned.
-
-=head2 internaldate
-
-Example:
-
- my $msg_internal_date = $imap->internaldate($msgid)
- or die "internaldate failed: $@\n";
-
-B accepts one argument, a message id (or UID if the
-L parameter is true), and returns that message's internal date
-or undef if the call fails or internal date is not returned.
-
-=head2 get_bodystructure
-
-Example:
-
- my $bodyStructObject = $imap->get_bodystructure($msgid)
- or die "Could not get_bodystructure: $@\n";
-
-The B method accepts one argument, a message
-sequence number or, if L is true, a message UID. It obtains the
-message's body structure and returns a parsed
-L object for the message.
-
-=head2 get_envelope
-
-Example:
-
- my $envObject = $imap->get_envelope(@args)
- or die "Could not get_envelope: $@\n";
-
-The B method accepts one argument, a message sequence
-number or, if L is true, a message UID. It obtains the
-message's envelope and returns a
-B object for the envelope,
-which is just a version of the envelope that's been parsed into a Perl
-object.
-
-For more information on how to use this object once you've gotten it,
-see the L documentation. (As of this
-writing there is no separate pod document for
-B.)
-
-=head2 getacl
-
-Example:
-
- my $hash = $imap->getacl($folder)
- or die "Could not getacl for $folder: $@\n";
-
-B accepts one argument, the name of a folder. If no argument
-is provided then the currently selected folder is used as the default.
-It returns a reference to a hash. The keys of the hash are userids
-that have access to the folder, and the value of each element are the
-permissions for that user. The permissions are listed in a string in
-the order returned from the server with no white space or punctuation
-between them.
-
-=head2 get_header
-
-Example:
-
- my $messageId = $imap->get_header( $msg, "Message-Id" );
-
-The B method accepts two arguments, a message sequence
-number or UID and the name of an RFC822 header (without the trailing
-colon). It returns the value for that header in the message whose
-sequence number or UID was passed as the first argument. If no value
-can be found it returns C; if multiple values are found it
-returns the first one. Its return value is always a scalar.
-B uses case insensitive matching to get the value, so you
-do not have to worry about the case of your second argument.
-
-The B method is a short-cut for:
-
- my $messageId = $imap->parse_headers($msg,"Subject")->{"Subject"}[0];
-
-=head2 getquotaroot
-
-Example:
-
- my $results = $imap->getquotaroot($mailboxname)
- or die "Could not getquotaroot for $mailboxname: $@\n";
-
-The B method implements the RFC2087 GETQUOTAROOT
-command. The "$mailboxname" defaults to "INBOX" if no argument is
-provided.
-
-On error C is returned, otherwise L are returned.
-The results should have the untagged QUOTAROOT response from the
-server along with the QUOTAROOT's resource usage and limits in an
-untagged QUOTA response.
-
-See also B, L, L, L and L.
-
-=head2 getquota
-
-Example:
-
- my $results = $imap->getquota($quotaroot)
- or die "Could not getquota for $quotaroot: $@\n";
-
-The B method implements the RFC2087 GETQUOTA command. The
-"$quotaroot" defaults to "user/I" if no argument is provided.
-
-On error C is returned, otherwise L are returned.
-The results from the server should have the untagged QUOTA response
-from the server.
-
-See also B, L , L and L.
-
-=head2 quota
-
-Example:
-
- my $limit = $imap->quota($quotaroot)
- or die "Could not get quota limit for $quotaroot: $@\n";
-
-The B method takes the L from L and parses
-out the "STORAGE" limit returned by the server. The "$quotaroot"
-defaults to "INBOX" if no argument is provided.
-
-On error C is returned, otherwise the integer "STORAGE" limit
-provided by the server is returned.
-
-See also B, L, L and L.
-
-=head2 quota_usage
-
-Example:
-
- my $usage = $imap->quota_usage($quotaroot)
- or die "Could not get quota usage for $quotaroot: $@\n";
-
-The B method takes the L from L and
-parses out the "STORAGE" usage returned by the server. The
-"$quotaroot" defaults to "INBOX" if no argument is provided.
-
-On error C is returned, otherwise the integer "STORAGE" usage
-provided by the server is returned.
-
-See also B, L, L and L .
-
-=head2 setquota
-
-Example:
-
- my $results = $imap->setquota( $quotaroot, $resource, $limit )
- or die "Could not setquota for $quotaroot: $@\n";
-
-The B method implements the RFC2087 SETQUOTA command. It
-accepts multiple pairs of $resource and $limit arguments. The
-"$quotaroot" defaults to "user/I" if not defined.
-
-On error C is returned, otherwise L are returned.
-
-See also B, L and L.
-
-=head2 is_parent
-
-Example:
-
- my $hasKids = $imap->is_parent($folder);
-
-The B method accepts one argument, the name of a folder. It
-returns a value that indicates whether or not the folder has children.
-The value it returns is either:
-
-=over 4
-
-=item C<1> (or a positive integer)
-
-The C<\HasChildren> attribute is set, indicating that the folder has
-children.
-
-=item C<0> (zero)
-
-The C<\HasNoChildren> attribute is set, indicating that the folder has
-no children at this time.
-
-=item C
-
-The C<\NoInferiors> attribute is set, indicating the folder is not
-permitted to have children.
-
-=back
-
-Eg:
-
- my $parenthood = $imap->is_parent($folder);
- if ( defined($parenthood) ) {
- if ($parenthood) {
- print "$folder has children.\n";
- }
- else {
- print "$folder is permitted children, but has none.\n";
- }
- }
- else {
- print "$folder is not permitted to have children.\n";
- }
-
-=head2 list
-
-Example:
-
- my @raw_output = $imap->list(@args)
- or die "Could not list: $@\n";
-
-The B method implements the IMAP LIST client command. Arguments
-are passed to the IMAP server as received, separated from each other
-by spaces. If no arguments are supplied then the default list command
-C is issued.
-
-The B method returns an array (or an array reference, if called
-in a scalar context). The array is the unadulterated output of the
-LIST command. (If you want your output adulterated then see the
-L method, above.)
-
-An C value is returned in case of errors. Be sure to check for
-it.
-
-=head2 listrights
-
-Example:
-
- $imap->listrights( $folder, $user )
- or die "Could not listrights: $@\n";
-
-The B method implements the IMAP LISTRIGHTS client command
-(L). It accepts two arguments, the foldername and a user id.
-It returns the rights the specified user has for the specified folder.
-If called in a scalar context then the rights are returned a strings,
-with no punctuation or white space or any nonsense like that. If called
-in array context then B returns an array in which each
-element is one right.
-
-=head2 login
-
-Example:
-
- $imap->login or die "Could not login: $@\n";
-
-The B method implements the IMAP LOGIN client command to log
-into the server. It automatically calls L if the
-I parameter is set to anything except 'LOGIN' otherwise
-a clear text LOGIN is attempted.
-
-The I and I parameters must be set before the B
-method can be invoked. On success, a Mail::IMAPClient object with the
-Status of I is returned. On failure, undef is returned
-and $@ is set. The methods L
, L, and L may
-automatically invoke B see the documentation of each method for
-details.
-
-If the L parameter is set, the L method will
-automatically be called after successful authentication.
-
-See also L and L for additional information
-regarding ways of authenticating with a server via SASL and/or
-PROXYAUTH.
-
-=head2 proxyauth
-
-Example:
-
- $imap->login( "admin", "password" );
- $imap->proxyauth("someuser");
-
-The B method implements the IMAP PROXYAUTH client command.
-The command is used by Sun/iPlanet/Netscape IMAP servers to allow an
-administrative user to masquerade as another user.
-
-=head2 logout
-
-Example:
-
- $imap->logout or die "Could not logout: $@\n";
-
-The B method implements the LOGOUT IMAP client command. This
-method causes the server to end the connection and the IMAPClient
-client enters the I state. This method does not, destroy
-the IMAPClient object, thus the L and L methods can
-be used to establish a new IMAP session.
-
-Note that RFC2683 section 3.1.2 (Severed connections) makes some
-recommendations on how IMAP clients should behave. It is up to the
-user of this module to decide on the preferred behavior and code
-accordingly.
-
-Version note: documentation (from 2.x through 3.23) claimed that
-Mail::IMAPClient would attempt to log out of the server during
-B if the object is in the L state. This
-documentation was apparently incorrect from at least 2.2.2 and
-possibly earlier versions on up.
-
-=head2 lsub
-
-Example:
-
- $imap->lsub(@args) or die "Could not lsub: $@\n";
-
-The B method implements the IMAP LSUB client command. Arguments
-are passed to the IMAP server as received, separated from each other
-by spaces. If no arguments are supplied then the default lsub command
-C is issued.
-
-The B method returns an array (or an array reference, if called
-in a scalar context). The array is the unaltered output of the LSUB
-command. If you want an array of subscribed folders then see the
-L method, below.
-
-=head2 mark
-
-Example:
-
- $imap->mark(@msgs) or die "Could not mark: $@\n";
-
-The B method accepts a list of one or more messages sequence
-numbers, or a single reference to an array of one or more message
-sequence numbers, as its argument(s). It then sets the "\Flagged"
-flag for those message(s). Of course, if the L parameter is set
-to a true value then those message sequence numbers had better be
-unique message id's.
-
-Note that specifying C<$imap-Esee(@msgs)> is just a shortcut for
-specifying C<$imap-Eset_flag("Flagged",@msgs)>.
-
-=head2 Massage
-
-Example:
-
- $imap->search(HEADER => 'Message-id' => $imap->Massage($msg_id,1));
-
-WARNING: This method may be deprecated in the future, consider using
-L instead of this method.
-
-The B method accepts a value as an argument and, optionally,
-a second value that, when true, indicates that the first argument is
-not the name of an existing folder.
-
-WARNING: If the first argument has double quotes at the beginning and
-end of its value, those double quote will be stripped unless the
-second argument does not evaluate to true.
-
-It returns its argument as a correctly quoted string or a literal
-string.
-
-Note that you should rarely use this on folder names, since methods
-that accept folder names as an argument will call B for
-you.
-
-=head2 message_count
-
-Example:
-
- my $msgcount = $imap->message_count($folder);
- defined($msgcount) or die "message_count failed: $@\n";
-
-The B method accepts the name of a folder as an
-argument and returns the number of messages in that folder.
-Internally, it invokes the L method (see above) and parses
-out the results to obtain the number of messages. If you don't supply
-an argument to B then it will return the number of
-messages in the currently selected folder (assuming of course that
-you've used the L or L method to select it instead
-of trying something funky). Note that RFC2683 contains warnings about
-the use of the IMAP I command (and thus the L method
-and therefore the B method) against the currently
-selected folder. You should carefully consider this before using
-B on the currently selected folder. You may be better
-off using L or one of its variants (especially L),
-and then counting the results. On the other hand, I regularly violate
-this rule on my server without suffering any dire consequences. Your
-mileage may vary.
-
-=head2 message_string
-
-Example:
-
- my $string = $imap->message_string($msgid)
- or die "message_string failed: $@\n";
-
-The B method accepts a message sequence number (or
-message UID if L is true) as an argument and returns the message
-as a string. The returned value contains the entire message in one
-scalar variable, including the message headers. Note that using this
-method will set the message's "\Seen" flag as a side effect, unless
-I is set to a true value.
-
-=head2 message_to_file
-
-Example:
-
- $imap->message_to_file( $file, @msgs )
- or die "message_to_file failed: $@\n";
-
-The B method accepts a filename or file handle and
-one or more message sequence numbers (or message UIDs if L is
-true) as arguments and places the message string(s) (including RFC822
-headers) into the file named in the first argument (or prints them to
-the file handle, if a file handle is passed). The returned value is
-true on success and C on failure.
-
-If the first argument is a reference, it is assumed to be an open
-file handle and will not be closed when the method completes, If it is
-a file, it is opened in append mode, written to, then closed.
-
-Note that using this method will set the message's "\Seen" flag as a
-side effect. But you can use the L method to set it
-back, or set the L parameter to a true value to prevent setting
-the "\Seen" flag at all.
-
-This method currently works by making some basic assumptions about the
-server's behavior, notably that the message text will be returned as a
-literal string but that nothing else will be. If you have a better
-idea then I'd like to hear it.
-
-=head2 message_uid
-
-Example:
-
- my $msg_uid = $imap->message_uid($msg_seq_no)
- or die "Could not get uid for $msg_seq_no: $@\n";
-
-The B method accepts a message sequence number (or
-message UID if L is true) as an argument and returns the
-message's UID. Yes, if L is true then it will use the IMAP UID
-FETCH UID client command to obtain and return the very same argument
-you supplied. This is an IMAP feature so don't complain to me about
-it.
-
-=head2 messages
-
-Example:
-
- # Get a list of messages in the current folder:
- my @msgs = $imap->messages or warn "Could not list messages\n";
- # Get a reference to an array of messages in the current folder:
- my $msgs = $imap->messages or die "Get messages failed: $@\n";
-
-If called in list context, the B method returns a list of
-all the messages in the currently selected folder. If called in
-scalar context, it returns a reference to an array containing all the
-messages in the folder. This is the same as specifying
-C<$imap-EL("ALL")>.
-
-An empty list is returned when no messages are found. On failure
- is returned and L is set.
-
-=head2 migrate
-
-Example:
-
- $imap_src->migrate( $imap_dest, "ALL", $targetFolder )
- or die "Could not migrate: ", $imap_src->LastError;
-
-The B method copies the indicated message(s) B the
-currently selected folder B another Mail::IMAPClient object's
-session. It requires these arguments:
-
-=over 4
-
-=item 1.
-
-a reference to the target Mail::IMAPClient object (not the calling
-object, which is connected to the source account);
-
-=item 2.
-
-the message(s) to be copied, specified as either a) the message
-sequence number (or message UID if the UID parameter is true) of a
-single message, b) a reference to an array of message sequence numbers
-(or message UID's if the UID parameter is true) or c) the special
-string "ALL", which is a shortcut for the results of
-C("ALL")>.
-
-=item 3.
-
-the name of the destination folder on the target mailbox to receive
-the message(s). If this argument is not supplied or is I then
-the currently selected folder on the calling object will be used. The
-destination folder will be automatically created if necessary.
-
-=back
-
-The target ($imap_dest) Mail::IMAPClient object must not be the same
-object as the source ($imap_src).
-
-This method does not attempt to minimize memory usage. In the future
-it could be enhanced to (optionally) write message data to a temporary
-file to avoid storing the entire message in memory.
-
-To work around potential network timeouts on large messages, consider
-setting L to 1 on both $imap_src and $imap_dest.
-
-See also C.
-
-=head2 move
-
-Example:
-
- my $newUid = $imap->move( $newFolder, $oldUid )
- or die "Could not move: $@\n";
- $imap->expunge;
-
-The B method moves messages from the currently selected folder
-to the folder specified in the first argument to B. If the
-L parameter is not true, then the rest of the arguments should
-be either:
-
-=over 4
-
-=item a)
-
-a message sequence number,
-
-=item b)
-
-a comma-separated list of message sequence numbers, or
-
-=item c)
-
-a reference to an array of message sequence numbers.
-
-=back
-
-If the L parameter is true, then the arguments should be:
-
-=over 4
-
-=item a)
-
-a message UID,
-
-=item b)
-
-a comma-separated list of message UID's, or
-
-=item c)
-
-a reference to an array of message UID's.
-
-=back
-
-If the target folder does not exist then it will be created.
-
-If move is successful, then it returns a true value. Furthermore, if
-the Mail::IMAPClient object is connected to a server that has the
-UIDPLUS capability, then the true value will be the comma-separated
-list of UID's for the newly copied messages. The list will be in the
-order in which the messages were moved which should correspond to the
-order of the message UID provided by the caller.
-
-If the move is not successful then B returns C.
-
-Note that a move really just involves copying the message to the new
-folder and then setting the I<\Deleted> flag. To actually delete the
-original message you will need to run L (or L).
-
-=head2 namespace
-
-Example:
-
- my $refs = $imap->namespace
- or die "namespace failed: $@\n";
-
-The namespace method runs the NAMESPACE IMAP command (as defined in
-RFC 2342). When called in a list context, it returns a list of three
-references. Each reference looks like this:
-
- [
- [ $prefix_1, $separator_1 ],
- [ $prefix_2, $separator_2 ],
- [ $prefix_n, $separator_n ],
- ]
-
-The first reference provides a list of prefixes and separator
-characters for the available personal namespaces. The second
-reference provides a list of prefixes and separator characters for the
-available shared namespaces. The third reference provides a list of
-prefixes and separator characters for the available public namespaces.
-
-If any of the three namespaces are unavailable on the current server
-then an 'undef' is returned instead of a reference. So for example if
-shared folders were not supported on the server but personal and
-public namespaces were both available (with one namespace each), the
-returned value might resemble this:
-
- [ [ "", "/" ] , undef, [ "#news", "." ] ];
-
-If the B method is called in scalar context, it returns a
-reference to the above-mentioned list of three references, thus
-creating a single structure that would pretty-print something like
-this:
-
- $VAR1 = [
- [
- [ $user_prefix_1, $user_separator_1 ],
- [ $user_prefix_2, $user_separator_2 ],
- [ $user_prefix_n, $user_separator_n ],
- ], # or undef
- [
- [ $shared_prefix_1, $shared_separator_1 ],
- [ $shared_prefix_2, $shared_separator_2 ],
- [ $shared_prefix_n, $shared_separator_n ],
- ], # or undef
- [
- [ $public_prefix_1, $public_separator_1 ],
- [ $public_prefix_2, $public_separator_2 ],
- [ $public_prefix_n, $public_separator_n ],
- ], # or undef
- ];
-
-=head2 on
-
-Example:
-
- my @msgs = $imap->on($Rfc3501_date)
- or warn "Could not find messages sent on $Rfc3501_date: $@\n";
-
-The B method works just like the L method, below, except
-it returns a list of messages whose internal system dates are the same
-as the date supplied as the argument.
-
-=head2 parse_headers
-
-Example:
-
- my $hashref = $imap->parse_headers( $msg || \@msgs, "Date", "Subject" )
- or die "Could not parse_headers: $@\n";
-
-The B method accepts as arguments a message sequence
-number and a list of header fields. It returns a hash reference in
-which the keys are the header field names (without the colon) and the
-values are references to arrays of values. On failure is
-returned and L is set.
-
-A picture would look something like this:
-
- $hashref = $imap->parse_headers( 1, "Date", "Received", "Subject", "To");
- $hashref = {
- "Date" => [ "Thu, 09 Sep 1999 09:49:04 -0400" ] ,
- "Received" => [ q/
- from mailhub ([111.11.111.111]) by mailhost.bigco.com
- (Netscape Messaging Server 3.6) with ESMTP id AAA527D for
- ; Fri, 18 Jun 1999 16:29:07 +0000
- /, q/
- from directory-daemon by mailhub.bigco.com (PMDF V5.2-31 #38473)
- id <0FDJ0010174HF7@mailhub.bigco.com> for bigshot@bigco.com
- (ORCPT rfc822;big.shot@bigco.com); Fri, 18 Jun 1999 16:29:05 +0000 (GMT)
- /, q/
- from someplace ([999.9.99.99]) by smtp-relay.bigco.com (PMDF V5.2-31 #38473)
- with ESMTP id <0FDJ0000P74H0W@smtp-relay.bigco.com> for big.shot@bigco.com; Fri,
- 18 Jun 1999 16:29:05 +0000 (GMT)
- /] ,
- "Subject" => [ qw/ Help! I've fallen and I can't get up!/ ] ,
- "To" => [ "Big Shot ] ,
- };
-
-The text in the example for the "Received" array has been formatted to
-make reading the example easier. The actual values returned are just
-strings of words separated by spaces and with newlines and carriage
-returns stripped off. The I header is probably the main
-reason that the B method creates a hash of lists rather
-than a hash of values.
-
-If the second argument to B is 'ALL' or if it is
-unspecified then all available headers are included in the returned
-hash of lists.
-
-If you're not emotionally prepared to deal with a hash of lists then
-you can always call the L method yourself with the appropriate
-parameters and parse the data out any way you want to. Also, in the
-case of headers whose contents are also reflected in the envelope, you
-can use the L method as an alternative to
-L .
-
-If the L parameter is true then the first argument will be
-treated as a message UID. If the first argument is a reference to an
-array of message sequence numbers (or UID's if L is true), then
-B will be run against each message in the array. In
-this case the return value is a hash, in which the key is the message
-sequence number (or UID) and the value is a reference to a hash as
-described above.
-
-An example of using B to print the date and subject of
-every message in your demo folder could look like this:
-
- use Mail::IMAPClient;
- my $imap = Mail::IMAPClient->new(
- Server => $imaphost, User => $login, Password => $pass, Uid => 1
- );
-
- $imap->select("demo");
-
- my $msgs = $imap->search("ALL");
- for my $h (
-
- # get the Subject and Date from every message in folder "demo" the
- # first arg is a reference to an array listing all messages in the
- # folder (which is what gets returned by the $imap->search("ALL")
- # method when called in scalar context) and the remaining arguments
- # are the fields to parse out The key is the message number, which
- # in this case we don't care about:
-
- values %{ $imap->parse_headers( $msgs , "Subject", "Date") } )
- {
- # $h is the value of each element in the hash ref returned
- # from parse_headers, and $h is also a reference to a hash.
- # We'll only print the first occurrence of each field because
- # we don't expect more than one Date: or Subject: line per
- # message.
- print map { "$_:\t$h->{$_}[0]\n"} keys %$h;
- }
-
-=head2 recent
-
-Example:
-
- my @recent = $imap->recent or warn "No recent msgs: $@\n";
-
-The B method performs an IMAP SEARCH RECENT search against the
-selected folder and returns an array of sequence numbers (or UID's, if
-the L parameter is true) of messages that are recent.
-
-=head2 recent_count
-
-Example:
-
- my $count = 0;
- defined($count = $imap->recent_count($folder))
- or die "recent_count failed: $@\n";
-
-The B method accepts as an argument a folder name. It
-returns the number of recent messages in the folder (as returned by
-the IMAP client command "STATUS folder RECENT"), or C in the
-case of an error. The B method was contributed by Rob
-Deker (deker@ikimbo.com).
-
-=head2 noop
-
-Example:
-
- $imap->noop or die "noop failed: $@\n";
-
-The B method performs an IMAP NOOP command. Per RFC3501 this
-command does nothing and always succeeds. However, if a connection
-times out or other errors occur while communicating with the server,
-this method can still fail. This command can be used as a periodic
-poll to check for (untagged) status updates (new messages, etc.) from
-the server and also to reset any inactivity/auto-logout timers the
-server may maintain.
-
-=head2 reconnect
-
-Example:
-
- $imap->noop or $imap->reconnect or die "noop failed: $@\n";
-
-Attempt to reconnect if the IMAP connection unless $imap is already in
-the IsConnected state. This method calls L and optionally
-L if a Folder was previously selected. On success, returns
-the (same) $imap object. On failure is returned and
-L is set.
-
-Version note: method added in Mail::IMAPClient 3.17
-
-=head2 rename
-
-Example:
-
- $imap->rename( $oldname, $nedwname )
- or die "rename failed: $@\n";
-
-The B method accepts two arguments: the name of an existing
-folder, and a new name for the folder. The existing folder will be
-renamed to the new name using the RENAME IMAP client command.
-B will return a true value if successful, or C if
-unsuccessful.
-
-=head2 restore_message
-
-Example:
-
- $imap->restore_message(@msgs) or die "restore_message failed: $@\n";
-
-The B method is used to undo a previous
-L operation (but not if there has been an intervening
-L or L). The IMAPClient object must be in
-L status to use the B method.
-
-The B method accepts a list of arguments. If the
-L parameter is not set to a true value, then each item in the
-list should be either:
-
-=over 4
-
-=item >
-
-a message sequence number,
-
-=item >
-
-a comma-separated list of message sequence numbers,
-
-=item >
-
-a reference to an array of message sequence numbers, or
-
-=back
-
-If the L parameter is set to a true value, then each item in the
-list should be either:
-
-=over 4
-
-=item >
-
-a message UID,
-
-=item >
-
-a comma-separated list of UID's, or
-
-=item >
-
-a reference to an array of message UID's.
-
-=back
-
-The messages identified by the sequence numbers or UID's will have
-their I<\Deleted> flags cleared, effectively "undeleting" the
-messages. B returns the number of messages it was
-able to restore.
-
-Note that B is similar to calling
-C("\Deleted",@msgs)>, except that B
-returns a (slightly) more meaningful value. Also it's easier to type.
-
-=head2 run
-
-Example:
-
- $imap->run(@args) or die "run failed: $@\n";
-
-The B method is provided to make those uncommon things
-possible... however, we would like you to contribute the knowledge of
-missing features with us.
-
-The B method excepts one or two arguments. The first argument is
-a string containing an IMAP client command, including a tag and all
-required arguments. The optional second argument is a string to look
-for that will indicate success. (The default is C). The
-B method returns an array (or arrayref in scalar context) of
-output lines from the command, which you are free to parse as you see
-fit.
-
-The B method does not do any syntax checking, other than
-rudimentary checking for a tag.
-
-When B processes the command, it increments the transaction count
-and saves the command and responses in the History buffer in the same
-way other commands do. However, it also creates a special entry in
-the History buffer named after the tag supplied in the string passed
-as the first argument. If you supply a numeric value as the tag then
-you may risk overwriting a previous transaction's entry in the History
-buffer.
-
-If you want the control of B but you don't want to worry about
-tags then see L"tag_and_run">, below.
-
-=head2 search
-
-Example:
-
- my $msgs1 = $imap->search(@args);
- if ($msgs1) {
- print "search matches: @$msgs1";
- }
- else {
- warn "Error in search: $@\n" if $@;
- }
-
- # or note: be sure to quote string properly
- my $msgs2 = $imap->search( \( $imap->Quote($msgid), "FROM", q{"me"} ) )
- or warn "search failed: $@\n";
-
- # or note: be sure to quote string properly
- my $msgs3 = $imap->search('TEXT "string not in mailbox"')
- or warn "search failed: $@\n";
-
-The B method implements the SEARCH IMAP client command. Any
-arguments supplied to B are prefixed with a space then
-appended to the SEARCH IMAP client command. The SEARCH IMAP client
-command allows for many options and arguments. See RFC3501 for
-details.
-
-As of version 3.17 B tries to "DWIM" by automatically quoting
-things that likely need quotes when the words do not match any of the
-following:
-
- ALL ANSWERED BCC BEFORE BODY CC DELETED DRAFT FLAGGED
- FROM HEADER KEYWORD LARGER NEW NOT OLD ON OR RECENT
- SEEN SENTBEFORE SENTON SENTSINCE SINCE SMALLER SUBJECT
- TEXT TO UID UNANSWERED UNDELETED UNDRAFT UNFLAGGED
- UNKEYWORD UNSEEN
-
-The following options exist to avoid the automatic quoting (note:
-caller is responsible for verifying the data sent in these cases is
-properly escaped/quoted):
-
-=over 4
-
-=item *
-
-specify a single string/argument in the call to search.
-
-=item *
-
-specify args as scalar references (SCALAR) and the values of those
-SCALAR refs will be passed along as-is.
-
-=back
-
-The B method returns an array containing sequence numbers of
-messages that passed the SEARCH IMAP client command's search criteria.
-If the L parameter is true then the array will contain message
-UID's. If B is called in scalar context then a pointer to the
-array will be passed, instead of the array itself. If no messages
-meet the criteria then B returns an empty list (when in list
-context) or C (in scalar context).
-
-Since a valid, successful search can legitimately return zero matches,
-you may wish to distinguish between a search that correctly returns
-zero hits and a search that has failed for some other reason (i.e.
-invalid search parameters). Therefore, the C<$@> variable will always
-be cleared before the I command is issued to the server, and
-will thus remain empty unless the server gives a I or I
-response to the I command.
-
-=head2 see
-
-Example:
-
- $imap->see(@msgs) or die "see failed: $@\n";
-
-The B method accepts a list of one or more messages sequence
-numbers, or a single reference to an array of one or more message
-sequence numbers, as its argument(s). It then sets the I<\Seen> flag
-for those message(s). Of course, if the L parameter is set to a
-true value then those message sequence numbers had better be unique
-message id's, but then you already knew that, didn't you?
-
-Note that specifying C<$imap-Esee(@msgs)> is just a shortcut for
-specifying C<$imap-EL("Seen",@msgs)>.
-
-=head2 seen
-
-Example:
-
- my @seenMsgs = $imap->seen or warn "No seen msgs: $@\n";
-
-The B method performs an IMAP SEARCH SEEN search against the
-selected folder and returns an array of sequence numbers of messages
-that have already been seen (ie their I<\Seen> flag is set). If the
-L parameter is true then an array of message UID's will be
-returned instead. If called in scalar context than a reference to the
-array (rather than the array itself) will be returned.
-
-=head2 select
-
-Example:
-
- $imap->select($folder) or die "select failed: $@\n";
-
-The B method selects a folder and changes the object's state
-to I. It accepts one argument, which is the name of the
-folder to select.
-
-=head2 selectable
-
-Example:
-
- foreach my $f ( grep( $imap->selectable($_), $imap->folders ) ) {
- $imap->select($f);
- }
-
-The B method accepts one value, a folder name, and returns
-true if the folder is selectable or false if it is not selectable.
-
-=head2 sentbefore
-
-Example:
-
- my @msgs = $imap->sentbefore($Rfc3501_date)
- or warn "Could not find any msgs sent before $Rfc3501_date: $@\n";
-
-The B method works just like L"sentsince">, below,
-except it searches for messages that were sent before the date
-supplied as an argument to the method.
-
-=head2 senton
-
-Example:
-
- my @msgs = $imap->senton($Rfc3501_date)
- or warn "Could not find any messages sent on $Rfc3501_date: $@\n";
-
-The B method works just like L"sentsince">, below, except it
-searches for messages that were sent on the exact date supplied as an
-argument to the method.
-
-=head2 sentsince
-
-Example:
-
- my @msgs = $imap->sentsince($Rfc3501_date)
- or warn "Could not find any messages sent since $Rfc3501_date: $@\n";
-
-The B method accepts one argument, a date in either epoch
-time format (seconds since 1/1/1970, or as output by
-L and as accepted by
-L) or in the I format as
-defined in RFC3501 (dd-Mon-yyyy, where Mon is the English-language
-three-letter abbreviation for the month).
-
-It searches for items in the currently selected folder for messages
-sent since the day whose date is provided as the argument. It uses
-the RFC822 I header to determine the I date.
-(Actually, it the server that uses the I header; this
-documentation just assumes that the date is coming from the I
-header because that's what RFC3501 dictates.)
-
-In the case of arguments supplied as a number of seconds, the returned
-result list will include items sent on or after that day, regardless
-of whether they arrived before the specified time on that day. The
-IMAP protocol does not support searches at a granularity finer than a
-day, so neither do I. On the other hand, the only thing I check for
-in a I argument is that it matches the pattern
-C\d\d-\D\D\D-\d\d\d\d/> (notice the lack of anchors), so if your
-server lets you add something extra to a I string then so
-will Mail::IMAPClient.
-
-If you'd like, you can use the L method to convert from
-epoch time (as returned by L) into an RFC3501 date
-specification.
-
-=head2 separator
-
-Example:
-
- my $sepChar = $imap->separator(@args)
- or die "Could not get separator: $@\n";
-
-The B method returns the character used as a separator
-character in folder hierarchies. On UNIX-based servers, this is often
-but not necessarily a forward slash (/). It accepts one argument, the
-name of a folder whose hierarchy's separator should be returned. If
-no folder name is supplied then the separator for the INBOX is
-returned, which probably is good enough.
-
-If you want your programs to be portable from IMAP server brand X to
-IMAP server brand Y, then you should never use hard-coded separator
-characters to specify subfolders. (In fact, it's even more
-complicated than that, since some server don't allow any subfolders at
-all, some only allow subfolders under the "INBOX" folder, and some
-forbid subfolders in the inbox but allow them "next" to the inbox.
-Furthermore, some server implementations do not allow folders to
-contain both subfolders and mail messages; other servers allow this.)
-
-=head2 set_flag
-
-Example:
-
- $imap->set_flag( "Seen", @msgs )
- or die "Could not set flag: $@\n";
-
-The B method accepts the name of a flag as its first
-argument and a list of one or more messages sequence numbers, or a
-single reference to an array of one or more message sequence numbers,
-as its next argument(s). It then sets the flag specified for those
-message(s). Of course, if the L parameter is set to a true
-value then those message sequence numbers had better be unique message
-id's, just as you'd expect.
-
-Note that when specifying the flag in question, the preceding
-backslash (\) is entirely optional. (For you, that is.
-Mail::IMAPClient still has remember to stick it in there before
-passing the command to the server if the flag is one of the reserved
-flags specified in RFC3501. This is in fact so important that the
-method checks its argument and adds the backslash when necessary,
-which is why you don't have to worry about it overly much.)
-
-=head2 setacl
-
-Example:
-
- $imap->setacl( $folder, $userid, $aclstring )
- or die "Could not set acl: $@\n";
-
-The B method accepts three input arguments, a folder name, a
-user id (or authentication identifier, to use the terminology of
-RFC2086), and an access rights modification string. See RFC2086 for
-more information. (This is somewhat experimental and its
-implementation may change.)
-
-=head2 since
-
-Example:
-
- my @msgs = $imap->since($date)
- or warn "Could not find any messages since $date: $@\n";
-
-The B method accepts a date in either epoch format (seconds
-since 1/1/1970, or as output by L and as accepted by
-L) or in the I format as defined in
-RFC3501 (dd-Mon-yyyy, where Mon is the English-language three-letter
-abbreviation for the month). It searches for items in the currently
-selected folder for messages whose internal dates are on or after the
-day whose date is provided as the argument. It uses the internal
-system date for a message to determine if that message was sent since
-the given date.
-
-In the case of arguments supplied as a number of seconds, the returned
-result list will include items whose internal date is on or after that
-day, regardless of whether they arrived before the specified time on
-that day.
-
-If B is called in a list context then it will return a list of
-messages meeting the I criterion, or an empty list if no
-messages meet the criterion.
-
-If B is called in a scalar context then it will return a
-reference to an array of messages meeting the I
-criterion, or C if no messages meet the criterion.
-
-Since B is a front-end to L , some of the same rules
-apply. For example, the C<$@> variable will always be cleared before
-the I command is issued to the server, and will thus remain
-empty unless the server gives a I or I response to the
-I command.
-
-=head2 size
-
-Example:
-
- my $size = $imap->size($msgId)
- or die "Could not find size of message $msgId: $@\n";
-
-The B method accepts one input argument, a sequence number (or
-message UID if the L parameter is true). It returns the size of
-the message in the currently selected folder with the supplied
-sequence number (or UID). The IMAPClient object must be in a
-I state in order to use this method.
-
-=head2 sort
-
-Example:
-
- my @msgs = $imap->sort(@args);
- warn "Error in sort: $@\n" if $@;
-
-The B method is just like the L method, only different.
-It implements the SORT extension as described in
-F.
-It would be wise to use the L method to verify that
-the SORT capability is available on your server before trying to use
-the B method. If you forget to check and you're connecting to a
-server that doesn't have the SORT capability then B will return
-undef. L will then say you are "BAD". If your server
-doesn't support the SORT capability then you'll have to use L
-and then sort the results yourself.
-
-The first argument to B is a space-delimited list of sorting
-criteria. The Internet Draft that describes SORT requires that this
-list be wrapped in parentheses, even if there is only one sort
-criterion. If you forget the parentheses then the B method will
-add them. But you have to forget both of them, or none. This isn't
-CMS running under VM!
-
-The second argument is a character set to use for sorting. Different
-character sets use different sorting orders, so this argument is
-important. Since all servers must support UTF-8 and US-ASCII if they
-support the SORT capability at all, you can use one of those if you
-don't have some other preferred character set in mind.
-
-The rest of the arguments are searching criteria, just as you would
-supply to the L method. These are all documented in RFC3501.
-If you just want all of the messages in the currently selected folder
-returned to you in sorted order, use I as your only search
-criterion.
-
-The B method returns an array containing sequence numbers of
-messages that passed the SORT IMAP client command's search criteria.
-If the L parameter is true then the array will contain message
-UID's. If B is called in scalar context then a pointer to the
-array will be passed, instead of the array itself. The message
-sequence numbers or unique identifiers are ordered according to the
-sort criteria specified. The sort criteria are nested in the order
-specified; that is, items are sorted first by the first criterion, and
-within the first criterion they are sorted by the second criterion,
-and so on.
-
-The sort method will clear C<$@> before attempting the I
-operation just as the L method does.
-
-=head2 starttls
-
-Example:
-
- $imap->starttls() or die "starttls failed: $@\n";
-
-The B method accepts no arguments. This method is used to
-upgrade an exiting connection which is not authenticated to a TLS/SSL
-connection by using the IMAP STARTTLS command followed by using the
-B class method from L to do the necessary
-TLS negotiation. The negotiation is done in a blocking fashion with a
-default B of 30 seconds. The arguments used in the call to
-B can be controlled by setting the Mail::IMAPClient
-L attribute to an ARRAY reference containing the desired
-arguments.
-
-Version note: method added in Mail::IMAPClient 3.22
-
-=head2 status
-
-Example:
-
- my @rawdata = $imap->status( $folder, qw/(Messages)/ )
- or die "Error obtaining status: $@\n";
-
-The B method accepts one argument, the name of a folder (or
-mailbox, to use RFC3501's terminology), and returns an array
-containing the results of running the IMAP STATUS client command
-against that folder. If additional arguments are supplied then they
-are appended to the IMAP STATUS client command string, separated from
-the rest of the string and each other with spaces.
-
-If B is not called in an array context then it returns a
-reference to an array rather than the array itself.
-
-The B method should not be confused with the B method
-(with an uppercase 'S'), which returns information about the
-IMAPClient object. (See the section labeled L"Status Methods">,
-below).
-
-=head2 store
-
-Example:
-
- $imap->store(@args) or die "Could not store: $@\n";
-
-The B method accepts a message sequence number or
-comma-separated list of message sequence numbers as a first argument,
-a message data item name, and a value for the message data item.
-Currently, data items are the word "FLAGS" followed by a space and a
-list of flags (in parens). The word "FLAGS" can be modified by
-prefixing it with either a "+" or a "-" (to indicate "add these flags"
-or "remove these flags") and by suffixing it with ".SILENT" (which
-reduces the amount of output from the server; very useful with large
-message sets). Normally you won't need to call B because there
-are oodles of methods that will invoke store for you with the correct
-arguments. Furthermore, these methods are friendlier and more
-flexible with regards to how you specify your arguments. See for
-example L, L, L, and
-L . Or L
, L, L, and
-L.
-
-=head2 subject
-
-Example:
-
- my $subject = $imap->subject($msg);
-
-The B method accepts one argument, a message sequence number
-(or a message UID, if the I parameter is true). The text in the
-"Subject" header of that message is returned (without the "Subject: "
-prefix). This method is a short-cut for:
-
- my $subject = $imap->get_header($msg, "Subject");
-
-=head2 subscribed
-
-Example:
-
- my @subscribedFolders = $imap->subscribed
- or warn "Could not find subscribed folders: $@\n";
-
-The B method works like the B method, above,
-except that the returned list (or array reference, if called in scalar
-context) contains only the subscribed folders.
-
-Like L , you can optionally provide a prefix argument to the
-B method.
-
-=head2 tag_and_run
-
-Example:
-
- my $output = $imap->tag_and_run(@args)
- or die "Could not tag_and_run: $@\n";
-
-The B method accepts one or two arguments. The first
-argument is a string containing an IMAP client command, without a tag
-but with all required arguments. The optional second argument is a
-string to look for that will indicate success (without pattern
-delimiters). The default is C.
-
-The B method will prefix your string (from the first
-argument) with the next transaction number and run the command. It
-returns an array of output lines from the command, which you are free
-to parse as you see fit. Using this method instead of B (above)
-will free you from having to worry about handling the tags (and from
-worrying about the side affects of naming your own tags).
-
-=head2 uidexpunge
-
-Example:
-
- $imap->uidexpunge(@uids) or die "Could not uidexpunge: $@\n";
-
-The B method implements the UID EXPUNGE IMAP (RFC4315
-UIDPLUS ext) client command to permanently remove all messages that
-have the \Deleted flag set and have a UID that is included in the list
-of UIDs.
-
-B returns an array or arrayref (scalar context) of output
-lines returned from the UID EXPUNGE command.
-
-B returns undef on failure.
-
-If the server does not support the UIDPLUS extension, this method
-returns undef.
-
-=head2 uidnext
-
-Example:
-
- my $nextUid = $imap->uidnext($folder) or die "uidnext failed: $@\n";
-
-The B method accepts one argument, the name of a folder, and
-returns the numeric string that is the next available message UID for
-that folder.
-
-=head2 thread
-
-Example:
-
- my $thread = $imap->thread( $algorithm, $charset, @search_args );
-
-The B method accepts zero to three arguments. The first
-argument is the threading algorithm to use, generally either
-I or I. The second argument is the
-character set to use, and the third argument is the set of search
-arguments to use.
-
-If the algorithm is not supplied, it defaults to I if
-available, or I if available. If neither of these is
-available then the B method returns undef.
-
-If the character set is not specified it will default to I.
-
-If the search arguments are not specified, the default is I.
-
-If B is called for an object connected to a server that does
-not support the THREADS extension then the B method will
-return C.
-
-The B method will issue the I command as defined in
-F.
-It returns an array of threads. Each element in the array is either a
-message id or a reference to another array of (sub)threads.
-
-If the L parameter is set to a true value then the message id's
-returned in the thread structure will be message UID's. Otherwise
-they will be message sequence numbers.
-
-=head2 uidvalidity
-
-Example:
-
- my $validity = $imap->uidvalidity($folder)
- or die "uidvalidity failed: $@\n";
-
-The B method accepts one argument, the name of a folder,
-and returns the numeric string that is the unique identifier validity
-value for the folder.
-
-=head2 unmark
-
-Example:
-
- $imap->unmark(@msgs) or die "Could not unmark: $@\n";
-
-The B method accepts a list of one or more messages sequence
-numbers, or a single reference to an array of one or more message
-sequence numbers, as its argument(s). It then unsets the I<\Flagged>
-flag for those message(s). Of course, if the L parameter is set
-to a true value then those message sequence numbers should really be
-unique message id's.
-
-Note that specifying C<$imap-Eunmark(@msgs)> is just a shortcut
-for specifying C<$imap-Eunset_flag("Flagged",@msgs)>.
-
-Note also that the I<\Flagged> flag is just one of many possible
-flags. This is a little confusing, but you'll have to get used to the
-idea that among the reserved flags specified in RFC3501 is one name
-I<\Flagged>. There is no specific meaning for this flag; it means
-whatever the mailbox owner (or delegate) wants it to mean when it is
-turned on.
-
-=head2 unseen
-
-Example:
-
- my @unread = $imap->unseen or warn "Could not find unseen msgs: $@\n";
-
-The B method performs an IMAP SEARCH UNSEEN search against the
-selected folder and returns an array of sequence numbers of messages
-that have not yet been seen (ie their I<\Seen> flag is not set). If
-the L parameter is true then an array of message UID's will be
-returned instead. If called in scalar context than a pointer to the
-array (rather than the array itself) will be returned.
-
-=head2 unseen_count
-
-Example:
-
- foreach my $f ($imap->folders) {
- print "The $f folder has ",
- $imap->unseen_count($f)||0, " unseen messages.\n";
- }
-
-The B method accepts the name of a folder as an argument
-and returns the number of unseen messages in that folder. If no
-folder argument is provided then it returns the number of unseen
-messages in the currently selected Folder.
-
-=head2 unset_flag
-
-Example:
-
- $imap->unset_flag( "\Seen", @msgs )
- or die "unset_flag failed: $@\n";
-
-The B method accepts the name of a flag as its first
-argument and a list of one or more messages sequence numbers, or a
-single reference to an array of one or more message sequence numbers,
-as its next argument(s). It then unsets the flag specified for those
-message(s). Of course, if the L parameter is set to a true
-value then those message sequence numbers had better be unique message
-id's, just as you'd expect.
-
-=head1 Other IMAP Client Commands
-
-Until release C<2.99>, when you called a method which did not exist,
-they where automatically translated into an IMAP call with the same
-name via an AUTOLOAD hack. This "feature" was removed for various
-reasons: people made typos in the capitalization of method names, and
-the program still seemed to work correctly. Besides, it blocked
-further development of this module, because people did not contribute
-their private extensions to the protocol implementation.
-
-=head2 copy($msg, $folder)
-
-Copy a message from the currently selected folder in the folder whose
-name is in C<$folder>
-
-=head2 subscribe($folder)
-
-Subscribe to a folder
-
-B Once again, remember to quote your quotes (or use the
-L method) if you want quotes to be part of the IMAP command
-string.
-
-You can also use the default method to override the behavior of
-implemented IMAP methods by changing the case of the method name,
-preferably to all-uppercase so as not to conflict with the Class
-method and accessor method namespace. For example, if you don't want
-the L method's behavior (which returns a list of message
-numbers) but would rather have an array of raw data returned from your
-L operation, you can issue the following snippet:
-
- my @raw = $imap->SEARCH("SUBJECT","Whatever...");
-
-which is slightly more efficient than the equivalent:
-
- $imap->search("SUBJECT","Whatever...");
- my @raw = $imap->Results;
-
-Of course you probably want the search results tucked nicely into a
-list for you anyway, in which case you might as well use the
-L method.
-
-=head1 Parameters
-
-There are several parameters that influence the behavior of an
-IMAPClient object. Each is set by specifying a named value pair
-during new method invocation as follows:
-
- my $imap = Mail::IMAPClient->new ( parameter => "value",
- parameter2 => "value",
- ...
- );
-
-Parameters can also be set after an object has been instantiated by
-using the parameter's eponymous accessor method like this:
-
- my $imap = Mail::IMAPClient->new;
- $imap->parameter( "value");
- $imap->parameter2("value");
-
-The eponymous accessor methods can also be used without arguments to
-obtain the current value of the parameter as follows:
-
- my $imap = Mail::IMAPClient->new;
- $imap->parameter( "value");
- $imap->parameter2("value");
-
- ... # A whole bunch of awesome Perl code, omitted for brevity
-
- my $forgot = $imap->parameter;
- my $forgot2 = $imap->parameter2;
-
-Note that in these examples I'm using 'parameter' and 'parameter2' as
-generic parameter names. The IMAPClient object doesn't actually have
-parameters named 'parameter' and 'parameter2'. On the contrary, the
-available parameters are:
-
-=head2 Authmechanism
-
-Example:
-
- $imap->Authmechanism("CRAM-MD5");
- # or
- my $authmech = $imap->Authmechanism();
-
-If specified, the I causes the specified authentication
-mechanism to be used whenever Mail::IMAPClient would otherwise invoke
-B. If the value specified for the I parameter
-is not a valid authentication mechanism for your server then you will
-never ever be able to log in again for the rest of your Perl script,
-probably. So you might want to check, like this:
-
- my $authmech = "CRAM-MD5";
- $imap->has_capability($authmech) and $imap->Authmechanism($authmech);
-
-Of course if you know your server supports your favorite authentication
-mechanism then you know, so you can then include your I
-with your B call, as in:
-
- my $imap = Mail::IMAPClient->new(
- User => $user,
- Passord => $passord,
- Server => $server,
- Authmechanism => $authmech,
- %etc
- );
-
-If I is supplied but I is not then you
-had better be supporting one of the authentication mechanisms that
-Mail::IMAPClient supports "out of the box" (such as CRAM-MD5).
-
-=head2 Authcallback
-
-Example:
-
- $imap->Authcallback( \&callback );
-
-This specifies a default callback to the default authentication
-mechanism (see L , above). Together, these two methods
-replace automatic calls to login with automatic calls that look like
-this (sort of):
-
- $imap->authenticate($imap->Authmechanism,$imap->Authcallback);
-
-If I is supplied but I is not then you
-had better be supporting one of the authentication mechanisms that
-Mail::IMAPClient supports "out of the box" (such as CRAM-MD5).
-
-=head2 Authuser
-
-The I parameter is used by the DIGEST-MD5 L .
-
-Typically when you authenticate the username specified in the User
-parameter is used. However, when using the DIGEST-MD5
-I the I can be used to specify a different
-username for the login.
-
-This can be useful to mark messages as seen for the I if you
-don't know the password of the user as the seen state is often a
-per-user state.
-
-=head2 Buffer
-
-Example:
-
- $Buffer = $imap->Buffer();
- # or:
- $imap->Buffer($new_value);
-
-The I parameter sets the size of a block of I/O. It is
-ignored unless L, below, is set to a true value (the
-default), or unless you are using the L method. It's value
-should be the number of bytes to attempt to read in one I/O operation.
-The default value is 4096.
-
-When using the L method, you can often achieve dramatic
-improvements in throughput by adjusting this number upward. However,
-doing so also entails a memory cost, so if set too high you risk
-losing all the benefits of the L method's chunking
-algorithm. Your program can thus terminate with an "out of memory"
-error and you'll have no one but yourself to blame.
-
-Note that, as hinted above, the I parameter affects the
-behavior of the L method regardless of whether you have
-L turned on. Believe me, you don't want to go around
-migrating tons of mail without using buffered I/O!
-
-=head2 Clear
-
-Example:
-
- $Clear = $imap->Clear();
- # or:
- $imap->Clear($integer);
-
-The name of this parameter, for historical reasons, is somewhat
-misleading. It should be named I, because it specifies how many
-transactions are stored in the wrapped history buffer. But it didn't
-always work that way; the buffer used to actually get cleared. The
-name though remains the same in the interests of backwards
-compatibility.
-
-I specifies that the object's history buffer should be wrapped
-after every I transactions, where I is the value specified for
-the I parameter. Calling the eponymous B method without
-an argument will return the current value of the I parameter
-but will not cause clear the history buffer to wrap.
-
-Setting I to 0 turns off automatic history buffer wrapping, and
-setting it to 1 turns off the history buffer facility (except for the
-last transaction, which cannot be disabled without breaking the
-IMAPClient module). Setting I to 0 will not cause an immediate
-clearing of the history buffer; setting it to 1 (or any other number)
-will (except of course for that inevitable last transaction).
-
-The default I value is set to five (5) in order to conserve
-memory.
-
-=head2 Compress
-
-If set, Mail::IMAPClient attempts to enable use of the RFC4978
-COMPRESS DEFLATE extension. This requires that the server supports
-this CAPABILITY. This attribute can be set to a true value to enable
-or an ARRAYREF to control the arguments used in the call to
-Compress::Zlib::deflateInit().
-
-Mail::IMAPClient will automatically use L to
-deflate/inflate the data to/from the server. This attribute is used
-in the L method.
-
-See also L and L.
-
-Version note: attribute added in Mail::IMAPClient 3.30
-
-=head2 Debug
-
-Example:
-
- $Debug = $imap->Debug();
- # or:
- $imap->Debug($true_or_false);
-
-Sets the debugging flag to either a true or false value. Can be
-supplied with the L method call or separately by calling the
-B object method. Use of this parameter is strongly recommended
-when debugging scripts and required when reporting bugs.
-
-=head2 Debug_fh
-
-Example:
-
- $Debug_fh = $imap->Debug_fh();
- # or:
- $imap->Debug_fh($fileHandle);
-
-Specifies the file handle to which debugging information should be
-printed. It can either a file handle object reference or a file handle
-glob. The default is to print debugging info to STDERR.
-
-For example, you can:
-
- use Mail::IMAPClient;
- use IO::File;
- # set $user, $pass, and $server here
- my $dh = IO::File->new(">debugging.output")
- or die "Can't open debugging.output: $!\n";
- my $imap = Mail::IMAPClient->new(
- User=>$user, Password=>$pass, Server=>$server, Debug=>1, Debug_fh => $dh
- );
-
-which is the same as:
-
- use Mail::IMAPClient;
- use IO::File;
- # set $user, $pass, and $server here
- my $imap = Mail::IMAPClient->new(
- User => $user,
- Password => $pass,
- Server => $server,
- Debug => "yes, please",
- Debug_fh => IO::File->new(">debugging.output")
- || die "Can't open debugging.output: $!\n"
- );
-
-You can also:
-
- use Mail::IMAPClient;
- # set $user, $pass, and $server here
- open(DBG,">debugging.output")
- or die "Can't open debugging.output: $!\n";
- my $imap = Mail::IMAPClient->new(
- User=>$user, Password=>$pass, Server=>$server, Debug=> 1, Debug_fh => *DBG
- );
-
-Specifying this parameter is not very useful unless L is set
-to a true value.
-
-=head2 Domain
-
-The I parameter is used by the NTLM L. The
-domain is an optional parameter for NTLM authentication.
-
-=head2 EnableServerResponseInLiteral
-
-Removed in 2.99_01 (now autodetect)
-
-=head2 Fast_io
-
-Example:
-
- $Fast_io = $imap->Fast_io();
- # or:
- $imap->Fast_io($true_or_false);
-
-The I parameter controls whether or not the Mail::IMAPClient
-object will attempt to use non-blocking I/O on the IMAP socket. It is
-turned on by default (unless the caller provides the socket to be
-used).
-
-See also L.
-
-=head2 Folder
-
-Example:
-
- $Folder = $imap->Folder();
- # or:
- $imap->Folder($new_value);
-
-The I parameter returns the name of the currently-selected
-folder (in case you forgot). It can also be used to set the name of
-the currently selected folder, which is completely unnecessary if you
-used the L method (or L's read-only equivalent, the
-L method) to select it.
-
-Note that setting the I parameter does not automatically
-select a new folder; you use the L or L object
-methods for that. Generally, the I parameter should only be
-queried (by using the no-argument form of the B method). You
-will only need to set the I parameter if you use some
-mysterious technique of your own for selecting a folder, which you
-probably won't do.
-
-=head2 Ignoresizeerrors
-
-Certain (caching) servers, like Exchange 2007, often report the wrong
-message size. Instead of chopping the message into a size that it
-fits the specified size, the reported size will be simply ignored when
-this parameter is set to C<1>.
-
-=head2 Keepalive
-
-Some firewalls and network gear like to timeout connections
-prematurely if the connection sits idle. The B parameter,
-when set to a true value, affects the behavior of L and
-L by enabling SO_KEEPALIVE on the socket.
-
-Version note: attribute added in Mail::IMAPClient 3.17
-
-=head2 Maxcommandlength
-
-The B attribute is used by fetch() to limit length
-of commands sent to a server. The default is 1000 chars, following
-the recommendation of RFC2683 section 3.2.1.5.
-
-B: this attribute should also be used for several other methods
-but this has not yet been implemented please feel free to file bugs
-for methods where you run into problems with this.
-
-This attribute should remove the need for utilities like imapsync to
-create their own split() functions and instead allows Mail::IMAPClient
-to DWIM.
-
-In practice, this parameter has proven to be useful to overcome a
-limit of 8000 octets for UW-IMAPD and 16384 octets for Courier/Cyrus
-IMAP servers.
-
-Version note: attribute added in Mail::IMAPClient 3.17
-
-=head2 Maxtemperrors
-
-Example:
-
- $Maxtemperrors = $imap->Maxtemperrors();
- # or:
- $imap->Maxtemperrors($number);
-
-The I parameter specifies the number of times a read or
-write operation is allowed to fail on a "Resource Temporarily
-Available" (e.g. EAGAIN) error. The default setting is I which
-means there is no limit.
-
-Setting this parameter to the string "unlimited" (instead of undef) to
-ignore "Resource Temporarily Unavailable" errors is deprecated.
-
-B: This setting should be used with caution and may be removed
-in a future release. Setting this can cause methods to return to the
-caller before data is received (and then handled) properly thereby
-possibly then leaving the module in a bad state. In the future, this
-behavior may be changed in an attempt to avoid this situation.
-
-=head2 Password
-
-Example:
-
- $Password = $imap->Password();
- # or:
- $imap->Password($new_value);
-
-Specifies the password to use when logging into the IMAP service on
-the host specified in the I parameter as the user specified in
-the I parameter. Can be supplied with the B method call or
-separately by calling the B object method.
-
-If I, I, and I are all provided to the L
-method, then the newly instantiated object will be connected to the
-host specified in I (at either the port specified in I
-or the default port 143) and then logged on as the user specified in
-the I parameter (using the password provided in the I
-parameter). See the discussion of the L"new"> method, below.
-
-=head2 Peek
-
-Example:
-
- $Peek = $imap->Peek();
- # or:
- $imap->Peek($true_or_false);
-
-Setting I to a true value will prevent the L,
-L and L methods from automatically
-setting the I<\Seen> flag. Setting L"Peek"> to 0 (zero) will force
-L"body_string">, L"message_string">, L"message_to_file">, and
-L"parse_headers"> to always set the I<\Seen> flag.
-
-The default is to set the seen flag whenever you fetch the body of a
-message but not when you just fetch the headers. Passing I to
-the eponymous B method will reset the I parameter to its
-pristine, default state.
-
-=head2 Port
-
-Example:
-
- $Port = $imap->Port();
- # or:
- $imap->Port($new_value);
-
-Specifies the port on which the IMAP server is listening. A default
-value of 993 (if L is true) or 143 is set during a call to
-L if no value is provided by the caller. This argument can
-be supplied with the L method call or separately by calling the
-L object method.
-
-=head2 Prewritemethod
-
-I parameter should contain a reference to a subroutine
-that will do "special things" to data before it is sent to the IMAP
-server (such as encryption or signing).
-
-This method will be called immediately prior to sending an IMAP client
-command to the server. Its first argument is a reference to the
-I object and the second argument is a string
-containing the command that will be sent to the server. Your
-I should return a string that has been signed or
-encrypted or whatever; this returned string is what will actually be
-sent to the server.
-
-Your I will probably need to know more than this to do
-whatever it does. It is recommended that you tuck all other pertinent
-information into a hash, and store a reference to this hash somewhere
-where your method can get to it, possibly in the I
-object itself.
-
-Note that this method should not actually send anything over the
-socket connection to the server; it merely converts data prior to
-sending.
-
-See also L.
-
-=head2 Ranges
-
-Example:
-
- $imap->Ranges(1);
- # or:
- my $search = $imap->search(@search_args);
- if ( $imap->Ranges) { # $search is a MessageSet object
- print "This is my condensed search result: $search\n";
- print "This is every message in the search result: ",
- join(",",@$search),"\n;
- }
-
-If set to a true value, then the L method will return a
-L object if called in a scalar context,
-instead of the array reference that B normally returns when
-called in a scalar context. If set to zero or if undefined, then
-B will continue to return an array reference when called in
-scalar context.
-
-This parameter has no affect on the B method when B
-is called in a list context.
-
-=head2 RawSocket
-
-Example:
- $socket = $imap->RawSocket;
- # or:
- $imap->RawSocket($socketh);
-
-The I method can be used to obtain the socket handle of the
-current connection (say, to do I/O on the connection that is not
-otherwise supported by Mail::IMAPClient) or to replace the current
-socket with a new handle (for instance an SSL handle, see
-L, but be sure to see the L method as well).
-
-If you supply a socket handle yourself, either by doing something like:
-
- $imap=Mail::IMAPClient->new(RawSocket => $sock, User => ... );
-
-or by doing something like:
-
- $imap = Mail::IMAPClient->new(User => $user,
- Password => $pass, Server => $host);
- # blah blah blah
- $imap->RawSocket($ssl);
-
-then it will be up to you to establish the connection AND to
-authenticate, either via the L method, or the fancier
-L, or, since you know so much anyway, by just doing raw
-I/O against the socket until you're logged in. If you do any of this
-then you should also set the L parameter yourself to reflect
-the current state of the object (i.e. Connected, Authenticated, etc).
-
-Note that no operation will be attempted on the socket when this
-method is called. In particular, after the TCP connections towards
-the IMAP server is established, the protocol mandates the server to
-send an initial greeting message, and you will have to explicitly cope
-with this message before doing any other operation, e.g. trying to
-call L. Caveat emptor.
-
-For a more DWIM approach to setting the socket see L.
-
-=head2 Readmethod
-
-Example:
-
- $imap->Readmethod( # IMAP, HANDLE, BUFFER, LENGTH, OFFSET
- sub {
- my ( $self, $handle, $buffer, $count, $offset ) = @_;
- my $rc = sysread( $handle, $$buffer, $count, $offset );
- # do something useful here...
- }
- );
-
-B should contain a reference to a subroutine that will
-replace sysread. The subroutine will be passed the following
-arguments: first the used Mail::IMAPClient object. Second, a
-reference to a socket. Third, a reference to a scalar variable into
-which data is read (BUFFER). The data placed here should be "finished
-data", so if you are decrypting or removing signatures then be sure to
-do that before you place data into this buffer. Fourth, the number of
-bytes requested to be read; the LENGTH of the request. Lastly, the
-OFFSET into the BUFFER where the data should be read. If not supplied
-it should default to zero.
-
-Note that this method completely replaces reads from the connection
-to the server, so if you define one of these then your subroutine will
-have to actually do the read. It is for things like this that we have
-the L parameter and eponymous accessor method.
-
-Your I will probably need to know more than this to do
-whatever it does. It is recommended that you tuck all other pertinent
-information into a hash, and store a reference to this hash somewhere
-where your method can get to it, possibly in the I
-object itself.
-
-See also L .
-
-=head2 Readmoremethod
-
-B should contain a reference to a subroutine that will
-replace/enhance the behavior of the internal _read_more() method. The
-subroutine will be passed the following arguments: first the used
-Mail::IMAPClient object. Second, a reference to a socket. Third, a
-timeout value which is used as the timeout value for CORE::select() by
-default. Depending upon changes/features introduced by Readmethod
-changes may be required here.
-
-Version note: attribute added in Mail::IMAPClient 3.30
-
-=head2 Reconnectretry
-
-If an IMAP connection sits idle too long, the connection may be closed
-by the server or firewall, etc. The B parameter, when
-given a positive integer value, will cause Mail::IMAPClient to
-retrying IMAP commands up to X times when an EPIPE or ECONNRESET error
-occurs. This is disabled (0) by default.
-
-See also L
-
-Version note: attribute added in Mail::IMAPClient 3.17
-
-=head2 Server
-
-Example:
-
- $Server = $imap->Server();
- # or:
- $imap->Server($hostname);
-
-Specifies the hostname or IP address of the host running the IMAP
-server. If provided as part of the L method call, then the new
-IMAP object will automatically be connected at the time of
-instantiation. (See the L method, below.) Can be supplied with
-the L method call or separately by calling the B object
-method.
-
-=head2 Showcredentials
-
-Normally debugging output will mask the login credentials when the
-plain text login mechanism is used. Setting I to a
-true value will suppress this, so that you can see the string being
-passed back and forth during plain text login. Only set this to true
-when you are debugging problems with the IMAP LOGIN command, and then
-turn it off right away when you're finished working on that problem.
-
-Example:
-
- print "This is very risky!\n" if $imap->Showcredentials();
- # or:
- $imap->Showcredentials(0); # mask credentials again
-
-=head2 Socket
-
-B The semantics of this method has changed as of version
-2.99_04 of this module. If you need the old semantics use
-L.
-
-Example:
-
- $Socket = $imap->Socket();
- # or:
- $imap->Socket($socket_fh);
-
-The I method can be used to obtain the socket handle of the
-current connection. This may be necessary to do I/O on the connection
-that is not otherwise supported by Mail::IMAPClient) or to replace the
-current socket with a new handle (for instance an SSL handle, see
-IO::Socket::SSL).
-
-If you supply a socket handle yourself, either by doing something like:
-
- $imap = Mail::IMAPClient->new( Socket => $sock, User => ... );
-
-or by doing something like:
-
- $imap = Mail::IMAPClient->new(
- User => $user, Password => $pass, Server => $host
- );
- $imap->Socket($ssl);
-
-then you are responsible for establishing the connection, i.e. make
-sure that C<$ssl> in the example is a valid and connected socket.
-
-This method is primarily used to provide a drop-in replacement for
-IO::Socket::(INET|IP), used by L by default. In fact, this
-method is called by L itself after having established a
-suitable IO::Socket::(INET|IP) socket connection towards the target
-server; for this reason, this method also carries the normal
-operations associated with L, namely:
-
-=over 4
-
-=item *
-
-read the initial greeting message from the server;
-
-=item *
-
-call L if the conditions apply (see L for details);
-
-=item *
-
-leave the I object in a suitable state.
-
-=back
-
-For these reasons, the following example will work "out of the box":
-
- use IO::Socket::SSL;
- my $imap = Mail::IMAPClient->new
- ( User => 'your-username',
- Password => 'your-password',
- Socket => IO::Socket::SSL->new
- ( Proto => 'tcp',
- PeerAddr => 'some.imap.server',
- PeerPort => 993, # IMAP over SSL standard port
- ),
- );
-
-If you need more control over the socket, e.g. you have to implement a
-fancier authentication method, see L.
-
-=head2 Starttls
-
-If an IMAP connection must start TLS/SSL after connecting to a server
-then set this attribute. If the value is set to an arrayref then they
-will be used as arguments to IO::Socket::SSL->start_SSL. By default
-this connection is set to blocking while establishing the connection
-with a timeout of 30 seconds. The socket will be reset to the
-original blocking/non-blocking value after a successful TLS
-negotiation has occurred. The arguments used in the call to start_SSL
-can be controlled by setting this attribute to an ARRAY reference
-containing the desired arguments.
-
-Version note: attribute added in Mail::IMAPClient 3.22
-
-=head2 Socketargs
-
-The arguments used in the call to IO::Socket::{UNIX|INET|IP|SSL}->new
-can be controlled by setting this attribute to an ARRAY reference
-containing the desired arguments.
-
-For example, to always pass MultiHomed => 1 to IO::Socket::...->new
-the following can be used:
-
- $imap = Mail::IMAPClient->new(
- ..., Socketargs => [ MultiHomed => 1 ], ...
- );
-
-See also L for specific control of the args to IO::Socket::SSL.
-
-Version note: attribute added in Mail::IMAPClient 3.34
-
-=head2 Ssl
-
-If an IMAP connection requires SSL you can set the Ssl attribute to
-'1' and Mail::IMAPClient will automatically use L
-instead of IO::Socket::(INET|IP) to connect to the server. This
-attribute is used in the L method. The arguments used in
-the call to IO::Socket::SSL->new can be controlled by setting this
-attribute to an ARRAY reference containing the desired arguments.
-
-See also L for details on connection initiation and
-L and L if you need to take more control of
-connection management.
-
-Version note: attribute added in Mail::IMAPClient 3.18
-
-=head2 Supportedflags
-
-Especially when C is used, the receiving peer may need to
-be configured explicitly with the list of supported flags; that may
-be different from the source IMAP server.
-
-The names are to be specified as an ARRAY. Black-slashes and casing
-will be ignored.
-
-You may also specify a CODE reference, which will be called for each
-of the flags separately. In this case, the flags are not (yet)
-normalized. The returned lists of the CODE calls are shape the
-resulting flag list.
-
-=head2 Timeout
-
-Example:
-
- $Timeout = $imap->Timeout();
- # or:
- $imap->Timeout($seconds);
-
-Specifies the timeout value in seconds for reads (default is 600).
-Specifying a I will prevent Mail::IMAPClient from blocking
-in a read.
-
-Since timeouts are implemented via the Perl L
-operator, the I parameter may be set to a fractional number
-of seconds. Setting I to 0 (zero) disables the timeout
-feature.
-
-=head2 Uid
-
-Example:
-
- $Uid = $imap->Uid();
- # or:
- $imap->Uid($true_or_false);
-
-If L is set to a true value (i.e. 1) then the behavior of the
-L, L, L, and L methods (and their
-derivatives) is changed so that arguments that would otherwise be
-message sequence numbers are treated as message UID's and so that
-return values (in the case of the L method and its
-derivatives) that would normally be message sequence numbers are
-instead message UID's.
-
-Internally this is implemented as a switch that, if turned on, causes
-methods that would otherwise issue an IMAP FETCH, STORE, SEARCH, or
-COPY client command to instead issue UID FETCH, UID STORE, UID SEARCH,
-or UID COPY, respectively. The main difference between message
-sequence numbers and message UID's is that, according to RFC3501,
-UID's must not change during a session and should not change between
-sessions, and must never be reused. Sequence numbers do not have that
-same guarantee and in fact may be reused right away.
-
-Since folder names also have a unique identifier (UIDVALIDITY), which
-is provided when the folder is L ed or Ld or by
-doing something like "$imap->status($folder,"UIDVALIDITY"), it is
-possible to uniquely identify every message on the server, although
-normally you won't need to bother.
-
-The methods currently affected by turning on the L flag are:
-
- copy fetch
- search store
- message_string message_uid
- body_string flags
- move size
- parse_headers thread
-
-Note that if for some reason you only want the L parameter turned
-on for one command, then you can choose between the following two
-snippets, which are equivalent:
-
-Example 1:
-
- $imap->Uid(1);
- my @uids = $imap->search('SUBJECT',"Just a silly test"); #
- $imap->Uid(0);
-
-Example 2:
-
- my @uids;
- foreach $r ($imap->UID("SEARCH","SUBJECT","Just a silly test") {
- chomp $r;
- $r =~ s/\r$//;
- $r =~ s/^\*\s+SEARCH\s+// or next;
- push @uids, grep(/\d/,(split(/\s+/,$r)));
- }
-
-In the second example, we used the default method to issue the UID
-IMAP client command, being careful to use an all-uppercase method name
-so as not to inadvertently call the L accessor method. Then we
-parsed out the message UIDs manually, since we don't have the benefit
-of the built-in L method doing it for us.
-
-Please be very careful when turning the L parameter on and off
-throughout a script. If you loose track of whether you've got the
-L parameter turned on you might do something sad, like deleting
-the wrong message. Remember, like all eponymous accessor methods, the
-B method without arguments will return the current value for the
-L parameter, so do yourself a favor and check. The safest
-approach is probably to turn it on at the beginning (or just let it
-default to being on) and then leave it on. (Remember that leaving it
-turned off can lead to problems if changes to a folder's contents
-cause resequencing.)
-
-By default, the L parameter is turned on.
-
-=head2 User
-
-Example:
-
- $User = $imap->User();
- # or:
- $imap->User($userid);
-
-Specifies the userid to use when logging into the IMAP service. Can
-be supplied with the L method call or separately by calling the
-B object method.
-
-Parameters can be set during L method invocation by passing named
-parameter/value pairs to the method, or later by calling the
-parameter's eponymous object method.
-
-=head1 Status Methods
-
-There are several object methods that return the status of the object.
-They can be used at any time to check the status of an IMAPClient
-object, but are particularly useful for determining the cause of
-failure when a connection and login are attempted as part of a single
-L method invocation. The status methods are:
-
-=head2 Escaped_history
-
-Example:
-
- my @history = $imap->Escaped_history;
-
-The B method is almost identical to the B
-method. Unlike the B method, however, server output
-transmitted literally will be wrapped in double quotes, with all
-double quotes, backslashes escaped. If called in a scalar context,
-B returns an array reference rather than an array.
-
-B is useful if you are retrieving output and
-processing it manually, and you are depending on the above special
-characters to delimit the data. It is not useful when retrieving
-message contents; use B or B for that.
-
-=head2 Escaped_results
-
-Example:
-
- my @results = $imap->Escaped_results;
-
-The B method is almost identical to the B
-method. Unlike the B method, however, server output
-transmitted literally will be wrapped in double quotes, with all
-double quotes, backslashes escaped. If called in a scalar context,
-B returns an array reference rather than an array.
-
-B is useful if you are retrieving output and
-processing it manually, and you are depending on the above special
-characters to delimit the data. It is not useful when retrieving
-message contents; use B or B for that.
-
-=head2 History
-
-Example:
-
- my @history = $imap->History;
-
-The B method is almost identical to the L method.
-Unlike the L method, however, the IMAP command that was
-issued to create the results being returned is not included in the
-returned results. If called in a scalar context, B returns
-an array reference rather than an array.
-
-=head2 IsUnconnected
-
-returns a true value if the object is currently in an L
-state.
-
-=head2 IsConnected
-
-returns a true value if the object is currently in either a
-L, L, or L state.
-
-=head2 IsAuthenticated
-
-returns a true value if the object is currently in either an
-L or L state.
-
-=head2 IsSelected
-
-returns a true value if the object is currently in a L
-state.
-
-=head2 LastError
-
-Internally B is implemented just like a parameter (as
-described in L"Parameters">, above). There is a I
-attribute and an eponymous accessor method which returns the
-I text string describing the last error condition
-encountered by the server.
-
-Note that some errors are more serious than others, so I's
-value is only meaningful if you encounter an error condition that you
-don't like. For example, if you use the L method to see if a
-folder exists and the folder does not exist, then an error message
-will be recorded in I even though this is not a
-particularly serious error. On the other hand, if you didn't use
-L and just tried to L a non-existing folder, then
-L would return C after setting I to
-something like C. At this point it would be useful to print out the
-contents of I as you L.
-
-=head2 LastIMAPCommand
-
-New in version 2.0.4, B returns the exact IMAP
-command string to be sent to the server. Useful mainly in
-constructing error messages when L just isn't enough.
-
-=head2 Report
-
-The B method returns an array containing a history of the IMAP
-session up to the point that B was called. It is primarily
-meant to assist in debugging but can also be used to retrieve raw
-output for manual parsing. The value of the L parameter
-controls how many transactions are in the report.
-
-=head2 Results
-
-The B method returns an array containing the results of one
-IMAP client command. It accepts one argument, the transaction number
-of the command whose results are to be returned. If transaction
-number is unspecified then B returns the results of the last
-IMAP client command issued. If called in a scalar context, B
-returns an array reference rather than an array.
-
-=head2 State
-
-The B method returns a numerical value that indicates the
-current status of the IMAPClient object. If invoked with an argument,
-it will set the object's state to that value. If invoked without an
-argument, it behaves just like L, below.
-
-Normally you will not have to invoke this function. An exception is
-if you are bypassing the Mail::IMAPClient module's L and/or
-L modules to set up your own connection (say, for example,
-over a secure socket), in which case you must manually do what the
-L and L methods would otherwise do for you.
-
-=head2 Status
-
-The B method returns a numerical value that indicates the
-current status of the IMAPClient object. (Not to be confused with the
-L method, all lower-case, which is the implementation of the
-I IMAP client command.)
-
-=head2 Transaction
-
-The B method returns the tag value (or transaction
-number) of the last IMAP client command.
-
-=head1 Custom Authentication Mechanisms
-
-If you just want to use plain text authentication or any of the
-supported L"Advanced Authentication Mechanisms"> then there is no
-need to read this section.
-
-There are a number of methods and parameters that you can use to build
-your own authentication mechanism. All of the methods and parameters
-discussed in this section are described in more detail elsewhere in
-this document. This section provides a starting point for building
-your own authentication mechanism.
-
-There are I authentication mechanisms out there, if your
-preferred mechanism is not currently supported but you manage to get
-it working please consider donating them to this module. Patches and
-suggestions are always welcome.
-
-Support for add-on authentication mechanisms in Mail::IMAPClient is
-pretty straight forward. You create a callback to be used to provide
-the response to the server's challenge. The L parameter
-contains a reference to the callback, which can be an anonymous
-subroutine or a named subroutine. Then, you identify your
-authentication mechanism, either via the L parameter or
-as an argument to L.
-
-You may also need to provide a subroutine to encrypt (or whatever)
-data before it is sent to the server. The L parameter
-must contain a reference to this subroutine. And, you will need to
-decrypt data from the server; a reference to the subroutine that does
-this must be stored in the L parameter.
-
-This framework is based on the assumptions that a) the mechanism you
-are using requires a challenge-response exchange, and b) the mechanism
-does not fundamentally alter the exchange between client and server
-but merely wraps the exchange in a layer of encryption. It also
-assumes that the line-oriented nature of the IMAP conversation is
-preserved; authentication mechanisms that break up messages into
-blocks of a predetermined size may still be possible but will
-certainly be more difficult to implement.
-
-Alternatively, if you have access to B, a utility included in
-the Cyrus IMAP distribution, you can use that utility to broker your
-communications with the IMAP server. This is quite easy to implement.
-An example, F, can be found in the
-C subdirectory of the source distribution.
-
-The following list summarizes the methods and parameters that you may
-find useful in implementing advanced authentication:
-
-=over 4
-
-=item The authenticate method
-
-The L method uses the L parameter to
-determine how to authenticate with the server see the method
-documentation for details.
-
-=item Socket and RawSocket
-
-The L and L methods provide access to the socket
-connection. The socket is typically automatically created by the
-L method, but if you are implementing an advanced
-authentication technique you may choose to set up your own socket
-connection and then set this parameter manually, bypassing the
-B method completely. This is also useful if you want to use
-IO::Socket::(INET|IP) alternatives like IO::Socket::SSL and need full
-control.
-
-L simply gets/sets the socket without attempting any
-interaction on it. In this case, you have to be sure to handle all
-the preliminary operations and manually set the Mail::IMAPClient
-object in sync with its actual status with respect to this socket (see
-below for additional parameters regarding this, especially the
-L parameter).
-
-Unlike L, L attempts to carry on preliminary
-connection phases if the conditions apply. If both parameters are
-present, this takes the precedence over L. If
-L is set, then the L method will be called by
-L.
-
-B As of version 2.99_04 of this module, semantics for
-L have changed to make it more "DWIM". L was
-introduced as a replacement for the L parameter in older
-version.
-
-=item State, Server, User, Password, Proxy and Domain Parameters
-
-If you need to make your own connection to the server and perform your
-authentication manually, then you can set these parameters to keep
-your Mail::IMAPClient object in sync with its actual status. Of
-these, only the L parameter is always necessary. The others
-need to be set only if you think your program will need them later.
-
-=item Authmechanism
-
-Set this to the value that AUTHENTICATE should send to the server as
-the authentication mechanism. If you are brokering your own
-authentication then this parameter may be less useful. It exists
-primarily so that you can set it when you call L to instantiate
-your object. The L method will call L, which will
-call L. If L sees that you have set an
-B then it will call B, using your
-B and B parameters as arguments.
-
-=item Authcallback
-
-The L , if set, holds a pointer to a subroutine
-(CODEREF). The L method will use this as the callback
-argument to the B method if the B and
-B parameters are both set. If you set B
-but not B then the default callback for your mechanism
-will be used. All supported authentication mechanisms have a default
-callback; in every other case not supplying the callback results in an
-error.
-
-Most advanced authentication mechanisms require a challenge-response
-exchange. After the L method sends " AUTHENTICATE
-\015\012" to the IMAP server, the server replies with a
-challenge. The L method then invokes the code whose
-reference is stored in the B parameter as follows:
-
- $Authcallback->( $challenge, $imap )
-
-where C<$Authcallback> is the code reference stored in the
-B parameter, C<$challenge> is the challenge received
-from the IMAP server, and C<$imap> is a pointer to the
-Mail::IMAPClient object. The return value from the B
-routine should be the response to the challenge, and that return value
-will be sent by the L method to the server.
-
-=item Prewritemethod/Readmethod
-
-The B can hold a subroutine that will do whatever
-encryption is necessary and then return the result to the caller so it
-in turn can be sent to the server.
-
-The B can hold a subroutine to be used to replace
-B usually performed by Mail::IMAPClient.
-
-See L and L for details.
-
-=back
-
-=head1 REPORTING BUGS
-
-Please send bug reports to C or
-https://rt.cpan.org/Public/Dist/Display.html?Name=Mail-IMAPClient
-
-=head1 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.
diff --git a/W/Mail-IMAPClient-3.42/lib/Mail/IMAPClient/BodyStructure.pm b/W/Mail-IMAPClient-3.42/lib/Mail/IMAPClient/BodyStructure.pm
deleted file mode 100644
index c54ff0d..0000000
--- a/W/Mail-IMAPClient-3.42/lib/Mail/IMAPClient/BodyStructure.pm
+++ /dev/null
@@ -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 method accepts
-one argument, a string containing a server response to a FETCH
-BODYSTRUCTURE directive.
-
-The module B provides the B
-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 object method requires no arguments. It returns the
-bodytype for the message whose structure is described by the calling
-B object.
-
-=head2 bodysubtype
-
-The B object method requires no arguments. It returns the
-bodysubtype for the message whose structure is described by the calling
-B object.
-
-=head2 bodyparms
-
-The B object method requires no arguments. It returns the
-bodyparms for the message whose structure is described by the calling
-B object.
-
-=head2 bodydisp
-
-The B object method requires no arguments. It returns the
-bodydisp for the message whose structure is described by the calling
-B object.
-
-=head2 bodyid
-
-The B object method requires no arguments. It returns the
-bodyid for the message whose structure is described by the calling
-B object.
-
-=head2 bodydesc
-
-The B object method requires no arguments. It returns the
-bodydesc for the message whose structure is described by the calling
-B object.
-
-=head2 bodyenc
-
-The B object method requires no arguments. It returns the
-bodyenc for the message whose structure is described by the calling
-B object.
-
-=head2 bodysize
-
-The B object method requires no arguments. It returns the
-bodysize for the message whose structure is described by the calling
-B object.
-
-=head2 bodylang
-
-The B object method requires no arguments. It returns the
-bodylang for the message whose structure is described by the calling
-B object.
-
-=head2 bodystructure
-
-The B object method requires no arguments. It returns
-the bodystructure for the message whose structure is described by the
-calling B object.
-
-=head2 envelopestruct
-
-The B object method requires no arguments. It returns
-a B object for the message
-from the calling B object.
-
-=head2 textlines
-
-The B object method requires no arguments. It returns the
-textlines for the message whose structure is described by the calling
-B object.
-
-=head1 Mail::IMAPClient::BodyStructure::Envelope
-
-The IMAP standard specifies that output from the IMAP B command will be an RFC2060 envelope structure. It further
-specifies that output from the B command may also
-contain embedded envelope structures (if, for example, a message's
-subparts contain one or more included messages). Objects belonging to
-B 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, C<$imap->fetch($msgid,"ENVELOPE")> or
-Cget_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
-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 objects, which are perl
-data structures representing RFC2060 address structures. Some of
-these arrays would naturally contain one element (such as B,
-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, 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.
-
-=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 arrays) also has
-an analogous method that will return a list of E-Mail addresses
-instead. The addresses are in the format Cmailboxname@hostnameE> (see the section on
-B, 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, 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
-parses each of these into an array of
-B 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:
-
-Cmailboxname@hostnameE>
-
-Note that because the B
-objects come in arrays, it's generally easier to use the methods
-available to B 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 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
diff --git a/W/Mail-IMAPClient-3.42/lib/Mail/IMAPClient/BodyStructure/Parse.grammar b/W/Mail-IMAPClient-3.42/lib/Mail/IMAPClient/BodyStructure/Parse.grammar
deleted file mode 100644
index d99d7a3..0000000
--- a/W/Mail-IMAPClient-3.42/lib/Mail/IMAPClient/BodyStructure/Parse.grammar
+++ /dev/null
@@ -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 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 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) bodysubtype
- bodyparms(?) bodydisp(?) bodylang(?) bodyloc(?) bodyextra(?)
-
- { $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}}
-
-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} }
diff --git a/W/Mail-IMAPClient-3.42/lib/Mail/IMAPClient/BodyStructure/Parse.pm b/W/Mail-IMAPClient-3.42/lib/Mail/IMAPClient/BodyStructure/Parse.pm
deleted file mode 100644
index 4055e60..0000000
--- a/W/Mail-IMAPClient-3.42/lib/Mail/IMAPClient/BodyStructure/Parse.pm
+++ /dev/null
@@ -1,17063 +0,0 @@
-package Mail::IMAPClient::BodyStructure::Parse;
-use Parse::RecDescent;
-{ my $ERRORS;
-
-
-package Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse;
-use strict;
-use vars qw($skip $AUTOLOAD );
-@Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::ISA = ();
-$skip = '\s*';
-
- 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 }
- }
-;
-
-
-{
-local $SIG{__WARN__} = sub {0};
-# PRETEND TO BE IN Parse::RecDescent NAMESPACE
-*Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::AUTOLOAD = sub
-{
- no strict 'refs';
-
- ${"AUTOLOAD"} =~ s/^Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse/Parse::RecDescent/;
- goto &{${"AUTOLOAD"}};
-}
-}
-
-push @Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::ISA, 'Parse::RecDescent';
-# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args, $_itempos)
-sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::envelopestruct
-{
- my $thisparser = $_[0];
- use vars q{$tracelevel};
- local $tracelevel = ($tracelevel||0)+1;
- $ERRORS = 0;
- my $thisrule = $thisparser->{"rules"}{"envelopestruct"};
-
- Parse::RecDescent::_trace(q{Trying rule: [envelopestruct]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
-
- my $def_at = @{$thisparser->{deferred}};
- my $err_at = @{$thisparser->{errors}};
-
- my $score;
- my $score_return;
- my $_tok;
- my $return = undef;
- my $_matched=0;
- my $commit=0;
- my @item = ();
- my %item = ();
- my $repeating = $_[2];
- my $_noactions = $_[3];
- my @arg = defined $_[4] ? @{ &{$_[4]} } : ();
- my $_itempos = $_[5];
- my %arg = ($#arg & 01) ? @arg : (@arg, undef);
- my $text;
- my $lastsep;
- my $current_match;
- my $expectation = new Parse::RecDescent::Expectation(q{'('});
- $expectation->at($_[1]);
-
- my $thisline;
- tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
-
-
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: ['(' date subject from sender replyto to cc bcc inreplyto messageid ')']},
- Parse::RecDescent::_tracefirst($_[1]),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[0];
- $text = $_[1];
- my $_savetext;
- @item = (q{envelopestruct});
- %item = (__RULE__ => q{envelopestruct});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying terminal: ['(']},
- Parse::RecDescent::_tracefirst($text),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- undef $lastsep;
- $expectation->is(q{})->at($text);
-
-
- unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and do { $_tok = "("; 1 } and
- substr($text,0,length($_tok)) eq $_tok and
- do { substr($text,0,length($_tok)) = ""; 1; }
- )
- {
- $text = $lastsep . $text if defined $lastsep;
-
- $expectation->failed();
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
- . $_tok . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $item{__STRING1__}=$_tok;
-
-
- Parse::RecDescent::_trace(q{Trying subrule: [date]},
- Parse::RecDescent::_tracefirst($text),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{date})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::date($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [date]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{date}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{Trying subrule: [subject]},
- Parse::RecDescent::_tracefirst($text),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{subject})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::subject($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [subject]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{subject}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{Trying subrule: [from]},
- Parse::RecDescent::_tracefirst($text),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{from})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::from($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [from]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{from}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{Trying subrule: [sender]},
- Parse::RecDescent::_tracefirst($text),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{sender})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::sender($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [sender]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{sender}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{Trying subrule: [replyto]},
- Parse::RecDescent::_tracefirst($text),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{replyto})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::replyto($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [replyto]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{replyto}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{Trying subrule: [to]},
- Parse::RecDescent::_tracefirst($text),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{to})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::to($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [to]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{to}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{Trying subrule: [cc]},
- Parse::RecDescent::_tracefirst($text),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{cc})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::cc($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [cc]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{cc}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{Trying subrule: [bcc]},
- Parse::RecDescent::_tracefirst($text),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{bcc})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bcc($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [bcc]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{bcc}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{Trying subrule: [inreplyto]},
- Parse::RecDescent::_tracefirst($text),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{inreplyto})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::inreplyto($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [inreplyto]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{inreplyto}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{Trying subrule: [messageid]},
- Parse::RecDescent::_tracefirst($text),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{messageid})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::messageid($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [messageid]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{messageid}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{Trying terminal: [')']},
- Parse::RecDescent::_tracefirst($text),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- undef $lastsep;
- $expectation->is(q{')'})->at($text);
-
-
- unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and do { $_tok = ")"; 1 } and
- substr($text,0,length($_tok)) eq $_tok and
- do { substr($text,0,length($_tok)) = ""; 1; }
- )
- {
- $text = $lastsep . $text if defined $lastsep;
-
- $expectation->failed();
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
- . $_tok . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $item{__STRING2__}=$_tok;
-
-
- Parse::RecDescent::_trace(q{Trying action},
- Parse::RecDescent::_tracefirst($text),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
- $_tok = ($_noactions) ? 0 : do { $return = bless {}, "Mail::IMAPClient::BodyStructure::Envelope";
- $return->{$_} = $item{$_}
- for qw/date subject from sender replyto to cc/
- , qw/bcc inreplyto messageid/;
- 1;
- };
- unless (defined $_tok)
- {
- Parse::RecDescent::_trace(q{<> (return value: [undef])})
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched action<< (return value: [}
- . $_tok . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $_tok;
- $item{__ACTION1__}=$_tok;
-
-
- Parse::RecDescent::_trace(q{>>Matched production: ['(' date subject from sender replyto to cc bcc inreplyto messageid ')']<<},
- Parse::RecDescent::_tracefirst($text),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- unless ( $_matched || defined($score) )
- {
- splice @{$thisparser->{deferred}}, $def_at;
-
-
- $_[1] = $text; # NOT SURE THIS IS NEEDED
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($_[1]),
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- return undef;
- }
- if (!defined($return) && defined($score))
- {
- Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
- q{envelopestruct},
- $tracelevel)
- if defined $::RD_TRACE;
- $return = $score_return;
- }
- splice @{$thisparser->{errors}}, $err_at;
- $return = $item[$#item] unless defined $return;
- if (defined $::RD_TRACE)
- {
- Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
- $return . q{])}, "",
- q{envelopestruct},
- $tracelevel);
- Parse::RecDescent::_trace(q{(consumed: [} .
- Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])},
- Parse::RecDescent::_tracefirst($text),
- , q{envelopestruct},
- $tracelevel)
- }
- $_[1] = $text;
- return $return;
-}
-
-# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args, $_itempos)
-sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::subpart
-{
- my $thisparser = $_[0];
- use vars q{$tracelevel};
- local $tracelevel = ($tracelevel||0)+1;
- $ERRORS = 0;
- my $thisrule = $thisparser->{"rules"}{"subpart"};
-
- Parse::RecDescent::_trace(q{Trying rule: [subpart]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{subpart},
- $tracelevel)
- if defined $::RD_TRACE;
-
- my $def_at = @{$thisparser->{deferred}};
- my $err_at = @{$thisparser->{errors}};
-
- my $score;
- my $score_return;
- my $_tok;
- my $return = undef;
- my $_matched=0;
- my $commit=0;
- my @item = ();
- my %item = ();
- my $repeating = $_[2];
- my $_noactions = $_[3];
- my @arg = defined $_[4] ? @{ &{$_[4]} } : ();
- my $_itempos = $_[5];
- my %arg = ($#arg & 01) ? @arg : (@arg, undef);
- my $text;
- my $lastsep;
- my $current_match;
- my $expectation = new Parse::RecDescent::Expectation(q{'('});
- $expectation->at($_[1]);
-
- my $thisline;
- tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
-
-
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: ['(' part ')' ]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{subpart},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[0];
- $text = $_[1];
- my $_savetext;
- @item = (q{subpart});
- %item = (__RULE__ => q{subpart});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying terminal: ['(']},
- Parse::RecDescent::_tracefirst($text),
- q{subpart},
- $tracelevel)
- if defined $::RD_TRACE;
- undef $lastsep;
- $expectation->is(q{})->at($text);
-
-
- unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and do { $_tok = "("; 1 } and
- substr($text,0,length($_tok)) eq $_tok and
- do { substr($text,0,length($_tok)) = ""; 1; }
- )
- {
- $text = $lastsep . $text if defined $lastsep;
-
- $expectation->failed();
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
- . $_tok . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $item{__STRING1__}=$_tok;
-
-
- Parse::RecDescent::_trace(q{Trying subrule: [part]},
- Parse::RecDescent::_tracefirst($text),
- q{subpart},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{part})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::part($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{subpart},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [part]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{subpart},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{part}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{Trying terminal: [')']},
- Parse::RecDescent::_tracefirst($text),
- q{subpart},
- $tracelevel)
- if defined $::RD_TRACE;
- undef $lastsep;
- $expectation->is(q{')'})->at($text);
-
-
- unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and do { $_tok = ")"; 1 } and
- substr($text,0,length($_tok)) eq $_tok and
- do { substr($text,0,length($_tok)) = ""; 1; }
- )
- {
- $text = $lastsep . $text if defined $lastsep;
-
- $expectation->failed();
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
- . $_tok . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $item{__STRING2__}=$_tok;
-
-
- Parse::RecDescent::_trace(q{Trying action},
- Parse::RecDescent::_tracefirst($text),
- q{subpart},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
- $_tok = ($_noactions) ? 0 : do {$return = $item{part}};
- unless (defined $_tok)
- {
- Parse::RecDescent::_trace(q{<> (return value: [undef])})
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched action<< (return value: [}
- . $_tok . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $_tok;
- $item{__ACTION1__}=$_tok;
-
-
-
-
- Parse::RecDescent::_trace(q{Trying directive: []},
- Parse::RecDescent::_tracefirst($text),
- q{subpart},
- $tracelevel)
- if defined $::RD_TRACE;
- $_tok = do { push @{$thisparser->{deferred}}, sub { ++$subpartCount; }; };
- if (defined($_tok))
- {
- Parse::RecDescent::_trace(q{>>Matched directive<< (return value: [}
- . $_tok . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- }
- else
- {
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- }
-
- last unless defined $_tok;
- push @item, $item{__DIRECTIVE1__}=$_tok;
-
-
- Parse::RecDescent::_trace(q{>>Matched production: ['(' part ')' ]<<},
- Parse::RecDescent::_tracefirst($text),
- q{subpart},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- unless ( $_matched || defined($score) )
- {
- splice @{$thisparser->{deferred}}, $def_at;
-
-
- $_[1] = $text; # NOT SURE THIS IS NEEDED
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($_[1]),
- q{subpart},
- $tracelevel)
- if defined $::RD_TRACE;
- return undef;
- }
- if (!defined($return) && defined($score))
- {
- Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
- q{subpart},
- $tracelevel)
- if defined $::RD_TRACE;
- $return = $score_return;
- }
- splice @{$thisparser->{errors}}, $err_at;
- $return = $item[$#item] unless defined $return;
- if (defined $::RD_TRACE)
- {
- Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
- $return . q{])}, "",
- q{subpart},
- $tracelevel);
- Parse::RecDescent::_trace(q{(consumed: [} .
- Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])},
- Parse::RecDescent::_tracefirst($text),
- , q{subpart},
- $tracelevel)
- }
- $_[1] = $text;
- return $return;
-}
-
-# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args, $_itempos)
-sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NIL
-{
- my $thisparser = $_[0];
- use vars q{$tracelevel};
- local $tracelevel = ($tracelevel||0)+1;
- $ERRORS = 0;
- my $thisrule = $thisparser->{"rules"}{"NIL"};
-
- Parse::RecDescent::_trace(q{Trying rule: [NIL]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{NIL},
- $tracelevel)
- if defined $::RD_TRACE;
-
- my $def_at = @{$thisparser->{deferred}};
- my $err_at = @{$thisparser->{errors}};
-
- my $score;
- my $score_return;
- my $_tok;
- my $return = undef;
- my $_matched=0;
- my $commit=0;
- my @item = ();
- my %item = ();
- my $repeating = $_[2];
- my $_noactions = $_[3];
- my @arg = defined $_[4] ? @{ &{$_[4]} } : ();
- my $_itempos = $_[5];
- my %arg = ($#arg & 01) ? @arg : (@arg, undef);
- my $text;
- my $lastsep;
- my $current_match;
- my $expectation = new Parse::RecDescent::Expectation(q{/^NIL/i});
- $expectation->at($_[1]);
-
- my $thisline;
- tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
-
-
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [/^NIL/i]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{NIL},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[0];
- $text = $_[1];
- my $_savetext;
- @item = (q{NIL});
- %item = (__RULE__ => q{NIL});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying terminal: [/^NIL/i]}, Parse::RecDescent::_tracefirst($text),
- q{NIL},
- $tracelevel)
- if defined $::RD_TRACE;
- undef $lastsep;
- $expectation->is(q{})->at($text);
-
-
- unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A(?:^NIL)/i)
- {
- $text = $lastsep . $text if defined $lastsep;
- $expectation->failed();
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
-
- last;
- }
- $current_match = substr($text, $-[0], $+[0] - $-[0]);
- substr($text,0,length($current_match),q{});
- Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
- . $current_match . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $item{__PATTERN1__}=$current_match;
-
-
- Parse::RecDescent::_trace(q{Trying action},
- Parse::RecDescent::_tracefirst($text),
- q{NIL},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
- $_tok = ($_noactions) ? 0 : do { $return = "NIL" };
- unless (defined $_tok)
- {
- Parse::RecDescent::_trace(q{<> (return value: [undef])})
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched action<< (return value: [}
- . $_tok . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $_tok;
- $item{__ACTION1__}=$_tok;
-
-
- Parse::RecDescent::_trace(q{>>Matched production: [/^NIL/i]<<},
- Parse::RecDescent::_tracefirst($text),
- q{NIL},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- unless ( $_matched || defined($score) )
- {
- splice @{$thisparser->{deferred}}, $def_at;
-
-
- $_[1] = $text; # NOT SURE THIS IS NEEDED
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($_[1]),
- q{NIL},
- $tracelevel)
- if defined $::RD_TRACE;
- return undef;
- }
- if (!defined($return) && defined($score))
- {
- Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
- q{NIL},
- $tracelevel)
- if defined $::RD_TRACE;
- $return = $score_return;
- }
- splice @{$thisparser->{errors}}, $err_at;
- $return = $item[$#item] unless defined $return;
- if (defined $::RD_TRACE)
- {
- Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
- $return . q{])}, "",
- q{NIL},
- $tracelevel);
- Parse::RecDescent::_trace(q{(consumed: [} .
- Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])},
- Parse::RecDescent::_tracefirst($text),
- , q{NIL},
- $tracelevel)
- }
- $_[1] = $text;
- return $return;
-}
-
-# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args, $_itempos)
-sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::PLAIN
-{
- my $thisparser = $_[0];
- use vars q{$tracelevel};
- local $tracelevel = ($tracelevel||0)+1;
- $ERRORS = 0;
- my $thisrule = $thisparser->{"rules"}{"PLAIN"};
-
- Parse::RecDescent::_trace(q{Trying rule: [PLAIN]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{PLAIN},
- $tracelevel)
- if defined $::RD_TRACE;
-
- my $def_at = @{$thisparser->{deferred}};
- my $err_at = @{$thisparser->{errors}};
-
- my $score;
- my $score_return;
- my $_tok;
- my $return = undef;
- my $_matched=0;
- my $commit=0;
- my @item = ();
- my %item = ();
- my $repeating = $_[2];
- my $_noactions = $_[3];
- my @arg = defined $_[4] ? @{ &{$_[4]} } : ();
- my $_itempos = $_[5];
- my %arg = ($#arg & 01) ? @arg : (@arg, undef);
- my $text;
- my $lastsep;
- my $current_match;
- my $expectation = new Parse::RecDescent::Expectation(q{/^"PLAIN"|^PLAIN/i});
- $expectation->at($_[1]);
-
- my $thisline;
- tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
-
-
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [/^"PLAIN"|^PLAIN/i]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{PLAIN},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[0];
- $text = $_[1];
- my $_savetext;
- @item = (q{PLAIN});
- %item = (__RULE__ => q{PLAIN});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying terminal: [/^"PLAIN"|^PLAIN/i]}, Parse::RecDescent::_tracefirst($text),
- q{PLAIN},
- $tracelevel)
- if defined $::RD_TRACE;
- undef $lastsep;
- $expectation->is(q{})->at($text);
-
-
- unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A(?:^"PLAIN"|^PLAIN)/i)
- {
- $text = $lastsep . $text if defined $lastsep;
- $expectation->failed();
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
-
- last;
- }
- $current_match = substr($text, $-[0], $+[0] - $-[0]);
- substr($text,0,length($current_match),q{});
- Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
- . $current_match . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $item{__PATTERN1__}=$current_match;
-
-
- Parse::RecDescent::_trace(q{Trying action},
- Parse::RecDescent::_tracefirst($text),
- q{PLAIN},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
- $_tok = ($_noactions) ? 0 : do { $return = "PLAIN" };
- unless (defined $_tok)
- {
- Parse::RecDescent::_trace(q{<> (return value: [undef])})
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched action<< (return value: [}
- . $_tok . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $_tok;
- $item{__ACTION1__}=$_tok;
-
-
- Parse::RecDescent::_trace(q{>>Matched production: [/^"PLAIN"|^PLAIN/i]<<},
- Parse::RecDescent::_tracefirst($text),
- q{PLAIN},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- unless ( $_matched || defined($score) )
- {
- splice @{$thisparser->{deferred}}, $def_at;
-
-
- $_[1] = $text; # NOT SURE THIS IS NEEDED
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($_[1]),
- q{PLAIN},
- $tracelevel)
- if defined $::RD_TRACE;
- return undef;
- }
- if (!defined($return) && defined($score))
- {
- Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
- q{PLAIN},
- $tracelevel)
- if defined $::RD_TRACE;
- $return = $score_return;
- }
- splice @{$thisparser->{errors}}, $err_at;
- $return = $item[$#item] unless defined $return;
- if (defined $::RD_TRACE)
- {
- Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
- $return . q{])}, "",
- q{PLAIN},
- $tracelevel);
- Parse::RecDescent::_trace(q{(consumed: [} .
- Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])},
- Parse::RecDescent::_tracefirst($text),
- , q{PLAIN},
- $tracelevel)
- }
- $_[1] = $text;
- return $return;
-}
-
-# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args, $_itempos)
-sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::RFC822
-{
- my $thisparser = $_[0];
- use vars q{$tracelevel};
- local $tracelevel = ($tracelevel||0)+1;
- $ERRORS = 0;
- my $thisrule = $thisparser->{"rules"}{"RFC822"};
-
- Parse::RecDescent::_trace(q{Trying rule: [RFC822]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{RFC822},
- $tracelevel)
- if defined $::RD_TRACE;
-
- my $def_at = @{$thisparser->{deferred}};
- my $err_at = @{$thisparser->{errors}};
-
- my $score;
- my $score_return;
- my $_tok;
- my $return = undef;
- my $_matched=0;
- my $commit=0;
- my @item = ();
- my %item = ();
- my $repeating = $_[2];
- my $_noactions = $_[3];
- my @arg = defined $_[4] ? @{ &{$_[4]} } : ();
- my $_itempos = $_[5];
- my %arg = ($#arg & 01) ? @arg : (@arg, undef);
- my $text;
- my $lastsep;
- my $current_match;
- my $expectation = new Parse::RecDescent::Expectation(q{/^"RFC822"|^RFC822/i});
- $expectation->at($_[1]);
-
- my $thisline;
- tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
-
-
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [/^"RFC822"|^RFC822/i]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{RFC822},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[0];
- $text = $_[1];
- my $_savetext;
- @item = (q{RFC822});
- %item = (__RULE__ => q{RFC822});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying terminal: [/^"RFC822"|^RFC822/i]}, Parse::RecDescent::_tracefirst($text),
- q{RFC822},
- $tracelevel)
- if defined $::RD_TRACE;
- undef $lastsep;
- $expectation->is(q{})->at($text);
-
-
- unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A(?:^"RFC822"|^RFC822)/i)
- {
- $text = $lastsep . $text if defined $lastsep;
- $expectation->failed();
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
-
- last;
- }
- $current_match = substr($text, $-[0], $+[0] - $-[0]);
- substr($text,0,length($current_match),q{});
- Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
- . $current_match . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $item{__PATTERN1__}=$current_match;
-
-
- Parse::RecDescent::_trace(q{Trying action},
- Parse::RecDescent::_tracefirst($text),
- q{RFC822},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
- $_tok = ($_noactions) ? 0 : do { $return = "RFC822" };
- unless (defined $_tok)
- {
- Parse::RecDescent::_trace(q{<> (return value: [undef])})
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched action<< (return value: [}
- . $_tok . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $_tok;
- $item{__ACTION1__}=$_tok;
-
-
- Parse::RecDescent::_trace(q{>>Matched production: [/^"RFC822"|^RFC822/i]<<},
- Parse::RecDescent::_tracefirst($text),
- q{RFC822},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- unless ( $_matched || defined($score) )
- {
- splice @{$thisparser->{deferred}}, $def_at;
-
-
- $_[1] = $text; # NOT SURE THIS IS NEEDED
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($_[1]),
- q{RFC822},
- $tracelevel)
- if defined $::RD_TRACE;
- return undef;
- }
- if (!defined($return) && defined($score))
- {
- Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
- q{RFC822},
- $tracelevel)
- if defined $::RD_TRACE;
- $return = $score_return;
- }
- splice @{$thisparser->{errors}}, $err_at;
- $return = $item[$#item] unless defined $return;
- if (defined $::RD_TRACE)
- {
- Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
- $return . q{])}, "",
- q{RFC822},
- $tracelevel);
- Parse::RecDescent::_trace(q{(consumed: [} .
- Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])},
- Parse::RecDescent::_tracefirst($text),
- , q{RFC822},
- $tracelevel)
- }
- $_[1] = $text;
- return $return;
-}
-
-# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args, $_itempos)
-sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodysubtype
-{
- my $thisparser = $_[0];
- use vars q{$tracelevel};
- local $tracelevel = ($tracelevel||0)+1;
- $ERRORS = 0;
- my $thisrule = $thisparser->{"rules"}{"bodysubtype"};
-
- Parse::RecDescent::_trace(q{Trying rule: [bodysubtype]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{bodysubtype},
- $tracelevel)
- if defined $::RD_TRACE;
-
- my $def_at = @{$thisparser->{deferred}};
- my $err_at = @{$thisparser->{errors}};
-
- my $score;
- my $score_return;
- my $_tok;
- my $return = undef;
- my $_matched=0;
- my $commit=0;
- my @item = ();
- my %item = ();
- my $repeating = $_[2];
- my $_noactions = $_[3];
- my @arg = defined $_[4] ? @{ &{$_[4]} } : ();
- my $_itempos = $_[5];
- my %arg = ($#arg & 01) ? @arg : (@arg, undef);
- my $text;
- my $lastsep;
- my $current_match;
- my $expectation = new Parse::RecDescent::Expectation(q{PLAIN, or HTML, or NIL, or STRING});
- $expectation->at($_[1]);
-
- my $thisline;
- tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
-
-
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [PLAIN]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{bodysubtype},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[0];
- $text = $_[1];
- my $_savetext;
- @item = (q{bodysubtype});
- %item = (__RULE__ => q{bodysubtype});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying subrule: [PLAIN]},
- Parse::RecDescent::_tracefirst($text),
- q{bodysubtype},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::PLAIN($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{bodysubtype},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [PLAIN]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{bodysubtype},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{PLAIN}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{>>Matched production: [PLAIN]<<},
- Parse::RecDescent::_tracefirst($text),
- q{bodysubtype},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [HTML]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{bodysubtype},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[1];
- $text = $_[1];
- my $_savetext;
- @item = (q{bodysubtype});
- %item = (__RULE__ => q{bodysubtype});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying subrule: [HTML]},
- Parse::RecDescent::_tracefirst($text),
- q{bodysubtype},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::HTML($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{bodysubtype},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [HTML]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{bodysubtype},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{HTML}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{>>Matched production: [HTML]<<},
- Parse::RecDescent::_tracefirst($text),
- q{bodysubtype},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [NIL]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{bodysubtype},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[2];
- $text = $_[1];
- my $_savetext;
- @item = (q{bodysubtype});
- %item = (__RULE__ => q{bodysubtype});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying subrule: [NIL]},
- Parse::RecDescent::_tracefirst($text),
- q{bodysubtype},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NIL($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{bodysubtype},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [NIL]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{bodysubtype},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{NIL}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{>>Matched production: [NIL]<<},
- Parse::RecDescent::_tracefirst($text),
- q{bodysubtype},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [STRING]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{bodysubtype},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[3];
- $text = $_[1];
- my $_savetext;
- @item = (q{bodysubtype});
- %item = (__RULE__ => q{bodysubtype});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying subrule: [STRING]},
- Parse::RecDescent::_tracefirst($text),
- q{bodysubtype},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::STRING($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{bodysubtype},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [STRING]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{bodysubtype},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{STRING}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{>>Matched production: [STRING]<<},
- Parse::RecDescent::_tracefirst($text),
- q{bodysubtype},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- unless ( $_matched || defined($score) )
- {
- splice @{$thisparser->{deferred}}, $def_at;
-
-
- $_[1] = $text; # NOT SURE THIS IS NEEDED
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($_[1]),
- q{bodysubtype},
- $tracelevel)
- if defined $::RD_TRACE;
- return undef;
- }
- if (!defined($return) && defined($score))
- {
- Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
- q{bodysubtype},
- $tracelevel)
- if defined $::RD_TRACE;
- $return = $score_return;
- }
- splice @{$thisparser->{errors}}, $err_at;
- $return = $item[$#item] unless defined $return;
- if (defined $::RD_TRACE)
- {
- Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
- $return . q{])}, "",
- q{bodysubtype},
- $tracelevel);
- Parse::RecDescent::_trace(q{(consumed: [} .
- Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])},
- Parse::RecDescent::_tracefirst($text),
- , q{bodysubtype},
- $tracelevel)
- }
- $_[1] = $text;
- return $return;
-}
-
-# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args, $_itempos)
-sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::from
-{
- my $thisparser = $_[0];
- use vars q{$tracelevel};
- local $tracelevel = ($tracelevel||0)+1;
- $ERRORS = 0;
- my $thisrule = $thisparser->{"rules"}{"from"};
-
- Parse::RecDescent::_trace(q{Trying rule: [from]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{from},
- $tracelevel)
- if defined $::RD_TRACE;
-
- my $def_at = @{$thisparser->{deferred}};
- my $err_at = @{$thisparser->{errors}};
-
- my $score;
- my $score_return;
- my $_tok;
- my $return = undef;
- my $_matched=0;
- my $commit=0;
- my @item = ();
- my %item = ();
- my $repeating = $_[2];
- my $_noactions = $_[3];
- my @arg = defined $_[4] ? @{ &{$_[4]} } : ();
- my $_itempos = $_[5];
- my %arg = ($#arg & 01) ? @arg : (@arg, undef);
- my $text;
- my $lastsep;
- my $current_match;
- my $expectation = new Parse::RecDescent::Expectation(q{ADDRESSES});
- $expectation->at($_[1]);
-
- my $thisline;
- tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
-
-
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [ADDRESSES]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{from},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[0];
- $text = $_[1];
- my $_savetext;
- @item = (q{from});
- %item = (__RULE__ => q{from});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying subrule: [ADDRESSES]},
- Parse::RecDescent::_tracefirst($text),
- q{from},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::ADDRESSES($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{from},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [ADDRESSES]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{from},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{ADDRESSES}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{>>Matched production: [ADDRESSES]<<},
- Parse::RecDescent::_tracefirst($text),
- q{from},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- unless ( $_matched || defined($score) )
- {
- splice @{$thisparser->{deferred}}, $def_at;
-
-
- $_[1] = $text; # NOT SURE THIS IS NEEDED
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($_[1]),
- q{from},
- $tracelevel)
- if defined $::RD_TRACE;
- return undef;
- }
- if (!defined($return) && defined($score))
- {
- Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
- q{from},
- $tracelevel)
- if defined $::RD_TRACE;
- $return = $score_return;
- }
- splice @{$thisparser->{errors}}, $err_at;
- $return = $item[$#item] unless defined $return;
- if (defined $::RD_TRACE)
- {
- Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
- $return . q{])}, "",
- q{from},
- $tracelevel);
- Parse::RecDescent::_trace(q{(consumed: [} .
- Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])},
- Parse::RecDescent::_tracefirst($text),
- , q{from},
- $tracelevel)
- }
- $_[1] = $text;
- return $return;
-}
-
-# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args, $_itempos)
-sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::multipart
-{
- my $thisparser = $_[0];
- use vars q{$tracelevel};
- local $tracelevel = ($tracelevel||0)+1;
- $ERRORS = 0;
- my $thisrule = $thisparser->{"rules"}{"multipart"};
-
- Parse::RecDescent::_trace(q{Trying rule: [multipart]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{multipart},
- $tracelevel)
- if defined $::RD_TRACE;
-
- my $def_at = @{$thisparser->{deferred}};
- my $err_at = @{$thisparser->{errors}};
-
- my $score;
- my $score_return;
- my $_tok;
- my $return = undef;
- my $_matched=0;
- my $commit=0;
- my @item = ();
- my %item = ();
- my $repeating = $_[2];
- my $_noactions = $_[3];
- my @arg = defined $_[4] ? @{ &{$_[4]} } : ();
- my $_itempos = $_[5];
- my %arg = ($#arg & 01) ? @arg : (@arg, undef);
- my $text;
- my $lastsep;
- my $current_match;
- my $expectation = new Parse::RecDescent::Expectation(q{subpart});
- $expectation->at($_[1]);
-
- my $thisline;
- tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
-
-
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [subpart bodysubtype bodyparms bodydisp bodylang bodyloc bodyextra ]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{multipart},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[0];
- $text = $_[1];
- my $_savetext;
- @item = (q{multipart});
- %item = (__RULE__ => q{multipart});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying repeated subrule: [subpart]},
- Parse::RecDescent::_tracefirst($text),
- q{multipart},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->is(q{})->at($text);
-
- unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::subpart, 1, 100000000, $_noactions,$expectation,sub { \@arg },undef)))
- {
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{multipart},
- $tracelevel)
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched repeated subrule: [subpart]<< (}
- . @$_tok . q{ times)},
-
- Parse::RecDescent::_tracefirst($text),
- q{multipart},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{subpart(s)}} = $_tok;
- push @item, $_tok;
-
-
-
-
-
- Parse::RecDescent::_trace(q{Trying directive: []},
- Parse::RecDescent::_tracefirst($text),
- q{multipart},
- $tracelevel)
- if defined $::RD_TRACE;
- $_tok = do { $commit = 1 };
- if (defined($_tok))
- {
- Parse::RecDescent::_trace(q{>>Matched directive<< (return value: [}
- . $_tok . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- }
- else
- {
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- }
-
- last unless defined $_tok;
- push @item, $item{__DIRECTIVE1__}=$_tok;
-
-
- Parse::RecDescent::_trace(q{Trying subrule: [bodysubtype]},
- Parse::RecDescent::_tracefirst($text),
- q{multipart},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{bodysubtype})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodysubtype($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{multipart},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [bodysubtype]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{multipart},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{bodysubtype}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{Trying repeated subrule: [bodyparms]},
- Parse::RecDescent::_tracefirst($text),
- q{multipart},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->is(q{bodyparms})->at($text);
-
- unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodyparms, 0, 1, $_noactions,$expectation,sub { \@arg },undef)))
- {
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{multipart},
- $tracelevel)
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched repeated subrule: [bodyparms]<< (}
- . @$_tok . q{ times)},
-
- Parse::RecDescent::_tracefirst($text),
- q{multipart},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{bodyparms(?)}} = $_tok;
- push @item, $_tok;
-
-
-
- Parse::RecDescent::_trace(q{Trying repeated subrule: [bodydisp]},
- Parse::RecDescent::_tracefirst($text),
- q{multipart},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->is(q{bodydisp})->at($text);
-
- unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodydisp, 0, 1, $_noactions,$expectation,sub { \@arg },undef)))
- {
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{multipart},
- $tracelevel)
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched repeated subrule: [bodydisp]<< (}
- . @$_tok . q{ times)},
-
- Parse::RecDescent::_tracefirst($text),
- q{multipart},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{bodydisp(?)}} = $_tok;
- push @item, $_tok;
-
-
-
- Parse::RecDescent::_trace(q{Trying repeated subrule: [bodylang]},
- Parse::RecDescent::_tracefirst($text),
- q{multipart},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->is(q{bodylang})->at($text);
-
- unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodylang, 0, 1, $_noactions,$expectation,sub { \@arg },undef)))
- {
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{multipart},
- $tracelevel)
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched repeated subrule: [bodylang]<< (}
- . @$_tok . q{ times)},
-
- Parse::RecDescent::_tracefirst($text),
- q{multipart},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{bodylang(?)}} = $_tok;
- push @item, $_tok;
-
-
-
- Parse::RecDescent::_trace(q{Trying repeated subrule: [bodyloc]},
- Parse::RecDescent::_tracefirst($text),
- q{multipart},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->is(q{bodyloc})->at($text);
-
- unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodyloc, 0, 1, $_noactions,$expectation,sub { \@arg },undef)))
- {
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{multipart},
- $tracelevel)
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched repeated subrule: [bodyloc]<< (}
- . @$_tok . q{ times)},
-
- Parse::RecDescent::_tracefirst($text),
- q{multipart},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{bodyloc(?)}} = $_tok;
- push @item, $_tok;
-
-
-
- Parse::RecDescent::_trace(q{Trying repeated subrule: [bodyextra]},
- Parse::RecDescent::_tracefirst($text),
- q{multipart},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->is(q{bodyextra})->at($text);
-
- unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodyextra, 0, 1, $_noactions,$expectation,sub { \@arg },undef)))
- {
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{multipart},
- $tracelevel)
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched repeated subrule: [bodyextra]<< (}
- . @$_tok . q{ times)},
-
- Parse::RecDescent::_tracefirst($text),
- q{multipart},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{bodyextra(?)}} = $_tok;
- push @item, $_tok;
-
-
-
-
-
- Parse::RecDescent::_trace(q{Trying directive: []},
- Parse::RecDescent::_tracefirst($text),
- q{multipart},
- $tracelevel)
- if defined $::RD_TRACE;
- $_tok = do { push @{$thisparser->{deferred}}, sub { $subpartCount = 0 }; };
- if (defined($_tok))
- {
- Parse::RecDescent::_trace(q{>>Matched directive<< (return value: [}
- . $_tok . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- }
- else
- {
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- }
-
- last unless defined $_tok;
- push @item, $item{__DIRECTIVE2__}=$_tok;
-
-
- Parse::RecDescent::_trace(q{Trying action},
- Parse::RecDescent::_tracefirst($text),
- q{multipart},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
- $_tok = ($_noactions) ? 0 : do { $return =
- { bodysubtype => $item{bodysubtype}
- , bodytype => 'MULTIPART'
- , bodystructure => $item{'subpart(s)'}
- };
- take_optional_items($return, \%item
- , qw/bodyparms bodydisp bodylang bodyloc bodyextra/);
- 1;
- };
- unless (defined $_tok)
- {
- Parse::RecDescent::_trace(q{<> (return value: [undef])})
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched action<< (return value: [}
- . $_tok . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $_tok;
- $item{__ACTION1__}=$_tok;
-
-
- Parse::RecDescent::_trace(q{>>Matched production: [subpart bodysubtype bodyparms bodydisp bodylang bodyloc bodyextra ]<<},
- Parse::RecDescent::_tracefirst($text),
- q{multipart},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- unless ( $_matched || defined($score) )
- {
- splice @{$thisparser->{deferred}}, $def_at;
-
-
- $_[1] = $text; # NOT SURE THIS IS NEEDED
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($_[1]),
- q{multipart},
- $tracelevel)
- if defined $::RD_TRACE;
- return undef;
- }
- if (!defined($return) && defined($score))
- {
- Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
- q{multipart},
- $tracelevel)
- if defined $::RD_TRACE;
- $return = $score_return;
- }
- splice @{$thisparser->{errors}}, $err_at;
- $return = $item[$#item] unless defined $return;
- if (defined $::RD_TRACE)
- {
- Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
- $return . q{])}, "",
- q{multipart},
- $tracelevel);
- Parse::RecDescent::_trace(q{(consumed: [} .
- Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])},
- Parse::RecDescent::_tracefirst($text),
- , q{multipart},
- $tracelevel)
- }
- $_[1] = $text;
- return $return;
-}
-
-# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args, $_itempos)
-sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodyid
-{
- my $thisparser = $_[0];
- use vars q{$tracelevel};
- local $tracelevel = ($tracelevel||0)+1;
- $ERRORS = 0;
- my $thisrule = $thisparser->{"rules"}{"bodyid"};
-
- Parse::RecDescent::_trace(q{Trying rule: [bodyid]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{bodyid},
- $tracelevel)
- if defined $::RD_TRACE;
-
- my $def_at = @{$thisparser->{deferred}};
- my $err_at = @{$thisparser->{errors}};
-
- my $score;
- my $score_return;
- my $_tok;
- my $return = undef;
- my $_matched=0;
- my $commit=0;
- my @item = ();
- my %item = ();
- my $repeating = $_[2];
- my $_noactions = $_[3];
- my @arg = defined $_[4] ? @{ &{$_[4]} } : ();
- my $_itempos = $_[5];
- my %arg = ($#arg & 01) ? @arg : (@arg, undef);
- my $text;
- my $lastsep;
- my $current_match;
- my $expectation = new Parse::RecDescent::Expectation(q{/[()]/, or STRING});
- $expectation->at($_[1]);
-
- my $thisline;
- tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
-
-
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [/[()]/ NIL]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{bodyid},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[0];
- $text = $_[1];
- my $_savetext;
- @item = (q{bodyid});
- %item = (__RULE__ => q{bodyid});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying terminal: [/[()]/]}, Parse::RecDescent::_tracefirst($text),
- q{bodyid},
- $tracelevel)
- if defined $::RD_TRACE;
- undef $lastsep;
- $expectation->is(q{})->at($text);
- $_savetext = $text;
-
- if ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A(?:[()])/)
- {
- $text = $_savetext;
- $expectation->failed();
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
-
- last;
- }
- $current_match = substr($text, $-[0], $+[0] - $-[0]);
- substr($text,0,length($current_match),q{});
- Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
- . $current_match . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $item{__PATTERN1__}=$current_match;
- $text = $_savetext;
-
- Parse::RecDescent::_trace(q{Trying subrule: [NIL]},
- Parse::RecDescent::_tracefirst($text),
- q{bodyid},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{NIL})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NIL($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{bodyid},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [NIL]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{bodyid},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{NIL}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{>>Matched production: [/[()]/ NIL]<<},
- Parse::RecDescent::_tracefirst($text),
- q{bodyid},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [STRING]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{bodyid},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[1];
- $text = $_[1];
- my $_savetext;
- @item = (q{bodyid});
- %item = (__RULE__ => q{bodyid});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying subrule: [STRING]},
- Parse::RecDescent::_tracefirst($text),
- q{bodyid},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::STRING($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{bodyid},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [STRING]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{bodyid},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{STRING}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{>>Matched production: [STRING]<<},
- Parse::RecDescent::_tracefirst($text),
- q{bodyid},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- unless ( $_matched || defined($score) )
- {
- splice @{$thisparser->{deferred}}, $def_at;
-
-
- $_[1] = $text; # NOT SURE THIS IS NEEDED
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($_[1]),
- q{bodyid},
- $tracelevel)
- if defined $::RD_TRACE;
- return undef;
- }
- if (!defined($return) && defined($score))
- {
- Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
- q{bodyid},
- $tracelevel)
- if defined $::RD_TRACE;
- $return = $score_return;
- }
- splice @{$thisparser->{errors}}, $err_at;
- $return = $item[$#item] unless defined $return;
- if (defined $::RD_TRACE)
- {
- Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
- $return . q{])}, "",
- q{bodyid},
- $tracelevel);
- Parse::RecDescent::_trace(q{(consumed: [} .
- Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])},
- Parse::RecDescent::_tracefirst($text),
- , q{bodyid},
- $tracelevel)
- }
- $_[1] = $text;
- return $return;
-}
-
-# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args, $_itempos)
-sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodylang
-{
- my $thisparser = $_[0];
- use vars q{$tracelevel};
- local $tracelevel = ($tracelevel||0)+1;
- $ERRORS = 0;
- my $thisrule = $thisparser->{"rules"}{"bodylang"};
-
- Parse::RecDescent::_trace(q{Trying rule: [bodylang]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{bodylang},
- $tracelevel)
- if defined $::RD_TRACE;
-
- my $def_at = @{$thisparser->{deferred}};
- my $err_at = @{$thisparser->{errors}};
-
- my $score;
- my $score_return;
- my $_tok;
- my $return = undef;
- my $_matched=0;
- my $commit=0;
- my @item = ();
- my %item = ();
- my $repeating = $_[2];
- my $_noactions = $_[3];
- my @arg = defined $_[4] ? @{ &{$_[4]} } : ();
- my $_itempos = $_[5];
- my %arg = ($#arg & 01) ? @arg : (@arg, undef);
- my $text;
- my $lastsep;
- my $current_match;
- my $expectation = new Parse::RecDescent::Expectation(q{NIL, or STRING, or STRINGS});
- $expectation->at($_[1]);
-
- my $thisline;
- tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
-
-
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [NIL]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{bodylang},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[0];
- $text = $_[1];
- my $_savetext;
- @item = (q{bodylang});
- %item = (__RULE__ => q{bodylang});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying subrule: [NIL]},
- Parse::RecDescent::_tracefirst($text),
- q{bodylang},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NIL($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{bodylang},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [NIL]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{bodylang},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{NIL}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{>>Matched production: [NIL]<<},
- Parse::RecDescent::_tracefirst($text),
- q{bodylang},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [STRING]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{bodylang},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[1];
- $text = $_[1];
- my $_savetext;
- @item = (q{bodylang});
- %item = (__RULE__ => q{bodylang});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying subrule: [STRING]},
- Parse::RecDescent::_tracefirst($text),
- q{bodylang},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::STRING($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{bodylang},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [STRING]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{bodylang},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{STRING}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{>>Matched production: [STRING]<<},
- Parse::RecDescent::_tracefirst($text),
- q{bodylang},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [STRINGS]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{bodylang},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[2];
- $text = $_[1];
- my $_savetext;
- @item = (q{bodylang});
- %item = (__RULE__ => q{bodylang});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying subrule: [STRINGS]},
- Parse::RecDescent::_tracefirst($text),
- q{bodylang},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::STRINGS($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{bodylang},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [STRINGS]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{bodylang},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{STRINGS}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{>>Matched production: [STRINGS]<<},
- Parse::RecDescent::_tracefirst($text),
- q{bodylang},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- unless ( $_matched || defined($score) )
- {
- splice @{$thisparser->{deferred}}, $def_at;
-
-
- $_[1] = $text; # NOT SURE THIS IS NEEDED
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($_[1]),
- q{bodylang},
- $tracelevel)
- if defined $::RD_TRACE;
- return undef;
- }
- if (!defined($return) && defined($score))
- {
- Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
- q{bodylang},
- $tracelevel)
- if defined $::RD_TRACE;
- $return = $score_return;
- }
- splice @{$thisparser->{errors}}, $err_at;
- $return = $item[$#item] unless defined $return;
- if (defined $::RD_TRACE)
- {
- Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
- $return . q{])}, "",
- q{bodylang},
- $tracelevel);
- Parse::RecDescent::_trace(q{(consumed: [} .
- Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])},
- Parse::RecDescent::_tracefirst($text),
- , q{bodylang},
- $tracelevel)
- }
- $_[1] = $text;
- return $return;
-}
-
-# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args, $_itempos)
-sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodyloc
-{
- my $thisparser = $_[0];
- use vars q{$tracelevel};
- local $tracelevel = ($tracelevel||0)+1;
- $ERRORS = 0;
- my $thisrule = $thisparser->{"rules"}{"bodyloc"};
-
- Parse::RecDescent::_trace(q{Trying rule: [bodyloc]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{bodyloc},
- $tracelevel)
- if defined $::RD_TRACE;
-
- my $def_at = @{$thisparser->{deferred}};
- my $err_at = @{$thisparser->{errors}};
-
- my $score;
- my $score_return;
- my $_tok;
- my $return = undef;
- my $_matched=0;
- my $commit=0;
- my @item = ();
- my %item = ();
- my $repeating = $_[2];
- my $_noactions = $_[3];
- my @arg = defined $_[4] ? @{ &{$_[4]} } : ();
- my $_itempos = $_[5];
- my %arg = ($#arg & 01) ? @arg : (@arg, undef);
- my $text;
- my $lastsep;
- my $current_match;
- my $expectation = new Parse::RecDescent::Expectation(q{NIL, or STRING});
- $expectation->at($_[1]);
-
- my $thisline;
- tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
-
-
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [NIL]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{bodyloc},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[0];
- $text = $_[1];
- my $_savetext;
- @item = (q{bodyloc});
- %item = (__RULE__ => q{bodyloc});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying subrule: [NIL]},
- Parse::RecDescent::_tracefirst($text),
- q{bodyloc},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NIL($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{bodyloc},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [NIL]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{bodyloc},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{NIL}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{>>Matched production: [NIL]<<},
- Parse::RecDescent::_tracefirst($text),
- q{bodyloc},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [STRING]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{bodyloc},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[1];
- $text = $_[1];
- my $_savetext;
- @item = (q{bodyloc});
- %item = (__RULE__ => q{bodyloc});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying subrule: [STRING]},
- Parse::RecDescent::_tracefirst($text),
- q{bodyloc},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::STRING($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{bodyloc},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [STRING]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{bodyloc},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{STRING}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{>>Matched production: [STRING]<<},
- Parse::RecDescent::_tracefirst($text),
- q{bodyloc},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- unless ( $_matched || defined($score) )
- {
- splice @{$thisparser->{deferred}}, $def_at;
-
-
- $_[1] = $text; # NOT SURE THIS IS NEEDED
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($_[1]),
- q{bodyloc},
- $tracelevel)
- if defined $::RD_TRACE;
- return undef;
- }
- if (!defined($return) && defined($score))
- {
- Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
- q{bodyloc},
- $tracelevel)
- if defined $::RD_TRACE;
- $return = $score_return;
- }
- splice @{$thisparser->{errors}}, $err_at;
- $return = $item[$#item] unless defined $return;
- if (defined $::RD_TRACE)
- {
- Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
- $return . q{])}, "",
- q{bodyloc},
- $tracelevel);
- Parse::RecDescent::_trace(q{(consumed: [} .
- Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])},
- Parse::RecDescent::_tracefirst($text),
- , q{bodyloc},
- $tracelevel)
- }
- $_[1] = $text;
- return $return;
-}
-
-# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args, $_itempos)
-sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::inreplyto
-{
- my $thisparser = $_[0];
- use vars q{$tracelevel};
- local $tracelevel = ($tracelevel||0)+1;
- $ERRORS = 0;
- my $thisrule = $thisparser->{"rules"}{"inreplyto"};
-
- Parse::RecDescent::_trace(q{Trying rule: [inreplyto]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{inreplyto},
- $tracelevel)
- if defined $::RD_TRACE;
-
- my $def_at = @{$thisparser->{deferred}};
- my $err_at = @{$thisparser->{errors}};
-
- my $score;
- my $score_return;
- my $_tok;
- my $return = undef;
- my $_matched=0;
- my $commit=0;
- my @item = ();
- my %item = ();
- my $repeating = $_[2];
- my $_noactions = $_[3];
- my @arg = defined $_[4] ? @{ &{$_[4]} } : ();
- my $_itempos = $_[5];
- my %arg = ($#arg & 01) ? @arg : (@arg, undef);
- my $text;
- my $lastsep;
- my $current_match;
- my $expectation = new Parse::RecDescent::Expectation(q{NIL, or STRING});
- $expectation->at($_[1]);
-
- my $thisline;
- tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
-
-
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [NIL]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{inreplyto},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[0];
- $text = $_[1];
- my $_savetext;
- @item = (q{inreplyto});
- %item = (__RULE__ => q{inreplyto});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying subrule: [NIL]},
- Parse::RecDescent::_tracefirst($text),
- q{inreplyto},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NIL($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{inreplyto},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [NIL]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{inreplyto},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{NIL}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{>>Matched production: [NIL]<<},
- Parse::RecDescent::_tracefirst($text),
- q{inreplyto},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [STRING]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{inreplyto},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[1];
- $text = $_[1];
- my $_savetext;
- @item = (q{inreplyto});
- %item = (__RULE__ => q{inreplyto});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying subrule: [STRING]},
- Parse::RecDescent::_tracefirst($text),
- q{inreplyto},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::STRING($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{inreplyto},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [STRING]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{inreplyto},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{STRING}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{>>Matched production: [STRING]<<},
- Parse::RecDescent::_tracefirst($text),
- q{inreplyto},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- unless ( $_matched || defined($score) )
- {
- splice @{$thisparser->{deferred}}, $def_at;
-
-
- $_[1] = $text; # NOT SURE THIS IS NEEDED
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($_[1]),
- q{inreplyto},
- $tracelevel)
- if defined $::RD_TRACE;
- return undef;
- }
- if (!defined($return) && defined($score))
- {
- Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
- q{inreplyto},
- $tracelevel)
- if defined $::RD_TRACE;
- $return = $score_return;
- }
- splice @{$thisparser->{errors}}, $err_at;
- $return = $item[$#item] unless defined $return;
- if (defined $::RD_TRACE)
- {
- Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
- $return . q{])}, "",
- q{inreplyto},
- $tracelevel);
- Parse::RecDescent::_trace(q{(consumed: [} .
- Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])},
- Parse::RecDescent::_tracefirst($text),
- , q{inreplyto},
- $tracelevel)
- }
- $_[1] = $text;
- return $return;
-}
-
-# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args, $_itempos)
-sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::ADDRESSES
-{
- my $thisparser = $_[0];
- use vars q{$tracelevel};
- local $tracelevel = ($tracelevel||0)+1;
- $ERRORS = 0;
- my $thisrule = $thisparser->{"rules"}{"ADDRESSES"};
-
- Parse::RecDescent::_trace(q{Trying rule: [ADDRESSES]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{ADDRESSES},
- $tracelevel)
- if defined $::RD_TRACE;
-
- my $def_at = @{$thisparser->{deferred}};
- my $err_at = @{$thisparser->{errors}};
-
- my $score;
- my $score_return;
- my $_tok;
- my $return = undef;
- my $_matched=0;
- my $commit=0;
- my @item = ();
- my %item = ();
- my $repeating = $_[2];
- my $_noactions = $_[3];
- my @arg = defined $_[4] ? @{ &{$_[4]} } : ();
- my $_itempos = $_[5];
- my %arg = ($#arg & 01) ? @arg : (@arg, undef);
- my $text;
- my $lastsep;
- my $current_match;
- my $expectation = new Parse::RecDescent::Expectation(q{NIL, or RFCNONCOMPLY, or '('});
- $expectation->at($_[1]);
-
- my $thisline;
- tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
-
-
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [NIL]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{ADDRESSES},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[0];
- $text = $_[1];
- my $_savetext;
- @item = (q{ADDRESSES});
- %item = (__RULE__ => q{ADDRESSES});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying subrule: [NIL]},
- Parse::RecDescent::_tracefirst($text),
- q{ADDRESSES},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NIL($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{ADDRESSES},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [NIL]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{ADDRESSES},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{NIL}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{>>Matched production: [NIL]<<},
- Parse::RecDescent::_tracefirst($text),
- q{ADDRESSES},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [RFCNONCOMPLY]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{ADDRESSES},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[1];
- $text = $_[1];
- my $_savetext;
- @item = (q{ADDRESSES});
- %item = (__RULE__ => q{ADDRESSES});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying subrule: [RFCNONCOMPLY]},
- Parse::RecDescent::_tracefirst($text),
- q{ADDRESSES},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::RFCNONCOMPLY($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{ADDRESSES},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [RFCNONCOMPLY]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{ADDRESSES},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{RFCNONCOMPLY}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{>>Matched production: [RFCNONCOMPLY]<<},
- Parse::RecDescent::_tracefirst($text),
- q{ADDRESSES},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: ['(' addressstruct ')']},
- Parse::RecDescent::_tracefirst($_[1]),
- q{ADDRESSES},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[2];
- $text = $_[1];
- my $_savetext;
- @item = (q{ADDRESSES});
- %item = (__RULE__ => q{ADDRESSES});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying terminal: ['(']},
- Parse::RecDescent::_tracefirst($text),
- q{ADDRESSES},
- $tracelevel)
- if defined $::RD_TRACE;
- undef $lastsep;
- $expectation->is(q{})->at($text);
-
-
- unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and do { $_tok = "("; 1 } and
- substr($text,0,length($_tok)) eq $_tok and
- do { substr($text,0,length($_tok)) = ""; 1; }
- )
- {
- $text = $lastsep . $text if defined $lastsep;
-
- $expectation->failed();
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
- . $_tok . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $item{__STRING1__}=$_tok;
-
-
- Parse::RecDescent::_trace(q{Trying repeated subrule: [addressstruct]},
- Parse::RecDescent::_tracefirst($text),
- q{ADDRESSES},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->is(q{addressstruct})->at($text);
-
- unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::addressstruct, 1, 100000000, $_noactions,$expectation,sub { \@arg },undef)))
- {
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{ADDRESSES},
- $tracelevel)
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched repeated subrule: [addressstruct]<< (}
- . @$_tok . q{ times)},
-
- Parse::RecDescent::_tracefirst($text),
- q{ADDRESSES},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{addressstruct(s)}} = $_tok;
- push @item, $_tok;
-
-
-
- Parse::RecDescent::_trace(q{Trying terminal: [')']},
- Parse::RecDescent::_tracefirst($text),
- q{ADDRESSES},
- $tracelevel)
- if defined $::RD_TRACE;
- undef $lastsep;
- $expectation->is(q{')'})->at($text);
-
-
- unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and do { $_tok = ")"; 1 } and
- substr($text,0,length($_tok)) eq $_tok and
- do { substr($text,0,length($_tok)) = ""; 1; }
- )
- {
- $text = $lastsep . $text if defined $lastsep;
-
- $expectation->failed();
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
- . $_tok . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $item{__STRING2__}=$_tok;
-
-
- Parse::RecDescent::_trace(q{Trying action},
- Parse::RecDescent::_tracefirst($text),
- q{ADDRESSES},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
- $_tok = ($_noactions) ? 0 : do { $return = $item{'addressstruct(s)'} };
- unless (defined $_tok)
- {
- Parse::RecDescent::_trace(q{<> (return value: [undef])})
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched action<< (return value: [}
- . $_tok . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $_tok;
- $item{__ACTION1__}=$_tok;
-
-
- Parse::RecDescent::_trace(q{>>Matched production: ['(' addressstruct ')']<<},
- Parse::RecDescent::_tracefirst($text),
- q{ADDRESSES},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- unless ( $_matched || defined($score) )
- {
- splice @{$thisparser->{deferred}}, $def_at;
-
-
- $_[1] = $text; # NOT SURE THIS IS NEEDED
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($_[1]),
- q{ADDRESSES},
- $tracelevel)
- if defined $::RD_TRACE;
- return undef;
- }
- if (!defined($return) && defined($score))
- {
- Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
- q{ADDRESSES},
- $tracelevel)
- if defined $::RD_TRACE;
- $return = $score_return;
- }
- splice @{$thisparser->{errors}}, $err_at;
- $return = $item[$#item] unless defined $return;
- if (defined $::RD_TRACE)
- {
- Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
- $return . q{])}, "",
- q{ADDRESSES},
- $tracelevel);
- Parse::RecDescent::_trace(q{(consumed: [} .
- Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])},
- Parse::RecDescent::_tracefirst($text),
- , q{ADDRESSES},
- $tracelevel)
- }
- $_[1] = $text;
- return $return;
-}
-
-# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args, $_itempos)
-sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::key
-{
- my $thisparser = $_[0];
- use vars q{$tracelevel};
- local $tracelevel = ($tracelevel||0)+1;
- $ERRORS = 0;
- my $thisrule = $thisparser->{"rules"}{"key"};
-
- Parse::RecDescent::_trace(q{Trying rule: [key]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{key},
- $tracelevel)
- if defined $::RD_TRACE;
-
- my $def_at = @{$thisparser->{deferred}};
- my $err_at = @{$thisparser->{errors}};
-
- my $score;
- my $score_return;
- my $_tok;
- my $return = undef;
- my $_matched=0;
- my $commit=0;
- my @item = ();
- my %item = ();
- my $repeating = $_[2];
- my $_noactions = $_[3];
- my @arg = defined $_[4] ? @{ &{$_[4]} } : ();
- my $_itempos = $_[5];
- my %arg = ($#arg & 01) ? @arg : (@arg, undef);
- my $text;
- my $lastsep;
- my $current_match;
- my $expectation = new Parse::RecDescent::Expectation(q{STRING});
- $expectation->at($_[1]);
-
- my $thisline;
- tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
-
-
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [STRING]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{key},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[0];
- $text = $_[1];
- my $_savetext;
- @item = (q{key});
- %item = (__RULE__ => q{key});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying subrule: [STRING]},
- Parse::RecDescent::_tracefirst($text),
- q{key},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::STRING($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{key},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [STRING]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{key},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{STRING}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{>>Matched production: [STRING]<<},
- Parse::RecDescent::_tracefirst($text),
- q{key},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- unless ( $_matched || defined($score) )
- {
- splice @{$thisparser->{deferred}}, $def_at;
-
-
- $_[1] = $text; # NOT SURE THIS IS NEEDED
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($_[1]),
- q{key},
- $tracelevel)
- if defined $::RD_TRACE;
- return undef;
- }
- if (!defined($return) && defined($score))
- {
- Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
- q{key},
- $tracelevel)
- if defined $::RD_TRACE;
- $return = $score_return;
- }
- splice @{$thisparser->{errors}}, $err_at;
- $return = $item[$#item] unless defined $return;
- if (defined $::RD_TRACE)
- {
- Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
- $return . q{])}, "",
- q{key},
- $tracelevel);
- Parse::RecDescent::_trace(q{(consumed: [} .
- Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])},
- Parse::RecDescent::_tracefirst($text),
- , q{key},
- $tracelevel)
- }
- $_[1] = $text;
- return $return;
-}
-
-# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args, $_itempos)
-sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::rfc822message
-{
- my $thisparser = $_[0];
- use vars q{$tracelevel};
- local $tracelevel = ($tracelevel||0)+1;
- $ERRORS = 0;
- my $thisrule = $thisparser->{"rules"}{"rfc822message"};
-
- Parse::RecDescent::_trace(q{Trying rule: [rfc822message]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{rfc822message},
- $tracelevel)
- if defined $::RD_TRACE;
-
- my $def_at = @{$thisparser->{deferred}};
- my $err_at = @{$thisparser->{errors}};
-
- my $score;
- my $score_return;
- my $_tok;
- my $return = undef;
- my $_matched=0;
- my $commit=0;
- my @item = ();
- my %item = ();
- my $repeating = $_[2];
- my $_noactions = $_[3];
- my @arg = defined $_[4] ? @{ &{$_[4]} } : ();
- my $_itempos = $_[5];
- my %arg = ($#arg & 01) ? @arg : (@arg, undef);
- my $text;
- my $lastsep;
- my $current_match;
- my $expectation = new Parse::RecDescent::Expectation(q{MESSAGE});
- $expectation->at($_[1]);
-
- my $thisline;
- tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
-
-
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [MESSAGE RFC822]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{rfc822message},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[0];
- $text = $_[1];
- my $_savetext;
- @item = (q{rfc822message});
- %item = (__RULE__ => q{rfc822message});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying subrule: [MESSAGE]},
- Parse::RecDescent::_tracefirst($text),
- q{rfc822message},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::MESSAGE($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{rfc822message},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [MESSAGE]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{rfc822message},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{MESSAGE}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{Trying subrule: [RFC822]},
- Parse::RecDescent::_tracefirst($text),
- q{rfc822message},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{RFC822})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::RFC822($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{rfc822message},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [RFC822]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{rfc822message},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{RFC822}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{Trying action},
- Parse::RecDescent::_tracefirst($text),
- q{rfc822message},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
- $_tok = ($_noactions) ? 0 : do { $return = "MESSAGE RFC822" };
- unless (defined $_tok)
- {
- Parse::RecDescent::_trace(q{<> (return value: [undef])})
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched action<< (return value: [}
- . $_tok . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $_tok;
- $item{__ACTION1__}=$_tok;
-
-
- Parse::RecDescent::_trace(q{>>Matched production: [MESSAGE RFC822]<<},
- Parse::RecDescent::_tracefirst($text),
- q{rfc822message},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- unless ( $_matched || defined($score) )
- {
- splice @{$thisparser->{deferred}}, $def_at;
-
-
- $_[1] = $text; # NOT SURE THIS IS NEEDED
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($_[1]),
- q{rfc822message},
- $tracelevel)
- if defined $::RD_TRACE;
- return undef;
- }
- if (!defined($return) && defined($score))
- {
- Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
- q{rfc822message},
- $tracelevel)
- if defined $::RD_TRACE;
- $return = $score_return;
- }
- splice @{$thisparser->{errors}}, $err_at;
- $return = $item[$#item] unless defined $return;
- if (defined $::RD_TRACE)
- {
- Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
- $return . q{])}, "",
- q{rfc822message},
- $tracelevel);
- Parse::RecDescent::_trace(q{(consumed: [} .
- Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])},
- Parse::RecDescent::_tracefirst($text),
- , q{rfc822message},
- $tracelevel)
- }
- $_[1] = $text;
- return $return;
-}
-
-# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args, $_itempos)
-sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bcc
-{
- my $thisparser = $_[0];
- use vars q{$tracelevel};
- local $tracelevel = ($tracelevel||0)+1;
- $ERRORS = 0;
- my $thisrule = $thisparser->{"rules"}{"bcc"};
-
- Parse::RecDescent::_trace(q{Trying rule: [bcc]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{bcc},
- $tracelevel)
- if defined $::RD_TRACE;
-
- my $def_at = @{$thisparser->{deferred}};
- my $err_at = @{$thisparser->{errors}};
-
- my $score;
- my $score_return;
- my $_tok;
- my $return = undef;
- my $_matched=0;
- my $commit=0;
- my @item = ();
- my %item = ();
- my $repeating = $_[2];
- my $_noactions = $_[3];
- my @arg = defined $_[4] ? @{ &{$_[4]} } : ();
- my $_itempos = $_[5];
- my %arg = ($#arg & 01) ? @arg : (@arg, undef);
- my $text;
- my $lastsep;
- my $current_match;
- my $expectation = new Parse::RecDescent::Expectation(q{ADDRESSES});
- $expectation->at($_[1]);
-
- my $thisline;
- tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
-
-
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [ADDRESSES]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{bcc},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[0];
- $text = $_[1];
- my $_savetext;
- @item = (q{bcc});
- %item = (__RULE__ => q{bcc});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying subrule: [ADDRESSES]},
- Parse::RecDescent::_tracefirst($text),
- q{bcc},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::ADDRESSES($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{bcc},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [ADDRESSES]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{bcc},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{ADDRESSES}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{>>Matched production: [ADDRESSES]<<},
- Parse::RecDescent::_tracefirst($text),
- q{bcc},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- unless ( $_matched || defined($score) )
- {
- splice @{$thisparser->{deferred}}, $def_at;
-
-
- $_[1] = $text; # NOT SURE THIS IS NEEDED
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($_[1]),
- q{bcc},
- $tracelevel)
- if defined $::RD_TRACE;
- return undef;
- }
- if (!defined($return) && defined($score))
- {
- Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
- q{bcc},
- $tracelevel)
- if defined $::RD_TRACE;
- $return = $score_return;
- }
- splice @{$thisparser->{errors}}, $err_at;
- $return = $item[$#item] unless defined $return;
- if (defined $::RD_TRACE)
- {
- Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
- $return . q{])}, "",
- q{bcc},
- $tracelevel);
- Parse::RecDescent::_trace(q{(consumed: [} .
- Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])},
- Parse::RecDescent::_tracefirst($text),
- , q{bcc},
- $tracelevel)
- }
- $_[1] = $text;
- return $return;
-}
-
-# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args, $_itempos)
-sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodydisp
-{
- my $thisparser = $_[0];
- use vars q{$tracelevel};
- local $tracelevel = ($tracelevel||0)+1;
- $ERRORS = 0;
- my $thisrule = $thisparser->{"rules"}{"bodydisp"};
-
- Parse::RecDescent::_trace(q{Trying rule: [bodydisp]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{bodydisp},
- $tracelevel)
- if defined $::RD_TRACE;
-
- my $def_at = @{$thisparser->{deferred}};
- my $err_at = @{$thisparser->{errors}};
-
- my $score;
- my $score_return;
- my $_tok;
- my $return = undef;
- my $_matched=0;
- my $commit=0;
- my @item = ();
- my %item = ();
- my $repeating = $_[2];
- my $_noactions = $_[3];
- my @arg = defined $_[4] ? @{ &{$_[4]} } : ();
- my $_itempos = $_[5];
- my %arg = ($#arg & 01) ? @arg : (@arg, undef);
- my $text;
- my $lastsep;
- my $current_match;
- my $expectation = new Parse::RecDescent::Expectation(q{NIL, or KVPAIRS});
- $expectation->at($_[1]);
-
- my $thisline;
- tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
-
-
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [NIL]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{bodydisp},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[0];
- $text = $_[1];
- my $_savetext;
- @item = (q{bodydisp});
- %item = (__RULE__ => q{bodydisp});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying subrule: [NIL]},
- Parse::RecDescent::_tracefirst($text),
- q{bodydisp},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NIL($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{bodydisp},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [NIL]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{bodydisp},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{NIL}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{>>Matched production: [NIL]<<},
- Parse::RecDescent::_tracefirst($text),
- q{bodydisp},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [KVPAIRS]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{bodydisp},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[1];
- $text = $_[1];
- my $_savetext;
- @item = (q{bodydisp});
- %item = (__RULE__ => q{bodydisp});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying subrule: [KVPAIRS]},
- Parse::RecDescent::_tracefirst($text),
- q{bodydisp},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::KVPAIRS($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{bodydisp},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [KVPAIRS]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{bodydisp},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{KVPAIRS}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{>>Matched production: [KVPAIRS]<<},
- Parse::RecDescent::_tracefirst($text),
- q{bodydisp},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- unless ( $_matched || defined($score) )
- {
- splice @{$thisparser->{deferred}}, $def_at;
-
-
- $_[1] = $text; # NOT SURE THIS IS NEEDED
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($_[1]),
- q{bodydisp},
- $tracelevel)
- if defined $::RD_TRACE;
- return undef;
- }
- if (!defined($return) && defined($score))
- {
- Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
- q{bodydisp},
- $tracelevel)
- if defined $::RD_TRACE;
- $return = $score_return;
- }
- splice @{$thisparser->{errors}}, $err_at;
- $return = $item[$#item] unless defined $return;
- if (defined $::RD_TRACE)
- {
- Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
- $return . q{])}, "",
- q{bodydisp},
- $tracelevel);
- Parse::RecDescent::_trace(q{(consumed: [} .
- Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])},
- Parse::RecDescent::_tracefirst($text),
- , q{bodydisp},
- $tracelevel)
- }
- $_[1] = $text;
- return $return;
-}
-
-# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args, $_itempos)
-sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::KVPAIRS
-{
- my $thisparser = $_[0];
- use vars q{$tracelevel};
- local $tracelevel = ($tracelevel||0)+1;
- $ERRORS = 0;
- my $thisrule = $thisparser->{"rules"}{"KVPAIRS"};
-
- Parse::RecDescent::_trace(q{Trying rule: [KVPAIRS]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{KVPAIRS},
- $tracelevel)
- if defined $::RD_TRACE;
-
- my $def_at = @{$thisparser->{deferred}};
- my $err_at = @{$thisparser->{errors}};
-
- my $score;
- my $score_return;
- my $_tok;
- my $return = undef;
- my $_matched=0;
- my $commit=0;
- my @item = ();
- my %item = ();
- my $repeating = $_[2];
- my $_noactions = $_[3];
- my @arg = defined $_[4] ? @{ &{$_[4]} } : ();
- my $_itempos = $_[5];
- my %arg = ($#arg & 01) ? @arg : (@arg, undef);
- my $text;
- my $lastsep;
- my $current_match;
- my $expectation = new Parse::RecDescent::Expectation(q{'('});
- $expectation->at($_[1]);
-
- my $thisline;
- tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
-
-
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: ['(' kvpair ')']},
- Parse::RecDescent::_tracefirst($_[1]),
- q{KVPAIRS},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[0];
- $text = $_[1];
- my $_savetext;
- @item = (q{KVPAIRS});
- %item = (__RULE__ => q{KVPAIRS});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying terminal: ['(']},
- Parse::RecDescent::_tracefirst($text),
- q{KVPAIRS},
- $tracelevel)
- if defined $::RD_TRACE;
- undef $lastsep;
- $expectation->is(q{})->at($text);
-
-
- unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and do { $_tok = "("; 1 } and
- substr($text,0,length($_tok)) eq $_tok and
- do { substr($text,0,length($_tok)) = ""; 1; }
- )
- {
- $text = $lastsep . $text if defined $lastsep;
-
- $expectation->failed();
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
- . $_tok . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $item{__STRING1__}=$_tok;
-
-
- Parse::RecDescent::_trace(q{Trying repeated subrule: [kvpair]},
- Parse::RecDescent::_tracefirst($text),
- q{KVPAIRS},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->is(q{kvpair})->at($text);
-
- unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::kvpair, 1, 100000000, $_noactions,$expectation,sub { \@arg },undef)))
- {
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{KVPAIRS},
- $tracelevel)
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched repeated subrule: [kvpair]<< (}
- . @$_tok . q{ times)},
-
- Parse::RecDescent::_tracefirst($text),
- q{KVPAIRS},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{kvpair(s)}} = $_tok;
- push @item, $_tok;
-
-
-
- Parse::RecDescent::_trace(q{Trying terminal: [')']},
- Parse::RecDescent::_tracefirst($text),
- q{KVPAIRS},
- $tracelevel)
- if defined $::RD_TRACE;
- undef $lastsep;
- $expectation->is(q{')'})->at($text);
-
-
- unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and do { $_tok = ")"; 1 } and
- substr($text,0,length($_tok)) eq $_tok and
- do { substr($text,0,length($_tok)) = ""; 1; }
- )
- {
- $text = $lastsep . $text if defined $lastsep;
-
- $expectation->failed();
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
- . $_tok . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $item{__STRING2__}=$_tok;
-
-
- Parse::RecDescent::_trace(q{Trying action},
- Parse::RecDescent::_tracefirst($text),
- q{KVPAIRS},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
- $_tok = ($_noactions) ? 0 : do { $return = { map { (%$_) } @{$item{'kvpair(s)'}} } };
- unless (defined $_tok)
- {
- Parse::RecDescent::_trace(q{<> (return value: [undef])})
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched action<< (return value: [}
- . $_tok . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $_tok;
- $item{__ACTION1__}=$_tok;
-
-
- Parse::RecDescent::_trace(q{>>Matched production: ['(' kvpair ')']<<},
- Parse::RecDescent::_tracefirst($text),
- q{KVPAIRS},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- unless ( $_matched || defined($score) )
- {
- splice @{$thisparser->{deferred}}, $def_at;
-
-
- $_[1] = $text; # NOT SURE THIS IS NEEDED
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($_[1]),
- q{KVPAIRS},
- $tracelevel)
- if defined $::RD_TRACE;
- return undef;
- }
- if (!defined($return) && defined($score))
- {
- Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
- q{KVPAIRS},
- $tracelevel)
- if defined $::RD_TRACE;
- $return = $score_return;
- }
- splice @{$thisparser->{errors}}, $err_at;
- $return = $item[$#item] unless defined $return;
- if (defined $::RD_TRACE)
- {
- Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
- $return . q{])}, "",
- q{KVPAIRS},
- $tracelevel);
- Parse::RecDescent::_trace(q{(consumed: [} .
- Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])},
- Parse::RecDescent::_tracefirst($text),
- , q{KVPAIRS},
- $tracelevel)
- }
- $_[1] = $text;
- return $return;
-}
-
-# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args, $_itempos)
-sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::bodyMD5
-{
- my $thisparser = $_[0];
- use vars q{$tracelevel};
- local $tracelevel = ($tracelevel||0)+1;
- $ERRORS = 0;
- my $thisrule = $thisparser->{"rules"}{"bodyMD5"};
-
- Parse::RecDescent::_trace(q{Trying rule: [bodyMD5]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{bodyMD5},
- $tracelevel)
- if defined $::RD_TRACE;
-
- my $def_at = @{$thisparser->{deferred}};
- my $err_at = @{$thisparser->{errors}};
-
- my $score;
- my $score_return;
- my $_tok;
- my $return = undef;
- my $_matched=0;
- my $commit=0;
- my @item = ();
- my %item = ();
- my $repeating = $_[2];
- my $_noactions = $_[3];
- my @arg = defined $_[4] ? @{ &{$_[4]} } : ();
- my $_itempos = $_[5];
- my %arg = ($#arg & 01) ? @arg : (@arg, undef);
- my $text;
- my $lastsep;
- my $current_match;
- my $expectation = new Parse::RecDescent::Expectation(q{NIL, or STRING});
- $expectation->at($_[1]);
-
- my $thisline;
- tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
-
-
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [NIL]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{bodyMD5},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[0];
- $text = $_[1];
- my $_savetext;
- @item = (q{bodyMD5});
- %item = (__RULE__ => q{bodyMD5});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying subrule: [NIL]},
- Parse::RecDescent::_tracefirst($text),
- q{bodyMD5},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NIL($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{bodyMD5},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [NIL]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{bodyMD5},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{NIL}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{>>Matched production: [NIL]<<},
- Parse::RecDescent::_tracefirst($text),
- q{bodyMD5},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [STRING]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{bodyMD5},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[1];
- $text = $_[1];
- my $_savetext;
- @item = (q{bodyMD5});
- %item = (__RULE__ => q{bodyMD5});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying subrule: [STRING]},
- Parse::RecDescent::_tracefirst($text),
- q{bodyMD5},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::STRING($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{bodyMD5},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [STRING]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{bodyMD5},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{STRING}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{>>Matched production: [STRING]<<},
- Parse::RecDescent::_tracefirst($text),
- q{bodyMD5},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- unless ( $_matched || defined($score) )
- {
- splice @{$thisparser->{deferred}}, $def_at;
-
-
- $_[1] = $text; # NOT SURE THIS IS NEEDED
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($_[1]),
- q{bodyMD5},
- $tracelevel)
- if defined $::RD_TRACE;
- return undef;
- }
- if (!defined($return) && defined($score))
- {
- Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
- q{bodyMD5},
- $tracelevel)
- if defined $::RD_TRACE;
- $return = $score_return;
- }
- splice @{$thisparser->{errors}}, $err_at;
- $return = $item[$#item] unless defined $return;
- if (defined $::RD_TRACE)
- {
- Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
- $return . q{])}, "",
- q{bodyMD5},
- $tracelevel);
- Parse::RecDescent::_trace(q{(consumed: [} .
- Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])},
- Parse::RecDescent::_tracefirst($text),
- , q{bodyMD5},
- $tracelevel)
- }
- $_[1] = $text;
- return $return;
-}
-
-# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args, $_itempos)
-sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::part
-{
- my $thisparser = $_[0];
- use vars q{$tracelevel};
- local $tracelevel = ($tracelevel||0)+1;
- $ERRORS = 0;
- my $thisrule = $thisparser->{"rules"}{"part"};
-
- Parse::RecDescent::_trace(q{Trying rule: [part]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{part},
- $tracelevel)
- if defined $::RD_TRACE;
-
- my $def_at = @{$thisparser->{deferred}};
- my $err_at = @{$thisparser->{errors}};
-
- my $score;
- my $score_return;
- my $_tok;
- my $return = undef;
- my $_matched=0;
- my $commit=0;
- my @item = ();
- my %item = ();
- my $repeating = $_[2];
- my $_noactions = $_[3];
- my @arg = defined $_[4] ? @{ &{$_[4]} } : ();
- my $_itempos = $_[5];
- my %arg = ($#arg & 01) ? @arg : (@arg, undef);
- my $text;
- my $lastsep;
- my $current_match;
- my $expectation = new Parse::RecDescent::Expectation(q{multipart, or textmessage, or nestedmessage, or othertypemessage});
- $expectation->at($_[1]);
-
- my $thisline;
- tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
-
-
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [multipart]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{part},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[0];
- $text = $_[1];
- my $_savetext;
- @item = (q{part});
- %item = (__RULE__ => q{part});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying subrule: [multipart]},
- Parse::RecDescent::_tracefirst($text),
- q{part},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::multipart($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{part},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [multipart]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{part},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{multipart}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{Trying action},
- Parse::RecDescent::_tracefirst($text),
- q{part},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
- $_tok = ($_noactions) ? 0 : do { $return = bless $item{multipart}, $mibs };
- unless (defined $_tok)
- {
- Parse::RecDescent::_trace(q{<> (return value: [undef])})
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched action<< (return value: [}
- . $_tok . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $_tok;
- $item{__ACTION1__}=$_tok;
-
-
- Parse::RecDescent::_trace(q{>>Matched production: [multipart]<<},
- Parse::RecDescent::_tracefirst($text),
- q{part},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [textmessage]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{part},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[1];
- $text = $_[1];
- my $_savetext;
- @item = (q{part});
- %item = (__RULE__ => q{part});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying subrule: [textmessage]},
- Parse::RecDescent::_tracefirst($text),
- q{part},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::textmessage($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{part},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [textmessage]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{part},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{textmessage}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{Trying action},
- Parse::RecDescent::_tracefirst($text),
- q{part},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
- $_tok = ($_noactions) ? 0 : do { $return = bless $item{textmessage}, $mibs };
- unless (defined $_tok)
- {
- Parse::RecDescent::_trace(q{<> (return value: [undef])})
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched action<< (return value: [}
- . $_tok . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $_tok;
- $item{__ACTION1__}=$_tok;
-
-
- Parse::RecDescent::_trace(q{>>Matched production: [textmessage]<<},
- Parse::RecDescent::_tracefirst($text),
- q{part},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [nestedmessage]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{part},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[2];
- $text = $_[1];
- my $_savetext;
- @item = (q{part});
- %item = (__RULE__ => q{part});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying subrule: [nestedmessage]},
- Parse::RecDescent::_tracefirst($text),
- q{part},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::nestedmessage($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{part},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [nestedmessage]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{part},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{nestedmessage}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{Trying action},
- Parse::RecDescent::_tracefirst($text),
- q{part},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
- $_tok = ($_noactions) ? 0 : do { $return = bless $item{nestedmessage}, $mibs };
- unless (defined $_tok)
- {
- Parse::RecDescent::_trace(q{<> (return value: [undef])})
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched action<< (return value: [}
- . $_tok . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $_tok;
- $item{__ACTION1__}=$_tok;
-
-
- Parse::RecDescent::_trace(q{>>Matched production: [nestedmessage]<<},
- Parse::RecDescent::_tracefirst($text),
- q{part},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [othertypemessage]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{part},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[3];
- $text = $_[1];
- my $_savetext;
- @item = (q{part});
- %item = (__RULE__ => q{part});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying subrule: [othertypemessage]},
- Parse::RecDescent::_tracefirst($text),
- q{part},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::othertypemessage($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{part},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [othertypemessage]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{part},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{othertypemessage}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{Trying action},
- Parse::RecDescent::_tracefirst($text),
- q{part},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
- $_tok = ($_noactions) ? 0 : do { $return = bless $item{othertypemessage}, $mibs };
- unless (defined $_tok)
- {
- Parse::RecDescent::_trace(q{<> (return value: [undef])})
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched action<< (return value: [}
- . $_tok . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $_tok;
- $item{__ACTION1__}=$_tok;
-
-
- Parse::RecDescent::_trace(q{>>Matched production: [othertypemessage]<<},
- Parse::RecDescent::_tracefirst($text),
- q{part},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- unless ( $_matched || defined($score) )
- {
- splice @{$thisparser->{deferred}}, $def_at;
-
-
- $_[1] = $text; # NOT SURE THIS IS NEEDED
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($_[1]),
- q{part},
- $tracelevel)
- if defined $::RD_TRACE;
- return undef;
- }
- if (!defined($return) && defined($score))
- {
- Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
- q{part},
- $tracelevel)
- if defined $::RD_TRACE;
- $return = $score_return;
- }
- splice @{$thisparser->{errors}}, $err_at;
- $return = $item[$#item] unless defined $return;
- if (defined $::RD_TRACE)
- {
- Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
- $return . q{])}, "",
- q{part},
- $tracelevel);
- Parse::RecDescent::_trace(q{(consumed: [} .
- Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])},
- Parse::RecDescent::_tracefirst($text),
- , q{part},
- $tracelevel)
- }
- $_[1] = $text;
- return $return;
-}
-
-# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args, $_itempos)
-sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::TEXT
-{
- my $thisparser = $_[0];
- use vars q{$tracelevel};
- local $tracelevel = ($tracelevel||0)+1;
- $ERRORS = 0;
- my $thisrule = $thisparser->{"rules"}{"TEXT"};
-
- Parse::RecDescent::_trace(q{Trying rule: [TEXT]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{TEXT},
- $tracelevel)
- if defined $::RD_TRACE;
-
- my $def_at = @{$thisparser->{deferred}};
- my $err_at = @{$thisparser->{errors}};
-
- my $score;
- my $score_return;
- my $_tok;
- my $return = undef;
- my $_matched=0;
- my $commit=0;
- my @item = ();
- my %item = ();
- my $repeating = $_[2];
- my $_noactions = $_[3];
- my @arg = defined $_[4] ? @{ &{$_[4]} } : ();
- my $_itempos = $_[5];
- my %arg = ($#arg & 01) ? @arg : (@arg, undef);
- my $text;
- my $lastsep;
- my $current_match;
- my $expectation = new Parse::RecDescent::Expectation(q{/^"TEXT"|^TEXT/i});
- $expectation->at($_[1]);
-
- my $thisline;
- tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
-
-
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [/^"TEXT"|^TEXT/i]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{TEXT},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[0];
- $text = $_[1];
- my $_savetext;
- @item = (q{TEXT});
- %item = (__RULE__ => q{TEXT});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying terminal: [/^"TEXT"|^TEXT/i]}, Parse::RecDescent::_tracefirst($text),
- q{TEXT},
- $tracelevel)
- if defined $::RD_TRACE;
- undef $lastsep;
- $expectation->is(q{})->at($text);
-
-
- unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A(?:^"TEXT"|^TEXT)/i)
- {
- $text = $lastsep . $text if defined $lastsep;
- $expectation->failed();
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
-
- last;
- }
- $current_match = substr($text, $-[0], $+[0] - $-[0]);
- substr($text,0,length($current_match),q{});
- Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
- . $current_match . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $item{__PATTERN1__}=$current_match;
-
-
- Parse::RecDescent::_trace(q{Trying action},
- Parse::RecDescent::_tracefirst($text),
- q{TEXT},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
- $_tok = ($_noactions) ? 0 : do { $return = "TEXT" };
- unless (defined $_tok)
- {
- Parse::RecDescent::_trace(q{<> (return value: [undef])})
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched action<< (return value: [}
- . $_tok . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $_tok;
- $item{__ACTION1__}=$_tok;
-
-
- Parse::RecDescent::_trace(q{>>Matched production: [/^"TEXT"|^TEXT/i]<<},
- Parse::RecDescent::_tracefirst($text),
- q{TEXT},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- unless ( $_matched || defined($score) )
- {
- splice @{$thisparser->{deferred}}, $def_at;
-
-
- $_[1] = $text; # NOT SURE THIS IS NEEDED
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($_[1]),
- q{TEXT},
- $tracelevel)
- if defined $::RD_TRACE;
- return undef;
- }
- if (!defined($return) && defined($score))
- {
- Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
- q{TEXT},
- $tracelevel)
- if defined $::RD_TRACE;
- $return = $score_return;
- }
- splice @{$thisparser->{errors}}, $err_at;
- $return = $item[$#item] unless defined $return;
- if (defined $::RD_TRACE)
- {
- Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
- $return . q{])}, "",
- q{TEXT},
- $tracelevel);
- Parse::RecDescent::_trace(q{(consumed: [} .
- Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])},
- Parse::RecDescent::_tracefirst($text),
- , q{TEXT},
- $tracelevel)
- }
- $_[1] = $text;
- return $return;
-}
-
-# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args, $_itempos)
-sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::MESSAGE
-{
- my $thisparser = $_[0];
- use vars q{$tracelevel};
- local $tracelevel = ($tracelevel||0)+1;
- $ERRORS = 0;
- my $thisrule = $thisparser->{"rules"}{"MESSAGE"};
-
- Parse::RecDescent::_trace(q{Trying rule: [MESSAGE]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{MESSAGE},
- $tracelevel)
- if defined $::RD_TRACE;
-
- my $def_at = @{$thisparser->{deferred}};
- my $err_at = @{$thisparser->{errors}};
-
- my $score;
- my $score_return;
- my $_tok;
- my $return = undef;
- my $_matched=0;
- my $commit=0;
- my @item = ();
- my %item = ();
- my $repeating = $_[2];
- my $_noactions = $_[3];
- my @arg = defined $_[4] ? @{ &{$_[4]} } : ();
- my $_itempos = $_[5];
- my %arg = ($#arg & 01) ? @arg : (@arg, undef);
- my $text;
- my $lastsep;
- my $current_match;
- my $expectation = new Parse::RecDescent::Expectation(q{/^"MESSAGE"|^MESSAGE/i});
- $expectation->at($_[1]);
-
- my $thisline;
- tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
-
-
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [/^"MESSAGE"|^MESSAGE/i]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{MESSAGE},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[0];
- $text = $_[1];
- my $_savetext;
- @item = (q{MESSAGE});
- %item = (__RULE__ => q{MESSAGE});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying terminal: [/^"MESSAGE"|^MESSAGE/i]}, Parse::RecDescent::_tracefirst($text),
- q{MESSAGE},
- $tracelevel)
- if defined $::RD_TRACE;
- undef $lastsep;
- $expectation->is(q{})->at($text);
-
-
- unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A(?:^"MESSAGE"|^MESSAGE)/i)
- {
- $text = $lastsep . $text if defined $lastsep;
- $expectation->failed();
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
-
- last;
- }
- $current_match = substr($text, $-[0], $+[0] - $-[0]);
- substr($text,0,length($current_match),q{});
- Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
- . $current_match . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $item{__PATTERN1__}=$current_match;
-
-
- Parse::RecDescent::_trace(q{Trying action},
- Parse::RecDescent::_tracefirst($text),
- q{MESSAGE},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
- $_tok = ($_noactions) ? 0 : do { $return = "MESSAGE"};
- unless (defined $_tok)
- {
- Parse::RecDescent::_trace(q{<> (return value: [undef])})
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched action<< (return value: [}
- . $_tok . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $_tok;
- $item{__ACTION1__}=$_tok;
-
-
- Parse::RecDescent::_trace(q{>>Matched production: [/^"MESSAGE"|^MESSAGE/i]<<},
- Parse::RecDescent::_tracefirst($text),
- q{MESSAGE},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- unless ( $_matched || defined($score) )
- {
- splice @{$thisparser->{deferred}}, $def_at;
-
-
- $_[1] = $text; # NOT SURE THIS IS NEEDED
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($_[1]),
- q{MESSAGE},
- $tracelevel)
- if defined $::RD_TRACE;
- return undef;
- }
- if (!defined($return) && defined($score))
- {
- Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
- q{MESSAGE},
- $tracelevel)
- if defined $::RD_TRACE;
- $return = $score_return;
- }
- splice @{$thisparser->{errors}}, $err_at;
- $return = $item[$#item] unless defined $return;
- if (defined $::RD_TRACE)
- {
- Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
- $return . q{])}, "",
- q{MESSAGE},
- $tracelevel);
- Parse::RecDescent::_trace(q{(consumed: [} .
- Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])},
- Parse::RecDescent::_tracefirst($text),
- , q{MESSAGE},
- $tracelevel)
- }
- $_[1] = $text;
- return $return;
-}
-
-# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args, $_itempos)
-sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::start
-{
- my $thisparser = $_[0];
- use vars q{$tracelevel};
- local $tracelevel = ($tracelevel||0)+1;
- $ERRORS = 0;
- my $thisrule = $thisparser->{"rules"}{"start"};
-
- Parse::RecDescent::_trace(q{Trying rule: [start]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{start},
- $tracelevel)
- if defined $::RD_TRACE;
-
- my $def_at = @{$thisparser->{deferred}};
- my $err_at = @{$thisparser->{errors}};
-
- my $score;
- my $score_return;
- my $_tok;
- my $return = undef;
- my $_matched=0;
- my $commit=0;
- my @item = ();
- my %item = ();
- my $repeating = $_[2];
- my $_noactions = $_[3];
- my @arg = defined $_[4] ? @{ &{$_[4]} } : ();
- my $_itempos = $_[5];
- my %arg = ($#arg & 01) ? @arg : (@arg, undef);
- my $text;
- my $lastsep;
- my $current_match;
- my $expectation = new Parse::RecDescent::Expectation(q{/.*?\\(.*?BODYSTRUCTURE \\(/i});
- $expectation->at($_[1]);
-
- my $thisline;
- tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
-
-
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [/.*?\\(.*?BODYSTRUCTURE \\(/i part /\\).*\\)\\r?\\n?/]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{start},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[0];
- $text = $_[1];
- my $_savetext;
- @item = (q{start});
- %item = (__RULE__ => q{start});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying terminal: [/.*?\\(.*?BODYSTRUCTURE \\(/i]}, Parse::RecDescent::_tracefirst($text),
- q{start},
- $tracelevel)
- if defined $::RD_TRACE;
- undef $lastsep;
- $expectation->is(q{})->at($text);
-
-
- unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A(?:.*?\(.*?BODYSTRUCTURE \()/i)
- {
- $text = $lastsep . $text if defined $lastsep;
- $expectation->failed();
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
-
- last;
- }
- $current_match = substr($text, $-[0], $+[0] - $-[0]);
- substr($text,0,length($current_match),q{});
- Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
- . $current_match . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $item{__PATTERN1__}=$current_match;
-
-
- Parse::RecDescent::_trace(q{Trying repeated subrule: [part]},
- Parse::RecDescent::_tracefirst($text),
- q{start},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->is(q{part})->at($text);
-
- unless (defined ($_tok = $thisparser->_parserepeat($text, \&Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::part, 1, 1, $_noactions,$expectation,sub { \@arg },undef)))
- {
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{start},
- $tracelevel)
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched repeated subrule: [part]<< (}
- . @$_tok . q{ times)},
-
- Parse::RecDescent::_tracefirst($text),
- q{start},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{part(1)}} = $_tok;
- push @item, $_tok;
-
-
-
- Parse::RecDescent::_trace(q{Trying terminal: [/\\).*\\)\\r?\\n?/]}, Parse::RecDescent::_tracefirst($text),
- q{start},
- $tracelevel)
- if defined $::RD_TRACE;
- undef $lastsep;
- $expectation->is(q{/\\).*\\)\\r?\\n?/})->at($text);
-
-
- unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A(?:\).*\)\r?\n?)/)
- {
- $text = $lastsep . $text if defined $lastsep;
- $expectation->failed();
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
-
- last;
- }
- $current_match = substr($text, $-[0], $+[0] - $-[0]);
- substr($text,0,length($current_match),q{});
- Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
- . $current_match . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $item{__PATTERN2__}=$current_match;
-
-
- Parse::RecDescent::_trace(q{Trying action},
- Parse::RecDescent::_tracefirst($text),
- q{start},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
- $_tok = ($_noactions) ? 0 : do { $return = $item{'part(1)'}[0] };
- unless (defined $_tok)
- {
- Parse::RecDescent::_trace(q{<> (return value: [undef])})
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched action<< (return value: [}
- . $_tok . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $_tok;
- $item{__ACTION1__}=$_tok;
-
-
- Parse::RecDescent::_trace(q{>>Matched production: [/.*?\\(.*?BODYSTRUCTURE \\(/i part /\\).*\\)\\r?\\n?/]<<},
- Parse::RecDescent::_tracefirst($text),
- q{start},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- unless ( $_matched || defined($score) )
- {
- splice @{$thisparser->{deferred}}, $def_at;
-
-
- $_[1] = $text; # NOT SURE THIS IS NEEDED
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($_[1]),
- q{start},
- $tracelevel)
- if defined $::RD_TRACE;
- return undef;
- }
- if (!defined($return) && defined($score))
- {
- Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
- q{start},
- $tracelevel)
- if defined $::RD_TRACE;
- $return = $score_return;
- }
- splice @{$thisparser->{errors}}, $err_at;
- $return = $item[$#item] unless defined $return;
- if (defined $::RD_TRACE)
- {
- Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
- $return . q{])}, "",
- q{start},
- $tracelevel);
- Parse::RecDescent::_trace(q{(consumed: [} .
- Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])},
- Parse::RecDescent::_tracefirst($text),
- , q{start},
- $tracelevel)
- }
- $_[1] = $text;
- return $return;
-}
-
-# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args, $_itempos)
-sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::addressstruct
-{
- my $thisparser = $_[0];
- use vars q{$tracelevel};
- local $tracelevel = ($tracelevel||0)+1;
- $ERRORS = 0;
- my $thisrule = $thisparser->{"rules"}{"addressstruct"};
-
- Parse::RecDescent::_trace(q{Trying rule: [addressstruct]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{addressstruct},
- $tracelevel)
- if defined $::RD_TRACE;
-
- my $def_at = @{$thisparser->{deferred}};
- my $err_at = @{$thisparser->{errors}};
-
- my $score;
- my $score_return;
- my $_tok;
- my $return = undef;
- my $_matched=0;
- my $commit=0;
- my @item = ();
- my %item = ();
- my $repeating = $_[2];
- my $_noactions = $_[3];
- my @arg = defined $_[4] ? @{ &{$_[4]} } : ();
- my $_itempos = $_[5];
- my %arg = ($#arg & 01) ? @arg : (@arg, undef);
- my $text;
- my $lastsep;
- my $current_match;
- my $expectation = new Parse::RecDescent::Expectation(q{'('});
- $expectation->at($_[1]);
-
- my $thisline;
- tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
-
-
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: ['(' personalname sourceroute mailboxname hostname ')']},
- Parse::RecDescent::_tracefirst($_[1]),
- q{addressstruct},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[0];
- $text = $_[1];
- my $_savetext;
- @item = (q{addressstruct});
- %item = (__RULE__ => q{addressstruct});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying terminal: ['(']},
- Parse::RecDescent::_tracefirst($text),
- q{addressstruct},
- $tracelevel)
- if defined $::RD_TRACE;
- undef $lastsep;
- $expectation->is(q{})->at($text);
-
-
- unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and do { $_tok = "("; 1 } and
- substr($text,0,length($_tok)) eq $_tok and
- do { substr($text,0,length($_tok)) = ""; 1; }
- )
- {
- $text = $lastsep . $text if defined $lastsep;
-
- $expectation->failed();
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
- . $_tok . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $item{__STRING1__}=$_tok;
-
-
- Parse::RecDescent::_trace(q{Trying subrule: [personalname]},
- Parse::RecDescent::_tracefirst($text),
- q{addressstruct},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{personalname})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::personalname($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{addressstruct},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [personalname]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{addressstruct},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{personalname}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{Trying subrule: [sourceroute]},
- Parse::RecDescent::_tracefirst($text),
- q{addressstruct},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{sourceroute})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::sourceroute($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{addressstruct},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [sourceroute]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{addressstruct},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{sourceroute}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{Trying subrule: [mailboxname]},
- Parse::RecDescent::_tracefirst($text),
- q{addressstruct},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{mailboxname})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::mailboxname($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{addressstruct},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [mailboxname]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{addressstruct},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{mailboxname}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{Trying subrule: [hostname]},
- Parse::RecDescent::_tracefirst($text),
- q{addressstruct},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{hostname})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::hostname($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{addressstruct},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [hostname]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{addressstruct},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{hostname}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{Trying terminal: [')']},
- Parse::RecDescent::_tracefirst($text),
- q{addressstruct},
- $tracelevel)
- if defined $::RD_TRACE;
- undef $lastsep;
- $expectation->is(q{')'})->at($text);
-
-
- unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and do { $_tok = ")"; 1 } and
- substr($text,0,length($_tok)) eq $_tok and
- do { substr($text,0,length($_tok)) = ""; 1; }
- )
- {
- $text = $lastsep . $text if defined $lastsep;
-
- $expectation->failed();
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
- . $_tok . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $item{__STRING2__}=$_tok;
-
-
- Parse::RecDescent::_trace(q{Trying action},
- Parse::RecDescent::_tracefirst($text),
- q{addressstruct},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
- $_tok = ($_noactions) ? 0 : do { bless { personalname => $item{personalname}
- , sourceroute => $item{sourceroute}
- , mailboxname => $item{mailboxname}
- , hostname => $item{hostname}
- }, 'Mail::IMAPClient::BodyStructure::Address';
- };
- unless (defined $_tok)
- {
- Parse::RecDescent::_trace(q{<> (return value: [undef])})
- if defined $::RD_TRACE;
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched action<< (return value: [}
- . $_tok . q{])},
- Parse::RecDescent::_tracefirst($text))
- if defined $::RD_TRACE;
- push @item, $_tok;
- $item{__ACTION1__}=$_tok;
-
-
- Parse::RecDescent::_trace(q{>>Matched production: ['(' personalname sourceroute mailboxname hostname ')']<<},
- Parse::RecDescent::_tracefirst($text),
- q{addressstruct},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- unless ( $_matched || defined($score) )
- {
- splice @{$thisparser->{deferred}}, $def_at;
-
-
- $_[1] = $text; # NOT SURE THIS IS NEEDED
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($_[1]),
- q{addressstruct},
- $tracelevel)
- if defined $::RD_TRACE;
- return undef;
- }
- if (!defined($return) && defined($score))
- {
- Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
- q{addressstruct},
- $tracelevel)
- if defined $::RD_TRACE;
- $return = $score_return;
- }
- splice @{$thisparser->{errors}}, $err_at;
- $return = $item[$#item] unless defined $return;
- if (defined $::RD_TRACE)
- {
- Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
- $return . q{])}, "",
- q{addressstruct},
- $tracelevel);
- Parse::RecDescent::_trace(q{(consumed: [} .
- Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])},
- Parse::RecDescent::_tracefirst($text),
- , q{addressstruct},
- $tracelevel)
- }
- $_[1] = $text;
- return $return;
-}
-
-# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args, $_itempos)
-sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::date
-{
- my $thisparser = $_[0];
- use vars q{$tracelevel};
- local $tracelevel = ($tracelevel||0)+1;
- $ERRORS = 0;
- my $thisrule = $thisparser->{"rules"}{"date"};
-
- Parse::RecDescent::_trace(q{Trying rule: [date]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{date},
- $tracelevel)
- if defined $::RD_TRACE;
-
- my $def_at = @{$thisparser->{deferred}};
- my $err_at = @{$thisparser->{errors}};
-
- my $score;
- my $score_return;
- my $_tok;
- my $return = undef;
- my $_matched=0;
- my $commit=0;
- my @item = ();
- my %item = ();
- my $repeating = $_[2];
- my $_noactions = $_[3];
- my @arg = defined $_[4] ? @{ &{$_[4]} } : ();
- my $_itempos = $_[5];
- my %arg = ($#arg & 01) ? @arg : (@arg, undef);
- my $text;
- my $lastsep;
- my $current_match;
- my $expectation = new Parse::RecDescent::Expectation(q{NIL, or STRING});
- $expectation->at($_[1]);
-
- my $thisline;
- tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
-
-
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [NIL]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{date},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[0];
- $text = $_[1];
- my $_savetext;
- @item = (q{date});
- %item = (__RULE__ => q{date});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying subrule: [NIL]},
- Parse::RecDescent::_tracefirst($text),
- q{date},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NIL($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{date},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [NIL]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{date},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{NIL}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{>>Matched production: [NIL]<<},
- Parse::RecDescent::_tracefirst($text),
- q{date},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [STRING]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{date},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[1];
- $text = $_[1];
- my $_savetext;
- @item = (q{date});
- %item = (__RULE__ => q{date});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying subrule: [STRING]},
- Parse::RecDescent::_tracefirst($text),
- q{date},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::STRING($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{date},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [STRING]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{date},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{STRING}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{>>Matched production: [STRING]<<},
- Parse::RecDescent::_tracefirst($text),
- q{date},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- unless ( $_matched || defined($score) )
- {
- splice @{$thisparser->{deferred}}, $def_at;
-
-
- $_[1] = $text; # NOT SURE THIS IS NEEDED
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($_[1]),
- q{date},
- $tracelevel)
- if defined $::RD_TRACE;
- return undef;
- }
- if (!defined($return) && defined($score))
- {
- Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
- q{date},
- $tracelevel)
- if defined $::RD_TRACE;
- $return = $score_return;
- }
- splice @{$thisparser->{errors}}, $err_at;
- $return = $item[$#item] unless defined $return;
- if (defined $::RD_TRACE)
- {
- Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
- $return . q{])}, "",
- q{date},
- $tracelevel);
- Parse::RecDescent::_trace(q{(consumed: [} .
- Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])},
- Parse::RecDescent::_tracefirst($text),
- , q{date},
- $tracelevel)
- }
- $_[1] = $text;
- return $return;
-}
-
-# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args, $_itempos)
-sub Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::hostname
-{
- my $thisparser = $_[0];
- use vars q{$tracelevel};
- local $tracelevel = ($tracelevel||0)+1;
- $ERRORS = 0;
- my $thisrule = $thisparser->{"rules"}{"hostname"};
-
- Parse::RecDescent::_trace(q{Trying rule: [hostname]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{hostname},
- $tracelevel)
- if defined $::RD_TRACE;
-
- my $def_at = @{$thisparser->{deferred}};
- my $err_at = @{$thisparser->{errors}};
-
- my $score;
- my $score_return;
- my $_tok;
- my $return = undef;
- my $_matched=0;
- my $commit=0;
- my @item = ();
- my %item = ();
- my $repeating = $_[2];
- my $_noactions = $_[3];
- my @arg = defined $_[4] ? @{ &{$_[4]} } : ();
- my $_itempos = $_[5];
- my %arg = ($#arg & 01) ? @arg : (@arg, undef);
- my $text;
- my $lastsep;
- my $current_match;
- my $expectation = new Parse::RecDescent::Expectation(q{NIL, or STRING});
- $expectation->at($_[1]);
-
- my $thisline;
- tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
-
-
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [NIL]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{hostname},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[0];
- $text = $_[1];
- my $_savetext;
- @item = (q{hostname});
- %item = (__RULE__ => q{hostname});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying subrule: [NIL]},
- Parse::RecDescent::_tracefirst($text),
- q{hostname},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::NIL($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<>},
- Parse::RecDescent::_tracefirst($text),
- q{hostname},
- $tracelevel)
- if defined $::RD_TRACE;
- $expectation->failed();
- last;
- }
- Parse::RecDescent::_trace(q{>>Matched subrule: [NIL]<< (return value: [}
- . $_tok . q{]},
-
- Parse::RecDescent::_tracefirst($text),
- q{hostname},
- $tracelevel)
- if defined $::RD_TRACE;
- $item{q{NIL}} = $_tok;
- push @item, $_tok;
-
- }
-
- Parse::RecDescent::_trace(q{>>Matched production: [NIL]<<},
- Parse::RecDescent::_tracefirst($text),
- q{hostname},
- $tracelevel)
- if defined $::RD_TRACE;
-
-
-
- $_matched = 1;
- last;
- }
-
- splice
- @{$thisparser->{deferred}}, $def_at unless $_matched;
-
- while (!$_matched && !$commit)
- {
-
- Parse::RecDescent::_trace(q{Trying production: [STRING]},
- Parse::RecDescent::_tracefirst($_[1]),
- q{hostname},
- $tracelevel)
- if defined $::RD_TRACE;
- my $thisprod = $thisrule->{"prods"}[1];
- $text = $_[1];
- my $_savetext;
- @item = (q{hostname});
- %item = (__RULE__ => q{hostname});
- my $repcount = 0;
-
-
- Parse::RecDescent::_trace(q{Trying subrule: [STRING]},
- Parse::RecDescent::_tracefirst($text),
- q{hostname},
- $tracelevel)
- if defined $::RD_TRACE;
- if (1) { no strict qw{refs};
- $expectation->is(q{})->at($text);
- unless (defined ($_tok = Parse::RecDescent::Mail::IMAPClient::BodyStructure::Parse::STRING($thisparser,$text,$repeating,$_noactions,sub { \@arg },undef)))
- {
-
- Parse::RecDescent::_trace(q{<