#!/usr/bin/perl # vim: ts=4 ai syn bs=2 use strict; use Getopt::Long; use Time::Local; GetOptions( "archive=s" => \my $archive_dir, "mbox=s" => \my $mbox_file, "help" => \my $print_help, ); &usage, exit if $print_help; $archive_dir ||= "archive"; $mbox_file ||= "mbox"; my %month = ( 'Jan' => 0, 'Feb' => 1, 'Mar' => 2, 'Apr' => 3, 'May' => 4, 'Jun' => 5, 'Jul' => 6, 'Aug' => 7, 'Sep' => 8, 'Oct' => 9, 'Nov' => 10, 'Dec' => 11 ); open MBOX, ">$mbox_file"; # get the numbers dirs, stuff in ordered list. opendir ADIR, $archive_dir; my @dir_list = grep /\d+/, readdir ADIR; #my @dir_list = readdir ADIR; close ADIR; @dir_list = sort {$a <=> $b} @dir_list; print "@dir_list\n"; #exit; foreach my $dir (@dir_list) { opendir DIR, "$archive_dir/$dir"; my @file_list = sort {$a <=> $b} ( grep /\d+/, readdir DIR ); close DIR; open MSGINDEX, "$archive_dir/$dir/index"; my @msgindex = ; close MSGINDEX; print "$archive_dir/$dir: @file_list\n"; #next; foreach my $file (@file_list) { open FILE, "$archive_dir/$dir/$file"; my @buf = ; close FILE; # this is sloppy and assumes that the junk in <> is a valid email # find out what a valid email is and fix my ($from_line) = grep /^From:/, @buf; $from_line =~ m/<(.+)>/; my $from = $1; my $date_line = getlineaftermessagenumber("$dir$file"+0, \@msgindex); $date_line =~ m/^\s+(\d+) (\w{3}) (\d{4}) (\d{2}):(\d{2}):(\d{2})/; #my $date = "scalar localtime $1; my $time = timelocal($6, $5, $4, $1, $month{$2}, $3); my $date = scalar localtime $time; #$date_line =~ m/(\w{3}), (\d+) (\w{3}) (\d{4}) (\d{2}:\d{2}:\d{2})/; #my $date = "$1 $3 $2 $5 $4"; print MBOX "From $from $date\n"; print MBOX @buf; print MBOX "\n"; } #last; } close MBOX; sub getlineaftermessagenumber { my ($msgnum, $msgindex) = @_; for(my $i = 0; $i < @$msgindex; ++$i) { if ($msgindex->[$i] =~ /^$msgnum/) { return $msgindex->[$i+1]; } } die "could not find $msgnum in index!\n"; } sub usage { print "ezmlm2mbox: [ --archive ] [ --mbox ]\n"; }