=cut
-use Env qw(HOME MAILDIR);
+use Env qw(COLUMNS HOME MAILDIR);
+
+$COLUMNS ||= 80;
if (not $HOME) {
die("HOME environment variable must be set.\n");
=cut
our @FILTERS;
+our (@start_hooks, @stop_hooks, @filter_hooks, @post_store_hooks);
my $mh;
my $logfile;
sub find_mh_folder {
my $msg = shift;
- my %headers;
+ my %headers = @_;
my $filterref;
my @filter;
my $header;
my $expression;
my $result;
- %headers = get_headers($msg);
if (not %headers) {
return 'malformed';
}
- log_headers(%headers);
-
# Walk the list of filters. This structure is documented in
# pod at the end of the program.
foreach $filterref (@FILTERS) {
my $msgnum;
my %FOLDERS = ('SPAM'=>1);
- if (-f "$HOME/.mincspam") {
- require "$HOME/.mincspam";
- } else {
- eval "sub spam_start_hook { return (); }";
- eval "sub spam_stop_hook { }";
- eval "sub spam_check { return 0; }";
- }
+ # XXX lame names and hard-coded proportions.
+ my $nf = $COLUMNS * 0.1;
+ my $nm = $COLUMNS * 0.0625;
+ my $nF = $COLUMNS * 0.175;
+ my $ns = $COLUMNS - $nf - $nm - $nF - 3;
- if (-f "$HOME/.mincfilter") {
- require "$HOME/.mincfilter";
+ if (-f "$HOME/.minc") {
+ require "$HOME/.minc";
}
- if (-f "$HOME/.minchooks") {
- require "$HOME/.minchooks";
- } else {
- eval "sub post_store_hook { }";
+ my %batons;
+ for my $hook (@start_hooks) {
+ my ($handle, @baton) = $hook->();
+ if (defined($handle)) {
+ $batons{$handle} = [@baton];
+ }
}
- @baton = spam_start_hook();
-
foreach $msg (@msglist) {
($msg eq '.' or $msg eq '..') and next;
print("$msg\n");
}
- if (spam_check($msg, @baton)) {
- $mhfolder = 'SPAM';
- $spam = @SPAM + 1;
- } else {
- $mhfolder = find_mh_folder($msg);
- $saved++;
+ my %headers = get_headers($msg);
+ log_headers(%headers);
+
+ undef($mhfolder);
+ for my $hook (@filter_hooks) {
+ my $result = $hook->(\%batons, \%headers, $msg);
+ defined($result) and ($mhfolder = $result);
}
+ defined($mhfolder) or ($mhfolder = find_mh_folder($msg, %headers));
+
$msgnum = store_message($msg, $mhfolder);
- post_store_hook($mhfolder, $msgnum);
+ if ($mhfolder eq 'SPAM') {
+ $spam++;
+ } else {
+ $saved++;
+ print("\r");
+ print(' ' x $COLUMNS);
+ printf("\r\%-${nf}s \%${nm}d \%-${nF}s \%s\n",
+ substr($mhfolder, 0, $nf), substr($msgnum, 0, $nm),
+ substr(pop(@{$headers{'from'}}), 0, $nF),
+ substr(pop(@{$headers{'subject'}}), 0, $ns))
+ }
- print("\r");
- if (not $FOLDERS{$mhfolder}) {
- print(' ' x $len);
- print(" \r$mhfolder\n");
- $FOLDERS{$mhfolder} = 1;
+ for my $hook (@post_store_hooks) {
+ $hook->(\%batons, \%headers, $mhfolder, $msgnum);
}
printf(" \%${len}d SPAM \%${len}d saved \%${len}d/%1d",
}
print("\n");
- spam_stop_hook(@baton);
+ for my $hook (@stop_hooks) {
+ $hook->(\%batons);
+ }
}
\f
my $st;
if ($dumpfilters) {
- require "$HOME/.mincfilter";
+ require "$HOME/.minc";
$Data::Dumper::Indent = 1;
print(Dumper(\@FILTERS));
exit;