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