mirror of
https://github.com/imapsync/imapsync.git
synced 2025-06-05 04:07:23 +02:00
1.217
This commit is contained in:
parent
820693d0b3
commit
bce9598a84
8 changed files with 181 additions and 27 deletions
19
CREDITS
19
CREDITS
|
@ -7,11 +7,28 @@ http://www.amazon.com/gp/registry/wishlist/1C9UNDIH3P7R7/
|
||||||
|
|
||||||
I thank very much all of these people.
|
I thank very much all of these people.
|
||||||
|
|
||||||
|
Heiko Kirsch
|
||||||
|
Found the 24 characters bug in username.
|
||||||
|
In fact this is 76 in Mail::IMAPClient, md5, MIME::Base64::encode.
|
||||||
|
|
||||||
|
Morten W. Petersen
|
||||||
|
Asked for the default behavior.
|
||||||
|
All folders, recursively.
|
||||||
|
|
||||||
|
Tobias Müller
|
||||||
|
Found the buddy max inversion mistake in
|
||||||
|
the documentation.
|
||||||
|
|
||||||
|
Gavin Atkinson
|
||||||
|
MailEnable under Windows to Dovecot under FreeBSD
|
||||||
|
Not really a success. Just a one run copy.
|
||||||
|
MailEnable does not give its headers.
|
||||||
|
|
||||||
Simon Matter
|
Simon Matter
|
||||||
Had problem with append_string()
|
Had problem with append_string()
|
||||||
from Cyrus-IMAPd to Lotus Notes 7.0.2
|
from Cyrus-IMAPd to Lotus Notes 7.0.2
|
||||||
|
|
||||||
Simon's friend (his name ?)
|
Samuel Graenacher (Simon's friend)
|
||||||
Wrote a patch to add flags and date to append_file()
|
Wrote a patch to add flags and date to append_file()
|
||||||
|
|
||||||
Foo Kok Wai
|
Foo Kok Wai
|
||||||
|
|
23
ChangeLog
23
ChangeLog
|
@ -1,15 +1,34 @@
|
||||||
|
|
||||||
RCS file: RCS/imapsync,v
|
RCS file: RCS/imapsync,v
|
||||||
Working file: imapsync
|
Working file: imapsync
|
||||||
head: 1.213
|
head: 1.217
|
||||||
branch:
|
branch:
|
||||||
locks: strict
|
locks: strict
|
||||||
access list:
|
access list:
|
||||||
symbolic names:
|
symbolic names:
|
||||||
keyword substitution: kv
|
keyword substitution: kv
|
||||||
total revisions: 213; selected revisions: 213
|
total revisions: 217; selected revisions: 217
|
||||||
description:
|
description:
|
||||||
----------------------------
|
----------------------------
|
||||||
|
revision 1.217
|
||||||
|
date: 2007/03/06 13:12:23; author: gilles; state: Exp; lines: +103 -6
|
||||||
|
- Added _cram_md5_2() and authenticate2() to correct a bug
|
||||||
|
from the Mail::IMAPClient perl library. username can't be
|
||||||
|
longer than 24 due to a lack of blank second parameter
|
||||||
|
in MIME::Base64::encode() call.
|
||||||
|
----------------------------
|
||||||
|
revision 1.216
|
||||||
|
date: 2007/03/06 04:25:52; author: gilles; state: Exp; lines: +10 -7
|
||||||
|
Updated distribution list.
|
||||||
|
----------------------------
|
||||||
|
revision 1.215
|
||||||
|
date: 2007/03/06 03:50:35; author: gilles; state: Exp; lines: +16 -8
|
||||||
|
Updated documentation.
|
||||||
|
----------------------------
|
||||||
|
revision 1.214
|
||||||
|
date: 2007/02/26 10:31:32; author: gilles; state: Exp; lines: +6 -6
|
||||||
|
Fixed a mistake in the EXAMPLE section.
|
||||||
|
----------------------------
|
||||||
revision 1.213
|
revision 1.213
|
||||||
date: 2007/02/16 04:07:19; author: gilles; state: Exp; lines: +168 -11
|
date: 2007/02/16 04:07:19; author: gilles; state: Exp; lines: +168 -11
|
||||||
- Back to append_file() modified -> append_file2()
|
- Back to append_file() modified -> append_file2()
|
||||||
|
|
1
FAQ
1
FAQ
|
@ -152,7 +152,6 @@ Here is an example:
|
||||||
--password2 joespassonserver2 \
|
--password2 joespassonserver2 \
|
||||||
--exclude '^user\.'
|
--exclude '^user\.'
|
||||||
|
|
||||||
|
|
||||||
======================================================================
|
======================================================================
|
||||||
Q. imapsync fails with the following error:
|
Q. imapsync fails with the following error:
|
||||||
flags from : [\Seen NonJunk]["10-Aug-2006 13:00:30 -0400"]
|
flags from : [\Seen NonJunk]["10-Aug-2006 13:00:30 -0400"]
|
||||||
|
|
23
README
23
README
|
@ -3,14 +3,17 @@ 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.213 $
|
$Revision: 1.217 $
|
||||||
|
|
||||||
INSTALL
|
INSTALL
|
||||||
imapsync works fine under any Unix OS with perl.
|
imapsync works fine under any Unix OS with perl.
|
||||||
imapsync works fine under Windows 2000 (at least) and ActiveState's 5.8 Perl
|
imapsync works fine under Windows 2000 (at least) and ActiveState's 5.8 Perl
|
||||||
|
|
||||||
imapsync is already available on the following distributions (at least):
|
imapsync is already available directly on the following distributions (at least):
|
||||||
FreeBSD, Debian, Gentoo, NetBSD.
|
FreeBSD, Debian, Gentoo, NetBSD, Darwin, Mandriva.
|
||||||
|
|
||||||
|
imapsync is already available directly on the following distributions:
|
||||||
|
OpenBSD
|
||||||
|
|
||||||
Get imapsync at
|
Get imapsync at
|
||||||
http://www.linux-france.org/prj/imapsync/dist/
|
http://www.linux-france.org/prj/imapsync/dist/
|
||||||
|
@ -29,9 +32,13 @@ INSTALL
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
imapsync [options]
|
imapsync [options]
|
||||||
|
|
||||||
|
To get a description of each option just run imapsync like this :
|
||||||
|
|
||||||
imapsync --help
|
imapsync --help
|
||||||
imapsync
|
imapsync
|
||||||
|
|
||||||
|
The option list :
|
||||||
|
|
||||||
imapsync [--host1 server1] [--port1 <num>]
|
imapsync [--host1 server1] [--port1 <num>]
|
||||||
[--user1 <string>] [--passfile1 <string>]
|
[--user1 <string>] [--passfile1 <string>]
|
||||||
[--host2 server2] [--port2 <num>]
|
[--host2 server2] [--port2 <num>]
|
||||||
|
@ -71,6 +78,8 @@ DESCRIPTION
|
||||||
The command imapsync is a tool allowing incremental and recursive imap
|
The command imapsync is a tool allowing incremental and recursive imap
|
||||||
transfer from one mailbox to another.
|
transfer from one mailbox to another.
|
||||||
|
|
||||||
|
By default all folders are transfered, recursively.
|
||||||
|
|
||||||
We sometimes need to transfer mailboxes from one imap server to another.
|
We sometimes need to transfer mailboxes from one imap server to another.
|
||||||
This is called migration.
|
This is called migration.
|
||||||
|
|
||||||
|
@ -91,7 +100,9 @@ DESCRIPTION
|
||||||
you just want to keep a "live" copy of B in A.
|
you just want to keep a "live" copy of B in A.
|
||||||
|
|
||||||
OPTIONS
|
OPTIONS
|
||||||
Invoke: imapsync --help
|
To get a description of each option just invoke:
|
||||||
|
|
||||||
|
imapsync --help
|
||||||
|
|
||||||
HISTORY
|
HISTORY
|
||||||
I wrote imapsync because an enterprise (basystemes) paid me to install a
|
I wrote imapsync because an enterprise (basystemes) paid me to install a
|
||||||
|
@ -115,7 +126,7 @@ EXAMPLE
|
||||||
imapsync --host1 imap.src.fr --user1 buddy --passfile1 /etc/secret1 \
|
imapsync --host1 imap.src.fr --user1 buddy --passfile1 /etc/secret1 \
|
||||||
--host2 imap.dest.fr --user2 max --passfile2 /etc/secret2
|
--host2 imap.dest.fr --user2 max --passfile2 /etc/secret2
|
||||||
|
|
||||||
Then, you will have buddy's mailbox updated from max'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 --password1 instead of --passfile1 to give the password but
|
||||||
|
@ -309,5 +320,5 @@ SIMILAR SOFTWARES
|
||||||
|
|
||||||
Feedback (good or bad) will be always welcome.
|
Feedback (good or bad) will be always welcome.
|
||||||
|
|
||||||
$Id: imapsync,v 1.213 2007/02/16 04:07:19 gilles Exp $
|
$Id: imapsync,v 1.217 2007/03/06 13:12:23 gilles Exp $
|
||||||
|
|
||||||
|
|
2
TODO
2
TODO
|
@ -2,7 +2,7 @@ TODO file for imapsync
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
Add an option to make imapsync automatically
|
Add an option to make imapsync automatically
|
||||||
reconnect when the connection drops?
|
reconnect when the connection drops
|
||||||
|
|
||||||
Add an entry to
|
Add an entry to
|
||||||
http://lsm.execpc.com/lsm/
|
http://lsm.execpc.com/lsm/
|
||||||
|
|
2
VERSION
2
VERSION
|
@ -1 +1 @@
|
||||||
1.213
|
1.217
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
Project: imapsync
|
Project: imapsync
|
||||||
Version: 1.200
|
Version: 1.213
|
||||||
Release-Focus: Minor bugfixes
|
Release-Focus: Major bugfixes
|
||||||
Hide: Y
|
Hide: Y
|
||||||
Home-Page-URL: http://www.linux-france.org/prj/imapsync/
|
Home-Page-URL: http://www.linux-france.org/prj/imapsync/
|
||||||
Gzipped-Tar-URL: http://www.linux-france.org/prj/imapsync/dist/
|
Gzipped-Tar-URL: http://www.linux-france.org/prj/imapsync/dist/
|
||||||
|
|
||||||
Bug fix: corrected memory problem with big messages.
|
Bug fix: rewrote the way to store messages to avoid freeze problems with some imap servers
|
||||||
|
|
||||||
|
|
132
imapsync
132
imapsync
|
@ -7,15 +7,18 @@ 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.213 $
|
$Revision: 1.217 $
|
||||||
|
|
||||||
=head1 INSTALL
|
=head1 INSTALL
|
||||||
|
|
||||||
imapsync works fine under any Unix OS with perl.
|
imapsync works fine under any Unix OS with perl.
|
||||||
imapsync works fine under Windows 2000 (at least) and ActiveState's 5.8 Perl
|
imapsync works fine under Windows 2000 (at least) and ActiveState's 5.8 Perl
|
||||||
|
|
||||||
imapsync is already available on the following distributions (at least):
|
imapsync is already available directly on the following distributions (at least):
|
||||||
FreeBSD, Debian, Gentoo, NetBSD.
|
FreeBSD, Debian, Gentoo, NetBSD, Darwin, Mandriva.
|
||||||
|
|
||||||
|
imapsync is already available directly on the following distributions:
|
||||||
|
OpenBSD
|
||||||
|
|
||||||
Get imapsync at
|
Get imapsync at
|
||||||
http://www.linux-france.org/prj/imapsync/dist/
|
http://www.linux-france.org/prj/imapsync/dist/
|
||||||
|
@ -35,9 +38,13 @@ $Revision: 1.213 $
|
||||||
|
|
||||||
imapsync [options]
|
imapsync [options]
|
||||||
|
|
||||||
|
To get a description of each option just run imapsync like this :
|
||||||
|
|
||||||
imapsync --help
|
imapsync --help
|
||||||
imapsync
|
imapsync
|
||||||
|
|
||||||
|
The option list :
|
||||||
|
|
||||||
imapsync [--host1 server1] [--port1 <num>]
|
imapsync [--host1 server1] [--port1 <num>]
|
||||||
[--user1 <string>] [--passfile1 <string>]
|
[--user1 <string>] [--passfile1 <string>]
|
||||||
[--host2 server2] [--port2 <num>]
|
[--host2 server2] [--port2 <num>]
|
||||||
|
@ -79,8 +86,10 @@ $Revision: 1.213 $
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
The command imapsync is a tool allowing incremental and recursive
|
The command imapsync is a tool allowing incremental and
|
||||||
imap transfer from one mailbox to another.
|
recursive imap transfer from one mailbox to another.
|
||||||
|
|
||||||
|
By default all folders are transfered, recursively.
|
||||||
|
|
||||||
We sometimes need to transfer mailboxes from one imap server to
|
We sometimes need to transfer mailboxes from one imap server to
|
||||||
another. This is called migration.
|
another. This is called migration.
|
||||||
|
@ -105,7 +114,9 @@ in case you just want to keep a "live" copy of B in A.
|
||||||
|
|
||||||
=head1 OPTIONS
|
=head1 OPTIONS
|
||||||
|
|
||||||
Invoke: imapsync --help
|
To get a description of each option just invoke:
|
||||||
|
|
||||||
|
imapsync --help
|
||||||
|
|
||||||
=head1 HISTORY
|
=head1 HISTORY
|
||||||
|
|
||||||
|
@ -132,7 +143,7 @@ To synchronize the imap account "buddy" on host
|
||||||
imapsync --host1 imap.src.fr --user1 buddy --passfile1 /etc/secret1 \
|
imapsync --host1 imap.src.fr --user1 buddy --passfile1 /etc/secret1 \
|
||||||
--host2 imap.dest.fr --user2 max --passfile2 /etc/secret2
|
--host2 imap.dest.fr --user2 max --passfile2 /etc/secret2
|
||||||
|
|
||||||
Then, you will have buddy's mailbox updated from max's
|
Then, you will have max's mailbox updated from buddy's
|
||||||
mailbox.
|
mailbox.
|
||||||
|
|
||||||
=head1 SECURITY
|
=head1 SECURITY
|
||||||
|
@ -360,7 +371,7 @@ Entries for imapsync:
|
||||||
|
|
||||||
Feedback (good or bad) will be always welcome.
|
Feedback (good or bad) will be always welcome.
|
||||||
|
|
||||||
$Id: imapsync,v 1.213 2007/02/16 04:07:19 gilles Exp $
|
$Id: imapsync,v 1.217 2007/03/06 13:12:23 gilles Exp $
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -419,7 +430,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.213 2007/02/16 04:07:19 gilles Exp $ ';
|
$rcs = ' $Id: imapsync,v 1.217 2007/03/06 13:12:23 gilles Exp $ ';
|
||||||
$rcs =~ m/,v (\d+\.\d+)/;
|
$rcs =~ m/,v (\d+\.\d+)/;
|
||||||
$VERSION = ($1) ? $1 : "UNKNOWN";
|
$VERSION = ($1) ? $1 : "UNKNOWN";
|
||||||
|
|
||||||
|
@ -456,8 +467,8 @@ $error=0;
|
||||||
|
|
||||||
my $banner = join("",
|
my $banner = join("",
|
||||||
'$RCSfile: imapsync,v $ ',
|
'$RCSfile: imapsync,v $ ',
|
||||||
'$Revision: 1.213 $ ',
|
'$Revision: 1.217 $ ',
|
||||||
'$Date: 2007/02/16 04:07:19 $ ',
|
'$Date: 2007/03/06 13:12:23 $ ',
|
||||||
"\n",
|
"\n",
|
||||||
"Mail::IMAPClient version used here is ",
|
"Mail::IMAPClient version used here is ",
|
||||||
$VERSION_IMAPClient,"\n",
|
$VERSION_IMAPClient,"\n",
|
||||||
|
@ -1877,7 +1888,7 @@ sub fetch_hash2 {
|
||||||
|
|
||||||
sub login2 {
|
sub login2 {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
return $self->authenticate($self->Authmechanism,$self->Authcallback)
|
return $self->authenticate2($self->Authmechanism,$self->Authcallback)
|
||||||
if $self->{Authmechanism};
|
if $self->{Authmechanism};
|
||||||
|
|
||||||
my $id = $self->User;
|
my $id = $self->User;
|
||||||
|
@ -2011,3 +2022,100 @@ sub parse_headers2 {
|
||||||
return $headers;
|
return $headers;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# From IMAPClient.pm
|
||||||
|
|
||||||
|
sub authenticate2 {
|
||||||
|
|
||||||
|
my $self = shift;
|
||||||
|
my $scheme = shift;
|
||||||
|
my $response = shift;
|
||||||
|
|
||||||
|
$scheme ||= $self->Authmechanism;
|
||||||
|
$response ||= $self->Authcallback;
|
||||||
|
my $clear = $self->Clear;
|
||||||
|
|
||||||
|
$self->Clear($clear)
|
||||||
|
if $self->Count >= $clear and $clear > 0;
|
||||||
|
|
||||||
|
my $count = $self->Count($self->Count+1);
|
||||||
|
|
||||||
|
|
||||||
|
my $string = "$count AUTHENTICATE $scheme";
|
||||||
|
|
||||||
|
$self->_record($count,[ $self->_next_index($self->Transaction),
|
||||||
|
"INPUT", "$string\x0d\x0a"] );
|
||||||
|
|
||||||
|
my $feedback = $self->_send_line("$string");
|
||||||
|
|
||||||
|
unless ($feedback) {
|
||||||
|
$self->LastError("Error sending '$string' to IMAP: $!\n");
|
||||||
|
return undef;
|
||||||
|
}
|
||||||
|
|
||||||
|
my ($code, $output);
|
||||||
|
|
||||||
|
until ($code) {
|
||||||
|
$output = $self->_read_line or return undef;
|
||||||
|
foreach my $o (@$output) {
|
||||||
|
$self->_record($count,$o); # $o is a ref
|
||||||
|
($code) = $o->[DATA] =~ /^\+(.*)$/ ;
|
||||||
|
if ($o->[DATA] =~ /^\*\s+BYE/) {
|
||||||
|
$self->State(Unconnected);
|
||||||
|
return undef ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return undef if $code =~ /^BAD|^NO/ ;
|
||||||
|
|
||||||
|
if ('CRAM-MD5' eq $scheme && ! $response) {
|
||||||
|
if ($Mail::IMAPClient::_CRAM_MD5_ERR) {
|
||||||
|
$self->LastError($Mail::IMAPClient::_CRAM_MD5_ERR);
|
||||||
|
carp $Mail::IMAPClient::_CRAM_MD5_ERR if $^W;
|
||||||
|
} else {
|
||||||
|
$response = \&_cram_md5_2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$feedback = $self->_send_line($response->($code, $self));
|
||||||
|
|
||||||
|
unless ($feedback) {
|
||||||
|
$self->LastError("Error sending append msg text to IMAP: $!\n");
|
||||||
|
return undef;
|
||||||
|
}
|
||||||
|
|
||||||
|
$code = ""; # clear code
|
||||||
|
until ($code) {
|
||||||
|
$output = $self->_read_line or return undef;
|
||||||
|
foreach my $o (@$output) {
|
||||||
|
$self->_record($count,$o); # $o is a ref
|
||||||
|
if ( ($code) = $o->[DATA] =~ /^\+ (.*)$/ ) {
|
||||||
|
$feedback = $self->_send_line($response->($code,$self));
|
||||||
|
unless ($feedback) {
|
||||||
|
$self->LastError("Error sending append msg text to IMAP: $!\n");
|
||||||
|
return undef;
|
||||||
|
}
|
||||||
|
$code = "" ; # Clear code; we're still not finished
|
||||||
|
} else {
|
||||||
|
$o->[DATA] =~ /^$count (OK|NO|BAD)/ and $code = $1;
|
||||||
|
if ($o->[DATA] =~ /^\*\s+BYE/) {
|
||||||
|
$self->State(Unconnected);
|
||||||
|
return undef ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$code =~ /^OK/ and $self->State(Authenticated) ;
|
||||||
|
return $code =~ /^OK/ ? $self : undef ;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _cram_md5_2 {
|
||||||
|
my ($code, $client) = @_;
|
||||||
|
my $hmac = Digest::HMAC_MD5::hmac_md5_hex(MIME::Base64::decode($code),
|
||||||
|
$client->Password());
|
||||||
|
return MIME::Base64::encode($client->User() . " $hmac", "");
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue