So, ich hab's zum Laufen gebracht.
Allerdings über den Umweg, mittels des MIME::Parsers erst die Dateien zu speichern, dann die Textdatei wieder auszulesen und abschließend zu löschen. Das dürfte einige Extrapunkte in Ineffizienz geben...
...aber es funktioniert! <stolz>
Der Nachrichtentext liegt korrekt formatiert vor. Ich denke, daß es eine Möglichkeit gibt, auf den Text zugreifen zu können, ohne die MIME-Teile vorher abzuspeichern?
Mit $parser->output_to_core(1); kann ich beim Parser einstellen, daß nicht gespeichert wird. Nur wo finde ich dann den Text? Vielleicht kann mir ja noch jemand beim Optimieren dieses "plumpen Gebräus, welches unendlich langsam läuft und Systemressourcen frißt" (Perl-Kochbuch S. 383) helfen?
Hier das Gebräu:
#!/usr/bin/perl -w
use strict;
use warnings;
use CGI::Carp "fatalsToBrowser";
use CGI qw(:standard :html3);
use MIME::Parser;
use Net::POP3;
my $username = 'mail@adresse.de';
my $password = 'passwort';
my $dir = '../mailbox';
my $pop = Net::POP3->new('pop.adresse.de', Timeout => 60);
print 'Content-type: text/html\n\n';
print 'Nachrichten-Center...<hr>';
# Nachrichten holen
if ( $pop->login( $username, $password ) > 0) {
my $msgnums = $pop->list;
foreach my $msgnum (keys %$msgnums) {
my $msg = $pop->get($msgnum);
my $parser = MIME::Parser->new();
# hier werden die Nachrichtendateien temporär abgelegt
$parser->output_dir($dir);
# hole Nachricht und teile sie
my $message = $parser->parse_data( join ( '', @$msg ) );#
my $subject = $message->head->get('Subject');
my $from = $message->head->get('From');
my $body;
my $text;
# wenn mehrteilige Nachricht
if ($message->head->mime_type() =~ m/multipart/i) {
my $i;
my $anzahl_teile = $message->parts();
my $unterteile;
# alle Teile der Nachricht abarbeiten
# auf der Suche nach text/plain
for ($i = 0; $i < $anzahl_teile; $i++) {
$unterteile = $message->parts($i);
# wenn mehrteilige Nachricht noch Unterteile hat
if ($unterteile->mime_type() =~ m/multipart/i) {
my $j;
my $anzahl_sub_teile = $unterteile->parts();
my $sub_unterteile;
# alle Unterteile abarbeiten
for ($j = 0; $j < $anzahl_sub_teile; $j++) {
$sub_unterteile = $unterteile->parts($j);
if ($sub_unterteile->mime_type() =~ m/text/plain/i){
$body = $sub_unterteile->bodyhandle();
last;
}
}
}
if ($unterteile->mime_type() =~ m/text/plain/i){
$body = $unterteile->bodyhandle();
last;
}
}
}
# einteilige Nachricht
else{
$body = $message->bodyhandle();
}
# Text der Nachricht holen
open FILE, $body->path();
while (<FILE>) {
$text .= $_.'<br>';
}
close FILE;
print "$from - $subject - ".$body->path()."<br>";
print "$text<hr>";
$pop->delete($msgnum);
}
}
$pop->quit;
# alle gespeicherten Nachrichtendateien löschen
opendir my $dirhandle, $dir or die $!;
while( my $entry = readdir $dirhandle ){ # nach und nach die Einträge im Verzeichnis holen
my $path = $dir . '/' . $entry;
if( -f $path ){ # wenn es eine Datei ist
unlink $path; # lösche die Datei
}
}
closedir $dirhandle;
exit;