This commit is contained in:
Nick Bebout 2011-03-12 02:44:13 +00:00
parent b17d465c3e
commit f6f2c48fa4
7 changed files with 595 additions and 13 deletions

10
CREDITS
View file

@ -1,5 +1,15 @@
#!/bin/cat #!/bin/cat
Dan Wang
Gave "Novell NetMail and Novell Groupwise"
Reported bug Novell NetMail flags undef
Per olof Ljungmark
Gave
"Netscape Messaging Server 4.15 Patch 7 (built Sep 12 2001))
Cyrus IMAP4 v2.2.10"
Harald A. Irmer Harald A. Irmer
Huge migration with mbox format pb. Huge migration with mbox format pb.
Several problems. Several problems.

View file

@ -1,15 +1,24 @@
RCS file: RCS/imapsync,v RCS file: RCS/imapsync,v
Working file: imapsync Working file: imapsync
head: 1.121 head: 1.123
branch: branch:
locks: strict locks: strict
access list: access list:
symbolic names: symbolic names:
keyword substitution: kv keyword substitution: kv
total revisions: 121; selected revisions: 121 total revisions: 123; selected revisions: 123
description: description:
---------------------------- ----------------------------
revision 1.123
date: 2005/03/19 04:25:46; author: gilles; state: Exp; lines: +17 -6
Added check about flags undef
Bug reported from Novell NetMail by Dan Wang
----------------------------
revision 1.122
date: 2005/03/19 04:11:33; author: gilles; state: Exp; lines: +8 -6
Updated Success stories
----------------------------
revision 1.121 revision 1.121
date: 2005/02/01 04:03:30; author: gilles; state: Exp; lines: +7 -5 date: 2005/02/01 04:03:30; author: gilles; state: Exp; lines: +7 -5
Added links imapcopy and migrationtool Added links imapcopy and migrationtool

8
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.121 $ $Revision: 1.123 $
INSTALL INSTALL
imapsync works fine under any Unix OS. imapsync works fine under any Unix OS.
@ -165,7 +165,8 @@ IMAP SERVERS
- CommunicatePro server (Redhat 8.0) - CommunicatePro server (Redhat 8.0)
- Courier IMAP 1.5.1, 2.2.0, 2.1.1, 2.2.1 - Courier IMAP 1.5.1, 2.2.0, 2.1.1, 2.2.1
- Critical Path (7.0.020) - Critical Path (7.0.020)
- Cyrus IMAP 1.5, 1.6, 2.1, 2.1.15, 2.1.16, 2.2.1, Cyrus 2.2.2-BETA. - Cyrus IMAP 1.5, 1.6, 2.1, 2.1.15, 2.1.16,
2.2.1, 2.2.2-BETA, 2.2.10
- DBMail 1.2.1 - DBMail 1.2.1
- Dovecot 0.99.10.4 - Dovecot 0.99.10.4
- Domino (Notes) 6.5, 5.0.6 - Domino (Notes) 6.5, 5.0.6
@ -174,6 +175,7 @@ IMAP SERVERS
- MDaemon 7.0.1 - MDaemon 7.0.1
- MS Exchange Server 5.5 - MS Exchange Server 5.5
- Netscape Mail Server 3.6 (Wintel !) - Netscape Mail Server 3.6 (Wintel !)
- Netscape Messaging Server 4.15 Patch 7
- OpenWave - OpenWave
- Qualcomm Worldmail (NT) - Qualcomm Worldmail (NT)
- SunONE Messaging server 5.2, 6.0 (SUN JES - Java Enterprise System) - SunONE Messaging server 5.2, 6.0 (SUN JES - Java Enterprise System)
@ -242,5 +244,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.121 2005/02/01 04:03:30 gilles Exp $ $Id: imapsync,v 1.123 2005/03/19 04:25:46 gilles Exp $

13
TODO
View file

