Rework address code to properly catch when multiple address appear

As previously written, only the first address was found.  The key is
that the Email::Address::XS library was misused previously.  Based on
what is returned by Mail::Header->header_hashref(), it's clear that
we should use Email::Address::XS->parse_email_groups() first to
extract all addresses first.
This commit is contained in:
Bradley M. Kuhn 2023-06-03 10:57:59 -07:00
parent 347e0d3113
commit db9a80723f

View file

@ -21,7 +21,7 @@ use File::Spec::Functions;
use File::Spec; use File::Spec;
use File::Path qw(make_path); use File::Path qw(make_path);
use Mail::Header; use Mail::Header;
use Email::Address::XS; use Email::Address::XS qw(parse_email_groups);
use File::Copy; use File::Copy;
use Date::Manip::DM6 qw(ParseDate UnixDate); use Date::Manip::DM6 qw(ParseDate UnixDate);
use Text::CSV; # libtext-csv-perl in Debian use Text::CSV; # libtext-csv-perl in Debian
@ -139,18 +139,35 @@ sub ProcessMailDir($$$) {
my %parsed = (FromName => '', ToName => '', FromAddr => "", ToAddr => "", CCName => '', CCAddr => '', 'Subject' => '', my %parsed = (FromName => '', ToName => '', FromAddr => "", ToAddr => "", CCName => '', CCAddr => '', 'Subject' => '',
Date => ''); Date => '');
use Data::Dumper; use Data::Dumper;
foreach my $fieldName (qw/From To CC Subject Date/) { foreach my $fieldName (qw/From To CC Cc Subject Date/) {
foreach my $item (@{$fields->{$fieldName}}) { foreach my $item (@{$fields->{$fieldName}}) {
chomp $item; chomp $item;
if ($fieldName =~ /From|To|CC/) { if ($fieldName =~ /From|To|CC/i) {
my $addr = Email::Address::XS->parse($item); my @groups = parse_email_groups($item);
if ($addr->name ne "") { while ( my($groupName, $addrListRef) = each @groups) {
if (defined $groupName and $groupName !~ /^[01\s*]$/) {
$parsed{"${fieldName}Name"} .= "; " if $parsed{"${fieldName}Name"} !~ /^\s*$/; $parsed{"${fieldName}Name"} .= "; " if $parsed{"${fieldName}Name"} !~ /^\s*$/;
$parsed{"${fieldName}Name"} .= $addr->name; $parsed{"${fieldName}Name"} .= $groupName;
} }
if ($addr->address ne "") { if (not ref $addrListRef) {
if (defined $addrListRef and $addrListRef !~ /^\s*$/) {
$parsed{"${fieldName}Name"} .= "; " if $parsed{"${fieldName}Name"} !~ /^\s*$/;
$parsed{"${fieldName}Name"} .= $addrListRef;
}
} else {
foreach my $addr (@$addrListRef) {
my $name = $addr->name;
my $address = $addr->address;
if (defined $name and $name !~ /^\s*$/) {
$parsed{"${fieldName}Name"} .= "; " if $parsed{"${fieldName}Name"} !~ /^\s*$/;
$parsed{"${fieldName}Name"} .= $name;
}
if (defined $address and $address !~ /^\s*$/) {
$parsed{"${fieldName}Addr"} .= "; " if $parsed{"${fieldName}Addr"} !~ /^\s*$/; $parsed{"${fieldName}Addr"} .= "; " if $parsed{"${fieldName}Addr"} !~ /^\s*$/;
$parsed{"${fieldName}Addr"} .= $addr->address; $parsed{"${fieldName}Addr"} .= $address;
}
}
}
} }
} elsif ($fieldName eq 'Date' and $parsed{Date} =~ /^\s*$/) { } elsif ($fieldName eq 'Date' and $parsed{Date} =~ /^\s*$/) {
$parsed{Date} = ParseDate($item); $parsed{Date} = ParseDate($item);