mirror of
https://github.com/imapsync/imapsync.git
synced 2025-06-08 21:54:31 +02:00
1.331
This commit is contained in:
parent
dd1d8ce6e9
commit
9372de1698
9 changed files with 227 additions and 110 deletions
14
CREDITS
14
CREDITS
|
@ -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
|
||||||
|
|
||||||
|
|
32
ChangeLog
32
ChangeLog
|
@ -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.
|
||||||
----------------------------
|
----------------------------
|
||||||
|
|
4
Makefile
4
Makefile
|
@ -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
28
README
|
@ -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
1
TIME
|
@ -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
6
TODO
|
@ -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
|
||||||
|
|
2
VERSION
2
VERSION
|
@ -1 +1 @@
|
||||||
1.327
|
1.331
|
||||||
|
|
123
imapsync
123
imapsync
|
@ -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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2166,9 +2174,11 @@ sub stats {
|
||||||
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 "Messages deleted on host2 : $h2_mess_deleted\n";
|
||||||
print "Total bytes transferred : $mess_size_total_trans\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 skipped : $mess_size_total_skipped\n";
|
||||||
print "Total bytes error : $mess_size_total_error\n";
|
print "Total bytes error : $mess_size_total_error\n";
|
||||||
$timediff ||= 1; # No division per 0
|
$timediff ||= 1; # No division per 0
|
||||||
|
@ -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
|
||||||
|
|
109
index.shtml
109
index.shtml
|
@ -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-----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-----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>
|
Loading…
Add table
Add a link
Reference in a new issue