The OpenNET Project / Index page

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

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

"postfix + фильтры" 
Сообщение от Skif Искать по авторуВ закладки(ok) on 01-Июн-05, 13:05  (MSK)
Есть острая необходимость написать свой фильтр обработки почты.
вдоках все чудесно описано для Shell, а мне надо для перл. одни из ключевых моментов: вывод передается так сообщения в файл:

cat  > $DIR/$$ || { echo Cannot save mail to file; exit EX_TEMPFILE; }

Конечно, я могу это на перл реализовать как-то так(для простоты синтаксис пока оставим shell-овский):

system "cat  > $DIR/$$ || { echo Cannot save mail to file; exit EX_TEMPFILE; }"

или
`cat  > $DIR/$$ || { echo Cannot save mail to file; exit EX_TEMPFILE; }`

Но это не совсем "красивое" решение. Может кто подсказать,как "правильно" получить от smtpd сообщение, если фильтр прикручивается таким образом:

smtp    inet    n       -       n       -       10       smtpd
                -o content_filter=mailfilter:dummy

mailfilter unix  -       n       n       -       10       pipe
   flags=Rq user=pupkin argv=/usr/local/script/mail/mailfilter.sh -f ${sender} -- ${recipient}

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

 Оглавление

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

1. "postfix + фильтры" 
Сообщение от jonatan Искать по авторуВ закладки(??) on 01-Июн-05, 13:35  (MSK)
Может просто сделать:

open (OUTFILE, ">outfile");

while(<>) {
        print OUTFILE;
}

close OUTPUT;

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

2. "postfix + фильтры" 
Сообщение от Skif Искать по авторуВ закладки(ok) on 01-Июн-05, 13:39  (MSK)
Нет, вы не поняли, мне нужно перенаправить письмо от smtpd в файл. А уже потом с ним я сам разберусь. Я немогу понять, как это сделать.

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

3. "postfix + фильтры" 
Сообщение от jonatan Искать по авторуВ закладки(??) on 01-Июн-05, 13:47  (MSK)
Напишите shell скрипт, который будет только сохранять сообщение, переданное от postfix через pipe, в файл и вызывать Ваш perl скрипт с указанием имени этого файла в качестве параметра.
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "postfix + фильтры" 
Сообщение от Skif Искать по авторуВ закладки(ok) on 01-Июн-05, 13:51  (MSK)
>Напишите shell скрипт, который будет только сохранять сообщение, переданное от postfix через
>pipe, в файл и вызывать Ваш perl скрипт с указанием имени
>этого файла в качестве параметра.

Можно, но смысл? тогда вообще уж лучше отказаться от perl.
Просто цель написать один скрипт, а не большое число. Точнее сам скрипт уже готов, нужно только грамотно получить данные от smtpd и обработать.

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

5. "postfix + фильтры" 
Сообщение от jonatan Искать по авторуВ закладки(??) on 01-Июн-05, 14:01  (MSK)
Я Вам написал, как в perl получить сообщение. Можете сразу по строкам обрабатывать, можете сначал сохранить в файл.
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "postfix + фильтры" 
Сообщение от Skif Искать по авторуВ закладки(ok) on 01-Июн-05, 14:05  (MSK)
>Я Вам написал, как в perl получить сообщение. Можете сразу по строкам
>обрабатывать, можете сначал сохранить в файл.


Да нет, уже разобрался

open STDOUT, ">" || die "can not open STDOUT";
while (<STDOUT>){
  # bla-bla-bla
}
close STDOUT

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

7. "postfix + фильтры" 
Сообщение от jonatan Искать по авторуВ закладки(??) on 01-Июн-05, 15:00  (MSK)
>open STDOUT, ">" || die "can not open STDOUT";
>while (<STDOUT>){
>  # bla-bla-bla
>}
>close STDOUT
Поясните, что это значит?
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

8. "postfix + фильтры" 
Сообщение от gr Искать по авторуВ закладки on 01-Июн-05, 16:46  (MSK)
>>open STDOUT, ">" || die "can not open STDOUT";
>>while (<STDOUT>){
>>  # bla-bla-bla
>>}
>>close STDOUT
>Поясните, что это значит?


а это он STDIN открыл с именем STDOUT :)))

в блабла он очевидно открывает файлы и тд - STDOUT ом не пользуется

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

9. "postfix + фильтры" 
Сообщение от jonatan Искать по авторуВ закладки(??) on 01-Июн-05, 16:54  (MSK)
Я так и понял :)
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

10. "postfix + фильтры" 
Сообщение от gr Искать по авторуВ закладки on 01-Июн-05, 16:55  (MSK)
>>>open STDOUT, ">" || die "can not open STDOUT";
>>>while (<STDOUT>){
>>>  # bla-bla-bla
>>>}
>>>close STDOUT
>>Поясните, что это значит?
>
>
>а это он STDIN открыл с именем STDOUT :)))
>
>в блабла он очевидно открывает файлы и тд - STDOUT ом не
>пользуется

