1
0
mirror of https://github.com/imapsync/imapsync.git synced 2024-11-16 15:52:47 +01:00
This commit is contained in:
Nick Bebout 2011-03-12 02:44:55 +00:00
parent dd1d8ce6e9
commit 9372de1698
9 changed files with 227 additions and 110 deletions

14
CREDITS
View File

@ -1,5 +1,5 @@
#!/bin/cat
# $Id: CREDITS,v 1.140 2010/07/12 00:19:09 gilles Exp gilles $
# $Id: CREDITS,v 1.141 2010/07/14 13:52:04 gilles Exp gilles $
If you want to make a donation to the author, Gilles LAMIRAL:
@ -20,6 +20,18 @@ to remove one.
I thank very much all of these people.
David Osbo
Contributed by giving the book
15.61 "The Complete Idiot's Guide to Conversational Sign Language Illustrated"
Jeroen Ticheler
Contributed by giving the book
23.77 "Maps of Narrative Practice"
Korey Kwilinski
Contributed by giving money 20 USD
Bertrand STERN
Contributed by giving money 100 USD

View File

@ -1,17 +1,41 @@
RCS file: RCS/imapsync,v
Working file: imapsync
head: 1.327
head: 1.331
branch:
locks: strict
gilles: 1.327
gilles: 1.331
access list:
symbolic names:
keyword substitution: kv
total revisions: 327; selected revisions: 327
total revisions: 331; selected revisions: 331
description:
----------------------------
revision 1.327 locked by: gilles;
revision 1.331 locked by: gilles;
date: 2010/07/13 23:28:59; author: gilles; state: Exp; lines: +6 -6
default values for h1_mess_duplicate h1_mess_size_total_duplicate
----------------------------
revision 1.330
date: 2010/07/13 03:44:36; author: gilles; state: Exp; lines: +56 -36
Bugfix. Duplicate messages on host2 were not deleted with --delete2
----------------------------
revision 1.329
date: 2010/07/12 23:28:00; author: gilles; state: Exp; lines: +13 -21
--skipsize turned on by default.
Why? all examples on internet use --skipsize.
imapsync can not change buggy imp servers.
Useless code cleanup.
----------------------------
revision 1.328
date: 2010/07/12 22:49:23; author: gilles; state: Exp; lines: +18 -19
Changed basic documention:
- examples with --password1 instead of --passfile1
Why? all exemples on internet use --password1 so users
use --password1 even I've never told them to do so.
Usability fix.
----------------------------
revision 1.327
date: 2010/07/12 00:23:02; author: gilles; state: Exp; lines: +7 -5
Good exit at the end.
----------------------------

View File

@ -1,5 +1,5 @@
# $Id: Makefile,v 1.29 2010/06/11 02:51:20 gilles Exp gilles $
# $Id: Makefile,v 1.30 2010/07/12 12:14:11 gilles Exp gilles $
TARGET=imapsync
@ -129,7 +129,7 @@ clean_dist:
.PHONY: lfo lfo_upload niouze_lfo niouze_fm public
lfo: dist lfo_upload niouze_lfo
lfo: dist niouze_lfo lfo_upload
lfo_upload:
rsync -avH --delete . \

28
README
View File

