mirror of
https://github.com/imapsync/imapsync.git
synced 2024-11-17 00:02:29 +01:00
634 lines
21 KiB
Plaintext
634 lines
21 KiB
Plaintext
--- imapsync-1.267/imapsync Tue Oct 7 06:36:03 2008
|
|
+++ /usr/local/bin/imapsync Mon Dec 8 12:09:28 2008
|
|
@@ -79,6 +79,9 @@
|
|
[--debug] [--debugimap]
|
|
[--timeout <int>] [--fast]
|
|
[--split1] [--split2]
|
|
+ [--quiet]
|
|
+ [--showstats]
|
|
+ [--emailreport] [--emailuser <string]
|
|
[--version] [--help]
|
|
|
|
=cut
|
|
@@ -435,6 +438,7 @@
|
|
use Carp;
|
|
use Getopt::Long;
|
|
use Mail::IMAPClient;
|
|
+use Net::SMTP;
|
|
use Digest::MD5 qw(md5_base64);
|
|
#use Term::ReadKey;
|
|
#use IO::Socket::SSL;
|
|
@@ -442,6 +446,7 @@
|
|
use English;
|
|
use POSIX qw(uname);
|
|
use Fcntl;
|
|
+use Time::Zone;
|
|
|
|
#use Test::Simple tests => 1;
|
|
use Test::More 'no_plan';
|
|
@@ -450,7 +455,7 @@
|
|
|
|
|
|
my(
|
|
- $rcs, $debug, $debugimap, $error,
|
|
+ $rcs, $debug, $debugimap, $error, $errortext, $emailreport, $emailuser,
|
|
$host1, $host2, $port1, $port2,
|
|
$user1, $user2, $password1, $password2, $passfile1, $passfile2,
|
|
@folder, @include, @exclude, @folderrec,
|
|
@@ -484,7 +489,7 @@
|
|
$authmech1, $authmech2,
|
|
$split1, $split2,
|
|
$tests, $test_builder,
|
|
- $allow3xx,
|
|
+ $allow3xx,$quiet,$showstats
|
|
);
|
|
|
|
use vars qw ($opt_G); # missing code for this will be option.
|
|
@@ -548,7 +553,6 @@
|
|
|
|
}
|
|
|
|
-
|
|
my $banner = join("",
|
|
'$RCSfile: imapsync,v $ ',
|
|
'$Revision: 1.267 $ ',
|
|
@@ -566,12 +570,12 @@
|
|
}
|
|
|
|
get_options();
|
|
-
|
|
+$errortext = "";
|
|
check_lib_version() or
|
|
die "imapsync needs perl lib Mail::IMAPClient release 2.2.9 exactly, future imapsync release may suppoort 3.0.x, but sorry not now. See file BUG_IMAPClient_3.xx\n";
|
|
|
|
|
|
-print $banner;
|
|
+!$quiet and print $banner;
|
|
|
|
sub missing_option {
|
|
my ($option) = @_;
|
|
@@ -622,11 +626,11 @@
|
|
my $to = ();
|
|
|
|
$from = connect_imap($host1, $port1, $debugimap, $ssl1);
|
|
- print "From software : ", server_banner($from);
|
|
- print "From capability : ", join(" ", $from->capability()), "\n";
|
|
+ !$quiet and print "From software : ", server_banner($from);
|
|
+ !$quiet and print "From capability : ", join(" ", $from->capability()), "\n";
|
|
$to = connect_imap($host2, $port2, $debugimap, $ssl2);
|
|
- print "To software : ", server_banner($to);
|
|
- print "To capability : ", join(" ", $to->capability()), "\n";
|
|
+ !$quiet and print "To software : ", server_banner($to);
|
|
+ !$quiet and print "To capability : ", join(" ", $to->capability()), "\n";
|
|
$from->logout();
|
|
$to->logout();
|
|
exit(0);
|
|
@@ -638,16 +642,16 @@
|
|
$syncinternaldates = defined($syncinternaldates) ? defined($syncinternaldates) : 1;
|
|
|
|
if($idatefromheader) {
|
|
- print "Turned ON idatefromheader, ",
|
|
+ !$quiet and print "Turned ON idatefromheader, ",
|
|
"will set the internal dates on host2 from the 'Date:' header line.\n";
|
|
$syncinternaldates = 0;
|
|
|
|
}
|
|
if ($syncinternaldates) {
|
|
- print "Turned ON syncinternaldates, ",
|
|
+ !$quiet and print "Turned ON syncinternaldates, ",
|
|
"will set the internal dates on host2 same as host1.\n";
|
|
}else{
|
|
- print "Turned OFF syncinternaldates\n";
|
|
+ !$quiet and print "Turned OFF syncinternaldates\n";
|
|
}
|
|
|
|
if ($syncinternaldates || $idatefromheader) {
|
|
@@ -656,11 +660,12 @@
|
|
require Date::Manip;
|
|
Date::Manip->import(qw(ParseDate Date_Cmp UnixDate Date_Init Date_TimeZone));
|
|
#print "Date_init : [", join(" ",Date_Init()), "]\n";
|
|
- print "TimeZone :[", Date_TimeZone(), "]\n";
|
|
if (not (Date_TimeZone())) {
|
|
- warn "TimeZone not defined, setting it to GMT";
|
|
+ #warn "TimeZone not defined, setting it to GMT";
|
|
Date_Init("TZ=GMT");
|
|
- print "TimeZone : [", Date_TimeZone(), "]\n";
|
|
+ !$quiet and print "TimeZone : [", Date_TimeZone(), "]\n";
|
|
+ }else{
|
|
+ !$quiet and print "TimeZone :[", Date_TimeZone(), "]\n";
|
|
}
|
|
}
|
|
|
|
@@ -680,8 +685,8 @@
|
|
$authuser1 ||= $user1;
|
|
$authuser2 ||= $user2;
|
|
|
|
-print "Will try to use $authmech1 authentication on host1\n";
|
|
-print "Will try to use $authmech2 authentication on host2\n";
|
|
+!$quiet and print "Will try to use $authmech1 authentication on host1\n";
|
|
+!$quiet and print "Will try to use $authmech2 authentication on host2\n";
|
|
|
|
$syncacls = (defined($syncacls)) ? $syncacls : 0;
|
|
$foldersizes = (defined($foldersizes)) ? $foldersizes : 1;
|
|
@@ -693,8 +698,8 @@
|
|
|
|
@useheader = ("ALL") unless (@useheader);
|
|
|
|
-print "From imap server [$host1] port [$port1] user [$user1]\n";
|
|
-print "To imap server [$host2] port [$port2] user [$user2]\n";
|
|
+!$quiet and print "From imap server [$host1] port [$port1] user [$user1]\n";
|
|
+!$quiet and print "To imap server [$host2] port [$port2] user [$user2]\n";
|
|
|
|
|
|
sub ask_for_password {
|
|
@@ -765,20 +770,20 @@
|
|
$imap->connect()
|
|
or die "Can not open imap connection on [$host] with user [$user] : $@\n";
|
|
|
|
- print "Banner : ", server_banner($imap);
|
|
+ !$quiet and print "Banner : ", server_banner($imap);
|
|
|
|
if ($imap->has_capability("AUTH=$authmech")
|
|
or $imap->has_capability($authmech)
|
|
) {
|
|
- printf("Host %s says it has CAPABILITY for AUTHENTICATE %s\n",
|
|
- $imap->Server, $authmech);
|
|
+ if (!$quiet) { printf("Host %s says it has CAPABILITY for AUTHENTICATE %s\n",
|
|
+ $imap->Server, $authmech);}
|
|
}
|
|
else {
|
|
- printf("Host %s says it has NO CAPABILITY for AUTHENTICATE %s\n",
|
|
- $imap->Server, $authmech);
|
|
+ if (!$quiet) { printf("Host %s says it has NO CAPABILITY for AUTHENTICATE %s\n",
|
|
+ $imap->Server, $authmech);}
|
|
if ($authmech eq 'PLAIN') {
|
|
print "Frequently PLAIN is only supported with SSL, ",
|
|
- "try --ssl1 or --ssl2 option\n";
|
|
+ "try using SSL option\n";
|
|
}
|
|
}
|
|
|
|
@@ -789,15 +794,15 @@
|
|
$imap->Authuser($authuser);
|
|
$imap->Password($password);
|
|
unless ($imap->login()) {
|
|
- print "Error login : [$host] with user [$user] auth [$authmech]: $@\n";
|
|
+ !$quiet and print "Error login : [$host] with user [$user] auth [$authmech]: $@\n";
|
|
die if ($authmech eq 'LOGIN');
|
|
die if $imap->IsUnconnected();
|
|
- print "Trying LOGIN Auth mechanism on [$host] with user [$user]\n";
|
|
+ !$quiet and print "Trying LOGIN Auth mechanism on [$host] with user [$user]\n";
|
|
$imap->Authmechanism("");
|
|
$imap->login() or
|
|
die "Error login : [$host] with user [$user] auth [LOGIN] : $@";
|
|
}
|
|
- print "Success login on [$host] with user [$user] auth [$authmech]\n";
|
|
+ !$quiet and print "Success login on [$host] with user [$user] auth [$authmech]\n";
|
|
return($imap);
|
|
}
|
|
|
|
@@ -822,13 +827,13 @@
|
|
|
|
|
|
|
|
-print "From capability : ", join(" ", $from->capability()), "\n";
|
|
-print "To capability : ", join(" ", $to->capability()), "\n";
|
|
+!$quiet and print "From capability : ", join(" ", $from->capability()), "\n";
|
|
+!$quiet and print "To capability : ", join(" ", $to->capability()), "\n";
|
|
|
|
die unless $from->IsAuthenticated();
|
|
-print "From state Authenticated\n";
|
|
+!$quiet and print "From state Authenticated\n";
|
|
die unless $to->IsAuthenticated();
|
|
-print "To state Authenticated\n";
|
|
+!$quiet and print "To state Authenticated\n";
|
|
|
|
$split1 and $from->Split($split1);
|
|
$split2 and $to->Split($split2);
|
|
@@ -932,7 +937,7 @@
|
|
foreach my $include (@include) {
|
|
my @included_folders = grep /$include/, @all_source_folders;
|
|
add_to_requested_folders(@included_folders);
|
|
- print "Including folders matching pattern '$include': @included_folders\n";
|
|
+ !$quiet and print "Including folders matching pattern '$include': @included_folders\n";
|
|
}
|
|
}
|
|
|
|
@@ -941,7 +946,7 @@
|
|
my @requested_folder = sort(keys(%requested_folder));
|
|
my @excluded_folders = grep /$exclude/, @requested_folder;
|
|
remove_from_requested_folders(@excluded_folders);
|
|
- print "Excluding folders matching pattern '$exclude': @excluded_folders\n";
|
|
+ !$quiet and print "Excluding folders matching pattern '$exclude': @excluded_folders\n";
|
|
}
|
|
}
|
|
|
|
@@ -1056,7 +1061,7 @@
|
|
|
|
$debug and print "Getting prefix namespace\n";
|
|
if (defined($prefix_in)) {
|
|
- print "Using [$prefix_in] given by $prefix_opt\n";
|
|
+ !$quiet and print "Using [$prefix_in] given by $prefix_opt\n";
|
|
$prefix_out = $prefix_in;
|
|
return($prefix_out);
|
|
}
|
|
@@ -1082,7 +1087,7 @@
|
|
|
|
|
|
if ($sep_in) {
|
|
- print "Using [$sep_in] given by $sep_opt\n";
|
|
+ !$quiet and print "Using [$sep_in] given by $sep_opt\n";
|
|
$sep_out = $sep_in;
|
|
return($sep_out);
|
|
}
|
|
@@ -1101,8 +1106,8 @@
|
|
}
|
|
|
|
|
|
-print "From separator and prefix : [$f_sep][$f_prefix]\n";
|
|
-print "To separator and prefix : [$t_sep][$t_prefix]\n";
|
|
+!$quiet and print "From separator and prefix : [$f_sep][$f_prefix]\n";
|
|
+!$quiet and print "To separator and prefix : [$t_sep][$t_prefix]\n";
|
|
|
|
|
|
sub foldersizes {
|
|
@@ -1111,13 +1116,13 @@
|
|
my $tot = 0;
|
|
my $tmess = 0;
|
|
my @folders = @{$folders_r};
|
|
- print "++++ Calculating sizes ++++\n";
|
|
+ !$quiet and print "++++ Calculating sizes ++++\n";
|
|
foreach my $folder (@folders) {
|
|
my $stot = 0;
|
|
my $smess = 0;
|
|
- printf("$side Folder %-35s", "[$folder]");
|
|
+ !$quiet and printf("$side Folder %-35s", "[$folder]");
|
|
unless($imap->exists($folder)) {
|
|
- print("does not exist yet\n");
|
|
+ !$quiet and print("does not exist yet\n");
|
|
next;
|
|
}
|
|
unless ($imap->select($folder)) {
|
|
@@ -1148,14 +1153,14 @@
|
|
map {$stot += $hashref->{$_}->{"RFC822.SIZE"}} keys %$hashref;
|
|
}
|
|
}
|
|
- printf(" Size: %9s", $stot);
|
|
- printf(" Messages: %5s\n", $smess);
|
|
+ !$quiet and printf(" Size: %9s", $stot);
|
|
+ !$quiet and printf(" Messages: %5s\n", $smess);
|
|
$tot += $stot;
|
|
$tmess += $smess;
|
|
}
|
|
- print "Total size: $tot\n";
|
|
- print "Total messages: $tmess\n";
|
|
- print "Time : ", timenext(), " s\n";
|
|
+ !$quiet and print "Total size: $tot\n";
|
|
+ !$quiet and print "Total messages: $tmess\n";
|
|
+ !$quiet and print "Time : ", timenext(), " s\n";
|
|
}
|
|
|
|
|
|
@@ -1196,12 +1201,12 @@
|
|
$t_folders_list{$folder}++;
|
|
}
|
|
|
|
-print
|
|
+!$quiet and print
|
|
"++++ Listing folders ++++\n",
|
|
"From folders list : ", map("[$_] ",@f_folders),"\n",
|
|
"To folders list : ", map("[$_] ",@t_folders_list),"\n";
|
|
|
|
-print
|
|
+!$quiet and print
|
|
"From subscribed folders list : ",
|
|
map("[$_] ", sort keys(%subscribed_folder)), "\n"
|
|
if ($subscribed);
|
|
@@ -1259,11 +1264,11 @@
|
|
my %users = map({ ($_, 1) } (keys(%$f_hash), keys(%$t_hash)));
|
|
foreach my $user (sort(keys(%users))) {
|
|
my $acl = $f_hash->{$user} || "none";
|
|
- print "acl $user : [$acl]\n";
|
|
+ !$quiet and print "acl $user : [$acl]\n";
|
|
next if ($f_hash->{$user} && $t_hash->{$user} &&
|
|
$f_hash->{$user} eq $t_hash->{$user});
|
|
unless ($dry) {
|
|
- print "setting acl $t_fold $user $acl\n";
|
|
+ !$quiet and print "setting acl $t_fold $user $acl\n";
|
|
$to->setacl($t_fold, $user, $acl)
|
|
or warn "Could not set acl: $@\n";
|
|
}
|
|
@@ -1272,13 +1277,13 @@
|
|
}
|
|
|
|
|
|
-print "++++ Looping on each folder ++++\n";
|
|
+!$quiet and print "++++ Looping on each folder ++++\n";
|
|
|
|
FOLDER: foreach my $f_fold (@f_folders) {
|
|
my $t_fold;
|
|
- print "From Folder [$f_fold]\n";
|
|
+ !$quiet and print "From Folder [$f_fold]\n";
|
|
$t_fold = to_folder_name($f_fold);
|
|
- print "To Folder [$t_fold]\n";
|
|
+ !$quiet and print "To Folder [$t_fold]\n";
|
|
|
|
last FOLDER if $from->IsUnconnected();
|
|
last FOLDER if $to->IsUnconnected();
|
|
@@ -1291,12 +1296,13 @@
|
|
next FOLDER;
|
|
}
|
|
if ( ! exists($t_folders_list{$t_fold})) {
|
|
- print "To Folder $t_fold does not exist\n";
|
|
- print "Creating folder [$t_fold]\n";
|
|
+ !$quiet and print "To Folder $t_fold does not exist\n";
|
|
+ !$quiet and print "Creating folder [$t_fold]\n";
|
|
unless ($dry){
|
|
unless ($to->create($t_fold)){
|
|
warn "Couldn't create [$t_fold]",
|
|
$to->LastError,"\n";
|
|
+ $errortext .= "Couldn't create [$t_fold]",
|
|
$error++;
|
|
next FOLDER;
|
|
}
|
|
@@ -1317,13 +1323,13 @@
|
|
}
|
|
|
|
if ($expunge){
|
|
- print "Expunging $f_fold and $t_fold\n";
|
|
+ !$quiet and print "Expunging $f_fold and $t_fold\n";
|
|
unless($dry) { $from->expunge() };
|
|
#unless($dry) { $to->expunge() };
|
|
}
|
|
|
|
if ($subscribe and exists $subscribed_folder{$f_fold}) {
|
|
- print "Subscribing to folder $t_fold on destination server\n";
|
|
+ !$quiet and print "Subscribing to folder $t_fold on destination server\n";
|
|
unless($dry) { $to->subscribe($t_fold) };
|
|
}
|
|
|
|
@@ -1346,7 +1352,7 @@
|
|
my %f_hash = ();
|
|
my %t_hash = ();
|
|
|
|
- print "++++ From [$f_fold] Parse 1 ++++\n";
|
|
+ !$quiet and print "++++ From [$f_fold] Parse 1 ++++\n";
|
|
last FOLDER if $from->IsUnconnected();
|
|
last FOLDER if $to->IsUnconnected();
|
|
|
|
@@ -1363,7 +1369,7 @@
|
|
}
|
|
$debug and print "Time headers: ", timenext(), " s\n";
|
|
|
|
- print "++++ To [$t_fold] Parse 1 ++++\n";
|
|
+ !$quiet and print "++++ To [$t_fold] Parse 1 ++++\n";
|
|
last FOLDER if $from->IsUnconnected();
|
|
last FOLDER if $to->IsUnconnected();
|
|
|
|
@@ -1379,7 +1385,7 @@
|
|
}
|
|
$debug and print "Time headers: ", timenext(), " s\n";
|
|
|
|
- print "++++ Verifying [$f_fold] -> [$t_fold] ++++\n";
|
|
+ !$quiet and print "++++ Verifying [$f_fold] -> [$t_fold] ++++\n";
|
|
# messages in "from" that are not good in "to"
|
|
|
|
my @f_hash_keys_sorted_by_uid
|
|
@@ -1396,7 +1402,7 @@
|
|
#print "$m_id ";
|
|
unless (exists($f_hash{$m_id})) {
|
|
my $t_msg = $t_hash{$m_id}{'m'};
|
|
- print "deleting message $m_id $t_msg\n";
|
|
+ !$quiet and print "deleting message $m_id $t_msg\n";
|
|
$to->delete_message($t_msg) unless ($dry);
|
|
}
|
|
}
|
|
@@ -1408,16 +1414,16 @@
|
|
my $f_idate = $f_hash{$m_id}{'D'};
|
|
|
|
if (defined $maxsize and $f_size > $maxsize) {
|
|
- print "+ Skipping msg #$f_msg:$f_size in folder $f_fold (exceeds maxsize limit $maxsize bytes)\n";
|
|
+ !$quiet and print "+ Skipping msg #$f_msg:$f_size in folder $f_fold (exceeds maxsize limit $maxsize bytes)\n";
|
|
$mess_size_total_skipped += $f_size;
|
|
$mess_skipped += 1;
|
|
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";
|
|
+ !$quiet 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";
|
|
+ !$quiet and print "+ Copying msg #$f_msg:$f_size to folder $t_fold\n";
|
|
last FOLDER if $from->IsUnconnected();
|
|
my $string;
|
|
$string = $from->message_string($f_msg);
|
|
@@ -1497,7 +1503,7 @@
|
|
$flags_f = flags_regex($flags_f) if @regexflag;
|
|
|
|
my $new_id;
|
|
- print "flags from : [$flags_f][$d]\n";
|
|
+ !$quiet and print "flags from : [$flags_f][$d]\n";
|
|
last FOLDER if $to->IsUnconnected();
|
|
unless ($dry) {
|
|
|
|
@@ -1514,6 +1520,9 @@
|
|
warn "Couldn't append msg #$f_msg (Subject:[".
|
|
$from->subject($f_msg)."]) to folder $t_fold: ",
|
|
$to->LastError, "\n";
|
|
+ $errortext .= "Couldn't append msg #$f_msg (Subject:[".
|
|
+ $from->subject($f_msg)."]) to folder $t_fold: " .
|
|
+ $to->LastError . "\n";
|
|
$error++;
|
|
$mess_size_total_error += $f_size;
|
|
next MESS;
|
|
@@ -1522,11 +1531,11 @@
|
|
# good
|
|
# $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";
|
|
+ !$quiet 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;
|
|
if($delete) {
|
|
- print "Deleting msg #$f_msg in folder $f_fold\n";
|
|
+ !$quiet 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);
|
|
}
|
|
@@ -1577,12 +1586,12 @@
|
|
|
|
|
|
$debug and do {
|
|
- print "Looking dates\n";
|
|
+ !$quiet and print "Looking dates\n";
|
|
#my $d_f = $from->internaldate($f_msg);
|
|
#my $d_t = $to->internaldate($t_msg);
|
|
my $d_f = $f_hash{$m_id}{'D'};
|
|
my $d_t = $t_hash{$m_id}{'D'};
|
|
- print
|
|
+ !$quiet and print
|
|
"idate from : $d_f\n",
|
|
"idate to : $d_t\n";
|
|
|
|
@@ -1592,13 +1601,14 @@
|
|
};
|
|
unless (($f_size == $t_size) or $skipsize) {
|
|
# Bad size
|
|
- print
|
|
+ !$quiet and 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.
|
|
+ $errortext .= "Message $m_id SZ_BAD f:$f_msg:$f_size t:$t_msg:$t_size\n";
|
|
$error++;
|
|
if ($opt_G){
|
|
- print "Deleting msg f:#$t_msg in folder $t_fold\n";
|
|
+ !$quiet and print "Deleting msg f:#$t_msg in folder $t_fold\n";
|
|
$to->delete_message($t_msg) unless ($dry);
|
|
}
|
|
}
|
|
@@ -1607,22 +1617,22 @@
|
|
$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";
|
|
+ !$quiet 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);
|
|
}
|
|
}
|
|
}
|
|
if ($expunge1){
|
|
- print "Expunging source folder $f_fold\n";
|
|
+ !$quiet and print "Expunging source folder $f_fold\n";
|
|
unless($dry) { $from->expunge() };
|
|
}
|
|
if ($expunge2){
|
|
- print "Expunging target folder $t_fold\n";
|
|
+ !$quiet and print "Expunging target folder $t_fold\n";
|
|
unless($dry) { $to->expunge() };
|
|
}
|
|
|
|
-print "Time : ", timenext(), " s\n";
|
|
+!$quiet and print "Time : ", timenext(), " s\n";
|
|
}
|
|
|
|
|
|
@@ -1673,17 +1683,47 @@
|
|
}
|
|
|
|
sub stats {
|
|
- print "++++ Statistics ++++\n";
|
|
- 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 "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 "Detected $error errors\n\n";
|
|
- print thank_author();
|
|
+
|
|
+ if ($error){$emailreport=1;}
|
|
+ if ($emailreport == 1){
|
|
+ my $smtpserver = 'localhost';
|
|
+ my $Mail = Net::SMTP->new($smtpserver) ||
|
|
+ die "Could not connect to SMTP server $smtpserver : $!";
|
|
+ $Mail->mail($emailuser);
|
|
+ $Mail->recipient($emailuser);
|
|
+ my $Message = "To: " . $emailuser . "\n";
|
|
+ $Message .= "From: admin\@vfemail.net\n";
|
|
+ $Message .= "Date: " . date_r() ."\n";
|
|
+ $Message .= "Subject: IMAPSync Report\n\n\n";
|
|
+ $Message .= "++++ Statistics ++++\n";
|
|
+ $Message .= "Time : $timediff sec\n";
|
|
+ $Message .= "Messages transferred : $mess_trans ";
|
|
+ $Message .= "\n";
|
|
+ $Message .= "Messages skipped : $mess_skipped\n";
|
|
+ $Message .= "Total bytes transferred: $mess_size_total_trans\n";
|
|
+ $Message .= "Total bytes skipped : $mess_size_total_skipped\n";
|
|
+ $Message .= "Total bytes error : $mess_size_total_error\n";
|
|
+ $Message .= "Detected $error errors\n\n";
|
|
+ if ($error){$Message .= $errortext."\n\n";}
|
|
+
|
|
+ $Mail->data($Message);
|
|
+ $Mail->quit();
|
|
+
|
|
+
|
|
+
|
|
+ }elsif ($showstats){
|
|
+ print "++++ Statistics ++++\n";
|
|
+ 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 "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 "Detected $error errors\n\n";
|
|
+ #print thank_author();
|
|
+ }
|
|
}
|
|
|
|
sub thank_author {
|
|
@@ -1695,6 +1735,25 @@
|
|
|
|
}
|
|
|
|
+sub date_r
|
|
+ {
|
|
+ my ($day, $mon, $str);
|
|
+ my (@lt) = ();
|
|
+ my @DAYS = ( "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" );
|
|
+ my @MON = ("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
|
|
+
|
|
+ @lt = localtime();
|
|
+ $day = $lt[6];
|
|
+ $mon = $lt[4];
|
|
+
|
|
+ $str = $DAYS[$day] . ", " . $lt[3] . " " . $MON[$mon] . " " . ($lt[5]+1900)
|
|
+ . " " . sprintf("%02d:%02d:%02d", $lt[2], $lt[1], $lt[0] )
|
|
+ . " " . sprintf("%03d%02d", (tz_offset() / 3600), 0);
|
|
+
|
|
+ return $str;
|
|
+ }
|
|
+
|
|
+
|
|
sub get_options
|
|
{
|
|
my $numopt = scalar(@ARGV);
|
|
@@ -1760,6 +1819,10 @@
|
|
"split1=i" => \$split1,
|
|
"split2=i" => \$split2,
|
|
"tests" => \$tests,
|
|
+ "quiet!" => \$quiet,
|
|
+ "showstats" => \$showstats,
|
|
+ "emailreport" => \$emailreport,
|
|
+ "emailuser=s" => \$emailuser,
|
|
"allow3xx!" => \$allow3xx,
|
|
);
|
|
|
|
@@ -1769,7 +1832,7 @@
|
|
$test_builder->no_ending(1);
|
|
|
|
# just the version
|
|
- print "$VERSION\n" and exit if ($version) ;
|
|
+ !$quiet and print "$VERSION\n" and exit if ($version) ;
|
|
|
|
if ($tests) {
|
|
$test_builder->no_ending(0);
|
|
@@ -2027,6 +2090,10 @@
|
|
--fastio1 : use fastio with the "from" server.
|
|
--fastio2 : use fastio with the "destination" server.
|
|
--timeout <int> : imap connect timeout.
|
|
+--quiet : Only outupt errors.
|
|
+--showstats : On by default, use with --quiet for end results.
|
|
+--emailreport : Send final stats to email address.
|
|
+--emailuser <string> : User to send final stats to (server defaults to localhost).
|
|
--help : print this.
|
|
|
|
Example: to synchronise imap account "foo" on "imap.truc.org"
|