The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"perl скрипт+postfix"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Открытые системы на сервере (Почта / FreeBSD)
Изначальное сообщение [ Отслеживать ]

"perl скрипт+postfix"  +/
Сообщение от vitek16 email(ok) on 02-Май-10, 00:41 
Нужна помощь. Ситуация следующая...
Есть задача письма приходящие на адрес ask@domain.ru направлять скрипту, который в свою очередь выдирая из тела письма subject сравнивает его с файлом в котором прописаны нужные темы письма и кому пересылать соответственно теме.
Что сделано:
master.cf:
test unix  -        n          n       - 5      pipe
   flags=q. user=filter argv=/usr/local/admins/mailfilter localhost:10027::localhost::${sender}::${recipient}::

main.cf:

transport_maps = hash:/usr/local/etc/postfix/transport

/usr/local/etc/postfix/transport:

ask@domain.ru         test:

Сам скрипт:
/usr/local/admins/mailfilter:

#!/usr/bin/perl -w

##
##Subject: Filter for Qmail by Ivanov Konstantin;
##

#use strict;
use Net::SMTP;
#
#Before using - SET PARAMS in config file (path to file sets in '$config')!!!
#
#---------------------------------------
my $smtphost='localhost';
my $from='test@domain.ru';
my $log= "/usr/local/admins/filter_log";
my $config= "/usr/local/admins/filter.conf";
#Config file must contain subject and mail address splited by space. !!!1 mail address for 1 subj per line!!!

#---------------------------------------
if($debug){
$log="$log-$$";
open STDERR, ">>$log";
}

#Reading input stream
my @body = (<>);

my $border=0;
foreach $line (@body) { if ($line =~ /^$/) { $border++; } }
if ($debug) { print STDERR $border, "\n"; }
if ($border == 0) { push(@body,"\n\n") ;}

if($debug){
print STDERR "START-----------\n";
print STDERR @body;
print STDERR "END-------------\n";
}
#
#---Processing message body---
#

#Searching 'Subject:' header.
STOP: foreach $line (@body) {
($title, $id) = split (/ /, $line);
    $pass=false;
    if ($title eq "Subject:"){
    $tsubj=$title;
    $subj=$id;
    chomp ($subj);
    $pass=true;
    last STOP if ($pass);
    }
}
#Opening config file
open (FILE, "$config");
while (<FILE>){
($nsubj, $to)=split(' ', $_);
chomp ($nsubj); chomp ($to);
    if ($nsubj eq $subj){
    $smtp=Net::SMTP-> new($smtphost, Debug=>$debug, Timeout=>30,);
    unless(defined $smtp){
    if($debug){print STDERR "smtp server is not found\n";}
    exit;}
    $smtp->mail($from);
    $smtp->to($to);
    $smtp->data();
    $smtp->datasend(\@body);
    $smtp->quit();
    }
}

#End


Файл,который использует скрипт для сравнивания subject и пересылке на нужные адреса
/usr/local/admins/filter.conf

subject1 user1@domain.ru
subject2 user2@domain.ru

При отправке письма на ask@domain.ru в логах происходит вот что:
less /var/log/maillog:

