Sieve Rule: What am I missing here?

Stephan Bosch stephan at rename-it.nl
Thu Apr 30 21:00:23 UTC 2015


On 4/30/2015 9:15 PM, Larry Rosenman wrote:
> I have a rule that sends all mail from root to a mailbox, but I want it to
> NOT send mail from mailing-lists there.
>
> if allof (address :contains :localpart "From" "root",
>           not anyof(exists ["List-Id","List-ID","Mailing-List",
>                     "X-List-Name","List-Post"]))
> {
>    fileinto "root-mail";
>    stop;
> }
>
>
> What am I missing in the AnyOf part?  Or am I totally messed up?

A trace of the script shows the following for the provided example message:

"
$ sieve-test -t - -Tlevel=matching  ~/script.sieve ~/message.eml

      ## Started executing script 'script'
   3: address test
   3:   starting `:contains' match with `i;ascii-casemap' comparator:
   3:   extracting `From' headers from message
   3:   parsing address header value `m.de.groot <m.de.groot at dmdg.nl>'
   3:   extracting `localpart' part from address <m.de.groot at dmdg.nl>
   3:   matching value `m.de.groot'
   3:     with key `root' => 1
   3:   finishing match with result: matched
   3: jump if result is false
   3:   not jumping
   4: exists test
   4:   header `List-Id' exists
   4:   header `List-ID' exists
   4:   header `Mailing-List' is missing
   4:   headers are missing
   5: jump if result is true
   5:   not jumping
   7: fileinto action
   7:   store message in mailbox `root-mail'
   8: stop command; end all script execution
      ## Finished executing script 'frop'

Performed actions:

 * store message in folder: root-mail

Implicit keep:

  (none)

sieve-test(stephan): Info: final result: success
"

So, the "exists" test returns false, because not all listed headers
exist, which conforms to the specification:

RFC 5228:
"
5.5.  Test exists

   Usage:   exists <header-names: string-list>

   The "exists" test is true if the headers listed in the header-names
   argument exist within the message.  All of the headers must exist or
   the test is false.
"

Also, your use of "anyof" is useless. The following should work:

"
require "fileinto";

if allof (address :contains :localpart "From" "root",
    not anyof(
        exists "List-Id",
        exists "List-ID",
        exists "Mailing-List",
        exists "X-List-Name",
        exists "List-Post"))
{
   fileinto "root-mail";
   stop;
}
"

Regards,

Stephan.



More information about the dovecot mailing list