Hallo geehrtes Forum,
es schien so einfach:
Ich will eine POP3-Mailbox aufrufen, die Emails auslesen und weiterverarbeiten. Mailbox aufrufen funktioniert mit Net::POP3. An die Emails komme ich ran. Hier benötige ich nur den eigentlichen Emailtext; HTML oder Anhänge sind vorerst unwichtig.
Ich probierte es mit Email::Simple, Email::MIME, MIME::Parser und Mail::MboxParser. Letzteres Modul machte so einen schönen Eindruck:
(hier gefunden)
my $mbox= Net::POP3->new('some mailbox');
my $mb = Mail::MboxParser->new($mbox);
for my $msg ($mb->get_messages) {
my $to = $msg->header->{to};
my $from = $msg->header->{from};
my $cc = $msg->header->{cc} || " ",
my $subject = $msg->header->{subject} || '<No Subject:>',
my $body = $msg->body($msg->find_body,0);
my $body_str = $body->as_string || '<No message text>';
print "To: $to\n",
"From: $from\n",
"Cc: $cc\n",
"Subject: $subject\n",
"Message Text: $body_str\n";
print "~" x 77, "\n\n";
}
Das ist im Prinzip genau, was ich brauche. Doch 'some mailbox' setzt wohl einen Direktzugriff auf einen Mailserver voraus? Ich habe aber nur Zugriff mittels POP3, wenn ich das richtig sehe?
Mit Email::Simple komme ich soweit:
my $email = Email::Simple->new($str);
my $from_header = $email->header("From");
my @received = $email->header("Received");
my $body = $email->body;
$body enthält die gesamte Nachricht, mit HTML und Anhängen.
Mit Email::MIME hatte ich folgendes getan:
my $parsed = Email::MIME->new($body);
my @parts = $parsed->parts; # These will be Email::MIME objects, too.
In @parts sind dann wohl die verschiedenen MIME-Parts drin, allerdings als referenzierte Hashes (keinen Plan: Email::MIME objects)?!?. Naiv versuche ich $parts[0] anzuschauen, aber irgendwie blick ich nicht, wie ich da an den plain/text-Teil herankomme.
Dann habe ich was gelesen von MIME::Parser und probierte folgendes:
my $parser = MIME::Parser->new();
$parser->output_under('/tmp');
my $message = $parser->parse_data($str);
my $num_parts = $message->parts;
for (my $i=0; $i < $num_parts; $i++) {
my $part = $message->parts($i);
print "$i - $part<hr>";
}
Hier habe ich als Ergebnis dann MIME::Entity=HASH(0x17eb6b0). Das hinterläßt mich genauso ahnungslos wie Email::MIME. Wie geht's von hier zum Text?
Was ich suche ist eine Funktion, die den Nachrichtentext korrekt formatiert (also nicht: "PS.:=20 Danke f=FCr die Links") aus der Nachricht extrahiert. Das kann doch eigentlich nicht so schwer sein...
Somit bitte ich um Hilfe. Vielleicht gibt es ja noch ein passenderes Modul oder einen einfacheren Weg?
Mille Gracie
JOhnnY