Apr 30 22:18:03 mail postfix/qmgr[49276]: E872C530470: from=<user@gmail.com>, size=2058, nrcpt=1 (queue active)
Apr 30 22:18:03 mail postfix/smtpd[73847]: connect from localhost[127.0.0.1]
Apr 30 22:18:03 mail postfix/smtpd[73847]: match_hostname: localhost ~? 127.0.0.0/8
Apr 30 22:18:03 mail postfix/smtpd[73847]: match_hostaddr: 127.0.0.1 ~? 127.0.0.0/8
Apr 30 22:18:03 mail postfix/smtpd[73847]: > localhost[127.0.0.1]: 220 mail.domain.ru ESMTP
Apr 30 22:18:03 mail postfix/smtpd[73847]: xsasl_cyrus_server_create: SASL service=smtp, realm=(null)
Apr 30 22:18:03 mail postfix/smtpd[73847]: name_mask: noanonymous
Apr 30 22:18:03 mail postfix/smtpd[73847]: watchdog_pat: 0x80160ab30
Apr 30 22:18:03 mail postfix/smtpd[73847]: < localhost[127.0.0.1]: EHLO localhost.localdomain
Apr 30 22:18:03 mail postfix/smtpd[73847]: > localhost[127.0.0.1]: 250-mail.domain.ru
Apr 30 22:18:03 mail postfix/smtpd[73847]: > localhost[127.0.0.1]: 250-PIPELINING
Apr 30 22:18:03 mail postfix/smtpd[73847]: > localhost[127.0.0.1]: 250-SIZE 10240000
Apr 30 22:18:03 mail postfix/smtpd[73847]: > localhost[127.0.0.1]: 250-ETRN
Apr 30 22:18:03 mail postfix/smtpd[73847]: > localhost[127.0.0.1]: 250-AUTH LOGIN PLAIN CRAM-MD5
Apr 30 22:18:03 mail postfix/smtpd[73847]: match_list_match: localhost: no match
Apr 30 22:18:03 mail postfix/smtpd[73847]: match_list_match: 127.0.0.1: no match
Apr 30 22:18:03 mail postfix/smtpd[73847]: > localhost[127.0.0.1]: 250-AUTH=LOGIN PLAIN CRAM-MD5
Apr 30 22:18:03 mail postfix/smtpd[73847]: > localhost[127.0.0.1]: 250-ENHANCEDSTATUSCODES
Apr 30 22:18:03 mail postfix/smtpd[73847]: > localhost[127.0.0.1]: 250-8BITMIME
Apr 30 22:18:03 mail postfix/smtpd[73847]: > localhost[127.0.0.1]: 250 DSN
Apr 30 22:18:03 mail postfix/smtpd[73847]: watchdog_pat: 0x80160ab30
Apr 30 22:18:03 mail postfix/smtpd[73847]: < localhost[127.0.0.1]: MAIL FROM:<test@domain.ru>
Apr 30 22:18:03 mail postfix/smtpd[73847]: extract_addr: input: <test@domain.ru>
Apr 30 22:18:03 mail postfix/smtpd[73847]: smtpd_check_addr: addr=test@domain.ru
Apr 30 22:18:03 mail postfix/smtpd[73847]: connect to subsystem private/rewrite
Apr 30 22:18:03 mail postfix/smtpd[73847]: send attr request = rewrite
Apr 30 22:18:03 mail postfix/smtpd[73847]: send attr rule = local
Apr 30 22:18:03 mail postfix/smtpd[73847]: send attr address = test@domain.ru
Apr 30 22:18:03 mail postfix/smtpd[73847]: private/rewrite socket: wanted attribute: flags
Apr 30 22:18:03 mail postfix/smtpd[73847]: input attribute name: flags
Apr 30 22:18:03 mail postfix/smtpd[73847]: input attribute value: 0
Apr 30 22:18:03 mail postfix/smtpd[73847]: private/rewrite socket: wanted attribute: address
Apr 30 22:18:03 mail postfix/smtpd[73847]: input attribute name: address
Apr 30 22:18:03 mail postfix/smtpd[73847]: input attribute value: test@domain.ru
Apr 30 22:18:03 mail postfix/smtpd[73847]: private/rewrite socket: wanted attribute: (list terminator)
Apr 30 22:18:03 mail postfix/smtpd[73847]: input attribute name: (end)
Apr 30 22:18:03 mail postfix/smtpd[73847]: rewrite_clnt: local: test@domain.ru -> test@domain.ru
Apr 30 22:18:03 mail postfix/smtpd[73847]: send attr request = resolve
Apr 30 22:18:03 mail postfix/smtpd[73847]: send attr sender =
Apr 30 22:18:03 mail postfix/smtpd[73847]: send attr address = test@domain.ru
Apr 30 22:18:03 mail postfix/smtpd[73847]: private/rewrite socket: wanted attribute: flags
Apr 30 22:18:03 mail postfix/smtpd[73847]: input attribute name: flags
Apr 30 22:18:03 mail postfix/smtpd[73847]: input attribute value: 0
Apr 30 22:18:03 mail postfix/smtpd[73847]: private/rewrite socket: wanted attribute: transport
Apr 30 22:18:03 mail postfix/smtpd[73847]: input attribute name: transport
Apr 30 22:18:03 mail postfix/smtpd[73847]: input attribute value: virtual
Apr 30 22:18:03 mail postfix/smtpd[73847]: private/rewrite socket: wanted attribute: nexthop
Apr 30 22:18:03 mail postfix/smtpd[73847]: input attribute name: nexthop
Apr 30 22:18:03 mail postfix/smtpd[73847]: input attribute value: domain.ru
Apr 30 22:18:03 mail postfix/smtpd[73847]: private/rewrite socket: wanted attribute: recipient
Apr 30 22:18:03 mail postfix/smtpd[73847]: input attribute name: recipient
Apr 30 22:18:03 mail postfix/smtpd[73847]: input attribute value: test@domain.ru
Apr 30 22:18:03 mail postfix/smtpd[73847]: private/rewrite socket: wanted attribute: flags
Apr 30 22:18:03 mail postfix/smtpd[73847]: input attribute name: flags
Apr 30 22:18:03 mail postfix/smtpd[73847]: input attribute value: 1024
Apr 30 22:18:03 mail postfix/smtpd[73847]: private/rewrite socket: wanted attribute: (list terminator)
Apr 30 22:18:03 mail postfix/smtpd[73847]: input attribute name: (end)
Apr 30 22:18:03 mail postfix/smtpd[73847]: resolve_clnt: `' -> `test@domain.ru' -> transp=`virtual' host=`domain.ru' rcpt=`test@domnails.ru' flags= class=virtual
Apr 30 22:18:03 mail postfix/smtpd[73847]: ctable_locate: install entry key test@domnails.ru
Apr 30 22:18:03 mail postfix/smtpd[73847]: extract_addr: in: <test@domain.ru>, result: test@domain.ru
Apr 30 22:18:03 mail postfix/smtpd[73847]: fsspace: .: block size 2048, blocks free 23212216
Apr 30 22:18:03 mail postfix/smtpd[73847]: smtpd_check_queue: blocks 2048 avail 23212216 min_free 0 msg_size_limit 10240000
Apr 30 22:18:03 mail postfix/smtpd[73847]: > localhost[127.0.0.1]: 250 2.1.0 Ok
Apr 30 22:18:03 mail postfix/smtpd[73847]: watchdog_pat: 0x80160ab30
Apr 30 22:18:03 mail postfix/smtpd[73847]: < localhost[127.0.0.1]: RCPT TO:<>
Apr 30 22:18:03 mail postfix/smtpd[73847]: extract_addr: input: <>
Apr 30 22:18:03 mail postfix/smtpd[73847]: warning: Illegal address syntax from localhost[127.0.0.1] in RCPT command: <>
Apr 30 22:18:03 mail postfix/smtpd[73847]: extract_addr: in: <>, result:
Apr 30 22:18:03 mail postfix/smtpd[73847]: > localhost[127.0.0.1]: 501 5.1.3 Bad recipient address syntax
Apr 30 22:18:03 mail postfix/smtpd[73847]: watchdog_pat: 0x80160ab30
Apr 30 22:18:03 mail postfix/smtpd[73847]: < localhost[127.0.0.1]: DATA
Apr 30 22:18:03 mail postfix/smtpd[73847]: > localhost[127.0.0.1]: 554 5.5.1 Error: no valid recipients
Apr 30 22:18:03 mail postfix/smtpd[73847]: watchdog_pat: 0x80160ab30
Apr 30 22:18:03 mail postfix/smtpd[73847]: < localhost[127.0.0.1]:
Apr 30 22:18:03 mail postfix/smtpd[73847]: > localhost[127.0.0.1]: 500 5.5.2 Error: bad syntax
Apr 30 22:18:03 mail postfix/smtpd[73847]: watchdog_pat: 0x80160ab30
Apr 30 22:18:03 mail postfix/smtpd[73847]: < localhost[127.0.0.1]:
Apr 30 22:18:03 mail postfix/smtpd[73847]: > localhost[127.0.0.1]: 500 5.5.2 Error: bad syntax
Apr 30 22:18:03 mail postfix/smtpd[73847]: watchdog_pat: 0x80160ab30
Apr 30 22:18:03 mail postfix/smtpd[73847]: < localhost[127.0.0.1]: .
Apr 30 22:18:03 mail postfix/smtpd[73847]: match_string: . ~? CONNECT
Apr 30 22:18:03 mail postfix/smtpd[73847]: match_string: . ~? GET
Apr 30 22:18:03 mail postfix/smtpd[73847]: match_string: . ~? POST
Apr 30 22:18:03 mail postfix/smtpd[73847]: match_list_match: .: no match
Apr 30 22:18:03 mail postfix/smtpd[73847]: > localhost[127.0.0.1]: 502 5.5.2 Error: command not recognized
Apr 30 22:18:03 mail postfix/smtpd[73847]: watchdog_pat: 0x80160ab30
Apr 30 22:18:03 mail postfix/smtpd[73847]: < localhost[127.0.0.1]: QUIT
Apr 30 22:18:03 mail postfix/smtpd[73847]: > localhost[127.0.0.1]: 221 2.0.0 Bye
Apr 30 22:18:03 mail postfix/smtpd[73847]: match_hostname: localhost ~? 127.0.0.0/8
Apr 30 22:18:03 mail postfix/smtpd[73847]: match_hostaddr: 127.0.0.1 ~? 127.0.0.0/8
Apr 30 22:18:03 mail postfix/smtpd[73847]: disconnect from localhost[127.0.0.1]
Apr 30 22:18:03 mail postfix/pipe[73842]: E872C530470: to=<ask@domain.ru>, relay=test, delay=0.27, delays=0.22/0/0/0.05, dsn=2.0.0, status=sent (delivered via test service)
Apr 30 22:18:03 mail postfix/qmgr[49276]: E872C530470: removed
Apr 30 22:18:03 mail postfix/smtp[73809]: E387A53040B: to=<user@gmail.com>, relay=gmail-smtp-in.l.google.com[209.85.129.114]:25, delay=0.59, delays=0.02/0/0.45/0.12, dsn=5.5.2, status=undeliverable (host gmail-smtp-in.l.google.com[209.85.129.114] said: 555 5.5.2 Syntax error. 12si3484701fks.50 (in reply to MAIL FROM command))
Apr 30 22:18:23 mail postfix/qmgr[49276]: E387A53040B: removed
Apr 30 22:18:33 mail postfix/smtpd[73744]: disconnect from mail-ww0-f45.google.com[74.125.82.45]

