#!/usr/bin/perl -w use strict; use utf8; use DBI; use Net::POP3; use MIME::Parser; use HTML::FormatText::WithLinks; use MIME::QuotedPrint; use Encode qw/encode decode/; use Term::Prompt; my ( $text_plain, $text_html, $text, $charset ); ### POP3 my $host = 'pop.Xserver.de'; my $user = 'script@Xserver.de'; my $pw = 'tollespw'; ### DB my $database = "ticket"; my $hostname = "127.0.0.1"; my $dsn = "DBI:mysql:database=$database;host=$hostname"; my $dbuser = "mydbuser"; my $dbpasswd = 'tollesdbpw'; ### POP3 Login my $pop = Net::POP3->new($host) || die("Kein Kontakt zu $host. $!"); my $anzahl = $pop->login( $user, $pw ); ### DB Verbindung my $dbh = DBI::->connect( $dsn, $dbuser, $dbpasswd, { 'RaiseError' => 1, 'AutoCommit' => 1 } ) or die DBI::errstr; ### Mails abholen for ( my $i = 1; $i <= $anzahl; $i++ ) { my $message = $pop->get($i); my $messageall = join( "", @$message ); ### MIME-Nachricht einlesen und parsen my $parser = MIME::Parser->new(); $parser->output_to_core(1); my $top_entity = $parser->parse_data($messageall); ### Mail_Header ausgeben my $head = $top_entity->head(); my $subject = $head->get('Subject'); my $absender = $head->get('From'); $charset = $head->mime_attr('Content-type.charset'); $subject = decode( 'MIME-Header', $subject ); #$subject = encode( 'MIME-Header', $subject_utf8 ); $head->decode; $head->unfold; print "Subject: $subject\n"; print "From: $absender\n"; print "Return-Path: ", $head->get('Return-Path'); print "Date: ", $head->get('Date'); print "To: ", $head->get('To'); print "Charset: $charset\n"; print "Body:\n"; ### MIME-Nachricht rekursiv durchlaufen &walk($top_entity); ### Text umwandeln if ( defined $text_plain ) { $text = $text_plain } else { my $formater = HTML::FormatText::WithLinks->new(); $text = $formater->parse($text_html); } if ( $charset !~ m/UTF-8/i ) { #$text = decode_qp($text); ### QuotedPrintable String dekodieren } ### Text anzeigen chomp($text); print '-' x 60 . "\n"; print "$text\n"; print '-' x 60 . "\n"; ### Text in DB speichern my $sth = $dbh->prepare( "INSERT INTO mail(id, mailadd, subject, mailtext) VALUES ('',?,?,?)"); $sth->execute( $absender, $subject, $text ); ### Mail loeschen? my $result = prompt( 'y', "Soll eMail $i von $anzahl Gesamt geloescht werden?", '', '' ); if ( $result == 1 ) { $pop->delete($i) } undef($text_plain); undef($text_html); } $pop->quit(); $dbh->disconnect; exit; sub walk { ### Entity my $entity = shift if @_; return unless defined $entity; my $head = $entity->head(); if ( $head->mime_type() =~ m/multipart/i ) { ### mehrteilige Nachricht my $i; my $num_alt_parts = $entity->parts(); my $current_entity; ### alle Teile der Nachricht rekursiv abarbeiten for ( $i = 0; $i < $num_alt_parts; $i++ ) { $current_entity = $entity->parts($i); &walk($current_entity); } } elsif ( $head->mime_type() =~ m#text/plain#i ) { ### Text Nachricht my $body = $entity->bodyhandle(); if ( defined $body && $body !~ '' ) { $text_plain = $body->as_string } } elsif ( $head->mime_type() =~ m#text/html#i ) { ### HTML Nachricht print "MIME: ", $head->mime_type(), "\n"; my $body = $entity->bodyhandle(); if ( defined $body ) { $text_html = $body->as_string } } }