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

Re: exim и courier - обработчики событий



Konstantin Kubatkin wrote:
Нужно это для следующего: при приходе письма надо запускать скриптик который отсылает sms на указаный номер. все ящики обрабатывать не надо потому что не всем это нужно, а ящиков много.

у меня это делает сам exim:

virtual_home:
  debug_print = "T: virtual_home for $local_part@$domain"
  driver = appendfile
  directory = ${extract{maildir}{${lookup
pgsql{MAIN_VIRTUAL_USER}{$value}fail}}}
  create_directory
  delivery_date_add
  envelope_to_add
  return_path_add
  maildir_format
  directory_mode = 0700
  mode = 0600
  user = VIRTUAL_USER
  group = VIRTUAL_GROUP
  mode_fail_narrower = false
  maildir_use_size_file
  maildir_tag = ,S=$message_size
  maildir_quota_directory_regex = ^(?:cur|new|\.(?!Trash).*)$
quota = ${extract{quota}{${lookup pgsql{MAIN_VIRTUAL_USER}{$value}fail}}}
  shadow_transport = virtual_sms
  shadow_condition = ${if eq{${extract{dlvr_nom}{${lookup
pgsql{MAIN_VIRTUAL_USER}{$value}fail}}}}{}{no}{yes}}

virtual_sms:
  debug_print   = "T: virtual_sms for $local_part@$domain"
  driver        = pipe
  path          = "/bin:/usr/bin:/usr/local/bin:/usr/local/sbin"
  command       = /usr/local/sbin/service_new.sh \
                ${sender_address} \
                "${extract{dlvr_nom}{${lookup
pgsql{MAIN_VIRTUAL_USER}{$value}fail}}}"
  user          = VIRTUAL_USER
  group         = VIRTUAL_GROUP
  return_path_add
  delivery_date_add
  envelope_to_add

Спасибо, буду пробовать и это тоже.
в /etc/courier/authmysqlrc
откуда то из старых версий осталась строчка
MYSQL_QUERY_LASTREAD UPDATE account SET lastlogin=now() WHERE Mailbox='%s'

но сейчас она не срабатывает.

это такой патч был
http://home.raxnet.net/downloads/courier-imap/courier-authlib-056-sql-updates.patch

Да, я это тоже обнаружил.
и ещё - как сделать так, чтобы можно было проверить переполнение квоты получателем при приёме письма во время smtp сессии, а не после приёма и генерировать отлуп.

virtual_domains_check_quota:
  debug_print   = "R: check_quota for $local_part@$domain"
  driver        = redirect
  domains       = +virtual_domains
  user          = VIRTUAL_USER
  group         = VIRTUAL_GROUP
  condition     = ${perl {check_quota} \
                {${extract{maildir}{${lookup
pgsql{MAIN_VIRTUAL_USER}{$value}fail}}}} \
                {${extract{quota}{${lookup
pgsql{MAIN_VIRTUAL_USER}{$value}fail}}}} \
                {$message_size} \
                }
  verify_only
  allow_fail
  data          = ${lookup pgsql{MAIN_VIRTUAL_USER}{:fail:Over
quota}{:fail:User unknown}}

exim.pl (c) не мой
# >0 - quota exceed
# $1 - dir $2 - quota $3 - message_size
sub check_quota {

  $SIG{__WARN__} = sub { Exim::log_write($_[0]) }; # causes warnings to
be logged by Exim.

  my $dir = $_[0];
  $dir .= '/' unless $dir =~ /\/$/;
  my $quota = $_[1];
  my $msize = $_[2];

  return 0 if $dir =~ /^$/;
  return 0 if $quota <= 0;

  my $verbose = 1;
  my $File = $dir.'maildirsize';
  my $quota_ok = 1;

  if( -f $File && -r $File ) {
    # Calculating the occupied size
    my $size = 0;
    open( MD, $File );
    while( <MD> ) {
      chomp;
      if( /^\s*(-?\d+)\s+/ ) {
        $size += $1;
      }
    }
    close( MD );
    if( $verbose ) { Exim::log_write( "check_quota: $File has used
$size bytes, message $msize bytes" ) }
    if( $msize != -1 ) { $size += $msize; }
    $quota_ok = ( $size < $quota ) ? 0 : 1;
    return $quota_ok;
  } else {
    if( $verbose ) { Exim::log_write( "check_quota: Cannot open $File
file; is assumed that it does not have quota" ) }
    return 0;
  }

}



Я не совсем понял, а где там вызывается exim.pl ?


Reply to: