also sprach Stephan Bosch <step...@rename-it.nl> [2013-12-28 08:31 +1300]: > This configuration is incomplete. Your logs should show an error about > that. Testing with sieve-test shows:
Oh, thank you for introducing me to sieve-test, somehow I have missed that. Sorry! And thank you also for your quick reply! Unfortunately, the problem remains, and sieve-test is not as helpful as I had hoped. My script is attached, as well as the wrapper I use for spamc. Here is the output generated by sieve-test. The spam message is bare and does *not* contain the wanted headers, because those are added by vnd.dovecot.filter invoking spamc: % sieve-test -D -t- -Tlevel=matching -x +spamtest /tmp/spam.sieve /tmp/spam.msg sieve-test(madduck): Debug: sieve: include: sieve_global_dir is not set; it is currently not possible to include `:global' scripts. sieve-test(madduck): Debug: sieve: Pigeonhole Sieve Extprograms plugin version 0.1.0 loaded debug: script binary /tmp/spam.svbin successfully loaded. debug: binary save: not saving binary /tmp/spam.svbin, because it is already stored. ## Started executing script 'spam' 6: filter action 6: execute program `spamc' debug: filter action: piping message to program: spamc. debug: filter action: running program: spamc. debug: filter action: piping data to forked program `/etc/dovecot/sieve-filter/spamc'. 6: executed program successfully 6: changed message 8: header test 8: starting `:contains' match with `i;ascii-casemap' comparator: 8: extracting `X-Spam-Status' headers from message 8: matching value `Yes, score=66.5/5.0 tests=ADVANCE_FEE_2_NEW_FORM, ADVANCE_FEE_2_NEW_FRM_MNY,A...' 8: with key `score' => 1 8: finishing match with result: matched 8: jump if result is false 8: not jumping 9: debug_log "X-Spam-Score header present and contains 'score'" spam: line 9: info: DEBUG: X-Spam-Score header present and contains 'score'. 12: spamtest test [percent=false] 12: spamtest: header 'X-Spam-Status' not found in message 12: starting `:value-eq' match with `i;ascii-numeric' comparator: 12: matching value `0' 12: with key `0' => 1 12: finishing match with result: matched 12: jump if result is false 12: not jumping 13: debug_log "spamtest found no match!" spam: line 13: info: DEBUG: spamtest found no match!. 13: jumping to line 51 ## Finished executing script 'spam' Performed actions: (none) Implicit keep: * store message in folder: INBOX sieve-test(madduck): Info: final result: success So, as I had suspected in the original message, spamtest seems to look at the original message, not the one returned from the vnd.dovecot.filter. The regular sieve header match, however, *does* consult the filtered output. So I think that in addition to the clarification about regular vs. extended expressions in the docs, this is also a bug in need of fixing… … or am I still doing something wrong? -- martin | http://madduck.net/ | http://two.sentenc.es/ "a man's very highest moment is, i have no doubt at all, when he kneels in the dust, and beats his breast, and tells all the sins of his life." -- oscar wilde spamtraps: madduck.bo...@madduck.net
#!/bin/sh set -eu if find /tmp/dovecot-hack -mmin -1 | grep -q /; then exit 1 fi # HACK because vnd.dovecot.filter needs the filter to soak up all input before # it will even start reading its output. TMPFILE=$(tempfile -p spamc) cleanup() { rm -f $TMPFILE; trap - EXIT; } trap cleanup EXIT cat > "$TMPFILE" spamc "$@" < "$TMPFILE" cleanup
require [ "vnd.dovecot.filter"]; require [ "spamtest", "relational", "comparator-i;ascii-numeric" ]; require [ "fileinto", "mailbox" ]; require [ "vnd.dovecot.debug" ]; filter "spamc" [ "--no-safe-fallback" ]; if header :contains "X-Spam-Status" "score" { debug_log "X-Spam-Status header present and contains 'score'"; } if spamtest :value "eq" :comparator "i;ascii-numeric" "0" { debug_log "spamtest found no match!"; } elsif spamtest :value "ge" :comparator "i;ascii-numeric" "2" { if spamtest :value "eq" :comparator "i;ascii-numeric" "1" { debug_log "spamtest value == 1"; } if spamtest :value "eq" :comparator "i;ascii-numeric" "2" { debug_log "spamtest value == 2"; } if spamtest :value "eq" :comparator "i;ascii-numeric" "3" { debug_log "spamtest value == 3"; } if spamtest :value "eq" :comparator "i;ascii-numeric" "4" { debug_log "spamtest value == 4"; } if spamtest :value "eq" :comparator "i;ascii-numeric" "5" { debug_log "spamtest value == 5"; } if spamtest :value "eq" :comparator "i;ascii-numeric" "6" { debug_log "spamtest value == 6"; } if spamtest :value "eq" :comparator "i;ascii-numeric" "7" { debug_log "spamtest value == 7"; } if spamtest :value "eq" :comparator "i;ascii-numeric" "8" { debug_log "spamtest value == 8"; } if spamtest :value "eq" :comparator "i;ascii-numeric" "9" { debug_log "spamtest value == 9"; } if spamtest :value "eq" :comparator "i;ascii-numeric" "10" { debug_log "spamtest value == 10"; } #if header "X-Spam-Flag" "YES" { if mailboxexists "Junk" { debug_log "file spam into existing mailbox 'Junk'"; fileinto "Junk"; } elsif mailboxexists "junk" { debug_log "file spam into existing mailbox 'junk'"; fileinto "junk"; } elsif mailboxexists "spam" { debug_log "file spam into existing mailbox 'spam'"; fileinto "spam"; } else { debug_log "file spam into mailbox 'Spam'"; fileinto :create "Spam"; } stop; debug_log "after stop"; } else { debug_log "spamtest asserts message free of spam"; }
digital_signature_gpg.asc
Description: Digital signature (see http://martin-krafft.net/gpg/sig-policy/999bbcc4/current)