[Comm] Mozilla Thunderbird

Kolotov Alexandr =?iso-8859-1?q?akmypost_=CE=C1_mail=2Eru?=
Чт Дек 2 15:56:46 MSK 2004


>> Кто-нибудь знает плагин для Mozilla Thunderbird который позволяет 
>> удалять копии сообщений?
>> Просто при переходе с The Bat на Mozilla Thunderbird появилось 
>> несколько тысяч копий сообщений в разных папках и руками их удалять 
>> больно проблематично.
>> Заранее спасибо.
> 
> 
> Нету. Сам искал.
> Нашёл только прогу для обработки UNIX ящиков.
> Но в данный момент она утеряна. И как зовётся - не помню.
> Но нашёл я её на сайте мозиллы (на форуме)

где-то когда-то нашел...

----------------------------------------------------------------
#!/usr/bin/perl -w
use strict;

# mergebox [-h] [-d]
#
# Merge mboxen.  First argument is taken to be the destination mbox, all
# other arguments are asssumed to be source mboxen.  If a message doesn't
# have a Message-ID, construct one using MD5.  Can read Maildirs as well.
# Uses Mail::Folder::Mbox, which is nominally obsolete.  Will optionally
# delete messages older than date (ISO format YYYYMMDDhh:mm:ss) from
# source mbox(en).

# Performance - When reading the destination mbox, this program will look
# out for duplicate messages and keeps the longer message (under the
# assumption that truncation is the biggest source of duplicates).  Not
# the best, but who knows.  Once the destination mbox has been parsed,
# the program will read mbox (or maildir) looking out for duplicates.
# If the duplicate is smaller, it is skipped.  If it is longer, it is
# appended (and a warning printed).  The next time the destination is
# processed, the duplicate should be picked up and dealt with.
#
# The applicable license for distributing this module, is that
# which is common across much of the perl world, that being you get
# to use your choice of either The Artistic License of perl,
# or the GPL.  You can find copies of the Artistic License at
# perl.com (and other places), and you can find copies of the GNU
# Public License at Gnu.org (and other places).
#
# Gordon Haverland, Matter Realisations, perl на materialisations.com
# 2003/05/11

use Digest::MD5 qw(md5_base64);
use Mail::Folder::Mbox;
use Mail::Folder::Maildir;
use Mail::Internet;

use Getopt::Std;
use Date::Manip;
use vars qw($opt_h $opt_d);
my( $date, $date_dm, $past );

getopts('hd:');  # Delete messages older than $opt_d in source(s)
&usage() if( $opt_h );
if( $opt_d ) {
   die "Strange input (Date::Manip) format\n"
       unless( $opt_d =~ /^\d\d\d\d\d\d\d\d\d\d:\d\d:\d\d$/ );
}

#use Data::Dumper;  # For debugging

my( %dest,                     # Cache of Message-ID's
     $dest_folder, $dest_mbox,  # destination mbox/folder
     $email,                    # Mail::Internet email object
     $hdr,                      # Mail::Header header of $email
     $ID,                       # Message-ID of $email message
     $junk,                     # Flag to show if Message-ID present
     $size,                     # Size of message, as mbox message.
     $src_folder, $src_mbox,    # (Temporary) source mbox/folder name.
     @list,                     # Array to stick message numbers into
     );

if( $#ARGV > 0 ) {
     $dest_mbox = shift( @ARGV );
} else {
     &usage();
}

# Some email systems, have a placeholder first message, so create
# one here too.  The dummy message was sent at the origin of the
# UNIX epoch (Jan 1, 1970).
unless( -e $dest_mbox ) {
     # Grrrrr, now I find out that Mail::Folder is no longer supported,
     # and that Mail::Box is (sort of) preferred.  Okay, create a
     # single message mbox by hand.
     &write_init_mbox();
}
$dest_folder = new Mail::Folder('mbox', $dest_mbox ) ||
     die "Error, $dest_mbox is NOT a mbox\n";

my $dmessages = 0;
my $smessages = 0;
my $amessages = 0;
@list = [];         # Empty list.

# All our messages in destination mbox, are tidied, and have
# Message-IDs.  Get the first message, then iterate on the
# folder until all messages are processed.

@list = sort { $a <=> $b } $dest_folder->message_list;

foreach (@list) {
     $email = $dest_folder->get_message( $_ );

     $dmessages++;
     ($ID, $size, $junk) = &get_id( $email );
     die "Bad destination folder:($ID,$size,$junk)\n" if( $junk );
     if( exists( $dest{$ID} ) ) {           # Message exists already
	if( $dest{$_}->{size} && ($dest{$_}->{size} >= $size) ) {
	    # Truncation is the most common problem, assume newer message
	    # (which is smaller or same size) can be ignored (with warning).
	    print STDERR "Repeat message ($ID), keeping earlier one (bigger)\n";
	    $dest_folder->delete_message( $_ );

	} else {
	    # Later message is bigger, keep it.
	    print STDERR "Repeat message ($ID), keeping later one (bigger)\n";
	    $dest_folder->delete_message( $dest{$ID}->{msg} );
	    $dest{$ID}->{msg} = $_;
	    $dest{$ID}->{size} = $size;
	}

     } else {
	my $hash      = {};
	$hash->{msg}  = $_;
#       $hash->{ID}   = $ID;
	$hash->{size} = $size;
         $dest{$ID}    = $hash;
     }
}


