On 2/15/2012 11:57 AM, Jack Knowlton wrote:
> On Wed, February 15, 2012 5:37 pm, /dev/rob0 wrote:
>> On Wed, Feb 15, 2012 at 03:50:00PM +0100, Jack Knowlton wrote:
>>> I'm looking into implementing a check_recipient_access as a table
>>> inside a MySQL database. It's basically a list of users that have
>>> been banned from the system and for whom I don't want a simple 550
>>> user unknown bounce. Currently the list is a flat file hash map:
>>>
>>> u...@domain.com REJECT This particular user has been banned.
>>> us...@domain.com REJECT This particular user has been banned.
>>>
>>> First of all, what should be the table structure? Are "REJECT" and
>>> "This particular user has been banned." two separate fields?
>> You might wish to review these:
>>     http://www.postfix.org/SMTPD_ACCESS_README.html
>>     http://www.postfix.org/access.5.html
>>
>> The first word is the access(5) action, and the rest of it is the
>> reject message given to the client.
>>
>>> Secondly, what should query performed by postfix look like?
>> Obviously depends on your schema and RDBMS. Here's mine for sqlite:
>>
>> query = SELECT
>>      CASE WHEN A1.active!=0 AND A1.rclass IS NOT NULL
>>             THEN substr((100 + A1.rclass), 2, 2)
>>             ELSE substr((100 + D1.rclass), 2, 2)
>>      END
>>         FROM "Address" AS A1
>>                 JOIN "Domain" AS D1 ON A1.domain=D1.id
>>         WHERE A1.localpart IS '%u' AND D1.name IS '%d'
>> result_format = RC%s
>>
>> Returns RCxx where xx is a two-digit number, and where RCxx has been
>> defined in main.cf and also listed in smtpd_restriction_classes. The
>> Address and Domain tables each have a column "rclass" containing an
>> integer in the range 0-99.
>>
>> You can greatly simplify this by listing the whole address and the
>> entire actual restriction as columns in your table. See
>> mysql_table(5) for Postfix-specific hints, and talk to the MySQL
>> people for support of their software.
>
> Thanks!
>
> Do you think this could work

Yes it can work as long as the FIRST word of `action` is a valid
access(5) return value.

It is recommended to test with 'postmap -q value
mysql:/path/to/tabledef' before implementing.

Also, consider using proxy:mysql:/path/to/tabledef in production to
consolidate connections and not overload your database.
http://www.postfix.org/proxymap.8.html

>
> CREATE TABLE IF NOT EXISTS `recipient_access` (
>   `id` int(4) NOT NULL AUTO_INCREMENT,
Nit: If you want to reduce the table size, please use smallint.  int(4)
will only *display* 4 but store 11.
>   `insdate` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
>   `address` varchar(64) NOT NULL,
>   `action` text NOT NULL,
>   PRIMARY KEY (`id`)
> ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
>
> with this query:
>
> dbname = postfix
> hosts = 10.0.1.54
> query = SELECT action FROM recipient_access WHERE address='%s'
>
> ?
>
> -JK
>

Reply via email to