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:
parent
347e0d3113
commit
db9a80723f
1 changed files with 28 additions and 11 deletions
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue