[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: