[Dovecot] Performing an action on mail receipt
Jiri Bourek
bourek at thinline.cz
Wed May 14 09:41:12 UTC 2014
On 14.5.2014 02:15, Andrew Beverley wrote:
> On Tue, 2014-05-13 at 16:21 +0200, Stephan Bosch wrote:
>> This should provide what you need:
>>
>> http://sieve.info/
>> http://tools.ietf.org/html/rfc5435
>> http://tools.ietf.org/html/rfc5436
>>
>> http://wiki2.dovecot.org/Pigeonhole
>
> Fantastic, thanks, exactly what I need.
>
> I've got the basics working, with a static file Sieve script. However,
> I'm trying to keep as much of my config in a MySQL database, and this is
> where I'm starting to struggle.
Welcome to the club ;-)
>
> By user, I'd like to retrieve from a SQL database firstly which Sieve
> script to run (if applicable) and secondly the parameters for that
> particular user, in this case the external email address to notify.
AFAIK PigeonHole can read scripts only from file. Being able to use SQL
database as data source would sure be nice and I recall there was some
short discussion about it, but - again, AFAIK - it was never added as a
feature.
>
> As I understand it, I'll need to use the Extdata plugin to retrieve data
> values per-user. I've successfully compiled and installed this plugin,
> but I'm not sure how to connect it to a dict.
Tried that too for optional spamassassin test and failed, see
https://www.mail-archive.com/dovecot@dovecot.org/msg57539.html . IMO
documentation for this map and dict thing is a nightmare to say the
least (or if there is something, Google doesn't know about it.)
Anyway, this is what I came up with:
91-sieve-extdata.conf:
plugin {
sieve_extensions = +vnd.dovecot.extdata
sieve_extdata_dict_uri = proxy::testing
}
dict {
testing = pgsql:/etc/dovecot/pigeonhole-extdata.dict
}
/etc/dovecot/pigeonhole-extdata.dict:
connect = host=127.0.0.1 dbname=maildatabase user=mailuser password=secret
map {
pattern = priv/antispam_setting
table = mailschema.antispam_view
value_field = vtransport
username_field = full_username
}
I use PostgreSQL but I guess there won't be any major differences. In
sieve script it was used like this:
if extdata :is "antispam_setting" "enabled"
I think this worked in the end. Well, sort of worked, I needed to create
view with user names in user at domain format (I use separate tables for
domains and users), and the view looked like this:
create view antispam_view as \
select username || '@' || domain as full_username, vtransport \
from mailboxes \
left join domains on mailboxes.domains_id = domains.id ;
The || means string concatenation in PostgreSQL.
This is of course stupid and ugly, because lookup by username forces
sequential scan of the users table. Moreover I have separate UID for
every user, which in turn forced 0777 permissions on dict socket (sieve
interpreter runs under mailbox owner's uid), which doesn't seem very
secure. At this point I abandoned the idea.
Stephan Bosch suggested using the extprograms plugin - execute some
program non-conditionally, let it do all SQL lookups and take neccessary
actions. I didn't use that approach because it'd require me to create
some client-server application (to keep database credentials hidden from
users and to maintain database connection pool instead of doing connect
- lookup - close cycle for every request.) That looked a bit too
complicated compared with generating the sieve script (with or without
the test) according to database data. (I had the code to do that.)
But maybe some solution with extprograms will be more suitable for you.
>
> I've created a dict configuration file, with the following contents:
>
> map {
> pattern = priv/extdata/notify_email
> table = virtual_users
> username_field = email
> value_field = notify_email
> }
>
> And added it to dovecot.conf:
>
> dict {
> notify = mysql:/etc/dovecot/pigeonhole-sieve.dict
> }
>
> I've added the following to my Sieve configuration:
>
> sieve_plugins = sieve_extdata
> sieve_extdata_dict_uri = extdata::notify_email
>
> However, I'm not sure of the naming syntax of the above, and I'm just
> getting "sieve extdata: failed to initialize dict extdata::notify_email"
>
> I guess I've got the naming wrong, but I couldn't find documentation to
> specify how it should be. What am I doing wrong?
IIRC you're third person in past 4 weeks saying finding stuff in Dovecot
documention is hard, so don't feel bad ;-)
J.
More information about the dovecot
mailing list