Re: exim и courier - обработчики событий
On Sat, Feb 02, 2008 at 07:34:02PM +0500, Timur S. Sattarov wrote:
> Pavel Ammosov wrote:
>>>как сделать так, чтобы при складывании письма в maildir у конкретного
>>>пользователя запускалась нужная мне программа ?
>>Думаю, это можно сделать при помощи копии роутера с доставкой в
>>address_pipe и с флагом unseen. Тогда, почта перед складыванием в
>>окончательный мейлбокс будет проходить через этот роутер, который будет
>>её складывать в указанную программу.
>>
>Я честно говоря с экзимом недавно столкнулся, можно хотя бы грубо
>прикинуть такой роутер ?
Вот так вот работает:
dovemail_exec:
driver = redirect
allow_defer
allow_fail
domains = /etc/exim4/virtual-domains
pipe_transport = address_pipe
retry_use_local_part
data = |/usr/local/sbin/mail-input
require_files = /var/spool/dovemail/$domain/$local_part
user = dovemail
unseen
dovemail:
driver = redirect
allow_defer
allow_fail
domains = /etc/exim4/virtual-domains
file_transport = address_file
retry_use_local_part
data = /var/spool/dovemail/$domain/$local_part/inbox
require_files = /var/spool/dovemail/$domain/$local_part
user = dovemail
Первый роутер (dovemail_exec) скармливает письмо в stdin скрипта
/usr/local/sbin/mail-input (в аттачменте), а второй сохраняет в спул
к imap/pop.
По -bt это выглядит так:
# exim4 -bt chicken@example.com
chicken@example.com -> /var/spool/dovemail/example.com/chicken/inbox
transport = address_file
chicken@example.com -> |/usr/local/sbin/mail-input
transport = address_pipe
#!/usr/bin/perl -w
use strict;
use Sys::Syslog;
use File::Temp qw(tempfile);
Sys::Syslog::setlogsock ('unix');
openlog ("mail-input", "cons,pid", 'mail');
syslog("info", "incoming message");
$SIG{__DIE__} = sub {
return if ($^S); # внутри eval
my ($package, $filename, $line) = caller();
syslog("err", "dead " . join(", ", @_) . " at $filename:$line");
};
my $envelope = <STDIN>;
syslog("info", "Envelope: %s", $envelope);
syslog("info", "Message-ID: %s", $ENV{MESSAGE_ID});
for my $var (sort {$a cmp $b} keys (%ENV)) {
syslog("info", " Env %s=%s", $var, $ENV{$var});
}
my ($fh, $filename) = tempfile();
print $fh $envelope;
while (<STDIN>) {
print $fh $_;
}
syslog("info", "File: %s", $filename);
Reply to: