#!/usr/bin/perl

use Mail::Internet;
use Mail::Field;
use Mail::Address;
use File::Spec;
use POSIX 'strftime';

my $dir = shift || '.';
opendir D, $dir or die "Couldn't read directory $dir: $!; aborting";
my @message_files = sort { $a <=> $b } grep {!/\D/ && -f "$dir/$_" } readdir D;
closedir D;

my %me;
{ my @addresses = $ENV{ADDRESS} ? 
    split(/,\s+/, $ENV{ADDRESS}) : guess_addresses();
  for (@addresses) { $me{lc $_} = 1; };
}

for $msgno (@message_files) {
  local *F;
  my $file = File::Spec->catfile($dir, $msgno);
  unless (open F, "<", $file) {
    warn "Couldn't read message $msgno; skipping.\n"; 
    next;
  }
  my $mo = Mail::Internet->new(\*F);
  my $h = $mo->head;
  { my $datefield = $h->get('date');
    my $time = $datefield ? Mail::Field->new('date', $datefield)->time 
                          : (stat($file))[9];
    $date = strftime("%m/%d", localtime($time));
  }

  { for my $mf (Mail::Address->parse($h->get('from'))) {
      if ($me{lc $mf->address}) {
        $whom = "To:" . $h->get('to');
        last;
      } else {
        $whom = $mf->phrase || $mf->comment || $mf->address;
      }
    }
  }

  $subjcontent = $h->get('subject') . "<<" . join "", @{$mo->body};
  $subjcontent =~ tr/\n//d;
  
  write;
}

format STDOUT =
@####  @<<<< @<<<<<<<<<<<<<<<<  @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$msgno,$date,$whom,             $subjcontent
.

sub guess_addresses {
  my $username = $ENV{USER} || (getpwuid($<))[0] || return;
  my $host = $ENV{HOST} || do {
    require Config;
    "Config"->import;
    $Config{myhostname} . $Config{mydomain};
  } || return;
  "$username\@$host";
}
