#!/usr/bin/perl use warnings; use strict; ## Scott Wiersdorf ## Created: Thu May 17 11:23:02 MDT 2007 ## $Id: mailsender,v 1.1 2007/05/17 17:39:59 scott Exp $ ## mailsender: find the senders given a recipient ## usage: mailsender 'joe@recipient.tld' /var/log/maillog.0.gz ... our $VERSION = '0.90'; my $rcpt = shift @ARGV; my @files = @ARGV; open(PIPE, '-|', 'zgrep', $rcpt, @files) or do { die "Could not open pipe: $!\n"; }; my %ids = (); while( ) { next unless m{\bsm\-mta\b.+?: (\S+?):(?: Milter:)? to=<$rcpt>}o; $ids{$1} = 1; } close PIPE; ## open pipe again open(PIPE, '-|', 'zcat', '-f', @files) or do { die "Could not open pipe: $!\n"; }; my %sender = (); while( ) { next unless m{: ([^:]+): from=?,}o; next unless exists $ids{$1}; $sender{$2}++; } close PIPE; for my $sender ( sort { $sender{$b} <=> $sender{$a} } keys %sender ) { print "$sender ($sender{$sender})\n"; } exit;