[Pkg-exim4-users] Run a shell script from transport?

Nils Altenbach schwarzlicht at gmx.de
Fri Dec 3 16:11:37 UTC 2010


Hi everybody,

I have very limited experience with configuring Exim. I'm using exim4 on 
Lenny with a MySQL user database, which is working fine, but I want 
exim4 to run a shell script every time the transport 
local_mysql_delivery delivers a mail, with the username of the user 
receiving the mail (local part of the email address) as argument for 
that script.

I've tried using the transport_filter, but it doesn't work.

This is the transport in question:


local_mysql_delivery:
   driver        = appendfile
#  file         = /var/mail/$local_part
#  directory    = /home/$local_part/.maildir
   directory     = /var/mail/${domain}/${local_part}/
   maildir_format
   delivery_date_add
   envelope_to_add
   return_path_add
   user          = mail
   group         = mail
   mode          = 0660

   # running the delivery alert script

#  transport_filter = /bin/sh -c /usr/local/bin/maildelivered.sh 
'${quote_mysql:$local_part}'

   # at this time, we know a local user to get his individual 
preferences to tag the mail
   # the '${eval:$header_X-Spam-Score-Int:}' is is a hack to cope with 
negative ints that seem to be parsed as strings, thus failing the comparsion
   # if there's no X-Spam-Score-Int header set by data-acl above, don't 
panic ;-)
   # another hack is that we remove important headers, we add later to 
be sure there are no multiple versions from earlier relays, or forged 
ones (this is BUGGY right now as it merges all equal headers!)
   #     therefore i implemented the 
${sg{$header_X-Spam-Score-Int:}{^.*\n}{}} regex hack, that strips all
   headers_remove = Subject : X-Spam-Flag : X-Spam-Score-Int : 
X-Spam-Score : X-Spam-Bar : X-Spam-Report
   headers_add   = "X-Spam-Threshold: ${lookup mysql{ \
                                         SELECT spam_threshold \
                                         FROM user \
                                         WHERE 
username='${quote_mysql:$local_part}' \
                                         AND 
domain='${quote_mysql:$domain}' \
                                         AND SMTP_allowed='YES' \
                                       }{$value}{ERROR}}\n\
                   X-Spam-Score: $header_X-Spam-Score:\n\
                   X-Spam-Score-Int: $header_X-Spam-Score-Int:\n\
                   X-Spam-Bar: $header_X-Spam-Bar:\n\
                   X-Spam-Report: $header_X-Spam-Report:\n\
                   X-Spam-Flag: ${if def:header_X-Spam-Score-Int:{\
                                         ${if 
 >={${eval:${sg{$header_X-Spam-Score-Int:}{^.*\n}{}}}}\
                                                 {${lookup mysql{ \
                                         ${if 
 >={${eval:${sg{$header_X-Spam-Score-Int:}{^.*\n}{}}}}\
                                                 {${lookup mysql{ \
                                                         SELECT 
spam_threshold*10 \
                                                         FROM user \
                                                         WHERE 
username='${quote_mysql:$local_part}' \
                                                         AND 
domain='${quote_mysql:$domain}' \
                                                         AND 
SMTP_allowed='YES' \
                                                 
}{$value}{ERROR}}}{YES}{NO}}\
                                         }{\
                                         UNKNOWN\
                                 }}\n\
                   Subject: ${if def:header_X-Spam-Score-Int:{\
                                         ${if 
 >={${eval:${sg{$header_X-Spam-Score-Int:}{^.*\n}{}}}}\
                                                 {${lookup mysql{ \
                                                         SELECT 
spam_threshold*10 \
                                                         FROM user \
                                                         WHERE 
username='${quote_mysql:$local_part}' \
                                                         AND 
domain='${quote_mysql:$domain}' \
                                                         AND 
SMTP_allowed='YES' \
                                                 
}{$value}{ERROR}}}{${lookup mysql{ \
                                                                         
SELECT spam_tag \
                                                                         
FROM user \
                                                                         
WHERE username='${quote_mysql:$local_part}' \
                                                                         
AND domain='${quote_mysql:$domain}' \
                                                                         
AND SMTP_allowed='YES' \
                                                                    
}{$value}{ERROR}}$h_subject:}{$h_subject:}}\
                                 }{$h_subject:}}\n\
                   X-Delivered-To: $original_local_part@$original_domain 
($local_part@$domain)\n\
                   X-Message-Age: $message_age"

The transport filter is commented out because if I use it, mails aren't 
delivered, and /var/log/exim4/mainlog gives me something like this:

2010-12-03 16:51:25 1POXtY-00035P-2l == abc at fooserver.net R=mysql_user 
T=local_mysql_delivery defer (-24): transport filter process failed 
(127) while writing to tmp/1291391485.H362240P11945.fooserver.net: 
unable to execute command

What am I doing wrong? Should I use run instead of transport_filter, and 
how exactly am I supposed to run a shell script from a transport? I 
don't need any feedback from that shell script (other than it did run 
without errors), I just need exim to run that script every time a MySQL 
user receives a mail.

Thanks in advance.
Nils Altenbach



More information about the Pkg-exim4-users mailing list