Sieve EXPLICITLY does NOT have a looping construct.
On Thu, Nov 17, 2016 at 4:42 PM, Jeff Kletsky <dove...@allycomm.com> wrote: > 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 > -- Larry Rosenman http://www.lerctr.org/~ler Phone: +1 214-642-9640 (c) E-Mail: larry...@gmail.com US Mail: 17716 Limpia Crk, Round Rock, TX 78664-7281