@ -3,7 +3,7 @@ NAME
Synchronise mailboxes between two imap servers. Good at IMAP migration.
More than 32 different IMAP server softwares supported with success.
$Revision: 1.327 $
$Revision: 1.331 $
INSTALL
imapsync works fine under any Unix OS with perl.
@ -122,22 +122,22 @@ EXAMPLE
modification induced) with the --dry option. Nothing bad can be done
this way.
To synchronize the imap account "buddy" on host "imap.src.fr" to the
imap account "max" on host "imap.dest.fr" (the passwords are located in
two files "/etc/secret1" for "buddy", "/etc/secret2" for "max"):
To synchronize the imap account "buddy" (with password "secret1") on
host "imap.src.fr" to the imap account "max" (with password "secret2")
on host "imap.dest.fr":
imapsync --host1 imap.src.fr --user1 buddy --passfile1 /etc/secret1 \
--host2 imap.dest.fr --user2 max --passfile2 /etc/secret2
imapsync --host1 imap.src.fr --user1 buddy --password1 secret1 \
--host2 imap.dest.fr --user2 max --password2 secret2
Then, you will have max's mailbox updated from buddy's mailbox.
Then you will have max's mailbox updated from buddy's mailbox.
SECURITY
You can use --password1 instead of --passfile1 to give the password but
it is dangerous because any user on your host can see the password by
using the 'ps auxwwww' command. Using a variable (like $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.
You can use --passfile1 instead of --password1 to give the password
since it is safer. With --password1 option any user on your host can see
the password by using the 'ps auxwwww' command. Using a variable (like
$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.
imasync is not totally protected against sniffers on the network since
passwords may be transferred in plain text if CRAM-MD5 is not supported
@ -377,5 +377,5 @@ SIMILAR SOFTWARES
Feedback (good or bad) will always be welcome.
$Id: imapsync,v 1.327 2010/07/12 00:23:02 gilles Exp gilles $
$Id: imapsync,v 1.331 2010/07/13 23:28:59 gilles Exp gilles $

1
TIME
View File

@ -1,3 +1,4 @@
120 W3C validation of web site
120 --pidfile option. die_clean() exit_clean()
120 reconnect counter, --debugimap1 --debugimap2
50 FAQ tested "From " removing solution.

6
TODO
View File

@ -1,5 +1,5 @@
#!/bin/cat
# $Id: TODO,v 1.77 2010/07/12 00:13:15 gilles Exp gilles $
# $Id: TODO,v 1.78 2010/07/14 13:37:02 gilles Exp gilles $
TODO file for imapsync
----------------------
@ -21,6 +21,10 @@ Evaluate
http://www.rackspace.com/apps/email_hosting/migrations
http://www.yippiemove.com/
DONE. Bugfix. Duplicate messages on host2 are not deleted with --delete2
Reason: "Skipping msg #120:508 in host2 folder INBOX.2005-INBOX (duplicate so we ignore this message)"
Add NTLM authentification support
http://cpansearch.perl.org/src/BUZZ/NTLM-1.05/NTLM.pm
http://curl.haxx.se/rfc/ntlm.html

View File

@ -1 +1 @@
1.327
1.331

141
imapsync
View File

@ -9,7 +9,7 @@ tool. Synchronise mailboxes between two imap servers. Good
at IMAP migration. More than 32 different IMAP server softwares
supported with success.
$Revision: 1.327 $
$Revision: 1.331 $
=head1 INSTALL
@ -141,22 +141,21 @@ While working on imapsync parameters please run imapsync in
dry mode (no modification induced) with the --dry
option. Nothing bad can be done this way.
To synchronize the imap account "buddy" on host
"imap.src.fr" to the imap account "max" on host
"imap.dest.fr" (the passwords are located in two files
"/etc/secret1" for "buddy", "/etc/secret2" for "max"):
To synchronize the imap account "buddy" (with password "secret1")
on host "imap.src.fr" to the imap account "max" (with password "secret2")
on host "imap.dest.fr":
imapsync --host1 imap.src.fr --user1 buddy --passfile1 /etc/secret1 \
--host2 imap.dest.fr --user2 max --passfile2 /etc/secret2
imapsync --host1 imap.src.fr --user1 buddy --password1 secret1 \
--host2 imap.dest.fr --user2 max --password2 secret2
Then, you will have max's mailbox updated from buddy's
Then you will have max's mailbox updated from buddy's
mailbox.
=head1 SECURITY
You can use --password1 instead of --passfile1 to give the
password but it is dangerous because any user on your host
can see the password by using the 'ps auxwwww'
You can use --passfile1 instead of --password1 to give the
password since it is safer. With --password1 option any user
on your host can see the password by using the 'ps auxwwww'
command. Using a variable (like $PASSWORD1) is also
dangerous because of the 'ps auxwwwwe' command. So, saving
the password in a well protected file (600 or rw-------) is
@ -435,7 +434,7 @@ Entries for imapsync:
Feedback (good or bad) will always be welcome.
$Id: imapsync,v 1.327 2010/07/12 00:23:02 gilles Exp gilles $
$Id: imapsync,v 1.331 2010/07/13 23:28:59 gilles Exp gilles $
=cut
@ -492,8 +491,9 @@ my(
$mess_size_total_skipped,
$mess_size_total_error,
$mess_trans, $mess_skipped, $mess_skipped_dry,
$h1_mess_duplicate, $h1_mess_size_total_duplicate,
$h1_mess_deleted, $h2_mess_deleted,
$timeout, # whr (ESS/PRW)
$timeout,
$timestart, $timeend, $timediff,
$timesize, $timebefore,
$ssl1, $ssl2,
@ -507,10 +507,7 @@ my(
$tmpdir,
);
use vars qw ($opt_G); # missing code for this will be option.
$rcs = '$Id: imapsync,v 1.327 2010/07/12 00:23:02 gilles Exp gilles $ ';
$rcs = '$Id: imapsync,v 1.331 2010/07/13 23:28:59 gilles Exp gilles $ ';
$rcs =~ m/,v (\d+\.\d+)/;
$VERSION = ($1) ? $1: "UNKNOWN";
@ -521,7 +518,7 @@ $mess_size_total_skipped = 0;
$mess_size_total_error = 0;
$mess_trans = $mess_skipped = $mess_skipped_dry = 0;
$h1_mess_deleted = $h2_mess_deleted = 0;
$h1_mess_duplicate = $h1_mess_size_total_duplicate = 0;
sub check_lib_version {
@ -575,8 +572,8 @@ while (@argv_copy) {
my $banner_imapsync = join("",
'$RCSfile: imapsync,v $ ',
'$Revision: 1.327 $ ',
'$Date: 2010/07/12 00:23:02 $ ',
'$Revision: 1.331 $ ',
'$Date: 2010/07/13 23:28:59 $ ',
"\n",localhost_info(), "\n",
"Command line used:\n",
"$0 @argv_nopassord\n",
@ -669,6 +666,9 @@ $port2 ||= (defined $ssl2 && !defined $tls2) ? 993 : 143;
$debugimap1 = $debugimap2 = 1 if ($debugimap);
# By default, don't take size to compare
$skipsize = (defined $skipsize) ? $skipsize : 1;
sub connect_imap {
my($host, $port, $debugimap, $ssl, $tls) = @_;
my $imap = Mail::IMAPClient->new();
@ -1684,14 +1684,22 @@ FOLDER: foreach my $h1_fold (@h1_folders) {
}
last FOLDER if $imap1->IsUnconnected();
my @h1_msgs_duplicate;
foreach my $m (@h1_msgs) {
my $rc = parse_header_msg1($imap1, $m, $h1_heads, $h1_fir, "F", \%h1_hash);
if (!$rc) {
my $reason = !defined($rc) ? "no header" : "duplicate";
my $rc = parse_header_msg($imap1, $m, $h1_heads, $h1_fir, "F", \%h1_hash);
if (! defined($rc)) {
my $h1_size = $h1_fir->{$m}->{"RFC822.SIZE"} || 0;
print "+ Skipping msg #$m:$h1_size in folder $h1_fold ($reason so we ignore this message)\n";
print "+ Skipping msg #$m:$h1_size on host1 folder $h1_fold (no header so we ignore this message)\n";
$mess_size_total_skipped += $h1_size;
$mess_skipped += 1;
} elsif(0 == $rc) {
# duplicate
push(@h1_msgs_duplicate, $m);
# duplicate, same id same size?
my $h1_size = $h1_fir->{$m}->{"RFC822.SIZE"} || 0;
$h1_mess_size_total_duplicate += $h1_size;
$h1_mess_duplicate += 1;
}
}
$debug and print "Time parsing headers on host1: ", timenext(), " s\n";
@ -1707,14 +1715,16 @@ FOLDER: foreach my $h1_fold (@h1_folders) {
if (@h2_msgs);
$debug and print "Time fir: ", timenext(), " s\n";
last FOLDER if $imap2->IsUnconnected();
my @h2_msgs_duplicate;
foreach my $m (@h2_msgs) {
my $rc = parse_header_msg1($imap2, $m, $h2_heads, $h2_fir, "T", \%h2_hash);
if (!$rc) {
my $reason = !defined($rc) ? "no header" : "duplicate";
my $rc = parse_header_msg($imap2, $m, $h2_heads, $h2_fir, "T", \%h2_hash);
if (! defined($rc)) {
my $h2_size = $h2_fir->{$m}->{"RFC822.SIZE"} || 0;
print "+ Skipping msg #$m:$h2_size in host2 folder $h2_fold ($reason so we ignore this message)\n";
#$mess_size_total_skipped += $msize;
#$mess_skipped += 1;
print "+ Skipping msg #$m:$h2_size in host2 folder $h2_fold (no header so we ignore this message)\n";
} elsif(0 == $rc) {
# duplicate
push(@h2_msgs_duplicate, $m);
}
}
$debug and print "Time parsing headers on host2: ", timenext(), " s\n";
@ -1732,7 +1742,7 @@ FOLDER: foreach my $h1_fold (@h1_folders) {
if($delete2) {
my @expunge;
my @h2_expunge;
foreach my $m_id (@h2_hash_keys_sorted_by_uid) {
#print "$m_id ";
unless (exists($h1_hash{$m_id})) {
@ -1741,22 +1751,29 @@ FOLDER: foreach my $h1_fold (@h1_folders) {
my $isdel = $h2_flags =~ /\B\\Deleted\b/ ? 1 : 0;
print "deleting message [$m_id] #$h2_msg in host2 folder $h2_fold\n"
if ! $isdel;
push(@expunge,$h2_msg) if $uidexpunge2;
push(@h2_expunge, $h2_msg) if $uidexpunge2;
unless ($dry or $isdel) {
$imap2->delete_message($h2_msg);
$h2_mess_deleted += 1;
last FOLDER if $imap2->IsUnconnected();
}
}
}
foreach my $h2_msg (@h2_msgs_duplicate) {
print "deleting message [duplicate] #$h2_msg in host2 folder $h2_fold\n";
push(@h2_expunge, $h2_msg) if $uidexpunge2;
unless ($dry) {
$imap2->delete_message($h2_msg);
$h2_mess_deleted += 1;
}
}
my $cnt = scalar @expunge;
if(@expunge and !$imap2->can("uidexpunge")) {
my $cnt = scalar @h2_expunge;
if(@h2_expunge and !$imap2->can("uidexpunge")) {
warn "uidexpunge not supported (< IMAPClient 3.17)\n";
}
elsif(@expunge) {
elsif(@h2_expunge) {
print "uidexpunge $cnt message(s)\n";
$imap2->uidexpunge(\@expunge) if !$dry;
$imap2->uidexpunge(\@h2_expunge) if !$dry;
}
}
@ -1923,7 +1940,7 @@ Bye.'
$h1_flags = flags_filter($h1_flags, $permanentflags2) if ($permanentflags2);
my $new_id;
print "flags from: [$h1_flags][$d]\n";
print "flags & date from: [$h1_flags][$d]\n";
last FOLDER if $imap1->IsUnconnected();
last FOLDER if $imap2->IsUnconnected();
unless ($dry) {
@ -2032,18 +2049,11 @@ Bye.'
# print "!!! Dates differ !!!\n";
#}
};
unless (($h1_size == $h2_size) or $skipsize) {
unless ($skipsize or ($h1_size == $h2_size)) {
# Bad size
print
"Message $m_id SZ_BAD f:$h1_msg:$h1_size t:$h2_msg:$h2_size\n";
# delete in host2 and recopy ?
# NO recopy CODE HERE. to be written if needed.
$error++;
if ($opt_G){
print "Deleting msg f:#$h2_msg in host2 folder $h2_fold\n";
$imap2->delete_message($h2_msg) unless ($dry);
last FOLDER if $imap2->IsUnconnected();
}
}
else {
# Good
@ -2054,9 +2064,7 @@ Bye.'
unless($dry) {
$imap1->delete_message($h1_msg);
$h1_mess_deleted += 1;
last FOLDER if $imap1->IsUnconnected();
$imap1->expunge() if ($expunge);
last FOLDER if $imap1->IsUnconnected();
}
}
}
@ -2161,20 +2169,22 @@ sub select_msgs {
sub stats {
print "++++ Statistics ++++\n";
print "Time : $timediff sec\n";
print "Messages transferred : $mess_trans ";
print "Time : $timediff sec\n";
print "Messages transferred : $mess_trans ";
print "(could be $mess_skipped_dry without dry mode)" if ($dry);
print "\n";
print "Messages skipped : $mess_skipped\n";
print "Messages deleted on host1: $h1_mess_deleted\n";
print "Messages deleted on host2: $h2_mess_deleted\n";
print "Total bytes transferred : $mess_size_total_trans\n";
print "Total bytes skipped : $mess_size_total_skipped\n";
print "Total bytes error : $mess_size_total_error\n";
print "Messages skipped : $mess_skipped\n";
print "Messages duplicate on host1 : $h1_mess_duplicate\n";
print "Messages deleted on host1 : $h1_mess_deleted\n";
print "Messages deleted on host2 : $h2_mess_deleted\n";
print "Total bytes transferred : $mess_size_total_trans\n";
print "Total bytes duplicate host1 : $h1_mess_size_total_duplicate\n";
print "Total bytes skipped : $mess_size_total_skipped\n";
print "Total bytes error : $mess_size_total_error\n";
$timediff ||= 1; # No division per 0
printf ("Average bandwidth rate : %.1f KiB/s\n", $mess_size_total_trans / 1024 / $timediff);
print "Reconnections to host1 : $host1_reconnect_count\n";
print "Reconnections to host2 : $host2_reconnect_count\n";
printf ("Average bandwidth rate : %.1f KiB/s\n", $mess_size_total_trans / 1024 / $timediff);
print "Reconnections to host1 : $host1_reconnect_count\n";
print "Reconnections to host2 : $host2_reconnect_count\n";
print "Detected $error errors\n\n";
print thank_author();
}
@ -2322,7 +2332,7 @@ sub load_modules {
sub parse_header_msg1 {
sub parse_header_msg {
my ($imap, $m_uid, $s_heads, $s_fir, $s, $s_hash) = @_;
my $head = $s_heads->{$m_uid};
@ -2529,7 +2539,8 @@ Several options are mandatory.
Ex: Message-ID or Subject or Date.
--useheader <string> and this one, etc.
--skipsize : Don't take message size into account to compare
messages on both sides.
messages on both sides. On by default.
Use --no-skipsize for using size comparaison.
--allowsizemismatch : allow RFC822.SIZE != fetched msg size
consider also --skipsize to avoid duplicate messages
when running syncs more than one time per mailbox
@ -2570,12 +2581,12 @@ Several options are mandatory.
Example: to synchronise imap account "foo" on "imap.truc.org"
to imap account "bar" on "imap.trac.org"
with foo password stored in /etc/secret1
and bar password stored in /etc/secret2
with foo password "secret1"
and bar password "secret2"
$0 \\
--host1 imap.truc.org --user1 foo --passfile1 /etc/secret1 \\
--host2 imap.trac.org --user2 bar --passfile2 /etc/secret2
--host1 imap.truc.org --user1 foo --password1 secret1 \\
--host2 imap.trac.org --user2 bar --password2 secret2
$localhost_info
$rcs

View File

@ -5,7 +5,7 @@
<title>imapsync</title>
<meta name="generator" content="Bluefish 1.0.7"/>
<meta name="author" content="Gilles LAMIRAL"/>
<meta name="date" content="2010-07-11T21:37:45+0200"/>
<meta name="date" content="2010-07-14T15:55:32+0200"/>
<meta name="copyright" content="None"/>
<meta name="keywords" content="imap, transfert, migration"/>
<meta name="description" content="imap migration tool"/>
@ -32,29 +32,56 @@ src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
<h2>What is imapsync?</h2>
<b>imapsync</b> software is a command line tool allowing incremental and
<p><b>imapsync</b> software is a command line tool allowing incremental and
recursive <b>imap</b> transfers from one mailbox to another.
</p>
<h2>AUTHOR</h2>
<p>Gilles LAMIRAL<br/>
Email: <b>lamiral@linux-france.org</b></p>
<p>Feedback good or bad is often welcome.</p>
<p>A good place to talk about imapsync is the public
imapsync mailing-list (see below).</p>
<p>Gilles LAMIRAL earns his living writing, installing, configuring and
teaching free, open and gratis softwares. Do not hesitate to pay him for
that services.</p>
<p>If you <b>use imapsync</b> as a <b>professionnal worker</b> you may
<b><a href="http://www.linux-france.org/prj/imapsync_list/msg00470.html">read this call</a></b>
for feedback.
</p>
<h2>imapsync donation</h2>
<p>Happy with this <b>free</b>, <b>open</b> and <b>gratis</b> software?<br/></p>
<p>Help the author to maintain imapsync and support users:</p>
Help the author to maintain imapsync and support users:
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_s-xclick">
<p>
<input type="hidden" name="cmd" value="_s-xclick"/>
<input type="hidden" name="encrypted" value="-----BEGIN PKCS7-----MIIHNwYJKoZIhvcNAQcEoIIHKDCCByQCAQExggEwMIIBLAIBADCBlDCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20CAQAwDQYJKoZIhvcNAQEBBQAEgYCLqDFNLHWLnXOTR6fg5I/197IlWQ3GWa5cEph059d7/DGlRks59x3ehGkOe07+JrJBdmNmz7UnDGEFpaY4N+aum6pt+SB6tRGsGFpvqbaS7PTxH4unt4P02ekxl+sMSsCDRpTON5EqZDu/u59XpftzuzESOKxYi5QqyP0nKtXa9TELMAkGBSsOAwIaBQAwgbQGCSqGSIb3DQEHATAUBggqhkiG9w0DBwQIgQDw/j9EPAyAgZCurQXtibGHD+s+xFdIWW93rzpNFjoV+nWclf2nsMhu5g7lT4fIIEzeJc29zuAzY+ySQKZxoKYZKYAjKRteDnCytBmcrz0/+C1VmxLWjweZA5NQQhys6uqCMkYj/iNsRodsBtlCeg8jYoSZM64gdWfoQahOzzdA0oOWXF1j9kYFmqoyQDQU2cS97ZezbXlo7migggOHMIIDgzCCAuygAwIBAgIBADANBgkqhkiG9w0BAQUFADCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20wHhcNMDQwMjEzMTAxMzE1WhcNMzUwMjEzMTAxMzE1WjCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMFHTt38RMxLXJyO2SmS+Ndl72T7oKJ4u4uw+6awntALWh03PewmIJuzbALScsTS4sZoS1fKciBGoh11gIfHzylvkdNe/hJl66/RGqrj5rFb08sAABNTzDTiqqNpJeBsYs/c2aiGozptX2RlnBktH+SUNpAajW724Nv2Wvhif6sFAgMBAAGjge4wgeswHQYDVR0OBBYEFJaffLvGbxe9WT9S1wob7BDWZJRrMIG7BgNVHSMEgbMwgbCAFJaffLvGbxe9WT9S1wob7BDWZJRroYGUpIGRMIGOMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxFDASBgNVBAoTC1BheVBhbCBJbmMuMRMwEQYDVQQLFApsaXZlX2NlcnRzMREwDwYDVQQDFAhsaXZlX2FwaTEcMBoGCSqGSIb3DQEJARYNcmVAcGF5cGFsLmNvbYIBADAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4GBAIFfOlaagFrl71+jq6OKidbWFSE+Q4FqROvdgIONth+8kSK//Y/4ihuE4Ymvzn5ceE3S/iBSQQMjyvb+s2TWbQYDwcp129OPIbD9epdr4tJOUNiSojw7BHwYRiPh58S1xGlFgHFXwrEBb3dgNbMUa+u4qectsMAXpVHnD9wIyfmHMYIBmjCCAZYCAQEwgZQwgY4xCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLUGF5UGFsIEluYy4xEzARBgNVBAsUCmxpdmVfY2VydHMxETAPBgNVBAMUCGxpdmVfYXBpMRwwGgYJKoZIhvcNAQkBFg1yZUBwYXlwYWwuY29tAgEAMAkGBSsOAwIaBQCgXTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0xMDAxMTIwNDU1MTJaMCMGCSqGSIb3DQEJBDEWBBRqMaroJyi3sCMzp13JlujgbHO7pzANBgkqhkiG9w0BAQEFAASBgLajMBwporC1VxI+HKolT50xvSy38NG7f0TaYG964GZDF0snOlZRr5Is0k3fp/nZxgK1vIn7gmfkR9rrz09bIriyPrU4SJ1lgbFv4r/c7Bg22bMdbjJsgMVEaPin+3Kz1W2v90TkNGRx7LaMhJVKoDzTdVBXXU45sxfTlOkXCej+-----END PKCS7-----
">
<input type="image" src="https://www.paypal.com/en_US/i/btn/btn_donateCC_LG_global.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online.">
<img alt="" border="0" src="https://www.paypal.com/fr_FR/i/scr/pixel.gif" width="1" height="1">
"/>
<input type="image" src="https://www.paypal.com/en_US/i/btn/btn_donateCC_LG_global.gif" name="submit" alt="PayPal"/>
<img alt="" src="https://www.paypal.com/fr_FR/i/scr/pixel.gif" width="1" height="1"/>
</p>
</form>
<p>
Or offer him a book on his
<a href="http://www.amazon.com/gp/registry/wishlist/1C9UNDIH3P7R7/"><b>wishlist</b></a><br>
<a href="http://www.amazon.com/gp/registry/wishlist/1C9UNDIH3P7R7/"><b>wishlist</b></a><br/>
<b><i>Thanks in advance!</i></b>
<b><i>Thanks in advance!</i></b></p>
<h2><a href="VERSION">Latest release
<h2><a href="imapsync">Latest release
<!--#exec cmd="cat VERSION" -->
(<!--#flastmod file="imapsync" -->)
</a></h2>
<p>See <a href="ChangeLog">ChangeLog</a> to know what's new.</p>
<h2><a href="dist/?M=D">imapsync download</a></h2>
<h2><a href="INSTALL">imapsync installation</a></h2>
@ -65,40 +92,78 @@ Or offer him a book on his
<h2>MAILING-LIST</h2>
The public mailing-list may be the best way to get support.<br>
<p>
The public mailing-list may be the best way to get support.<br/>
</p>
<p>
To <b>write</b> on the mailing-list, the address is:
<b>imapsync@linux-france.org</b><br>
<b>imapsync@linux-france.org</b><br/>
</p>
<p>
To <b>subscribe</b>, send a message to:
<b>imapsync-subscribe@listes.linux-france.org</b><br>
<b>imapsync-subscribe@listes.linux-france.org</b><br/>
</p>
<p>
To <b>unsubscribe</b>, send a message to:
<b>imapsync-unsubscribe@listes.linux-france.org</b><br>
<b>imapsync-unsubscribe@listes.linux-france.org</b><br/>
</p>
<p>
To <b>contact</b> the person in charge for the list:
<b>imapsync-request@listes.linux-france.org</b><br>
<b>imapsync-request@listes.linux-france.org</b><br/>
</p>
<p>
The <b>list archives</b> may be available at
<a href="http://www.linux-france.org/prj/imapsync_list/">
http://linux-france.org/prj/imapsync_list/</a><br>
So consider that the list is public, anyone can see your post.
Use a pseudonym or do not post to
this list if you want to stay private.<br>
http://linux-france.org/prj/imapsync_list/</a><br/>
So consider that the list is public, anyone can see your post.<br/>
<i>Use a pseudonym or do not post to
this list if you want to stay private</i>.<br/>
<b>Thank you for your participation!</b>
</p>
<p>
<b>Thank you for your participation!</b>
</p>
<h2><a href="TODO">TODO</a></h2>
<p>I code new features for free when I have time and when I find it useful.<br/>
If you really want a feature you can donate money and I'll code it.<br/>
</p>
<p>Some features and their time/money to be done evaluation</p>
<table cellpadding="10" cellspacing="0" border="1">
<tr align="right"><th>Feature </th><th>Time guessed</th><th>Time spent</th><th>Money received</th><th>Money still needed</th></tr>
<tr align="right"><td>Speedup 50% </td><td>10 hours </td><td>0 </td><td>0 $ </td><td>300 $ </td></tr>
<tr align="right"><td>Backup to files</td><td> 8 hours </td><td>60 min </td><td>0 $ </td><td>240 $ </td></tr>
<tr align="right"><td>--deletefolder2</td><td> 3 hours </td><td>30 min </td><td>0 $ </td><td> 90 $ </td></tr>
<tr align="right"><td>NTLM auth </td><td> 3 hours </td><td>60 min </td><td>0 $ </td><td> 90 $ </td></tr>
</table>
<h2><a href="COPYING">COPYING</a></h2>
<h2><a href="ChangeLog">ChangeLog</a></h2>
<h2><a href="CREDITS">CREDITS</a></h2>
<hr/>
<p>
<a href="http://validator.w3.org/check?uri=referer"><img
src="http://www.w3.org/Icons/valid-xhtml10"
alt="Valid XHTML 1.0 Strict" height="31" width="88" /></a>
<!--#config timefmt="%D" -->
<!--#config timefmt="%A %B %d, %Y" -->
This document last modified <!--#echo var="LAST_MODIFIED" -->
This document last modified <!--#echo var="LAST_MODIFIED" --> <br/>
$Id: index.shtml,v 1.9 2010/07/14 13:56:44 gilles Exp gilles $
</p>
</body>
</html>