На сколько я сам понимаю скрипт не может подставить из файла получателя либо вообще не обращается к файлу...
Сам скрипт и пример файла к которому обращается скрипт взяты с рабочего сервера на linux, разница с ним только в том, что у него основной транспорт local а не virtual и там отдача писем скрипту организован через /etc/aliases

ask:    |/usr/local/lib/mailfilter

Всвязи с тем, что с postfix недавно работаю и perl не знаю настолько хорошо, прошу помощи у знающих людей,может у кого-то был опыт внедрения подобного...

Высказать мнение | Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "perl скрипт+postfix"  +/
Сообщение от vitek16 email(ok) on 03-Май-10, 22:26 
Никто не сталкивался с таким? Может кто-нибудь подскажет по синтаксису perl данного скрипта? Так как я больше чем уверен что проблема именно в нем...
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

2. "perl скрипт+postfix"  +/
Сообщение от PavelR (??) on 04-Май-10, 06:16 
>Никто не сталкивался с таким? Может кто-нибудь подскажет по синтаксису perl данного
>скрипта? Так как я больше чем уверен что проблема именно в
>нем...

Синтаксис перла в данном скрипте ничем не отличается от синтаксиса перла в других скриптах.

Написан скрипт чуть коряво, но только чуть. Строка #use strict; закомментирована 100% зря - надо исправлять ошибки, а не отключать их проверку.

Отладка скриптов: добавьте вывод значений нужных вам переменных, в нужные места, сравните с ожидаемым, при несовпадении - исправляйте ошибку.

Успехов.

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру