#!/opt/bin/perl5 # require 5.001; # ########################################################################### # # # Program to scan the sendmail(1) log file # # # ########################################################################### # # # Version 1.0 - Written 20.12.95 by Steffen Beyer # # # ########################################################################### # # # Copyright (C) 1995 by software design & management GmbH & Co. KG # # # ########################################################################### # # Some defaults: # $version = "version 1.0"; # $self = $0; $self =~ s!^.*/!!; # # Define here the name and absolute path of your sendmail(1) log file: # #$logfile = "/u/sb/sendmail.log"; $logfile = shift; # unless ((-e $logfile) && (-f $logfile) && (-s $logfile)) { print "$self error: '$logfile' is empty or doesn't exist!\n"; exit; } # unless (open(LOGFILE, "<$logfile")) { die "$self error: can't open '$logfile': $!\n"; } $state = 0; $old_id = ''; $new_id = ''; $message_id = ''; $from = ''; $received = ''; $to = ''; $olddate = ''; $newdate = ''; $time = 0; while () { chomp; $newdate = substr($_,0,16); if (/sendmail\[\d+\]:\s+(\w+?\d+):\s+/) { $new_id = $1; $_ = $'; if ($new_id ne $old_id) { &process_items; } $old_id = $new_id; $olddate = $newdate; } if (/^message-id=(.*)/) { $message_id = $1; if ($state != 0) { $item1 = &itemize(0); $item2 = &itemize($state); # warn "$self warning: expecting keyword '$item2', found '$item1'!\n"; } $state = 1; } elsif (/^from=(.*),\s+size/) { $from = $1; if ($state != 1) { $item1 = &itemize(1); $item2 = &itemize($state); # warn "$self warning: expecting keyword '$item2', found '$item1'!\n"; } $state = 2; } elsif (/^received from (\S+)/) { $received = $1; if ($state != 2) { $item1 = &itemize(2); $item2 = &itemize($state); # warn "$self warning: expecting keyword '$item2', found '$item1'!\n"; } $state = 3; } elsif (/^to=(.*),\s+delay/) { $to = $1; if ($state != 3) { $item1 = &itemize(3); $item2 = &itemize($state); # warn "$self warning: expecting keyword '$item2', found '$item1'!\n"; } $state = 0; } else { $item = &itemize($state); warn "$self warning: expecting keyword '$item', unable to parse this line:\n"; warn "$_\n"; } } # close(LOGFILE); # &print_list; # exit; # sub process_items { ($time) = ($olddate =~ /(\d\d):\d\d:\d\d/); if (($olddate =~ /Dec\s+19/) || (($olddate =~ /Dec\s+20/) && ($time < 14))) { @destination = split(/,/, $to); foreach $recipient (@destination) { if ($recipient !~ m!\|.*/.+!) { $recipient =~ s/^\s*?\s*$//; unless (defined $mail{$recipient}) { $mail{$recipient} = [ 0, [ ] ]; } $this = [ $olddate, $message_id, $from ]; $count = $mail{$recipient}->[0]; $mail{$recipient}->[1]->[$count] = $this; ++$mail{$recipient}->[0]; } } } $message_id = ''; $from = ''; $received = ''; $to = ''; } sub print_list { foreach $recipient (sort keys(%mail)) { chop($olddate = `date`); print <<"VERBATIM"; From sb\@sdm.de $olddate From: postmaster\@sunti1.sdm.de (Postmaster) To: $recipient Reply-To: sb\@sdm.de (Steffen Beyer) Subject: Verlorengegangene Mails (die 2.te) ;-) Folgende Mails an Dich sind wahrscheinlich verlorengegangen: (bitte selbst nachpruefen und den Absender ggfs. darum bitten, die betreffende Mail nochmals abzuschicken!) (Leider hatte das Skript von meinem gestrigen Rundschreiben einen Bug, der verhinderte, dass die Absender- und Message-ID-Angaben gefunden wurden, wo sie vorhanden waren. Daher hier ein neuer Versuch! ;-) Diesmal sollte es aber nun klappen!) VERBATIM $count = $mail{$recipient}->[0]; for ( $i = 0; $i < $count; ++$i ) { $this = $mail{$recipient}->[1]->[$i]; print "Absender: ", $this->[2], "\n"; print "Datum: ", $this->[0], "\n"; print "Message-ID: ", $this->[1], "\n\n"; } print <<'VERBATIM'; Mit freundlichen Gruessen, Eure System-Administration. i.A., -- Steffen Beyer mailto:sb@sdm.de |s |d &|m | software design & management GmbH&Co.KG phone: +49 89 63812-244 | | | | Thomas-Dehler-Str. 27 fax: +49 89 63812-150 | | | | 81737 Munich, Germany. VERBATIM } } sub itemize { my $state = shift; my $item; if ($state == 0) { $item = 'message-id'; } elsif ($state == 1) { $item = 'from'; } elsif ($state == 2) { $item = 'received'; } elsif ($state == 3) { $item = 'to'; } else { $item = '(internal error)'; } return($item); } # __END__