Whitelisting via SQL lookup to other address book

Patrick Domack patrickdk at patrickdk.com
Mon Jun 6 15:02:43 CEST 2011

That is cause amavis is looked for a user id, on mine the user-id  
number is returned via the sql_select_policy select. The ? in the  
sql_select_white_black_list is replaced with that user-id number.

Normally the table name sql_select_policy finds it's info is called users.

In my case I have it locate the virtual users table line that postfix  
uses, just return the auto-inc id, then on the white_black_list I join  
those two tables and select via that virtual user table id

Quoting Geoff Sweet <gorf at whootis.com>:

> Hi friends,
> I am still struggling with this a little bit.  So I altered my config with:
> 1. added the SQL connectiong information:
> @lookup_sql_dsn =(  
> ['DBI:mysql:database=users_horde;host=sql1.prod.whootis.net;port=3306',  
> 'amavisd', 'somepasswd'] );
> 2.
> $sql_clause{ 'sel_wblist'} = "SELECT 'W' as wb FROM turba_objects  
> WHERE  owner_id = ? AND object_email = (%K)";
> I understand that the ? is for preparing statements for  
> placeholders, and I assume that the %K is some array passed in from  
> Perl?  Anyway once I get that setup, I get errors like these:
> Jun  2 14:16:20 mail1 amavis[20980]: (20980-01) (!)lookup_sql: sql  
> exec: err=1142, S1000, DBD::mysql::st execute failed: SELECT command  
> denied to user 'amavisd'@'mail1.prod.whootis.net' for table 'users'  
> at (eval 69) line 166, <GEN9> line 5., 1142, SELECT command denied  
> to user 'amavisd'@'mail1.prod.whootis.net' for table 'users'
> Jun  2 14:16:20 mail1 amavis[20980]: (20980-01) (!!)TROUBLE in  
> process_request: sql exec: err=1142, S1000, DBD::mysql::st execute  
> failed: SELECT command denied to user  
> 'amavisd'@'mail1.prod.whootis.net' for table 'users' at (eval 69)  
> line 166, <GEN9> line 5. at (eval 70) line 280, <GEN9> line 5.
> Jun  2 14:16:20 mail1 amavis[20980]: (20980-01) (!)Requesting  
> process rundown after fatal error
> I know what the problem is - there is no database table called  
> "users".  Maybe I'm just not understanding how this works.  All I  
> want to do is get amavisd to query a pre-existing database table for  
> addresses that match the sender/recipient and whitelist them if it  
> exists. However it seems that when using SQL lookups, amavisd  
> expects the larger schema to already exist.  Is this not as simple  
> as I think?
> Thanks loads for everyones help so far.
> On 5/13/2011 6:37 AM, Mark Martinec wrote:
>> Geoff,
>>> Greetings everyone, I am running amavisd-new 2.6.4.  It's been very
>>> stable for me. I would like to try to extend it a little via SQL.
>>> The vast majority of my virtual users read email via a web
>>> interface. That interface (horde) provides a fairly robust address
>>> book system.  I'm hoping that someone could help me understand if it
>>> would be possible to tune the $sql_select_white_black_list and
>>> %sql_clause to look into that address book database for whitelisting.
>>> I can see in the structure of the table that the addresses in the
>>> address book are sorted via the address of the user.  I also can see
>>> in the documentation how to build a SQL query that will return the
>>> same format of data as described in the README.sql.txt.  What I am
>>> not totally clear on is what else I do or don't need to do.
>>> If I add the $sql_select_white_black_list into the amavisd.conf with
>>> my query,
>> Assigning to $sql_select_white_black_list suffices, as Patrick said.
>>> I then need to add the %sql_clause lines as well?
>>> Something like this:
>>> $sql_select_white_black_list = 'SELECT SOME STUFF';
>>> %sql_clause = (
>>> 'sel_wblist' =>  \$sql_select_white_black_list
>>> );
>> No need to, the 'sel_wblist' =>  \$sql_select_white_black_list is a
>> default entry in the %sql_clause hash and need not be changed.
>> Also you don't want to lose other key/value pairs in %sql_clause
>> by replacing the entire hash, while you only wanted to change
>> one key/value pair.
>> If you'd like to get rid of the compatibility measure (indirection
>> through$sql_select_white_black_list ), you may assign your
>> replacement SQL clause directly into $sql_clause{ 'sel_wblist'},
>> and forget about $sql_select_white_black_list, e.g.:
>> $sql_clause{ 'sel_wblist'} =
>>   "SELECT 'W' as wb from mail.virtual join hor...";
>>> Correct?  If I understand correctly, anything else in the sql_clause
>>> that is left out defaults back to whatever is in the cofig file?
>>> Or
>>> do I have to uncomment the entire %sql_clause block and define the
>>> entire SQL structure?
>> No need to. You may if really needed, which it is not in this case.
>>   Mark

More information about the amavis-users mailing list