Johnny B.: Email-Text auslesen

Beitrag lesen

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;