0

Convenient logging with procmail

published on 2007|09|19

I like to have a procmail logfile to find possible bugs in my ~1000 lines of mail filter rules. But if you get around thousand mails a day, the logfile size becomes bigger and bigger. And I always forget to remove that logfile. So I decided to let procmail do that job. I want to have a logfile structure logs/procmail/$YEAR/$MONTH/$DAY.log and I want the logfiles to be compressed daily and I want them to be kept for one month. This is how it looks like:

PATH="/bin:/usr/bin:/usr/local/bin:/usr/sbin:$HOME/bin"
MONTH=`date +%m`
YEAR=`date +%Y`
DAY=`date +%d`
YESTERDAY=`echo $DAY-1|bc -l`
LAST_MONTH=`echo $MONTH-1|bc -l
LAST_MONTH=`test $LAST_MONTH -eq 0 && echo 12 || echo $LAST_MONTH`
RM_RESULT=`test -d "$HOME/log/procmail/$YEAR/$LAST_MONTH" && rm -rf "$HOME/log/procmail/$YEAR/$LAST_MONTH"`
MKDIR_RESULT=`mkdir -p $HOME/log/procmail/$YEAR/$MONTH`
BZIP_RESULT=`test -f "$HOME/log/procmail/$YEAR/$MONTH/$YESTERDAY.log" && bzip2 "$HOME/log/procmail/$YEAR/$MONTH/$YESTERDAY.log"`
LOGFILE="$HOME/log/procmail/$YEAR/$MONTH/$DAY.log"

Yes, I know, I could do this in a cron. But it was funny to do it in the procmailrc.

Tags: ,

0

Mails von kaputtem procmail wiederherstellen

published on 2006|04|25

Ein Problem von procmail ist die unstrikte Syntax. Wenn man aus Versehen bösartige Direktiven in der .procmailrc platziert, so landen die Mails alle in einer großen Datei, die keine MBox ist. Ein Beispiel:

:0
br />^X-BeenThere: list@youfavouritehost\.com$
.Path.To.Your.Imap.Box/
Nun landen alle Mails in einer großen Datei »^X-BeenThere«, kurz gesagt: Schmerz im Hintern. Heute wunderte ich mich über die leer bleibende Inbox. Ein ganzer Tag ohne komische Linux-User die komische Dinge fragen, Leute ohne Freunde, die welche suchen und andere Spammer? Kann nicht sein. In das Logfile von procmail geschaut und obiges Problem entdeckt. Ruby sollte mein Freund sein, das wieder zu beheben:
#! /usr/bin/ruby
a = 0
File.new( “heap_of_mails” ).read.split( /\n\nReceived: / ).each |m| {
a = a.next
File.new( “outputdir/” + a + “_mail.txt”, File::CREAT|File::TRUNC|File::RDWR, 0640 ).write( “Received: “ + m )
}
Nachdem die Mails aus der Datei gebastelt wurden, kann man sie nun wieder über procmail ganz normal in die Mailsammlung einpflegen:
for file in outputdir/_mail.txt ; do cat $file | procmail ; done

Tags: ,

(Page 1 of 1, totaling 2 entries)