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 #!/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: 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. 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 Bertrand STERN
Contributed by giving money 100 USD Contributed by giving money 100 USD

View file

@ -1,17 +1,41 @@
RCS file: RCS/imapsync,v RCS file: RCS/imapsync,v
Working file: imapsync Working file: imapsync
head: 1.327 head: 1.331
branch: branch:
locks: strict locks: strict
gilles: 1.327 gilles: 1.331
access list: access list:
symbolic names: symbolic names:
keyword substitution: kv keyword substitution: kv
total revisions: 327; selected revisions: 327 total revisions: 331; selected revisions: 331
description: 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 date: 2010/07/12 00:23:02; author: gilles; state: Exp; lines: +7 -5
Good exit at the end. 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 TARGET=imapsync
@ -129,7 +129,7 @@ clean_dist:
.PHONY: lfo lfo_upload niouze_lfo niouze_fm public .PHONY: lfo lfo_upload niouze_lfo niouze_fm public
lfo: dist lfo_upload niouze_lfo lfo: dist niouze_lfo lfo_upload
lfo_upload: lfo_upload:
rsync -avH --delete . \ rsync -avH --delete . \

28
README
View file

@ -3,7 +3,7 @@ NAME
Synchronise mailboxes between two imap servers. Good at IMAP migration. Synchronise mailboxes between two imap servers. Good at IMAP migration.
More than 32 different IMAP server softwares supported with success. More than 32 different IMAP server softwares supported with success.
$Revision: 1.327 $ $Revision: 1.331 $
INSTALL INSTALL
imapsync works fine under any Unix OS with perl. 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 modification induced) with the --dry option. Nothing bad can be done
this way. this way.
To synchronize the imap account "buddy" on host "imap.src.fr" to the To synchronize the imap account "buddy" (with password "secret1") on
imap account "max" on host "imap.dest.fr" (the passwords are located in host "imap.src.fr" to the imap account "max" (with password "secret2")
two files "/etc/secret1" for "buddy", "/etc/secret2" for "max"): on host "imap.dest.fr":
imapsync --host1 imap.src.fr --user1 buddy --passfile1 /etc/secret1 \ imapsync --host1 imap.src.fr --user1 buddy --password1 secret1 \
--host2 imap.dest.fr --user2 max --passfile2 /etc/secret2 --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 SECURITY
You can use --password1 instead of --passfile1 to give the password but You can use --passfile1 instead of --password1 to give the password
it is dangerous because any user on your host can see the password by since it is safer. With --password1 option any user on your host can see
using the 'ps auxwwww' command. Using a variable (like $PASSWORD1) is the password by using the 'ps auxwwww' command. Using a variable (like
also dangerous because of the 'ps auxwwwwe' command. So, saving the $PASSWORD1) is also dangerous because of the 'ps auxwwwwe' command. So,
password in a well protected file (600 or rw-------) is the best saving the password in a well protected file (600 or rw-------) is the
solution. best solution.
imasync is not totally protected against sniffers on the network since imasync is not totally protected against sniffers on the network since
passwords may be transferred in plain text if CRAM-MD5 is not supported 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. 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 --pidfile option. die_clean() exit_clean()
120 reconnect counter, --debugimap1 --debugimap2 120 reconnect counter, --debugimap1 --debugimap2
50 FAQ tested "From " removing solution. 50 FAQ tested "From " removing solution.

6
TODO
View file

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

View file

@ -5,7 +5,7 @@
<title>imapsync</title> <title>imapsync</title>
<meta name="generator" content="Bluefish 1.0.7"/> <meta name="generator" content="Bluefish 1.0.7"/>
<meta name="author" content="Gilles LAMIRAL"/> <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="copyright" content="None"/>
<meta name="keywords" content="imap, transfert, migration"/> <meta name="keywords" content="imap, transfert, migration"/>
<meta name="description" content="imap migration tool"/> <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> <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. 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> <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"> <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="hidden" name="encrypted" value="-----BEGIN PKCS7-----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-----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."> <input type="image" src="https://www.paypal.com/en_US/i/btn/btn_donateCC_LG_global.gif" name="submit" alt="PayPal"/>
<img alt="" border="0" src="https://www.paypal.com/fr_FR/i/scr/pixel.gif" width="1" height="1"> <img alt="" src="https://www.paypal.com/fr_FR/i/scr/pixel.gif" width="1" height="1"/>
</p>
</form> </form>
<p>
Or offer him a book on his 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" --> <!--#exec cmd="cat VERSION" -->
(<!--#flastmod file="imapsync" -->) (<!--#flastmod file="imapsync" -->)
</a></h2> </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="dist/?M=D">imapsync download</a></h2>
<h2><a href="INSTALL">imapsync installation</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> <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: 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: 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: 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: 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 The <b>list archives</b> may be available at
<a href="http://www.linux-france.org/prj/imapsync_list/"> <a href="http://www.linux-france.org/prj/imapsync_list/">
http://linux-france.org/prj/imapsync_list/</a><br> http://linux-france.org/prj/imapsync_list/</a><br/>
So consider that the list is public, anyone can see your post. So consider that the list is public, anyone can see your post.<br/>
Use a pseudonym or do not post to <i>Use a pseudonym or do not post to
this list if you want to stay private.<br> 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> <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="COPYING">COPYING</a></h2>
<h2><a href="ChangeLog">ChangeLog</a></h2> <h2><a href="ChangeLog">ChangeLog</a></h2>
<h2><a href="CREDITS">CREDITS</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="%D" -->
<!--#config timefmt="%A %B %d, %Y" --> <!--#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> </body>
</html> </html>