это я херню сказал конечно
это бессмыслица

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

11. "postfix + фильтры" 
Сообщение от gr Искать по авторуВ закладки on 01-Июн-05, 16:58  (MSK)
>>>>open STDOUT, ">" || die "can not open STDOUT";
>>>>while (<STDOUT>){
>>>>  # bla-bla-bla
>>>>}
>>>>close STDOUT
>>>Поясните, что это значит?
>>
>>
>>а это он STDIN открыл с именем STDOUT :)))
>>
>>в блабла он очевидно открывает файлы и тд - STDOUT ом не
>>пользуется
>
>это я херню сказал конечно
>это бессмыслица


а впрочем нет - читаем доки:

        As a special case the 3 arg form with a read/write mode and the
               third argument being "undef":

                   open(TMP, "+>", undef) or die ...

               opens a filehandle to an anonymous temporary file.  Also using
               "+<" works for symmetry, but you really should consider writing
               something to the temporary file first.  You will need to seek()
               to do the reading.

               File handles can be opened to "in memory" files held in Perl
               scalars via:

                   open($fh, '>', \$variable) || ..

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

12. "postfix + фильтры" 
Сообщение от jonatan Искать по авторуВ закладки(??) on 01-Июн-05, 17:43  (MSK)
В том виде, в котором написал он, работать не будет. Файл (какой?) открыт для записи, а он пытается читать из него. ИМХО просто опечатался.
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

13. "postfix + фильтры" 
Сообщение от Skif Искать по авторуВ закладки(ok) on 02-Июн-05, 10:44  (MSK)
Да нет, подсказали неправильно. А я обрадовался.
Пришлось потом сидеть и долго мучаться, разобрался только дома. Когда добрался до хорошо любимой "Programming Perl"

Правильно так.
Так как дескриптор STDIN заранее объявлен в среде perl, то для получения данных с входного потока, в данном случае от smtpd, необходимо проделать следующее:

$message = <STDIN>;

Но таким образом получается одна строка

@message = <STDIN>;

Получаем все строки.
И вот после этого, если нужно, открываем файл, загоняем данные \туда и работаем с ним. Все. не более того.
Вот из-за банальной вещи убил кучу времени. И так частенько бывает.

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

14. "postfix + фильтры" 
Сообщение от jonatan Искать по авторуВ закладки(??) on 02-Июн-05, 10:49  (MSK)
А я Вам о чем писал? Тоже самое, только использовал переменную $_, считывал построчно и сразу писал в файл.
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

15. "postfix + фильтры" 
Сообщение от Skif Искать по авторуВ закладки(ok) on 02-Июн-05, 10:53  (MSK)
>А я Вам о чем писал? Тоже самое, только использовал переменную $_,
>считывал построчно и сразу писал в файл.


Увы, я пробовал такой вариант тоже - у меня не получилось.

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

18. "postfix + фильтры" 
Сообщение от jonatan Искать по авторуВ закладки(??) on 02-Июн-05, 11:10  (MSK)
Плохо пробовали. Еще раз привожу простой РАБОЧИЙ пример.

/home/user/perl/test.pl:

#!/usr/bin/perl -w

open (FILEOUT, ">/home/user/perl/outfile") or die "can not open FILEOUT";

while(<>) {
        print FILEOUT;
}

close FILEOUT;

Все. Письмо будет находиться в /home/user/perl/outfile. Делаем с ним потом все, что душе угодно.

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

16. "postfix + фильтры" 
Сообщение от jonatan Искать по авторуВ закладки(??) on 02-Июн-05, 10:53  (MSK)
>@message = <STDIN>;
Учтите еще, что переменная храниться в памяти, а писем может быть много и большого объема. Вы уверены в том, что делаете? У Вас так много памяти?
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

17. "postfix + фильтры" 
Сообщение от Skif Искать по авторуВ закладки(ok) on 02-Июн-05, 11:08  (MSK)
>>@message = <STDIN>;
>Учтите еще, что переменная храниться в памяти, а писем может быть много
>и большого объема. Вы уверены в том, что делаете? У Вас
>так много памяти?

