[exim] Run a shell script from transport?

Góra strony
Delete this message
Reply to this message
Autor: Nils Altenbach
Data:  
Dla: exim-users
Temat: [exim] Run a shell script from transport?
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@??? 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