Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

Using MIME::Tools

by Anonymous Monk
on Nov 24, 2001 at 00:08 UTC ( [id://127167]=perlquestion: print w/replies, xml ) Need Help??

Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Hi PerlMonks,

I am using MIME::Tools to read an email which is piped to my script, All is working great, except getting the body of the message, I'm sure I'm missing something simple but im not sure what - I have been through all the man pages for the mime-tools with no luck.. here is some of my code, which i use to get the subject etc, and the body...which isnt working :(
$parser = new MIME::Parser; $parser->ignore_errors(1); $parser->output_to_core(1); my $MIME_entity = $parser->parse(\*STDIN); my $error = ($@ || $parser->last_error); $header = $MIME_entity->head; $subject = $header->get('Subject'); <...snip..> $body = $MIME_entity->body;
And here is the value of $body:
ARRAY(0x84f4fec)
If anyone can shed some light on this, it would be very appreciated. Warm Regards.

Replies are listed 'Best First'.
Re: Using MIME::Tools
by mkmcconn (Chaplain) on Nov 24, 2001 at 00:19 UTC
      Thanks so much, that worked like a charm...the only problem now though is body also contains:
      MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0032_01C17453.FA494D20" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2600.0000 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000 test ...

      The main reason i used the modules was because i was told this was fix that :( rather than split direct from STDIN ... any ideas on how i can get the message from that?
        You're seeing parts of the headers there.
        If I remember correctly, you may (using this method) have to use print $$body[2] or something similar.
        Please see perldata for more information on why.

        Mime::Tools is not the most friendly of modules, either... Here's a small snippet which I used once upon a time. Mail messages are stored in @msgs, ok?

        foreach my$thismsg (@msgs){ my $parser = new MIME::Parser; my $ent = $parser->parse_data ("$thismsg"); print "here's the message :\n$thismsg\n"; print "mime type is ", $ent->mime_type(),"\n"; my @all_parts = $ent->parts; foreach (@all_parts) { print "mime type is ", $_->mime_type(),"\n"; my $head=$_->head()->as_string; if ($head=~/filename\="(.*?)"/) {print "Filename is $1\n"} print "header is $head\n"; print "------------------done\n"; } print "------------------done with messages\n"; }
        This shows how to read the entire message, parts of the content type and the header. IIRC, to pull out the message body would be similar to my $body=$_->body()->as_string; rather than my $head=$_->head()->as_string;.
Re: Using MIME::Tools
by atlantageek (Monk) on Nov 24, 2001 at 01:50 UTC
    You have a multipart message. You need to go through the parts and find the one that is a mime_type text/html or text/plain Try the following code.
    if ($MIME_entity->parts > 0) { for (my $i=0;$i<$MIME_entity->parts;$i++) { my $subEntity = $MIME_entity->parts($i); if (($types->{$subEntity->mime_type} eq 'text/html') || ($types->{$subEntity->mime_type} eq 'text/plain')) { if (my $io = $entity->open("r")) { while (defined($_=$io->getline)) {$recHash->{body} = $recHash->{body} . $_;} $io->close; } } } }
    UPDATED, the following code works better
    #!/usr/bin/perl use MIME::Parser; use Data::Dumper; $parser = new MIME::Parser; $parser->ignore_errors(1); $parser->output_to_core(1); my $MIME_entity = $parser->parse(\*STDIN); my $error = ($@ || $parser->last_error); if ($MIME_entity->parts > 0) # Is this a multipart { print ">> Multi Part Message\n"; for (my $i=0;$i<$MIME_entity->parts;$i++) { my $subEntity = $MIME_entity->parts($i); print ">> MIME: ", $subEntity->mime_type," \n"; if (($subEntity->mime_type eq 'text/html') || ($subEntity->mime_type eq 'text/plain')) { if (my $io = $subEntity->open("r")) { while (defined($_=$io->getline)) {print $_} $io->close; } } } } else { my $body = join "", @{$MIME_entity->body}; print ">> Not a multipart\n"; print $body; }
      Hi AtlantaGeek,

      The way I am doing it is to pipe emails to the script, I'm not sure how to include the code above ..

      ..what does the body get stored in from your above snippet?
        I'm sorry, $MIME_entity and $entity are the same variable. I was copying code from an existing application that I have. As long as you have the MIME_entity object created the open subroutine should work. Here you are letting the MIME::Parser parse the body of the message as well as the header.
        ----
        I always wanted to be somebody... I guess I should have been more specific.
Re: Using MIME::Tools
by atlantageek (Monk) on Nov 24, 2001 at 03:33 UTC
    OK, One more attempt. I have actually ran the following code and it seems to work. No untested hacked up hybrids of old code. If you have any more problems, feel free to /msg me later on tonight.
    #!/usr/bin/perl use MIME::Parser; use Data::Dumper; $parser = new MIME::Parser; $parser->ignore_errors(1); $parser->output_to_core(1); my $MIME_entity = $parser->parse(\*STDIN); my $error = ($@ || $parser->last_error); if ($MIME_entity->parts > 0) { print ">> Multi Part Message\n"; for (my $i=0;$i<$MIME_entity->parts;$i++) { my $subEntity = $MIME_entity->parts($i); print ">> MIME: ", $subEntity->mime_type," \n"; if (($subEntity->mime_type eq 'text/html') || ($subEntity->mime_type eq 'text/plain')) { if (my $io = $subEntity->open("r")) { while (defined($_=$io->getline)) {print $_} $io->close; } } } } else { my $body = join "", @{$MIME_entity->body}; print ">> Not a multipart\n"; print $body; }

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://127167]
Approved by root
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others romping around the Monastery: (6)
As of 2024-03-29 01:09 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found