This commit is contained in:
Nick Bebout 2011-03-12 02:44:17 +00:00
parent 0620694153
commit e47a98b809
5 changed files with 130 additions and 18 deletions

View file

@ -1,17 +1,21 @@
RCS file: RCS/imapsync,v RCS file: RCS/imapsync,v
Working file: imapsync Working file: imapsync
head: 1.136 head: 1.137
branch: branch:
locks: strict locks: strict
gilles: 1.136
access list: access list:
symbolic names: symbolic names:
keyword substitution: kv keyword substitution: kv
total revisions: 136; selected revisions: 136 total revisions: 137; selected revisions: 137
description: description:
---------------------------- ----------------------------
revision 1.136 locked by: gilles; revision 1.137
date: 2005/06/26 03:08:35; author: gilles; state: Exp; lines: +22 -11
Added --fastio1 --fastio2 options.
Fixed bad variable declaration with --maxage.
----------------------------
revision 1.136
date: 2005/06/23 02:24:19; author: gilles; state: Exp; lines: +42 -29 date: 2005/06/23 02:24:19; author: gilles; state: Exp; lines: +42 -29
Fixed --maxsize --skipsize bug Fixed --maxsize --skipsize bug
---------------------------- ----------------------------

4
README
View file

@ -2,7 +2,7 @@ NAME
imapsync - IMAP synchronization, copy or migration tool. Synchronize imapsync - IMAP synchronization, copy or migration tool. Synchronize
mailboxes between two imap servers. Good at IMAP migration. mailboxes between two imap servers. Good at IMAP migration.
$Revision: 1.136 $ $Revision: 1.137 $
INSTALL INSTALL
imapsync works fine under any Unix OS. imapsync works fine under any Unix OS.
@ -254,5 +254,5 @@ AUTHOR
teaching free open and gratis softwares. Don't hesitate to pay him for teaching free open and gratis softwares. Don't hesitate to pay him for
that services. that services.
$Id: imapsync,v 1.136 2005/06/23 02:24:19 gilles Exp gilles $ $Id: imapsync,v 1.137 2005/06/26 03:08:35 gilles Exp $

View file

@ -1 +1 @@
1.136 1.137

View file