@ -1,6 +1,19 @@
TODO file for imapsync TODO file for imapsync
---------------------- ----------------------
Read:
http://www.washington.edu/imap/documentation/commndmt.txt.html
Talk about :
"I think notes is right but MS Eudora is bad with dates.
(netscape or thunderbird is ok with dates)
use the option --syncinternaldates "
Add usage about --regextrans2
To remove INBOX. in the name of destination folders :
--regextrans2 's/^INBOX\.(.+)/$1/'
Add cyrus link about INBOX. namespace Add cyrus link about INBOX. namespace
http://asg.web.cmu.edu/cyrus/download/imapd/altnamespace.html http://asg.web.cmu.edu/cyrus/download/imapd/altnamespace.html

View file

@ -1 +1 @@
1.121 1.123

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.121 $ $Revision: 1.123 $
=head1 INSTALL =head1 INSTALL
@ -190,7 +190,8 @@ Success stories reported (softwares in alphabetic order) :
- CommunicatePro server (Redhat 8.0) - CommunicatePro server (Redhat 8.0)
- Courier IMAP 1.5.1, 2.2.0, 2.1.1, 2.2.1 - Courier IMAP 1.5.1, 2.2.0, 2.1.1, 2.2.1
- Critical Path (7.0.020) - Critical Path (7.0.020)
- Cyrus IMAP 1.5, 1.6, 2.1, 2.1.15, 2.1.16, 2.2.1, Cyrus 2.2.2-BETA. - Cyrus IMAP 1.5, 1.6, 2.1, 2.1.15, 2.1.16,
2.2.1, 2.2.2-BETA, 2.2.10
- DBMail 1.2.1 - DBMail 1.2.1
- Dovecot 0.99.10.4 - Dovecot 0.99.10.4
- Domino (Notes) 6.5, 5.0.6 - Domino (Notes) 6.5, 5.0.6
@ -199,6 +200,7 @@ Success stories reported (softwares in alphabetic order) :
- MDaemon 7.0.1 - MDaemon 7.0.1
- MS Exchange Server 5.5 - MS Exchange Server 5.5
- Netscape Mail Server 3.6 (Wintel !) - Netscape Mail Server 3.6 (Wintel !)
- Netscape Messaging Server 4.15 Patch 7
- OpenWave - OpenWave
- Qualcomm Worldmail (NT) - Qualcomm Worldmail (NT)
- SunONE Messaging server 5.2, 6.0 (SUN JES - Java Enterprise System) - SunONE Messaging server 5.2, 6.0 (SUN JES - Java Enterprise System)
@ -284,7 +286,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.121 2005/02/01 04:03:30 gilles Exp $ $Id: imapsync,v 1.123 2005/03/19 04:25:46 gilles Exp $
=cut =cut
@ -327,7 +329,7 @@ my(
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.121 2005/02/01 04:03:30 gilles Exp $ '; $rcs = ' $Id: imapsync,v 1.123 2005/03/19 04:25:46 gilles Exp $ ';
$rcs =~ m/,v (\d+\.\d+)/; $rcs =~ m/,v (\d+\.\d+)/;
$VERSION = ($1) ? $1 : "UNKNOWN"; $VERSION = ($1) ? $1 : "UNKNOWN";
@ -364,8 +366,8 @@ $error=0;
my $banner = join("", my $banner = join("",
'$RCSfile: imapsync,v $ ', '$RCSfile: imapsync,v $ ',
'$Revision: 1.121 $ ', '$Revision: 1.123 $ ',
'$Date: 2005/02/01 04:03:30 $ ', '$Date: 2005/03/19 04:25:46 $ ',
"\n", "\n",
"Mail::IMAPClient version used here is ", "Mail::IMAPClient version used here is ",
$VERSION_IMAPClient, " auth md5 : $md5_supported", $VERSION_IMAPClient, " auth md5 : $md5_supported",
@ -803,7 +805,18 @@ FOLDER: foreach my $f_fold (@f_folders) {
$debug and print "internal date from 1: [$d]\n"; $debug and print "internal date from 1: [$d]\n";
} }
my $flags_f = join(" ", @{$from->flags($f_msg)}); my $flags_f_rv = $from->flags($f_msg);
my @flags_f;
my $flags_f;
if (ref($flags_f_rv)) {
@flags_f = @{$flags_f_rv};
$flags_f = join(" ", @flags_f);
}else{
$flags_f = "";
}
#$flags_f = join(" ", @{$from->flags($f_msg)});
# RFC 2060 : This flag can not be altered by the client # RFC 2060 : This flag can not be altered by the client
$flags_f =~ s@\\Recent@@g; $flags_f =~ s@\\Recent@@g;

View file

@ -0,0 +1,535 @@
--- imapsync.orig 2005-02-11 14:27:53.508176000 -0600
+++ imapsync 2005-02-14 11:39:31.241157000 -0600
@@ -1,6 +1,6 @@
#!/usr/bin/perl -w
-=head1 NAME
+=head1 NAME
imapsync - IMAP synchronization, copy or migration
tool. Synchronize mailboxes between two imap servers. Good
@@ -35,9 +35,9 @@
imapsync
imapsync [--host1 server1] [--port1 <num>]
- [--user1 <string>] [--passfile1 <string>]
+ [--user1 <string>] [--passfile1 <string>]
[--host2 server2] [--port2 <num>]
- [--user2 <string>] [--passfile2 <string>]
+ [--user2 <string>] [--passfile2 <string>]
[--folder <string> --folder <string> ...]
[--include <regex>] [--exclude <regex>]
[--prefix2 <string>]
@@ -55,14 +55,14 @@
[--debug] [--debugimap]
[--timeout <int>]
[--version] [--help]
-
+
=cut
# comment
=pod
=head1 DESCRIPTION
-The command imapsync is a tool allowing incremental and recursive
+The command imapsync is a tool allowing incremental and recursive
imap transfer from one mailbox to another.
We sometimes need to transfer mailboxes from one imap server to
@@ -133,10 +133,10 @@
imapsync will exit with a 0 status (return code) if everything went good.
Otherwise, it exits with a non-zero status.
-So if you have a buggy internet connection, you can use this loop
+So if you have a buggy internet connection, you can use this loop
in a Bourne shell:
- while ! imapsync ...; do
+ while ! imapsync ...; do
echo imapsync not complete
done
@@ -184,7 +184,7 @@
=head1 IMAP SERVERS
-Success stories reported (softwares in alphabetic order) :
+Success stories reported (softwares in alphabetic order) :
- BincImap 1.2.3
- CommunicatePro server (Redhat 8.0)
@@ -223,7 +223,7 @@
=head1 HUGE MIGRATION
-Have a special attention on options
+Have a special attention on options
--subscribed
--subscribe
--delete
@@ -244,7 +244,7 @@
And the shell program is just :
-{ while IFS=';' read u1 p1 u2 p2; do
+{ while IFS=';' read u1 p1 u2 p2; do
imapsync --user1 $u1 --password1 $p1 --user2 $u2 --password2 $p2 ...
done ; } < file.csv
@@ -266,7 +266,7 @@
mailsync : http://mailsync.sourceforge.net/
imapxfer : http://www.washington.edu/imap/
part of the imap-utils from UW.
- mailutil : replace imapxfer in
+ mailutil : replace imapxfer in
part of the imap-utils from UW.
http://www.gsp.com/cgi-bin/man.cgi?topic=mailutil
imaprepl : http://www.bl0rg.net/software/
@@ -308,10 +308,10 @@
$syncinternaldates, $syncacls,
$maxsize, $maxage,
$skipheader, $skipsize, $foldersizes,
- $delete, $expunge, $dry,
+ $delete, $expunge, $dry,
$authmd5,
$subscribed, $subscribe,
- $version, $VERSION, $help,
+ $version, $VERSION, $help,
$justconnect, $justfolders,
$fast,
$mess_size_total_trans,
@@ -321,6 +321,7 @@
$timeout, # whr (ESS/PRW)
$timestart, $timeend, $timediff,
$timesize, $timebefore,
+ $verbose, $justcopy
);
@@ -362,7 +363,7 @@
$error=0;
-my $banner = join("",
+my $banner = join("",
'$RCSfile: imapsync,v $ ',
'$Revision: 1.121 $ ',
'$Date: 2005/02/01 04:03:30 $ ',
@@ -426,7 +427,7 @@
$to = login_imap($host2, $port2, $user2, $password2, $debugimap, $timeout);
sub login_imap {
- my($host, $port, $user, $password,
+ my($host, $port, $user, $password,
$debugimap, $timeout, $authmech) = @_;
my $imap = Mail::IMAPClient->new();
$imap->Server($host);
@@ -461,12 +462,12 @@
print "$authmech not wanted by you\n";
return;
}
- if ($imap->has_capability($authmech)
+ if ($imap->has_capability($authmech)
or $imap->has_capability("AUTH=$authmech")) {
- print "Server [", $imap->Server,
+ print "Server [", $imap->Server,
"] has capability $authmech\n";
}else{
- print "Server [", $imap->Server,
+ print "Server [", $imap->Server,
"] has NOT capability $authmech\n";
return;
}
@@ -520,7 +521,7 @@
@t_folders = sort @{$to->folders()};
-my($f_sep,$t_sep);
+my($f_sep,$t_sep);
# what are the private folders separators for each server ?
@@ -543,8 +544,8 @@
$sep_out = $imap->separator();
return($sep_out);
}else{
- print
- "No NAMESPACE capability in imap server ",
+ print
+ "No NAMESPACE capability in imap server ",
$imap->Server(),"\n",
"Give the separator caracter with the $sep_opt option\n";
exit(1);
@@ -555,7 +556,7 @@
print "From separator : [$f_sep]\n";
print "To separator : [$t_sep]\n";
-if ($foldersizes) {
+if (!$justcopy and $foldersizes) {
my $tot = 0;
my $tmess = 0;
print "++++ Calculating sizes ++++\n";
@@ -564,7 +565,7 @@
my $smess = 0;
printf("From Folder %-25s", "[$f_fold]");
unless ($from->select($f_fold)) {
- warn
+ warn
"From Folder $f_fold : Could not select ",
$from->LastError, "\n";
$error++;
@@ -616,11 +617,11 @@
-print
+print
"From folders : ", map("[$_] ",@f_folders),"\n",
"To folders : ", map("[$_] ",@t_folders),"\n";
-print
+print
"From subscribed folders : ", map("[$_] ", sort keys(%fs_folders)), "\n";
sub separator_invert {
@@ -654,14 +655,14 @@
print "To Folder [$t_fold]\n";
unless ($from->select($f_fold)) {
- warn
+ warn
"From Folder $f_fold : Could not select ",
$from->LastError, "\n";
$error++;
next FOLDER;
}
- unless ($to->exists($t_fold) or $to->select($t_fold)) {
+ unless ($to->exists($t_fold) or $to->select($t_fold)) {
print "To Folder $t_fold does not exist\n";
print "Creating folder [$t_fold]\n";
unless ($dry){
@@ -675,9 +676,9 @@
next FOLDER;
}
}
-
- unless ($to->select($t_fold)) {
- warn
+
+ unless ($to->select($t_fold)) {
+ warn
"To Folder $t_fold : Could not select ",
$to->LastError, "\n";
$error++;
@@ -708,6 +709,7 @@
}
}
}
+ print "Time folders: ", timenext(), " s\n";
next FOLDER if ($justfolders);
@@ -725,6 +727,7 @@
$from->Clear(1);
$to->Clear(1);
+ print "Time query: ", timenext(), " s\n";
print "From Buffer I/O : ", $from->Buffer(), "\n";
print "To Buffer I/O : ", $to->Buffer(), "\n";
@@ -733,49 +736,55 @@
# print "From Buffer I/O : ", $from->Buffer(), "\n";
# print "To Buffer I/O : ", $to->Buffer(), "\n";
- print "++++ From Parse 1 ++++\n";
-
- my $f_heads = $from->parse_headers([@f_msgs],"ALL") if (@f_msgs) ;
- print "Time headers: ", timenext(), " s\n";
- my $f_size = $from->fetch_hash("RFC822.SIZE") if (@f_msgs);
- print "Time sizes : ", timenext(), " s\n";
- #my $f_flags = $from->flags(@f_msgs) ;
- #print "Time flags : ", timenext(), " s\n";
- use Data::Dumper;
- #print Data::Dumper->Dump([$f_heads]);
- #print Data::Dumper->Dump([$f_flags]);
-
- #exit;
- foreach my $m (@f_msgs) {
- parse_header_msg1($m, $f_heads, $f_size, "F", \%f_hash);
- }
- print "Time headers: ", timenext(), " s\n";
-
- print "\n++++ To Parse 1 ++++\n";
- my $t_heads = $to->parse_headers([@t_msgs],"ALL") if (@t_msgs);
- print "Time headers: ", timenext(), " s\n";
- my $t_size = $to->fetch_hash("RFC822.SIZE") if (@t_msgs);
- print "Time sizes : ", timenext(), " s\n";
- #my $t_flags = $to->flags(@t_msgs) ;
- #print "Time flags : ", timenext(), " s\n";
-
- foreach my $m (@t_msgs) {
- parse_header_msg1($m, $t_heads, $t_size, "T", \%t_hash);
- }
- print "Time headers: ", timenext(), " s\n";
- #exit;
-
- print "\n++++ Verifying ++++\n";
- # messages in "from" that are not good in "to"
-
- my @f_hash_keys_sorted_by_uid
- = sort {$f_hash{$a}{'m'} <=> $f_hash{$b}{'m'}} keys(%f_hash);
-
- #print map { $f_hash{$_}{'m'} . " "} @f_hash_keys_sorted_by_uid;
-
- 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'};
+ # Define f_hash_keys_sorted_by_uid outside of if statement to keep
+ # Perl happy
+ my @f_hash_keys_sorted_by_uid = ();
+ if ($justcopy) {
+ print "++++ Copying ++++\n";
+ } else {
+ print "++++ From Parse 1 ++++\n";
+
+ my $f_heads = $from->parse_headers([@f_msgs],"ALL") if (@f_msgs) ;
+ print "Time headers: ", timenext(), " s\n";
+ my $f_size = $from->fetch_hash("RFC822.SIZE") if (@f_msgs);
+ print "Time sizes : ", timenext(), " s\n";
+ #my $f_flags = $from->flags(@f_msgs) ;
+ #print "Time flags : ", timenext(), " s\n";
+ use Data::Dumper;
+ #print Data::Dumper->Dump([$f_heads]);
+ #print Data::Dumper->Dump([$f_flags]);
+
+ #exit;
+ foreach my $m (@f_msgs) {
+ parse_header_msg1($m, $f_heads, $f_size, "F", \%f_hash);
+ }
+ print "Time headers: ", timenext(), " s\n";
+
+ print "\n++++ To Parse 1 ++++\n";
+ my $t_heads = $to->parse_headers([@t_msgs],"ALL") if (@t_msgs);
+ print "Time headers: ", timenext(), " s\n";
+ my $t_size = $to->fetch_hash("RFC822.SIZE") if (@t_msgs);
+ print "Time sizes : ", timenext(), " s\n";
+ #my $t_flags = $to->flags(@t_msgs) ;
+ #print "Time flags : ", timenext(), " s\n";
+
+ foreach my $m (@t_msgs) {
+ parse_header_msg1($m, $t_heads, $t_size, "T", \%t_hash);
+ }
+ print "Time headers: ", timenext(), " s\n";
+ #exit;
+
+ print "\n++++ Verifying ++++\n";
+ # messages in "from" that are not good in "to"
+ @f_hash_keys_sorted_by_uid
+ = sort {$f_hash{$a}{'m'} <=> $f_hash{$b}{'m'}} keys(%f_hash);
+
+ #print map { $f_hash{$_}{'m'} . " "} @f_hash_keys_sorted_by_uid;
+ }
+
+ MESS: foreach my $m_id ($justcopy ? @f_msgs : @f_hash_keys_sorted_by_uid) {
+ my $f_size = $justcopy ? 0 : $f_hash{$m_id}{'s'};
+ my $f_msg = $justcopy ? $m_id : $f_hash{$m_id}{'m'};
# print ".";
if (defined $maxsize and $f_size > $maxsize) {
print "+ Skipping msg #$f_msg:$f_size in folder $f_fold (exceeds maxsize limit $maxsize bytes)\n";
@@ -783,10 +792,10 @@
next MESS;
}
$debug and print "+ key $m_id #$f_msg\n";
- unless (exists($t_hash{$m_id})) {
- print "+ NO msg #$f_msg [$m_id] in $t_fold\n";
+ unless (!$justcopy and exists($t_hash{$m_id})) {
+ $verbose and print "+ NO msg #$f_msg [$m_id] in $t_fold\n";
# copy
- print "+ Copying msg #$f_msg:$f_size to folder $t_fold\n";
+ $verbose and print "+ Copying msg #$f_msg:$f_size to folder $t_fold\n";
my $string = $from->message_string($f_msg);
while (my $regexmess = shift(@regexmess)) {
$debug and print "eval \$string =~ $regexmess\n";
@@ -809,7 +818,7 @@
$flags_f =~ s@\\Recent@@g;
my $new_id;
- print "flags from : [$flags_f][$d]\n";
+ $verbose and print "flags from : [$flags_f][$d]\n";
unless ($dry) {
unless($new_id = $to->append_string($t_fold,$string, $flags_f, $d)){
warn "Couldn't append msg #$f_msg (Subject:[".$from->subject($f_msg)."]) to folder $t_fold: ",
@@ -820,9 +829,9 @@
}else{
# good
- # $new_id is an id if the IMAP server has the
+ # $new_id is an id if the IMAP server has the
# UIDPLUS capability else just a ref
- print "Copied msg id [$f_msg] to folder $t_fold msg id [$new_id]\n";
+ $verbose and print "Copied msg id [$f_msg] to folder $t_fold msg id [$new_id]\n";
$mess_size_total_trans += $f_size;
$mess_trans += 1;
}
@@ -834,12 +843,12 @@
$mess_skipped += 1;
}
- $fast and next MESS;
- #$debug and print "MESSAGE $m_id\n";
+ ($fast or $justcopy) and next MESS;
+ #$debug and print "MESSAGE $m_id\n";
my $t_size = $t_hash{$m_id}{'s'};
my $t_msg = $t_hash{$m_id}{'m'};
- $debug and print "Setting flags\n";
+ $debug and print "Setting flags\n";
my (@flags_f,@flags_t);
my $flags_f_rv = $from->flags($f_msg);
@flags_f = @{$flags_f_rv} if ref($flags_f_rv);
@@ -852,16 +861,16 @@
my $flags_t_rv = $to->flags($t_msg);
@flags_t = @{$flags_t_rv} if ref($flags_t_rv);
- $debug and print
+ $debug and print
"flags from : @flags_f\n",
"flags to : @flags_t\n";
$debug and do {
- print "Looking dates\n";
+ print "Looking dates\n";
my $d_f = $from->internaldate($f_msg);
my $d_t = $to->internaldate($t_msg);
- print
+ print
"idate from : $d_f\n",
"idate to : $d_t\n";
#unless ($d_f eq $d_t) {
@@ -870,7 +879,7 @@
};
unless ($f_size == $t_size) {
# Bad size
- print
+ print
"Message $m_id SZ_BAD f:$f_msg:$f_size t:$t_msg:$t_size\n";
# delete in to and recopy ?
# NO recopy CODE HERE. to be written if needed.
@@ -880,17 +889,17 @@
$to->delete_message($t_msg) unless ($dry);
}
}else {
- # Good
+ # Good
$debug and print
"Message $m_id SZ_GOOD f:$f_msg:$f_size t:$t_msg:$t_size\n";
if($delete) {
- print "Deleting msg #$f_msg in folder $f_fold\n";
+ $verbose and print "Deleting msg #$f_msg in folder $f_fold\n";
$from->delete_message($f_msg) unless ($dry);
$from->expunge() if ($expunge and not $dry);
}
}
}
-print "Time : ", timenext(), " s\n";
+ print "Time : ", timenext(), " s\n";
}
$timeend = time();
@@ -959,6 +968,8 @@
"timeout=i" => \$timeout,
"skipheader=s" => \$skipheader,
"skipsize!" => \$skipsize,
+ "verbose!" => \$verbose,
+ "justcopy!" => \$justcopy,
);
$debug and print "get options: [$opt_ret]\n";
@@ -1020,7 +1031,7 @@
my $headstr;
$debug and print "Head NUM:", scalar(keys(%$head)), "\n";
# no header -> return
- return unless(scalar(keys(%$head)));
+ return unless(scalar(keys(%$head)));
foreach my $h (sort keys(%$head)){
foreach my $val (sort @{$head->{$h}}) {
# no 8-bit data in headers !
@@ -1050,12 +1061,12 @@
my($file) = @_;
my $line = "";
-
+
open FILE, $file or die("$! $file");
chomp($line = <FILE>);
close FILE;
$line = ($line) ? $line : "!EMPTY! $file";
- return $line;
+ return $line;
}
sub usage {
@@ -1063,7 +1074,7 @@
usage: $0 [options]
-Several options are mandatory.
+Several options are mandatory.
--host1 <string> : "from" imap server. Mandatory.
--port1 <int> : port to connect. Default is 143.
@@ -1085,7 +1096,7 @@
--exclude <regex> : skip folders matching this regular expression
(only effective if neither --folder nor --subscribed
is specified)
---prefix2 <string> : add prefix to all destination folders
+--prefix2 <string> : add prefix to all destination folders
(usually INBOX. for cyrus imap servers)
--regextrans2 <regex> : Apply the whole regex to each destination folders.
--regexmess <regex> : Apply the whole regex to each message before transfer.
@@ -1101,7 +1112,7 @@
are not really deleted. See expunge.
--expunge : expunge messages on source account.
expunge really deletes messages marked deleted.
- expunge is made at the begining on the
+ expunge is made at the begining on the
source server only. newly transfered messages
are expunged if option --expunge is given.
no expunge is done on destination account but
@@ -1110,12 +1121,12 @@
--maxsize <int> : skip messages larger than <int> bytes
--maxage <int> : skip messages older than <int> days.
final stats (skipped) don't count older messages
---skipheader <regex> : Don't take into account header keyword
+--skipheader <regex> : Don't take into account header keyword
matching <string> ex: --skipheader 'X.*'
--skipsize : Don't take message size into account.
--dry : do nothing, just print what would be done.
--subscribed : transfer only subscribed folders.
---subscribe : subscribe to the folders transfered on the
+--subscribe : subscribe to the folders transfered on the
"destination" server that are subscribed
on the "source" server.
--(no)foldersizes : Calculate the size of each "From" folder in bytes
@@ -1125,12 +1136,17 @@
--debug : debug mode.
--debugimap : imap debug mode.
--version : print sotfware version.
---justconnect : just connect to both servers and print useful
+--justconnect : just connect to both servers and print useful
information.
--justfolders : just do things about folders (ignore messages).
--fast : be faster.
--timeout <int> : imap connect timeout.
--help : print this.
+--verbose : print info for each message transferred.
+--justcopy : only copy messages. Implies nofoldersizes, fast and
+ nomaxsize. No synchronization, might create duplicate
+ messages. Ment to be used for fast migration of
+ messages to new (empty) IMAP accounts.
Example: to synchronise imap account "foo" on "imap.truc.org"
to imap account "bar" on "imap.trac.org"