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) { | ||||||
|               $parsed{"${fieldName}Name"} .= "; " if $parsed{"${fieldName}Name"} !~ /^\s*$/; |               if (defined $groupName and $groupName !~ /^[01\s*]$/) { | ||||||
|               $parsed{"${fieldName}Name"} .= $addr->name; |                 $parsed{"${fieldName}Name"} .= "; " if $parsed{"${fieldName}Name"} !~ /^\s*$/; | ||||||
|             } |                 $parsed{"${fieldName}Name"} .= $groupName; | ||||||
|             if ($addr->address ne "") { |               } | ||||||
|               $parsed{"${fieldName}Addr"} .= "; " if $parsed{"${fieldName}Addr"} !~ /^\s*$/; |               if (not ref $addrListRef) { | ||||||
|               $parsed{"${fieldName}Addr"} .= $addr->address; |                 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*$/) { |           } elsif ($fieldName eq 'Date' and $parsed{Date} =~ /^\s*$/) { | ||||||
|             $parsed{Date} = ParseDate($item); |             $parsed{Date} = ParseDate($item); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Bradley M. Kuhn
						Bradley M. Kuhn