in reply to Re^7: extracting name & email address
in thread extracting name & email address

The last solution is not exactly what I need. It misses all the (text or html) attachments that have email address in them. This code is more like what I need ..

#!/usr/bin/perl # Print the types of messages in the folder. Multi-part messages will # be shown with all their parts. # # This code can be used and modified without restriction. # Mark Overmeer, <********@overmeer.net>, 9 nov 2001 use warnings; use strict; use lib '..', '.'; use Mail::Box::Manager 2.00; use Email::Address; use File::Slurp qw( write_file ); my $outfile = 'multipart4_out.txt'; sub show_type($;$); # # Get the command line arguments. # die "Usage: $0 folderfile\n" unless @ARGV==1; my $filename = shift @ARGV; # # Open the folder # my $mgr = Mail::Box::Manager->new; my $folder = $mgr->open ( $filename , extract => 'LAZY' # never take the body unless needed ); # which saves memory and time. die "Cannot open $filename: $!\n" unless defined $folder; # # List all messages in this folder. # my @messages = $folder->messages; print "Mail folder $filename contains ", scalar @messages, " messages: +\n"; my $counter = 1; foreach my $message (@messages) { printf "%3d. ", $counter++; print $message->get('Subject') || '<no subject>', "\n"; show_type $message; get_header_values($message); } sub get_header_values($) { my $msg = shift; # return all Mail::Message objects my @from = $msg->from; my $sender = $msg->sender; my $subject = $msg->subject; my $msgid = $msg->messageId; my @to = $msg->to; my @cc = $msg->cc; my @bcc = $msg->bcc; my @dest = $msg->destinations; my $replyto = $msg->get('Reply-To'); # need code here to use @from, @to, @cc , @bcc and $replyto, and p +ush out those emails (name/email address) to an array, # then output to $outfile, like below #File::Slurp::write_file( $outfile, {append => 1 }, join("\n", @em +ails) ); } sub show_type($;$) { my $msg = shift; my $indent = (shift || '') . ' '; # increase indentation print $indent, " type=", $msg->get('Content-Type'), ', ' , $msg->size, " bytes\n"; if($msg->isMultipart) { foreach my $part ($msg->parts) { my $content_type = $part->contentType; # the only parts we are interested in are text and html - bypa +ss all others if (defined($content_type) && $content_type eq 'text/plain') or (defined($content_type) && $content_type eq 'text/html') { my @emails = Email::Address->parse($part->body); #this isn' +t working properly #File::Slurp::write_file( $outfile, {append => 1 }, join("\n", + @emails) ); } show_type $part, $indent; } } } # # Finish # $folder->close;

But there are some errors when running it ..

"my" variable $part masks earlier declaration in same statement at multipart4.pl line 97. main::get_header_values() called too early to check prototype at multipart4.pl line 57. syntax error at multipart4.pl line 92, near ") or" syntax error at multipart4.pl line 100, near "}"

I don't think the "OR" is constructed properly. Why is there a msg on the sub get_header_values ?

Replies are listed 'Best First'.
Re^9: extracting name & email address (parens)
by tye (Sage) on Mar 04, 2015 at 04:18 UTC

        Final solution is here