Generalized looping possible in pigeonhole sieve?
Darac Marjal
mailinglist at darac.org.uk
Fri Nov 18 09:49:35 UTC 2016
On Thu, Nov 17, 2016 at 02:42:31PM -0800, Jeff Kletsky wrote:
>I'm struggling to achieve the kind of filtering with sieve that I was
>able to do with procmail.
A couple of options that I can think of:
If the address is sufficiently like the folder name, you can use sieve's
regex capabilities. For example, I convert addresses such as
"user+folder at example.com" to "Tagged/Folder" using:
require [ "fileinto", "mailbox", "subaddress", "variables", "regex",
"envelope"];
if envelope :detail :regex "to" "(.+)" {
set :upperfirst :lower "detail" "${1}";
fileinto :create "Tagged/${detail}";
stop;
}
Another alternative is, if your map of addresses is complex, but doesn't
change very often, use a script (such as a Makefile) to generate the
sieve script from the map. Then, next time you update the map, you
re-run the script which re-writes the sieve file.
>
>TL;DR
>
>I'd like a way to loop through a set of (address, destination) pairs
>in sieve so that I can maintain the (address, destination) pairs in
>one place and not have to explicitly write scores of nearly identical
>
>[...]
>
>if address :matches ["From", "Sender", "To", "Cc"] "address53" {
> fileinto "destination53"
>}
>
>if address :matches ["From", "Sender", "To", "Cc"] "address54" {
> fileinto "destination54"
>}
>
>[...]
>
>
>Longer:
>
>I've been using a table-based dispatch approach with procmail for
>years and it was working reasonably well.
>
>The approach uses list of pairs of address and destination boxes and
>doing a lookup based on the message to be delivered. With procmail, I
>collected the list of addresses and passed them to external scripts to
>do the lookup.
>
>If I just had a dozen boxes that I deal with, that would be
>straightforward to implement and maintain in sieve. As the list is an
>order of magnitude greater than that, maintaining the list of pairs in
>an external file and programmatically looping through it is a lot
>easier.
>
>I've looked at vnd.dovecot.execute and it certainly can return a
>destination box name given the input information.
>
>Unfortunately, the construct of (for example)
>
>address :matches "To" "*"'
>
>only returns the first address, not the list of addresses.
>
>I can't see a good way to get all the addressees from sieve to pass to
>the external program. If I have to pass the message (or at least the
>interesting headers) to the external program and then parse the
>address list myself, then I'm nearly all the way to just using a
>full-on external program to parse the whole message.
>
>While I'm not adverse to writing the whole thing in Python (or the
>like) and just using sieve as a thin shell, I'd like to make sure I'm
>not missing something in sieve.
>
>One way to achieve this would be to be able to loop through the pairs
>and using variable substitution for each iteration. I haven't seen
>anything in Dovecot Pigeonhole sieve that allows this.
>
>If you have any ideas on how to harness sieve for this, I'd appreciate it!
>
>
>Jeff
--
For more information, please reread.
More information about the dovecot
mailing list