#!C:/Perl/bin/Perl.exe -w use strict; use Data::Dumper; my %MailList; # A list of all seen addresses. # This hash is setup in step 1 in the # previous post. # Parse the mail box while () { next unless /^From:\s/; # ignore all other lines chomp; # except the from line # assume that email addresses are separated # by the ',' character. my @emails = split /,\s*/, substr($_, 6); # build a hash from the email address list my %emails = map { s/\s+$//g; # remove tailing spaces my ($name, $address); if (/>$/) { # look for < ... > ($name, $address) = /^(.*)\s<(.*)>$/; } else { $name = $address = $_; } $address => $name } @emails; # inspect captured email details # print Dumper(\%emails); # check if the email address(es) are already seen foreach (keys %emails) { if (! exists $MailList{$_}) { # ok, we haven't seen this Email address yet $MailList{$_} = $emails{$_}; } } } print Data::Dumper->Dump([\%MailList], ['MailList']); __DATA__ From: Roger , Roger 2 To: Peter R Subject: Hello Hello Peter, this from address has two addresses From: roger3@somewhere.com To: Peter R Subject: Hello Hello Peter, this from address has no full name From: roger3@somewhere.com To: Peter R Subject: Hello Hello Peter, has already seen this from address