in reply to MIME::Parser and mail from MS Outlook

If you haven't already done this, I would suggest dumping a copy of STDIN to a file, once for the mail from outlook and once for the mail from the other client. Something may jump out at you that's obviously not what you expect.

For example, maybe even though you told outlook to send it as plain text, it's really sending multipart/alternative and you'll have to go another level deep to get the plain text part.

If you don't see why it's not working after having done this, you could post the outlook mail and maybe someone will see what's wrong with it.

  • Comment on Re: MIME::Parser and mail from MS Outlook

Replies are listed 'Best First'.
Re: Re: MIME::Parser and mail from MS Outlook
by neilwatson (Priest) on Aug 09, 2002 at 14:49 UTC
    Yes, I just tried that. I was successful. This seems like a hack to me but it works. Here is the completed script:

    #!/usr/bin/perl -w use strict; use warnings; use MIME::Parser; use MIME::Entity; use MIME::Body; my (@body, $i, $subentity); my $parser = new MIME::Parser; my $to; #contains the message to header my $from; #contains the message from header my $subject; #contains the message subject heaer my $body; #contains the message body $parser->ignore_errors(1); $parser->output_to_core(1); my $entity = $parser->parse(\*STDIN); my $error = ($@ || $parser->last_error); #get email headers my $header = $entity->head; $subject = $header->get('Subject'); $to = $header->get('To'); $from = $header->get('From'); chomp($subject); chomp($to); chomp($from); #get email body if ($entity->parts > 0){ for ($i=0; $i<$entity->parts; $i++){ $subentity = $entity->parts($i); if (($subentity->mime_type =~ m/text\/html/i) || ($subentity-> +mime_type =~ m/text\/plain/i)){ $body = join "", @{$subentity->body}; } #this elsif is needed for Outlook's #nasty multipart/alternative messages elsif ($subentity->mime_type =~ m/multipart\/alternative/i){ $body = join "", @{$subentity->body}; #split html and text parts @body = split /------=_NextPart_\S*\n/, $body; #assign the first part of the message, #hopefully the text part, as the body $body = $body[1]; #remove leading headers from body $body =~ s/^Content-Type.*Content-Transfer-Encoding.*?\n+/ +/is } } } else { $body = join "", @{$entity->body}; } #body may contain html tags. they will be stripped here $body =~ s/(<br>)|(<p>)/\n/gi; #create new lines $body =~ s/<.+\n*.*?>//g; #remove all <> html tages $body =~ s/(\n|\r|(\n\r)|(\r\n)){3,}//g; #remove any extra new lines $body =~ s/\&nbsp;//g; #remove html &nbsp characters #remove trailing whitespace from body $body =~ s/\s*\n+$//s; open MAIL, ("|/usr/sbin/sendmail -t") || die "Unable to send mail: $!" +; print MAIL "To: $from\n"; print MAIL "From: root\n"; print MAIL "Subject: mime parser test\n\n"; print MAIL "Messege was contructed as follows: \$from: $from \$to: $to \$subject: $subject \$body: $body"; close(MAIL);

    Neil Watson
    watson-wilson.ca