Generalized looping possible in pigeonhole sieve?
Jeff Kletsky
dovecot at allycomm.com
Thu Nov 17 22:42:31 UTC 2016
I'm struggling to achieve the kind of filtering with sieve that I was
able to do with procmail.
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
More information about the dovecot
mailing list