# Okay, we are initialized.  Start to read in source folders and
# process them.
while( $src_mbox = shift( @ARGV ) ) {
     my( @del_messages );
     if( -e $src_mbox ) {
	unless( $src_folder = new Mail::Folder('AUTODETECT', $src_mbox, ) ) {
	    print "$src_mbox is NOT an mbox or maildir\n";
	    next;
	}

     } else {
	print "$src_mbox doesn't exist\n";
	next;
     }

     eval {
	@list = sort { $a <=> $b } $src_folder->message_list;
     };

     foreach (@list) {
	$email = $src_folder->get_message( $_ );
	$hdr   = $email->head();
         if( $opt_d ) {
	    $date  = $hdr->get('Date');
	    if( $date_dm = &ParseDate($date) ) {
		$past = &Date_Cmp( $date_dm, $opt_d );
		if( $past < 0 ) {
		    push( @del_messages, $_ );
		}
	    }
	}

	$smessages++;
	($ID, $size, $junk) = &get_id( $email );
	if( $junk ) {      # No Message-ID, so MD5 calculated.  Make new email
	    $email->tidy_body();
	    my $body = $email->body();

	    $hdr->add('Message-ID', $ID);
	    $email = new Mail::Internet( Header => $hdr, Body => $body );
	}

	unless( exists( $dest{$ID} ) ) {
	    my $hash      = {};
	    $hash->{msg}  = -1;  # Don't know message number
	    $hash->{size} = $size;
	    $dest{$ID}    = $hash;
	    $dest_folder->append_message( $email );
	    $amessages++;

	} else {  # Message already exists
	    if( $size > $dest{$ID}->{size} ) {
		print "Newer duplicate Message-ID ($ID), but bigger.  Appending anyway\n";
		$dest_folder->append_message( $email );
		$amessages++;

	    } else {
		print "Message $ID already exists in dest, skipping\n";
	    }
	}
     }
     if( $opt_d && ($#del_messages > 0) ) {
	$src_folder->delete_message( @del_messages );
	$src_folder->sync;
     }
     $src_folder->close;
}
$dest_folder->sync;
$dest_folder->close;
#undef( $dest_folder );
print STDERR "$dmessages originally in $dest_mbox\n";
print STDERR "$smessages in source folders to process\n";
print STDERR "and $amessages of those were added to $dest_mbox\n";
exit( 0 );

sub get_id {
     my $email = shift;
     my $hdr   = $email->head();
     my @tags  = $hdr->tags();
     my @mids  = grep( /Message-ID/i,         @tags );
     @mids     = grep( !/Resent-Message-ID/i, @mids );  # Filter out Resent

     if( $#mids > -1 ) {  # We have a Message-ID, use it
	my $mid;
	if( $#mids == 0 ) {
	    $mid = $hdr->get( $mids[0] );
	} else {
	    print "Strange, more than 1 Message-ID here\n";
	    foreach (@mids) { print " $_\n"; }
	    $mid = $hdr->get( $mids[0] );
	}
	my $size  = length( $email->as_mbox_string() );
	return( $mid, $size, undef );

     } else {                             # Make one from MD5 hash
	$email->tidy_body();
	my $size  = length( $email->as_mbox_string() );
	my $md5 = md5_base64( $email->as_string() );
	return( $md5, $size, $md5 );
     }
}
sub write_init_mbox {
     my $hdr = new Mail::Header(MailFrom => "KEEP");
     my @hdr_array = [
		     'From nobody на nowhere.org',
		     'From: nobody на nowhere.org',
		     'To: nobody на nowhere.org',
                      'Date: Thur,  1 Jan 1970 00:00:01 -0700 (MST)',
		     'Subject: Dummy Message for Mbox',
		     ];
     my @bdy_array = [
		     "Don't delete this message, I need a stub message.\n",
		     ];
     $hdr->extract( @hdr_array );
     my $email = new Mail::Internet( Header => $hdr, Body => @bdy_array );
     my $email_as_string = $email->as_mbox_string;

     # Note, this is a constant.  We could save time and just calculate
     # it once and then store that value here.
     my $ID = md5_base64( $email_as_string );

     $hdr->add( 'Message-ID', $ID );
     $email = new Mail::Internet( Header => $hdr, Body => @bdy_array );
     $email_as_string = $email->as_mbox_string;

     open( MBOX, "> $dest_mbox" ) ||
         die "Can't open $dest_mbox to write initial message to\n";
     print MBOX $email_as_string;
     close( MBOX );
}
------------------------------------------------------------------------------

-- 
С уважением, Kolotov Alexandr aka mr. Эбола
              отвечать: akmypost на mail.ru
                   ICQ: 100349254

    ---------------------------------------
   |  Registered Linux user       # 236664 |
    ---------------------------------------



Подробная информация о списке рассылки community