@ -6,7 +6,7 @@ imapsync - IMAP synchronization, copy or migration
tool. Synchronize mailboxes between two imap servers. Good tool. Synchronize mailboxes between two imap servers. Good
at IMAP migration. at IMAP migration.
$Revision: 1.136 $ $Revision: 1.137 $
=head1 INSTALL =head1 INSTALL
@ -296,7 +296,7 @@ Gilles LAMIRAL earn his living writing, installing,
configuring and teaching free open and gratis configuring and teaching free open and gratis
softwares. Don't hesitate to pay him for that services. softwares. Don't hesitate to pay him for that services.
$Id: imapsync,v 1.136 2005/06/23 02:24:19 gilles Exp gilles $ $Id: imapsync,v 1.137 2005/06/26 03:08:35 gilles Exp $
=cut =cut
@ -319,6 +319,7 @@ my(
@folder, $include, $exclude, $prefix2, $regextrans2, @regexmess, @folder, $include, $exclude, $prefix2, $regextrans2, @regexmess,
$sep1, $sep2, $sep1, $sep2,
$syncinternaldates, $syncacls, $syncinternaldates, $syncacls,
$fastio1, $fastio2,
$maxsize, $maxage, $maxsize, $maxage,
$skipheader, @useheader, $skipheader, @useheader,
$skipsize, $foldersizes, $buffersize, $skipsize, $foldersizes, $buffersize,
@ -335,13 +336,12 @@ my(
$timeout, # whr (ESS/PRW) $timeout, # whr (ESS/PRW)
$timestart, $timeend, $timediff, $timestart, $timeend, $timediff,
$timesize, $timebefore, $timesize, $timebefore,
); );
use vars qw ($opt_G); # missing code for this will be option. use vars qw ($opt_G); # missing code for this will be option.
$rcs = ' $Id: imapsync,v 1.136 2005/06/23 02:24:19 gilles Exp gilles $ '; $rcs = ' $Id: imapsync,v 1.137 2005/06/26 03:08:35 gilles Exp $ ';
$rcs =~ m/,v (\d+\.\d+)/; $rcs =~ m/,v (\d+\.\d+)/;
$VERSION = ($1) ? $1 : "UNKNOWN"; $VERSION = ($1) ? $1 : "UNKNOWN";
@ -378,8 +378,8 @@ $error=0;
my $banner = join("", my $banner = join("",
'$RCSfile: imapsync,v $ ', '$RCSfile: imapsync,v $ ',
'$Revision: 1.136 $ ', '$Revision: 1.137 $ ',
'$Date: 2005/06/23 02:24:19 $ ', '$Date: 2005/06/26 03:08:35 $ ',
"\n", "\n",
"Mail::IMAPClient version used here is ", "Mail::IMAPClient version used here is ",
$VERSION_IMAPClient,"\n" $VERSION_IMAPClient,"\n"
@ -411,6 +411,10 @@ $authmd5 = (defined($authmd5)) ? $authmd5 : 1;
$syncacls = (defined($syncacls)) ? $syncacls : 0; $syncacls = (defined($syncacls)) ? $syncacls : 0;
$foldersizes = (defined($foldersizes)) ? $foldersizes : 1; $foldersizes = (defined($foldersizes)) ? $foldersizes : 1;
$fastio1 = (defined($fastio1)) ? $fastio1 : 1;
$fastio2 = (defined($fastio2)) ? $fastio2 : 1;
@useheader = ("ALL") unless (@useheader); @useheader = ("ALL") unless (@useheader);
print "From imap server [$host1] port [$port1] user [$user1]\n"; print "From imap server [$host1] port [$port1] user [$user1]\n";
@ -442,8 +446,8 @@ my $authmech = "CRAM-MD5";
$timestart = time(); $timestart = time();
$timebefore = $timestart; $timebefore = $timestart;
my $fastio1 = 1; $fastio1 = 1;
my $fastio2 = 1; $fastio2 = 1;
$debugimap and print "From connection\n"; $debugimap and print "From connection\n";
$from = login_imap($host1, $port1, $user1, $password1, $debugimap, $timeout, $fastio1); $from = login_imap($host1, $port1, $user1, $password1, $debugimap, $timeout, $fastio1);
@ -616,7 +620,8 @@ sub foldersizes {
# The pb is fetch_hash() can only be applied on ALL messages # The pb is fetch_hash() can only be applied on ALL messages
my @msgs = $imap->since(time - 86400 * $maxage); my @msgs = $imap->since(time - 86400 * $maxage);
my $smess = scalar(@msgs); $smess = scalar(@msgs);
#print "maxage smess $smess " ;
foreach my $m (@msgs) { foreach my $m (@msgs) {
my $s = $imap->size($m) my $s = $imap->size($m)
or warn "Could not find size of message $m: $@\n"; or warn "Could not find size of message $m: $@\n";
@ -626,7 +631,9 @@ sub foldersizes {
my $hashref = {}; my $hashref = {};
$smess = $imap->message_count(); $smess = $imap->message_count();
unless ($smess == 0) { unless ($smess == 0) {
$imap->fetch_hash("RFC822.SIZE",$hashref); #$imap->Ranges(1);
$imap->fetch_hash("RFC822.SIZE",$hashref) or die "$@";
#$imap->Ranges(0);
#print map {$hashref->{$_}->{"RFC822.SIZE"}, " "} keys %$hashref; #print map {$hashref->{$_}->{"RFC822.SIZE"}, " "} keys %$hashref;
map {$stot += $hashref->{$_}->{"RFC822.SIZE"}} keys %$hashref; map {$stot += $hashref->{$_}->{"RFC822.SIZE"}} keys %$hashref;
} }
@ -1015,8 +1022,10 @@ sub get_options
"skipheader=s" => \$skipheader, "skipheader=s" => \$skipheader,
"useheader=s" => \@useheader, "useheader=s" => \@useheader,
"skipsize!" => \$skipsize, "skipsize!" => \$skipsize,
"fastio1!" => \$fastio1,
"fastio2!" => \$fastio2,
); );
$debug and print "get options: [$opt_ret]\n"; $debug and print "get options: [$opt_ret]\n";
# just the version # just the version
@ -1168,6 +1177,8 @@ Several options are mandatory.
information. information.
--justfolders : just do things about folders (ignore messages). --justfolders : just do things about folders (ignore messages).
--fast : be faster (does not sync flags). --fast : be faster (does not sync flags).
--nofastio1 : don't use fastio with the "from" server.
--nofastio2 : don't use fastio with the "destination" server.
--timeout <int> : imap connect timeout. --timeout <int> : imap connect timeout.
--help : print this. --help : print this.

View file

@ -0,0 +1,97 @@
--- imapsync.orig Tue Jun 14 23:28:32 2005
+++ imapsync Wed Jun 15 14:04:14 2005
@@ -318,7 +318,7 @@
$user1, $user2, $password1, $password2, $passfile1, $passfile2,
@folder, $include, $exclude, $prefix2, $regextrans2, @regexmess,
$sep1, $sep2,
- $syncinternaldates, $syncacls,
+ $syncinternaldates, $syncacls, $syncuids,
$maxsize, $maxage,
$skipheader, @useheader,
$skipsize, $foldersizes, $buffersize,
@@ -410,6 +410,7 @@
$authmd5 = (defined($authmd5)) ? $authmd5 : 1;
$syncacls = (defined($syncacls)) ? $syncacls : 0;
+$syncuids = (defined($syncuids)) ? $syncuids : 0;
$foldersizes = (defined($foldersizes)) ? $foldersizes : 1;
@useheader = ("ALL") unless (@useheader);
@@ -661,7 +662,8 @@
# needed for setting flags
my $tohasuidplus = $to->has_capability("UIDPLUS");
-
+die("Need UIDPLUS on destination server to synchronize UIDs\n")
+ if ($syncuids && !$tohasuidplus);
print
"From folders : ", map("[$_] ",@f_folders),"\n",
@@ -788,7 +790,7 @@
print "Time sizes : ", timenext(), " s\n";
#my $f_flags = $from->flags(@f_msgs) ;
#print "Time flags : ", timenext(), " s\n";
- use Data::Dumper;
+ #use Data::Dumper;
#print Data::Dumper->Dump([$f_heads]);
#print Data::Dumper->Dump([$f_flags]);
@@ -821,6 +823,7 @@
#print map { $f_hash{$_}{'m'} . " "} @f_hash_keys_sorted_by_uid;
+ my $last_uid = 0;
MESS: foreach my $m_id (@f_hash_keys_sorted_by_uid) {
my $f_size = $f_hash{$m_id}{'s'};
my $f_msg = $f_hash{$m_id}{'m'};
@@ -835,6 +838,21 @@
print "+ NO msg #$f_msg [$m_id] in $t_fold\n";
# copy
print "+ Copying msg #$f_msg:$f_size to folder $t_fold\n";
+ while ($syncuids && !$dry && $last_uid < $f_msg - 1) {
+ my $new_id = $to->append_string($t_fold,
+ "From: imapsync\r\n".
+ "Subject: deleted message\r\n".
+ "\r\n".
+ "This message has been deleted.\r\n");
+ if ($new_id) {
+ warn "Inserted padding message #$new_id\n";
+ $to->delete_message($new_id);
+ $last_uid = $new_id;
+ } else {
+ warn "Failed to insert padding message\n";
+ last;
+ }
+ }
my $string = $from->message_string($f_msg);
foreach my $regexmess (@regexmess) {
$debug and print "eval \$string =~ $regexmess\n";
@@ -883,6 +901,11 @@
print "Copied msg id [$f_msg] to folder $t_fold msg id [$new_id]\n";
$mess_size_total_trans += $f_size;
$mess_trans += 1;
+ $last_uid = $new_id;
+ if ($syncuids && $last_uid != $f_msg) {
+ # not much we can do about this...
+ warn "Couldn't preserve message UID\n";
+ }
}
}
next MESS;
@@ -1002,6 +1025,7 @@
"delete!" => \$delete,
"syncinternaldates!" => \$syncinternaldates,
"syncacls!" => \$syncacls,
+ "syncuids!" => \$syncuids,
"maxsize=i" => \$maxsize,
"maxage=i" => \$maxage,
"buffersize=i" => \$buffersize,
@@ -1156,6 +1180,8 @@
--justconnect. Turned on by default.
--syncacls : Synchronizes acls.
--nosyncacls : Does not synchronize acls. This is the default.
+--syncuids : Synchronizes UIDs.
+--nosyncuids : Does not synchronize UIDs. This is the default.
--debug : debug mode.
--debugimap : imap debug mode.
--version : print sotfware version.