Mercurial > hg > Applications > mh
diff miscellany/audit/refileto @ 0:bce86c4163a3
Initial revision
author | kono |
---|---|
date | Mon, 18 Apr 2005 23:46:02 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/miscellany/audit/refileto Mon Apr 18 23:46:02 2005 +0900 @@ -0,0 +1,140 @@ +#!/usr/bin/perl + +$program = $0; +$program =~ s|.*/||; +$| = 1; + +unshift(@INC, $ENV{'DELIVERPATH'}); +require 'audit.pl' || die "$program: cannot include audit.pl: $@"; +require 'mh.pl' || die "$program: cannot include mh.pl: $@"; + +@SW = ( + '-debug', + '-draft', + '-file file', + '-help', + '-link', + '-log +folder', # defaults to +log + '-nolink', + '-nopreserve', + '-preserve', + '-rmmproc program', + '-src +folder', # defaults to current folder + '-verbose', + ); + + +&mh_profile(); +&mh_parse(); + + +defined($SW{'help'}) && do { + print "syntax: $program [msgs] [switches]\n"; + &print_switches(); + exit; +}; + + +@args = (defined(@MSGS) ? @MSGS : @ARGV); + + +$logdir = $SW{'log'} || $MH{'logdir'} || "+log"; +($logdir = '+' . $logdir) if ($logdir !~ /\+/); +$folder = `mhpath cur`; chop $folder; $folder =~ s|/\d+$||; +$folder = $SW{'src'} if defined($SW{'src'}); +($folder = '+' . $folder) if ($folder !~ /\+/); + + +$SW{'file'} = "$MH{'path'}/draft" if defined($SW{'draft'}); +if (defined($SW{'file'})) { + @paths = ($file); +} else { + @paths = `mhpath $folder @args`; chop @paths; +}; + + +@refileargs = ( ); +for ('link', 'nolink', 'preserve', 'nopreserve') { + push(@refileargs, "-$_") if defined($SW{$_}); +}; +push(@refileargs, "-rmmproc", $SW{'rmmproc'}) if defined($SW{'rmmproc'}); + + +foreach $msg (@paths) { + open(MESSAGE, "< $msg") || next; + + &local_parse_message(MESSAGE); + + # ----- + # if -from was specified use the From line; if -to is specified use + # the To line. + # + $header = $headers{'from'} if ($program eq "refilefrom"); + $header = $headers{'to'} if ($program eq "refileto"); + $header = $header . ',' . $headers{'cc'} if + (($program eq "refileto") && defined($headers{'cc'})); + + @nfolders = ( ); + foreach $addr (split(',', $header)) { + ($friendly, $address, $name, $org) = &parse_email_address($addr); + $org = "local" if ($org eq "unknown"); + push(@nfolders, "$logdir/$org/$name"); + }; + + @mfolders = ( ); + foreach $folder (@nfolders) { + $fpath = `mhpath $folder`; chop $fpath; + if (-d $fpath || ! &make_mhpath($fpath)) { + push(@mfolders, $folder); + } else { + warn "cannot make directory $fpath: $!\n"; + }; + }; + + print "refile @refileargs -file $msg @mfolders\n" if + (@mfolders && defined($SW{'verbose'})); + system "refile -file $msg @mfolders" if + (@mfolders && !defined($SW{'debug'})); + + close(MESSAGE); +}; + + +# ===== +# Subroutine local_parse_message +# A simplified version of parse_message that does +# not care about the body of the message +# +sub local_parse_message { + local(*INFILE) = @_; + local($header, $body, $mheader); + + $/ = ''; # read input in paragraph mode + %headers = ( ); + @received = ( ); + + $header = <INFILE>; + $/ = "\n"; + $* = 0; + + # ----- + # fill out the headers associative array with fields from the mail + # header. + # + $_ = $header; + s/\n\s+//g; + @lines = split('\n'); + for ( @lines ) { + /^(\w*):\s*(.*)/ && do { + $mheader = $1; + $mheader =~ tr/A-Z/a-z/; + if (($mheader eq "cc" || $mheader eq "to") && $headers{$mheader}) { + $headers{$mheader} .= ", $2"; + } else { + $headers{$mheader} = $2; + }; + }; + } + + return; +}