#!/usr/bin/perl $USAGE = " SYNOPSIS: Scan mail files for new email addresses for mailrc AUTHOR: Mohsin Ahmed, http://www.cs.albany.edu/~mosh USAGE: $0 < mbox >> ~/.mailrc mail-alias mailfiles | more options: -v verbose -a all addresses -ns input in Netscape mail address format "; while( $_ = $ARGV[0], m/^-/ ){ shift; last if /^--$/; $verbose++, next if m/^-v/; $all++, next if m/^-a/; $netscape++, next if m/^-ns/; die $USAGE if m/^-?/; } open( MAILRC, "< $ENV{HOME}/.mailrc") or die "Cannot read ~/.mailrc\n"; my( %alias, %mailrc ); # Scan the mailrc for old aliases. while( ){ my $addr; # alias name, name is $1. if( s/alias\s+(\S+)// ){ $alias{$1}++; } # '@' mean address. while( s/([\w\d-_.]+\@[\w\d-._]+)// && ($addr = $1) ){ $mailrc{$addr}++; } } close MAILRC; # Now scan the mail files, format: ^From: Full Name # Lower case the addr, remove spaces from Full Name and # add it to %name my %name; LINE: while(<>){ my( $name, $addr ); if( ($name,$addr) = m/^From:\s+\"?(.*?)\"?\s+<(.*)>/ ){ $addr = "\L$addr"; $name =~ s/\W+/_/g; # print "$name is $addr\n"; next if( $name{$addr} && (index($name{$addr},$name)>=0)); $name{$addr} .= $name; next LINE; } if( $netscape ){ # "'Hindustan Organic Chemicals,Cochin'" , while( m/]+)>,?\s*// ){ $addr = $1; } $name =~ s/\s+$//; $name =~ s/^\s+//; $name =~ s/\s+/_/g; # print "name=$name, addr=$addr, _='$_'\n"; if( $name and ! $addr ){ die "No addr for name=$name.\n"; } $name{$addr} .= $name; } } # # This picks up too many addresses from headers. if( $all ){ while( s/([\w\d-_]+\@[\w.\d-_]+)// && ($addr = "\L$1") ){ $name{$addr} ||= "?"; # Missing Name is '?'. } } } # Now print them out. foreach $addr (sort keys %name){ next if $mailrc{$addr}; next if $addr =~ m/sasi\.com$/i; # don't keep local addresses. next if $addr =~ m/microsoft\.com$/i; # don't keep local addresses. my $name = $name{$addr}; my $alias; if( $name =~ m/([A-Za-z]+)/ ){ $alias = $1; }elsif( $name =~ m/(\w+)/ ){ $alias = $1; }else{ $alias = $addr; $alias =~ s/@.*//; } $alias = lc($alias); # Create a unique alias name, ie. name_N if( $alias{$alias} ){ $alias .= "_2"; $alias++ while( exists $alias{$alias} ); } $alias{$alias}++; printf "alias %-5s\t(%s)\t%s\n", $alias, $name{$addr}, $addr; } # EOF