I'm not sure if I can help you solve your problem ...
Update (further research): I noticed three things:
- As long as I use $parser->output_to_core(1); I don't get the path. Changing to $parser->output_under("/tmp"); does return a path.
- Your for $part(@parts){ }-loop runs one iteration too often, so your error message comes from the last call, where no parts are left.
- method 1: change $entity->bodyhandle->path; to $part->bodyhandle->path;.
The following code works fine for me:
use MIME::Parser;
split_entity($entity); # $entity is a MIME::Entity object
################################################
sub split_entity {
################################################
local $entity = shift;
my $num_parts = $entity->parts; # how many mime parts?
if ($num_parts) { # we have a multipart mime message
foreach (1..$num_parts) {
split_entity( $entity->parts($_ - 1) ); # recursive call
}
} else { # we have a single mime message/part
if ($entity->effective_type =~ /^text\/plain$/) { # text message
handle_text($entity->bodyhandle->as_string);
} else { # no text message
handle_other($entity->bodyhandle->path);
}
}
}
As you can see, I use path as you did and it is working perfectly.
I further recommend using a similar recursive call as some mailers seem to nest multipart messages and you maybe want to parse them correctly to any depth.
alex pleiner <alex@zeitform.de>
zeitform Internet Dienste