mirror of
https://github.com/imapsync/imapsync.git
synced 2024-11-16 15:52:47 +01:00
1.331
This commit is contained in:
parent
dd1d8ce6e9
commit
9372de1698
14
CREDITS
14
CREDITS
@ -1,5 +1,5 @@
|
||||
#!/bin/cat
|
||||
# $Id: CREDITS,v 1.140 2010/07/12 00:19:09 gilles Exp gilles $
|
||||
# $Id: CREDITS,v 1.141 2010/07/14 13:52:04 gilles Exp gilles $
|
||||
|
||||
If you want to make a donation to the author, Gilles LAMIRAL:
|
||||
|
||||
@ -20,6 +20,18 @@ to remove one.
|
||||
|
||||
I thank very much all of these people.
|
||||
|
||||
David Osbo
|
||||
Contributed by giving the book
|
||||
15.61 "The Complete Idiot's Guide to Conversational Sign Language Illustrated"
|
||||
|
||||
|
||||
Jeroen Ticheler
|
||||
Contributed by giving the book
|
||||
23.77 "Maps of Narrative Practice"
|
||||
|
||||
Korey Kwilinski
|
||||
Contributed by giving money 20 USD
|
||||
|
||||
Bertrand STERN
|
||||
Contributed by giving money 100 USD
|
||||
|
||||
|
32
ChangeLog
32
ChangeLog
@ -1,17 +1,41 @@
|
||||
|
||||
RCS file: RCS/imapsync,v
|
||||
Working file: imapsync
|
||||
head: 1.327
|
||||
head: 1.331
|
||||
branch:
|
||||
locks: strict
|
||||
gilles: 1.327
|
||||
gilles: 1.331
|
||||
access list:
|
||||
symbolic names:
|
||||
keyword substitution: kv
|
||||
total revisions: 327; selected revisions: 327
|
||||
total revisions: 331; selected revisions: 331
|
||||
description:
|
||||
----------------------------
|
||||
revision 1.327 locked by: gilles;
|
||||
revision 1.331 locked by: gilles;
|
||||
date: 2010/07/13 23:28:59; author: gilles; state: Exp; lines: +6 -6
|
||||
default values for h1_mess_duplicate h1_mess_size_total_duplicate
|
||||
----------------------------
|
||||
revision 1.330
|
||||
date: 2010/07/13 03:44:36; author: gilles; state: Exp; lines: +56 -36
|
||||
Bugfix. Duplicate messages on host2 were not deleted with --delete2
|
||||
----------------------------
|
||||
revision 1.329
|
||||
date: 2010/07/12 23:28:00; author: gilles; state: Exp; lines: +13 -21
|
||||
--skipsize turned on by default.
|
||||
Why? all examples on internet use --skipsize.
|
||||
imapsync can not change buggy imp servers.
|
||||
|
||||
Useless code cleanup.
|
||||
----------------------------
|
||||
revision 1.328
|
||||
date: 2010/07/12 22:49:23; author: gilles; state: Exp; lines: +18 -19
|
||||
Changed basic documention:
|
||||
- examples with --password1 instead of --passfile1
|
||||
Why? all exemples on internet use --password1 so users
|
||||
use --password1 even I've never told them to do so.
|
||||
Usability fix.
|
||||
----------------------------
|
||||
revision 1.327
|
||||
date: 2010/07/12 00:23:02; author: gilles; state: Exp; lines: +7 -5
|
||||
Good exit at the end.
|
||||
----------------------------
|
||||
|
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
|
||||
|
||||
@ -129,7 +129,7 @@ clean_dist:
|
||||
|
||||
.PHONY: lfo lfo_upload niouze_lfo niouze_fm public
|
||||
|
||||
lfo: dist lfo_upload niouze_lfo
|
||||
lfo: dist niouze_lfo lfo_upload
|
||||
|
||||
lfo_upload:
|
||||
rsync -avH --delete . \
|
||||
|
28
README
28
README
@ -3,7 +3,7 @@ NAME
|
||||
Synchronise mailboxes between two imap servers. Good at IMAP migration.
|
||||
More than 32 different IMAP server softwares supported with success.
|
||||
|
||||
$Revision: 1.327 $
|
||||
$Revision: 1.331 $
|
||||
|
||||
INSTALL
|
||||
imapsync works fine under any Unix OS with perl.
|
||||
@ -122,22 +122,22 @@ EXAMPLE
|
||||
modification induced) with the --dry option. Nothing bad can be done
|
||||
this way.
|
||||
|
||||
To synchronize the imap account "buddy" on host "imap.src.fr" to the
|
||||
imap account "max" on host "imap.dest.fr" (the passwords are located in
|
||||
two files "/etc/secret1" for "buddy", "/etc/secret2" for "max"):
|
||||
To synchronize the imap account "buddy" (with password "secret1") on
|
||||
host "imap.src.fr" to the imap account "max" (with password "secret2")
|
||||
on host "imap.dest.fr":
|
||||
|
||||
imapsync --host1 imap.src.fr --user1 buddy --passfile1 /etc/secret1 \
|
||||
--host2 imap.dest.fr --user2 max --passfile2 /etc/secret2
|
||||
imapsync --host1 imap.src.fr --user1 buddy --password1 secret1 \
|
||||
--host2 imap.dest.fr --user2 max --password2 secret2
|
||||
|
||||
Then, you will have max's mailbox updated from buddy's mailbox.
|
||||
Then you will have max's mailbox updated from buddy's mailbox.
|
||||
|
||||
SECURITY
|
||||
You can use --password1 instead of --passfile1 to give the password but
|
||||
it is dangerous because any user on your host can see the password by
|
||||
using the 'ps auxwwww' command. Using a variable (like $PASSWORD1) is
|
||||
also dangerous because of the 'ps auxwwwwe' command. So, saving the
|
||||
password in a well protected file (600 or rw-------) is the best
|
||||
solution.
|
||||
You can use --passfile1 instead of --password1 to give the password
|
||||
since it is safer. With --password1 option any user on your host can see
|
||||
the password by using the 'ps auxwwww' command. Using a variable (like
|
||||
$PASSWORD1) is also dangerous because of the 'ps auxwwwwe' command. So,
|
||||
saving the password in a well protected file (600 or rw-------) is the
|
||||
best solution.
|
||||
|
||||
imasync is not totally protected against sniffers on the network since
|
||||
passwords may be transferred in plain text if CRAM-MD5 is not supported
|
||||
@ -377,5 +377,5 @@ SIMILAR SOFTWARES
|
||||
|
||||
Feedback (good or bad) will always be welcome.
|
||||
|
||||
$Id: imapsync,v 1.327 2010/07/12 00:23:02 gilles Exp gilles $
|
||||
$Id: imapsync,v 1.331 2010/07/13 23:28:59 gilles Exp gilles $
|
||||
|
||||
|
1
TIME
1
TIME
@ -1,3 +1,4 @@
|
||||
120 W3C validation of web site
|
||||
120 --pidfile option. die_clean() exit_clean()
|
||||
120 reconnect counter, --debugimap1 --debugimap2
|
||||
50 FAQ tested "From " removing solution.
|
||||
|
6
TODO
6
TODO
@ -1,5 +1,5 @@
|
||||
#!/bin/cat
|
||||
# $Id: TODO,v 1.77 2010/07/12 00:13:15 gilles Exp gilles $
|
||||
# $Id: TODO,v 1.78 2010/07/14 13:37:02 gilles Exp gilles $
|
||||
|
||||
TODO file for imapsync
|
||||
----------------------
|
||||
@ -21,6 +21,10 @@ Evaluate
|
||||
http://www.rackspace.com/apps/email_hosting/migrations
|
||||
http://www.yippiemove.com/
|
||||
|
||||
|
||||
DONE. Bugfix. Duplicate messages on host2 are not deleted with --delete2
|
||||
Reason: "Skipping msg #120:508 in host2 folder INBOX.2005-INBOX (duplicate so we ignore this message)"
|
||||
|
||||
Add NTLM authentification support
|
||||
http://cpansearch.perl.org/src/BUZZ/NTLM-1.05/NTLM.pm
|
||||
http://curl.haxx.se/rfc/ntlm.html
|
||||
|
141
imapsync
141
imapsync
@ -9,7 +9,7 @@ tool. Synchronise mailboxes between two imap servers. Good
|
||||
at IMAP migration. More than 32 different IMAP server softwares
|
||||
supported with success.
|
||||
|
||||
$Revision: 1.327 $
|
||||
$Revision: 1.331 $
|
||||
|
||||
=head1 INSTALL
|
||||
|
||||
@ -141,22 +141,21 @@ While working on imapsync parameters please run imapsync in
|
||||
dry mode (no modification induced) with the --dry
|
||||
option. Nothing bad can be done this way.
|
||||
|
||||
To synchronize the imap account "buddy" on host
|
||||
"imap.src.fr" to the imap account "max" on host
|
||||
"imap.dest.fr" (the passwords are located in two files
|
||||
"/etc/secret1" for "buddy", "/etc/secret2" for "max"):
|
||||
To synchronize the imap account "buddy" (with password "secret1")
|
||||
on host "imap.src.fr" to the imap account "max" (with password "secret2")
|
||||
on host "imap.dest.fr":
|
||||
|
||||
imapsync --host1 imap.src.fr --user1 buddy --passfile1 /etc/secret1 \
|
||||
--host2 imap.dest.fr --user2 max --passfile2 /etc/secret2
|
||||
imapsync --host1 imap.src.fr --user1 buddy --password1 secret1 \
|
||||
--host2 imap.dest.fr --user2 max --password2 secret2
|
||||
|
||||
Then, you will have max's mailbox updated from buddy's
|
||||
Then you will have max's mailbox updated from buddy's
|
||||
mailbox.
|
||||
|
||||
=head1 SECURITY
|
||||
|
||||
You can use --password1 instead of --passfile1 to give the
|
||||
password but it is dangerous because any user on your host
|
||||
can see the password by using the 'ps auxwwww'
|
||||
You can use --passfile1 instead of --password1 to give the
|
||||
password since it is safer. With --password1 option any user
|
||||
on your host can see the password by using the 'ps auxwwww'
|
||||
command. Using a variable (like $PASSWORD1) is also
|
||||
dangerous because of the 'ps auxwwwwe' command. So, saving
|
||||
the password in a well protected file (600 or rw-------) is
|
||||
@ -435,7 +434,7 @@ Entries for imapsync:
|
||||
|
||||
Feedback (good or bad) will always be welcome.
|
||||
|
||||
$Id: imapsync,v 1.327 2010/07/12 00:23:02 gilles Exp gilles $
|
||||
$Id: imapsync,v 1.331 2010/07/13 23:28:59 gilles Exp gilles $
|
||||
|
||||
=cut
|
||||
|
||||
@ -492,8 +491,9 @@ my(
|
||||
$mess_size_total_skipped,
|
||||
$mess_size_total_error,
|
||||
$mess_trans, $mess_skipped, $mess_skipped_dry,
|
||||
$h1_mess_duplicate, $h1_mess_size_total_duplicate,
|
||||
$h1_mess_deleted, $h2_mess_deleted,
|
||||
$timeout, # whr (ESS/PRW)
|
||||
$timeout,
|
||||
$timestart, $timeend, $timediff,
|
||||
$timesize, $timebefore,
|
||||
$ssl1, $ssl2,
|
||||
@ -507,10 +507,7 @@ my(
|
||||
$tmpdir,
|
||||
);
|
||||
|
||||
use vars qw ($opt_G); # missing code for this will be option.
|
||||
|
||||
|
||||
$rcs = '$Id: imapsync,v 1.327 2010/07/12 00:23:02 gilles Exp gilles $ ';
|
||||
$rcs = '$Id: imapsync,v 1.331 2010/07/13 23:28:59 gilles Exp gilles $ ';
|
||||
$rcs =~ m/,v (\d+\.\d+)/;
|
||||
$VERSION = ($1) ? $1: "UNKNOWN";
|
||||
|
||||
@ -521,7 +518,7 @@ $mess_size_total_skipped = 0;
|
||||
$mess_size_total_error = 0;
|
||||
$mess_trans = $mess_skipped = $mess_skipped_dry = 0;
|
||||
$h1_mess_deleted = $h2_mess_deleted = 0;
|
||||
|
||||
$h1_mess_duplicate = $h1_mess_size_total_duplicate = 0;
|
||||
|
||||
|
||||
sub check_lib_version {
|
||||
@ -575,8 +572,8 @@ while (@argv_copy) {
|
||||
|
||||
my $banner_imapsync = join("",
|
||||
'$RCSfile: imapsync,v $ ',
|
||||
'$Revision: 1.327 $ ',
|
||||
'$Date: 2010/07/12 00:23:02 $ ',
|
||||
'$Revision: 1.331 $ ',
|
||||
'$Date: 2010/07/13 23:28:59 $ ',
|
||||
"\n",localhost_info(), "\n",
|
||||
"Command line used:\n",
|
||||
"$0 @argv_nopassord\n",
|
||||
@ -669,6 +666,9 @@ $port2 ||= (defined $ssl2 && !defined $tls2) ? 993 : 143;
|
||||
|
||||
$debugimap1 = $debugimap2 = 1 if ($debugimap);
|
||||
|
||||
# By default, don't take size to compare
|
||||
$skipsize = (defined $skipsize) ? $skipsize : 1;
|
||||
|
||||
sub connect_imap {
|
||||
my($host, $port, $debugimap, $ssl, $tls) = @_;
|
||||
my $imap = Mail::IMAPClient->new();
|
||||
@ -1684,14 +1684,22 @@ FOLDER: foreach my $h1_fold (@h1_folders) {
|
||||
}
|
||||
last FOLDER if $imap1->IsUnconnected();
|
||||
|
||||
|
||||
my @h1_msgs_duplicate;
|
||||
foreach my $m (@h1_msgs) {
|
||||
my $rc = parse_header_msg1($imap1, $m, $h1_heads, $h1_fir, "F", \%h1_hash);
|
||||
if (!$rc) {
|
||||
my $reason = !defined($rc) ? "no header" : "duplicate";
|
||||
my $rc = parse_header_msg($imap1, $m, $h1_heads, $h1_fir, "F", \%h1_hash);
|
||||
if (! defined($rc)) {
|
||||
my $h1_size = $h1_fir->{$m}->{"RFC822.SIZE"} || 0;
|
||||
print "+ Skipping msg #$m:$h1_size in folder $h1_fold ($reason so we ignore this message)\n";
|
||||
print "+ Skipping msg #$m:$h1_size on host1 folder $h1_fold (no header so we ignore this message)\n";
|
||||
$mess_size_total_skipped += $h1_size;
|
||||
$mess_skipped += 1;
|
||||
} elsif(0 == $rc) {
|
||||
# duplicate
|
||||
push(@h1_msgs_duplicate, $m);
|
||||
# duplicate, same id same size?
|
||||
my $h1_size = $h1_fir->{$m}->{"RFC822.SIZE"} || 0;
|
||||
$h1_mess_size_total_duplicate += $h1_size;
|
||||
$h1_mess_duplicate += 1;
|
||||
}
|
||||
}
|
||||
$debug and print "Time parsing headers on host1: ", timenext(), " s\n";
|
||||
@ -1707,14 +1715,16 @@ FOLDER: foreach my $h1_fold (@h1_folders) {
|
||||
if (@h2_msgs);
|
||||
$debug and print "Time fir: ", timenext(), " s\n";
|
||||
last FOLDER if $imap2->IsUnconnected();
|
||||
|
||||
my @h2_msgs_duplicate;
|
||||
foreach my $m (@h2_msgs) {
|
||||
my $rc = parse_header_msg1($imap2, $m, $h2_heads, $h2_fir, "T", \%h2_hash);
|
||||
if (!$rc) {
|
||||
my $reason = !defined($rc) ? "no header" : "duplicate";
|
||||
my $rc = parse_header_msg($imap2, $m, $h2_heads, $h2_fir, "T", \%h2_hash);
|
||||
if (! defined($rc)) {
|
||||
my $h2_size = $h2_fir->{$m}->{"RFC822.SIZE"} || 0;
|
||||
print "+ Skipping msg #$m:$h2_size in host2 folder $h2_fold ($reason so we ignore this message)\n";
|
||||
#$mess_size_total_skipped += $msize;
|
||||
#$mess_skipped += 1;
|
||||
print "+ Skipping msg #$m:$h2_size in host2 folder $h2_fold (no header so we ignore this message)\n";
|
||||
} elsif(0 == $rc) {
|
||||
# duplicate
|
||||
push(@h2_msgs_duplicate, $m);
|
||||
}
|
||||
}
|
||||
$debug and print "Time parsing headers on host2: ", timenext(), " s\n";
|
||||
@ -1732,7 +1742,7 @@ FOLDER: foreach my $h1_fold (@h1_folders) {
|
||||
|
||||
|
||||
if($delete2) {
|
||||
my @expunge;
|
||||
my @h2_expunge;
|
||||
foreach my $m_id (@h2_hash_keys_sorted_by_uid) {
|
||||
#print "$m_id ";
|
||||
unless (exists($h1_hash{$m_id})) {
|
||||
@ -1741,22 +1751,29 @@ FOLDER: foreach my $h1_fold (@h1_folders) {
|
||||
my $isdel = $h2_flags =~ /\B\\Deleted\b/ ? 1 : 0;
|
||||
print "deleting message [$m_id] #$h2_msg in host2 folder $h2_fold\n"
|
||||
if ! $isdel;
|
||||
push(@expunge,$h2_msg) if $uidexpunge2;
|
||||
push(@h2_expunge, $h2_msg) if $uidexpunge2;
|
||||
unless ($dry or $isdel) {
|
||||
$imap2->delete_message($h2_msg);
|
||||
$h2_mess_deleted += 1;
|
||||
last FOLDER if $imap2->IsUnconnected();
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach my $h2_msg (@h2_msgs_duplicate) {
|
||||
print "deleting message [duplicate] #$h2_msg in host2 folder $h2_fold\n";
|
||||
push(@h2_expunge, $h2_msg) if $uidexpunge2;
|
||||
unless ($dry) {
|
||||
$imap2->delete_message($h2_msg);
|
||||
$h2_mess_deleted += 1;
|
||||
}
|
||||
}
|
||||
|
||||
my $cnt = scalar @expunge;
|
||||
if(@expunge and !$imap2->can("uidexpunge")) {
|
||||
my $cnt = scalar @h2_expunge;
|
||||
if(@h2_expunge and !$imap2->can("uidexpunge")) {
|
||||
warn "uidexpunge not supported (< IMAPClient 3.17)\n";
|
||||
}
|
||||
elsif(@expunge) {
|
||||
elsif(@h2_expunge) {
|
||||
print "uidexpunge $cnt message(s)\n";
|
||||
$imap2->uidexpunge(\@expunge) if !$dry;
|
||||
$imap2->uidexpunge(\@h2_expunge) if !$dry;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1923,7 +1940,7 @@ Bye.'
|
||||
$h1_flags = flags_filter($h1_flags, $permanentflags2) if ($permanentflags2);
|
||||
|
||||
my $new_id;
|
||||
print "flags from: [$h1_flags][$d]\n";
|
||||
print "flags & date from: [$h1_flags][$d]\n";
|
||||
last FOLDER if $imap1->IsUnconnected();
|
||||
last FOLDER if $imap2->IsUnconnected();
|
||||
unless ($dry) {
|
||||
@ -2032,18 +2049,11 @@ Bye.'
|
||||
# print "!!! Dates differ !!!\n";
|
||||
#}
|
||||
};
|
||||
unless (($h1_size == $h2_size) or $skipsize) {
|
||||
unless ($skipsize or ($h1_size == $h2_size)) {
|
||||
# Bad size
|
||||
print
|
||||
"Message $m_id SZ_BAD f:$h1_msg:$h1_size t:$h2_msg:$h2_size\n";
|
||||
# delete in host2 and recopy ?
|
||||
# NO recopy CODE HERE. to be written if needed.
|
||||
$error++;
|
||||
if ($opt_G){
|
||||
print "Deleting msg f:#$h2_msg in host2 folder $h2_fold\n";
|
||||
$imap2->delete_message($h2_msg) unless ($dry);
|
||||
last FOLDER if $imap2->IsUnconnected();
|
||||
}
|
||||
}
|
||||
else {
|
||||
# Good
|
||||
@ -2054,9 +2064,7 @@ Bye.'
|
||||
unless($dry) {
|
||||
$imap1->delete_message($h1_msg);
|
||||
$h1_mess_deleted += 1;
|
||||
last FOLDER if $imap1->IsUnconnected();
|
||||
$imap1->expunge() if ($expunge);
|
||||
last FOLDER if $imap1->IsUnconnected();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2161,20 +2169,22 @@ sub select_msgs {
|
||||
|
||||
sub stats {
|
||||
print "++++ Statistics ++++\n";
|
||||
print "Time : $timediff sec\n";
|
||||
print "Messages transferred : $mess_trans ";
|
||||
print "Time : $timediff sec\n";
|
||||
print "Messages transferred : $mess_trans ";
|
||||
print "(could be $mess_skipped_dry without dry mode)" if ($dry);
|
||||
print "\n";
|
||||
print "Messages skipped : $mess_skipped\n";
|
||||
print "Messages deleted on host1: $h1_mess_deleted\n";
|
||||
print "Messages deleted on host2: $h2_mess_deleted\n";
|
||||
print "Total bytes transferred : $mess_size_total_trans\n";
|
||||
print "Total bytes skipped : $mess_size_total_skipped\n";
|
||||
print "Total bytes error : $mess_size_total_error\n";
|
||||
print "Messages skipped : $mess_skipped\n";
|
||||
print "Messages duplicate on host1 : $h1_mess_duplicate\n";
|
||||
print "Messages deleted on host1 : $h1_mess_deleted\n";
|
||||
print "Messages deleted on host2 : $h2_mess_deleted\n";
|
||||
print "Total bytes transferred : $mess_size_total_trans\n";
|
||||
print "Total bytes duplicate host1 : $h1_mess_size_total_duplicate\n";
|
||||
print "Total bytes skipped : $mess_size_total_skipped\n";
|
||||
print "Total bytes error : $mess_size_total_error\n";
|
||||
$timediff ||= 1; # No division per 0
|
||||
printf ("Average bandwidth rate : %.1f KiB/s\n", $mess_size_total_trans / 1024 / $timediff);
|
||||
print "Reconnections to host1 : $host1_reconnect_count\n";
|
||||
print "Reconnections to host2 : $host2_reconnect_count\n";
|
||||
printf ("Average bandwidth rate : %.1f KiB/s\n", $mess_size_total_trans / 1024 / $timediff);
|
||||
print "Reconnections to host1 : $host1_reconnect_count\n";
|
||||
print "Reconnections to host2 : $host2_reconnect_count\n";
|
||||
print "Detected $error errors\n\n";
|
||||
print thank_author();
|
||||
}
|
||||
@ -2322,7 +2332,7 @@ sub load_modules {
|
||||
|
||||
|
||||
|
||||
sub parse_header_msg1 {
|
||||
sub parse_header_msg {
|
||||
my ($imap, $m_uid, $s_heads, $s_fir, $s, $s_hash) = @_;
|
||||
|
||||
my $head = $s_heads->{$m_uid};
|
||||
@ -2529,7 +2539,8 @@ Several options are mandatory.
|
||||
Ex: Message-ID or Subject or Date.
|
||||
--useheader <string> and this one, etc.
|
||||
--skipsize : Don't take message size into account to compare
|
||||
messages on both sides.
|
||||
messages on both sides. On by default.
|
||||
Use --no-skipsize for using size comparaison.
|
||||
--allowsizemismatch : allow RFC822.SIZE != fetched msg size
|
||||
consider also --skipsize to avoid duplicate messages
|
||||
when running syncs more than one time per mailbox
|
||||
@ -2570,12 +2581,12 @@ Several options are mandatory.
|
||||
|
||||
Example: to synchronise imap account "foo" on "imap.truc.org"
|
||||
to imap account "bar" on "imap.trac.org"
|
||||
with foo password stored in /etc/secret1
|
||||
and bar password stored in /etc/secret2
|
||||
with foo password "secret1"
|
||||
and bar password "secret2"
|
||||
|
||||
$0 \\
|
||||
--host1 imap.truc.org --user1 foo --passfile1 /etc/secret1 \\
|
||||
--host2 imap.trac.org --user2 bar --passfile2 /etc/secret2
|
||||
--host1 imap.truc.org --user1 foo --password1 secret1 \\
|
||||
--host2 imap.trac.org --user2 bar --password2 secret2
|
||||
|
||||
$localhost_info
|
||||
$rcs
|
||||
|
109
index.shtml
109
index.shtml
@ -5,7 +5,7 @@
|
||||
<title>imapsync</title>
|
||||
<meta name="generator" content="Bluefish 1.0.7"/>
|
||||
<meta name="author" content="Gilles LAMIRAL"/>
|
||||
<meta name="date" content="2010-07-11T21:37:45+0200"/>
|
||||
<meta name="date" content="2010-07-14T15:55:32+0200"/>
|
||||
<meta name="copyright" content="None"/>
|
||||
<meta name="keywords" content="imap, transfert, migration"/>
|
||||
<meta name="description" content="imap migration tool"/>
|
||||
@ -32,29 +32,56 @@ src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
|
||||
|
||||
<h2>What is imapsync?</h2>
|
||||
|
||||
<b>imapsync</b> software is a command line tool allowing incremental and
|
||||
<p><b>imapsync</b> software is a command line tool allowing incremental and
|
||||
recursive <b>imap</b> transfers from one mailbox to another.
|
||||
</p>
|
||||
|
||||
<h2>AUTHOR</h2>
|
||||
|
||||
<p>Gilles LAMIRAL<br/>
|
||||
Email: <b>lamiral@linux-france.org</b></p>
|
||||
|
||||
<p>Feedback good or bad is often welcome.</p>
|
||||
|
||||
<p>A good place to talk about imapsync is the public
|
||||
imapsync mailing-list (see below).</p>
|
||||
|
||||
<p>Gilles LAMIRAL earns his living writing, installing, configuring and
|
||||
teaching free, open and gratis softwares. Do not hesitate to pay him for
|
||||
that services.</p>
|
||||
|
||||
<p>If you <b>use imapsync</b> as a <b>professionnal worker</b> you may
|
||||
<b><a href="http://www.linux-france.org/prj/imapsync_list/msg00470.html">read this call</a></b>
|
||||
for feedback.
|
||||
</p>
|
||||
|
||||
<h2>imapsync donation</h2>
|
||||
<p>Happy with this <b>free</b>, <b>open</b> and <b>gratis</b> software?<br/></p>
|
||||
<p>Help the author to maintain imapsync and support users:</p>
|
||||
|
||||
Help the author to maintain imapsync and support users:
|
||||
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
|
||||
<input type="hidden" name="cmd" value="_s-xclick">
|
||||
<p>
|
||||
<input type="hidden" name="cmd" value="_s-xclick"/>
|
||||
<input type="hidden" name="encrypted" value="-----BEGIN PKCS7-----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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.">
|
||||
<img alt="" border="0" src="https://www.paypal.com/fr_FR/i/scr/pixel.gif" width="1" height="1">
|
||||
"/>
|
||||
<input type="image" src="https://www.paypal.com/en_US/i/btn/btn_donateCC_LG_global.gif" name="submit" alt="PayPal"/>
|
||||
<img alt="" src="https://www.paypal.com/fr_FR/i/scr/pixel.gif" width="1" height="1"/>
|
||||
</p>
|
||||
</form>
|
||||
|
||||
<p>
|
||||
Or offer him a book on his
|
||||
<a href="http://www.amazon.com/gp/registry/wishlist/1C9UNDIH3P7R7/"><b>wishlist</b></a><br>
|
||||
<a href="http://www.amazon.com/gp/registry/wishlist/1C9UNDIH3P7R7/"><b>wishlist</b></a><br/>
|
||||
|
||||
<b><i>Thanks in advance!</i></b>
|
||||
<b><i>Thanks in advance!</i></b></p>
|
||||
|
||||
<h2><a href="VERSION">Latest release
|
||||
<h2><a href="imapsync">Latest release
|
||||
<!--#exec cmd="cat VERSION" -->
|
||||
(<!--#flastmod file="imapsync" -->)
|
||||
</a></h2>
|
||||
|
||||
<p>See <a href="ChangeLog">ChangeLog</a> to know what's new.</p>
|
||||
|
||||
<h2><a href="dist/?M=D">imapsync download</a></h2>
|
||||
|
||||
<h2><a href="INSTALL">imapsync installation</a></h2>
|
||||
@ -65,40 +92,78 @@ Or offer him a book on his
|
||||
|
||||
<h2>MAILING-LIST</h2>
|
||||
|
||||
The public mailing-list may be the best way to get support.<br>
|
||||
|
||||
<p>
|
||||
The public mailing-list may be the best way to get support.<br/>
|
||||
</p>
|
||||
<p>
|
||||
To <b>write</b> on the mailing-list, the address is:
|
||||
<b>imapsync@linux-france.org</b><br>
|
||||
<b>imapsync@linux-france.org</b><br/>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
To <b>subscribe</b>, send a message to:
|
||||
<b>imapsync-subscribe@listes.linux-france.org</b><br>
|
||||
<b>imapsync-subscribe@listes.linux-france.org</b><br/>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
To <b>unsubscribe</b>, send a message to:
|
||||
<b>imapsync-unsubscribe@listes.linux-france.org</b><br>
|
||||
<b>imapsync-unsubscribe@listes.linux-france.org</b><br/>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
To <b>contact</b> the person in charge for the list:
|
||||
<b>imapsync-request@listes.linux-france.org</b><br>
|
||||
<b>imapsync-request@listes.linux-france.org</b><br/>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The <b>list archives</b> may be available at
|
||||
<a href="http://www.linux-france.org/prj/imapsync_list/">
|
||||
http://linux-france.org/prj/imapsync_list/</a><br>
|
||||
So consider that the list is public, anyone can see your post.
|
||||
Use a pseudonym or do not post to
|
||||
this list if you want to stay private.<br>
|
||||
http://linux-france.org/prj/imapsync_list/</a><br/>
|
||||
So consider that the list is public, anyone can see your post.<br/>
|
||||
<i>Use a pseudonym or do not post to
|
||||
this list if you want to stay private</i>.<br/>
|
||||
|
||||
<b>Thank you for your participation!</b>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<b>Thank you for your participation!</b>
|
||||
</p>
|
||||
|
||||
<h2><a href="TODO">TODO</a></h2>
|
||||
|
||||
<p>I code new features for free when I have time and when I find it useful.<br/>
|
||||
If you really want a feature you can donate money and I'll code it.<br/>
|
||||
</p>
|
||||
|
||||
<p>Some features and their time/money to be done evaluation</p>
|
||||
|
||||
<table cellpadding="10" cellspacing="0" border="1">
|
||||
<tr align="right"><th>Feature </th><th>Time guessed</th><th>Time spent</th><th>Money received</th><th>Money still needed</th></tr>
|
||||
<tr align="right"><td>Speedup 50% </td><td>10 hours </td><td>0 </td><td>0 $ </td><td>300 $ </td></tr>
|
||||
<tr align="right"><td>Backup to files</td><td> 8 hours </td><td>60 min </td><td>0 $ </td><td>240 $ </td></tr>
|
||||
<tr align="right"><td>--deletefolder2</td><td> 3 hours </td><td>30 min </td><td>0 $ </td><td> 90 $ </td></tr>
|
||||
<tr align="right"><td>NTLM auth </td><td> 3 hours </td><td>60 min </td><td>0 $ </td><td> 90 $ </td></tr>
|
||||
</table>
|
||||
|
||||
|
||||
<h2><a href="COPYING">COPYING</a></h2>
|
||||
|
||||
<h2><a href="ChangeLog">ChangeLog</a></h2>
|
||||
|
||||
<h2><a href="CREDITS">CREDITS</a></h2>
|
||||
|
||||
<hr/>
|
||||
<p>
|
||||
<a href="http://validator.w3.org/check?uri=referer"><img
|
||||
src="http://www.w3.org/Icons/valid-xhtml10"
|
||||
alt="Valid XHTML 1.0 Strict" height="31" width="88" /></a>
|
||||
|
||||
<!--#config timefmt="%D" -->
|
||||
<!--#config timefmt="%A %B %d, %Y" -->
|
||||
This document last modified <!--#echo var="LAST_MODIFIED" -->
|
||||
This document last modified <!--#echo var="LAST_MODIFIED" --> <br/>
|
||||
$Id: index.shtml,v 1.9 2010/07/14 13:56:44 gilles Exp gilles $
|
||||
</p>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
Loading…
Reference in New Issue
Block a user