Question

I have been using sylfilter for over a year now (it is available from http://sylpheed.sraoss.jp/sylfilter/) and it works great as a filtering tool (no complaints). However, I have been trying to use procmail with sylfilter, but have been having a lot of trouble.

The web page for the filter shows:

sylfilter ~/Mail/inbox/1234

as the example to classify a message.

The return values are as following:

0 junk (spam)

1 clean (non-spam)

2 uncertain

127 other errors

I have been trying to incorporate sylfilter with procmail but not with much success. The big issue as compared with some other spam tool like bogofilter is that sylfilter does not make any changes to the e-mail message itself (unlike bogofilter, for which examples abound on the web, and which puts in a X-Bogosity field in the message header). I want everything that is classified as Junk to go to $HOME/Mail/Junk and everything that is not to be further classified into folders such as procmail rules. Perhaps the stuff that returns 2 can go to $HOME/Mail/uncertain.

Here is my latest attempt based on suggestions made in the Fedora mailing list.

:0 Wc
| /usr/bin/sylfilter /dev/stdin
:0 a
$HOME/Mail/Junk/.

However, this does not process the e-mail message using sylfilter (and the logfile says "No input file." before going on to process the other rules). So, I was wondering if anyone here knew of a similar case and knew the answer to this question.

Was it helpful?

Solution

I am not familiar with sylfilter, and the (somewhat vague) problem description makes me think there is something wrong with feeding it a message on standard input. But if you can make that work, the following is how you examine a program's exit code in Procmail.

:0
* ? sylfilter /dev/stdin
$HOME/Mail/Junk/.

# You should now have the exit code in $? if you want it for further processing
SYLSTATUS=$?

:0
* SYLSTATUS ?? ^^1^^
$HOME/Mail/INBOX/.
# ... etc

The condition succeeds if sylfilter returns a success (zero) exit code; if it fails, we fall through to subsequent recipes. We save $? to a named variable so that we can examine its value even if a subsequent recipe resets the system global $? by invoking some other external program.

By the by, you should not need to hard-code the path to sylfilter. If it's in a nonstandard location, amend the PATH at the beginning of your .procmailrc rather than littering your code with explicit paths to executables. So if it's in /usr/local/really/sf/sylfilter, you'd put

PATH=/usr/local/really/sf:$PATH

If you need the message in a temporary file, try something like this;

TMP=`mktemp -t sylf.XXXXXXXX`
TRAP='rm -f $TMP'
:0c
$TMP

:0
* ? sylfilter $TMP
$HOME/Mail/Junk/.

# etc as above

The mktemp command creates a unique temporary file. The TRAP assignment sets up a command sequence to run when Procmail terminates; this takes care of cleaning out the temporary file when we are done. Because we will be the only writer to this file, we don't care about locking while writing a copy of the message to this file.

For more nitty-gritty syntax details, see also http://www.iki.fi/era/procmail/quickref.html

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top