Fehler beim Sortieren der Nachrichten mit Procmail
Hi, ich hole mit fetchmail die Mails ab und gebe sie an procmail weiter. Im procmail-logfile erscheint noch alles richtig. Ich gebe das Mail dann an folgendes Script weiter: # Erstelle eine eine Kopie des aktuellen Mails cat > ~/mails.tmp # Aus dem temp. Mailfile mails.tmp werden Absender, Betreff, ID, Datum und Nachricht gerausgefiltert from=`cat ~/mails.tmp | tr "'" "-" | formail -x From:` subject=`cat ~/mails.tmp | tr "'" "-" | tr "FW:" "Re:" | tr "RE:" "Re:" | tr "Fw:" "Re:" | formail -x Subject:` id=`cat ~/mails.tmp | tr "'" "-" | formail -x Message-ID:` date=`cat ~/mails.tmp | tr "'" "-" | formail -x Date:` body=`cat ~/mails.tmp | tr "'" "-" | formail -I ""` echo "Schreibe Datensätze in Datenbank...." echo $id $date $from $subject $body >> ~/mails.log echo -e "INSERT INTO mails (messageid, date, sender, subject, body) VALUES ('$id', '$date', '$from', '$subject', '$body')"\ | mysql --user=user --password=user susenews Nun ist aber das Problem, dass sowohl in der mails.log als auch in der Db der gleiche Betreff bei 2 Sendern steht und dafür ein Betreff verschwindet, oder einfach die Bodys falschen Absendern zugeordnet werden. Ich kann am Script keinen Fehler erkennen, auch weils bei manchen Mails funktioniert. Habe ich irgendeinen Parameter vergessen?? MfG. Johannes -- GMX - Die Kommunikationsplattform im Internet. http://www.gmx.net
On Mon, 17 Sep 2001, Johannes Gruber wrote: *brrr* Der useless use of cat geht in mehrfacher Ausfertigung an... Erstens: tr kann nur mit einzelnen Zeichen umgehen! tr "FW:" "Re:" usw. machen also garantiert nicht das, was du willst. [von procmail aufgerufen]
# Erstelle eine eine Kopie des aktuellen Mails cat > ~/mails.tmp # Aus dem temp. Mailfile mails.tmp werden Absender, Betreff, ID, Datum und Nachricht gerausgefiltert from=`cat ~/mails.tmp | tr "'" "-" | formail -x From:`
from=`formail -x "From:" < ~/mails.tmp | tr "'" '-'` ^^^^^^^^^^^^^ Wozu?
subject=`cat ~/mails.tmp | tr "'" "-" | tr "FW:" "Re:" | tr "RE:" "Re:" | tr "Fw:" "Re:" | formail -x Subject:`
subject=`formail -x "Subject:" < ~/mails.tmp \ | sed 's/\([Ff][Ww]\|[Rr][Ee]\):/Re:/'
id=`cat ~/mails.tmp | tr "'" "-" | formail -x Message-ID:`
id=`formail -x "Message-ID:" < ~/mails.tmp | tr "'" '-'` ^^^^^^^^^^^^^ dito
date=`cat ~/mails.tmp | tr "'" "-" | formail -x Date:` body=`cat ~/mails.tmp | tr "'" "-" | formail -I ""`
s.o. Was sollen die tr "'" "-" fuer einen Sinn haben?
echo "Schreibe Datensätze in Datenbank...." echo $id $date $from $subject $body >> ~/mails.log echo -e "INSERT INTO mails (messageid, date, sender, subject, body) VALUES ('$id', '$date', '$from', '$subject', '$body')"\ | mysql --user=user --password=user susenews
Ein Perlscript waere hier eleganter... Ich mache sowas aehnliches...
Ich kann am Script keinen Fehler erkennen, auch weils bei manchen Mails funktioniert. Habe ich irgendeinen Parameter vergessen??
s.o. du solltest ein paar manpages waelzen oder gleich ein perlscript schreiben: ==== /tmp/mail2/db.pl ==== #!/usr/bin/perl -w $body = ""; $in_header = 1; while(<>) { if(/^$/) { $in_header = 0; $body .= $_; while(<>) { $body .= $_; } } elsif ($in_header) { if(/^From:(.*)$/) { $from = $1; } elsif(/^Subject:(.*)$/) { $subject = $1; } elsif(/^Message-[Ii][Dd]:(.*)$/) { $msg_id = $1; } elsif(/^Date:(.*)$/) { $date = $1; } } } ==== Natuerlich kann man die einzelnen Variablen noch mit dem komplette perl-Arsenal anpassen, z.B. $from =~ tr/'/-/; und dann natuerlich auch gleich aus perl heraus (mit DBI/DBD) in die DB schreiben: ==== ungetestet ==== use DBD::mysql; my $driver = "mysql"; my $database = "mails"; my $host = "localhost"; my $port = "3306"; my $user = "user"; my $pass = "geheim"; $dbh = DBI->connect( "DBI:$driver:database=$database;host=$host", $user, $pass, {RaiseError => 1} ) || die "Can't connect to Database $database"; $sth = $dbh->prepare("INSERT INTO mails (messageid, date, sender, subject, body) VALUES ('$id', '$date', '$from', '$subject', '$body')") || die $dbh->errstr; $sth->execute || die "$sth->errstr"; $sth->finish; $dbh->disconnect; ==== Und ja, due koenntest auch alle Mails von procmail in eine Datei schreiben lassen und diese dann komplett in einem Rutsch in die DB befoerdern, oder das ganze sogar via nem Socket machen, so dass die DB nur einmal geoeffnet werden muss... Saemtliche Klarheiten beseitigt? -dnh -- Also das mit der Milchstarsse und dem Kecksplaneten kolingt ja noch halbwegs plausiebel. Aber Nesquick Alee? Nenen! Kann nich sein. dann wäre es ja ein Schockomoinster und kein Krümelmonster. [Woko° in dag°]
participants (2)
-
David Haller
-
Johannes Gruber