Мне все равно необходимо обработать письмо. Так что чем-то жертвовать прийдется. Если уж совсем станет критично -  можно ведь и сохранить в файл, а потом очистить массив.
Второе - ограничить количество "обрабатываемых" писем. Вместо unlimited можно поставить например 20-30. Так что все решабельно. Другой вопрос что не для всех-то подойдет, согласен, но у меня особого выбора нету :(

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

19. "postfix + фильтры" 
Сообщение от Skif Искать по авторуВ закладки(ok) on 02-Июн-05, 11:18  (MSK)
>>>@message = <STDIN>;
>>Учтите еще, что переменная храниться в памяти, а писем может быть много
>>и большого объема. Вы уверены в том, что делаете? У Вас
>>так много памяти?
>
>Мне все равно необходимо обработать письмо. Так что чем-то жертвовать прийдется. Если
>уж совсем станет критично -  можно ведь и сохранить в
>файл, а потом очистить массив.
>Второе - ограничить количество "обрабатываемых" писем. Вместо unlimited можно поставить например 20-30.
>Так что все решабельно. Другой вопрос что не для всех-то подойдет,
>согласен, но у меня особого выбора нету :(

Кстати, а как такой вариант. Береться переменная. При помощи  Email::Simple выделяем заголовки и  тело письма, вложения,  и получаем в итоге несколько файлов:
1 - полностью все письмо
2 - только заголовки
3 - только тело
4 - только вложения.

Потом по отдельности обрабатывается каждый из "участков".
На основе обработки решаем, переслылаем мы сообщение дальше или киляем.

Единственное, я не совсем уверен, что в "прежнем" порядке снова все соберу.

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

20. "postfix + фильтры" 
Сообщение от jonatan Искать по авторуВ закладки(??) on 02-Июн-05, 11:27  (MSK)
>Кстати, а как такой вариант. Береться переменная. При помощи  Email::Simple выделяем
>заголовки и  тело письма, вложения,  и получаем в итоге
>несколько файлов:
>1 - полностью все письмо
>2 - только заголовки
>3 - только тело
>4 - только вложения.
Зависит от того, что Вам нужно, Ваших знаний и фантазии.
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

21. "postfix + фильтры" 
Сообщение от Skif Искать по авторуВ закладки(ok) on 02-Июн-05, 16:03  (MSK)
Вот представлю на суд код, так как где-то есть ошибка:
#!/usr/bin/perl -w

use Email::Simple;
use File::Temp;

my $sendmail = "/usr/sbin/sendmail -t";

my $ex_tempfail = 75;
my $ex_unaviable = 69;

my $inspect_dir='/tmp';
my @arr_mes;
my $text='';

#open (ST, "/root/message.txt");
my @message = <STDIN>;
#close (ST);

foreach my $mess (@message) {
$text = "$text$mess";
undef $mess ;
}

undef @message;


my $mail = Email::Simple->new($text);


open (SENDMAIL, "|$sendmail") || die "ERROR: Can not run sendmail";
print SENDMAIL $mail->as_string . "\n";
#system "cat $mail->as_string | $sendmail";
close (SENDMAIL);
#print $mail->as_string;


exit(0);


тобишь логика понятна. Что получили, сразу же и вернули(все основные действия я убрал, важен сам принцип.).
А теперь проверяем:

[root@skif] /usr/local/script/:telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.central.klo.
Escape character is '^]'.
220 klo.skif.com.ua ESMTP Postfix
mail from:<>
250 Ok
rcpt to: skif@klo.kiev.ua
250 Ok
data
354 End data with <CR><LF>.<CR><LF>
quit

.
250 Ok: queued as 33A27FDAB
quit
221 Bye
Connection closed by foreign host.
[root@skif.center.klo] /usr/local/script/:
[root@skif.center.klo] /usr/local/script/:
[root@skif.center.klo] /usr/local/script/:less /var/log/maillog
Jun  2 14:48:35 skif postfix/smtpd[7415]: connect from localhost.central.klo[127.0.0.1]
Jun  2 14:48:46 skif postfix/smtpd[7415]: 33A27FDAB: client=localhost.central.klo[127.0.0.1]
Jun  2 14:48:52 skif postfix/cleanup[7418]: 33A27FDAB: message-id=<20050602114839.33A27FDAB@klo.skif.com.ua>
Jun  2 14:48:52 skif postfix/qmgr[7412]: 33A27FDAB: from=<>, size=360, nrcpt=1 (queue active)
Jun  2 14:48:53 skif postfix/sendmail[7421]: fatal: No recipient addresses found in message header
Jun  2 14:48:53 skif postfix/smtpd[7415]: disconnect from localhost.central.klo[127.0.0.1]
Jun  2 14:48:54 skif postfix/pipe[7419]: 33A27FDAB: to=<skif@klo.kiev.ua>, relay=mailfilter, delay=15, status=
sent (dummy)
Jun  2 14:48:54 skif postfix/qmgr[7412]: 33A27FDAB: removed

письмо просто недоставляется. уходит в dummy и тишина. В top, конечно, процесс фильтра виден, но от этого не легче.

Если пускать с командной строки:
# ./filter.pl < /root/message.txt
то все ок...

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

22. "postfix + фильтры" 
Сообщение от jonatan Искать по авторуВ закладки(??) on 02-Июн-05, 16:41  (MSK)
Что-то вроде этого:

my $sendmail = "/usr/sbin/sendmail -t @ARGV";

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

23. "postfix + фильтры" 
Сообщение от Skif Искать по авторуВ закладки(ok) on 03-Июн-05, 10:39  (MSK)
>Что-то вроде этого:
>
>my $sendmail = "/usr/sbin/sendmail -t @ARGV";


да, оно
my $sendmail = "/usr/sbin/sendmail -t $ARGV[0] $ARGV[1] $ARGV[3]";

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


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

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ]
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




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

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