Re: [exim] Router condition

Top Page
Delete this message
Reply to this message
Author: Phil Pennock
Date:  
To: Jakub Čermák
CC: exim-users
Subject: Re: [exim] Router condition
On 2009-08-20 at 01:33 +0200, Jakub Čermák wrote:
> Hello *,
> I’ve this condition in my router:
> condition = ${lookup mysql {SELECT home FROM passwd WHERE email='${local_part}@${domain}'}}
> But I want to have a special router ho handle spam messages, therefore I’d like to add another condition to the previous one, something like "if ($h_X-Spam-Flag == „YES) AND (the condition above)"
>
> I tried
> ${if and { {eqi {$h_X-Spam-Flag} {YES}} ${lookup mysql {SELECT home FROM passwd WHERE email='${local_part}@${domain}'}} } }
> but it says the syntax is wrong. So can you please give me advice, how can I make a condition to filter spam messages for "mysql users" ?


There need to be {-braces-} around each of the branches of the
and{<branches>}. Even if the branch is an expansion item. So you end
up with:
${if and{ {eqi{A}{B}} {${lookup ARGS}} }

You can write stuff across lines using \-backslash, to split things up.

You also want to use quote_mysql so that you won't be hurt by
"interesting" left-hand-sides. Eg, this email address works to reach
me, because I'm a fan of xkcd.com and I like to make people think:
<"X'); DROP TABLE domains; DROP TABLE passwords; --"@???>


  condition = ${if and{\
      {eqi{$h_X-Spam-Flag}}\
    {${lookup mysql {SELECT home FROM passwd \
       WHERE email='${quote_mysql:${local_part}@${domain}}'}}}\
    }


Later, to speed things up, you might want to take advantage of some of
Exim's caching of lookups and the ${extract {key}....} operator, looking
up multiple fields from the RDBMS in one query.

-Phil