Гость Опубликовано 18 августа, 2001 Жалоба Поделиться Опубликовано 18 августа, 2001 Нужно написать почтового робота. Письма перенапрявляются на скрипт: кусок файла /etc/aliases: # support: |/www/robot/robot Вопрос состоит в том как получить содержимое пришедшего письма и обработать его? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 18 августа, 2001 Жалоба Поделиться Опубликовано 18 августа, 2001 Нужно написать почтового робота. Письма перенапрявляются на скрипт: кусок файла /etc/aliases: # support: |/www/robot/robot Вопрос состоит в том как получить содержимое пришедшего письма и обработать его? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 1 сентября, 2001 Жалоба Поделиться Опубликовано 1 сентября, 2001 Ну если о перле речь, В алиасы прописываешь типа test: |/test/test.pl не забудь сделать на файле алиасов newalias или postalias (если постфикс стоит). /test ну смторя что с ней делать, но владелец демона должен иметь на нее соотв. права, как, собсно и на запуск test.pl Пример test.pl : --------8<-------------------------- #!/usr/bin/perl -w open (OUTPUT, ">>", "/test/test.log"); while(<>) { print OUTPUT $_; } print OUTPUT "\n--------\n"; ---------8<------------------------- В общих чертах - сообщение вводится из стдина. Удачи! ) :wq Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 1 сентября, 2001 Жалоба Поделиться Опубликовано 1 сентября, 2001 Ну если о перле речь, В алиасы прописываешь типа test: |/test/test.pl не забудь сделать на файле алиасов newalias или postalias (если постфикс стоит). /test ну смторя что с ней делать, но владелец демона должен иметь на нее соотв. права, как, собсно и на запуск test.pl Пример test.pl : --------8<-------------------------- #!/usr/bin/perl -w open (OUTPUT, ">>", "/test/test.log"); while(<>) { print OUTPUT $_; } print OUTPUT "\n--------\n"; ---------8<------------------------- В общих чертах - сообщение вводится из стдина. Удачи! ) :wq Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 14 декабря, 2001 Жалоба Поделиться Опубликовано 14 декабря, 2001 лови пример робота. Если в сабджекте стоит имя сист. юзера, письмо пересылается ему, иначе - постоперу. Писано наспех потому можно многое улучшить, но работает. #!/usr/bin/perl $conf = "/etc/robot.conf"; # загоняем с конфиг файла какие-то переменные # файл в формате переменная::значение на строку if ( -r $conf ) { open (conf, "<".$conf); while () { if (!((/#.*/) or (/\A\s*\Z/))) { tr /\n\r//d; $config{lc((split(/::/))[0])} = (split(/::/))[1] } } close conf; } # смотрим системных юзерей open (pass, "/passwd"); while () { @name = split(/:/); @names = ($name[0], @names); } close pass; # а также алиасы open (aliases, "/aliases"); while () { if (!(/#.*/) && ($_ ne "\n")) { @name = split(/:/); @names = ($name[0], @names); } } close aliases; # какие-то умолчания $delivered = 0; $header = 1; $begin = 1; $prevline = "nothing"; $tmpfilename = "/tmp/robot.$$"; $errormessage = "/tmp/robot_err.$$"; $dest = "$config{postoper}"; # открываем тмп файл open (tmpfile, ">$tmpfilename"); # и читаем пришедшее мыло с стдин while () { if ($header) { # если заголовок - читаем if (!($begin && ($_ eq "\n"))) { if (!($_ eq "\n")) { $header_cont = $header_cont.$_; if (lc()=~/(subject:)(.*)/) { $subject = $2; $prevline = "subject"} elsif (lc()=~/(to:)(.*)/) { $to = $2; $prevline = "to" } elsif (lc()=~/(from:)(.*)/) { $from = $2; $prevline = "from" } elsif ((/(\t)(.*)/) && ($prevline ne "nothing")) {$$prevline = $$prevline." ".$2 } else {$prevline = "nothing"} $begin = 0 } else { $header = 0; ##################### rules: # здесь собственно правила обработки мыла # например, если от robot@liga.kiev.ua, то переслать юзеру liga if ($from=~/(\s*)(robot\@liga.kiev.ua)(.*)/ ) {$dest = "liga"} # а если сабджекте в стоит имя сист. юзера, письмо пересылается ему foreach (@names) { if ($subject=~/(\A\s*)(\b$_\(\s*\Z)/ ) {$dest = "$_"} } ##################### end of rules if ($config{"warn_$dest"} eq "") {$config{"warn_$dest"} = "mail" } if ($config{"ok_$dest"} eq "") {$config{"ok_$dest"} = "mail" } print (tmpfile "$header_cont\n"); } } } else { # если тело - тупо переписываем print (tmpfile $_); } } close tmpfile; # отсылаем письмо system "sendmail $dest < $tmpfilename > $errormessage"; # и отчитываемся руту if( $config{"ok_$dest"} eq "mail") { # если в конфиге сказано отчитываться по почте, то по почте. open (sendmail, "|sendmail $config{root}"); print (sendmail "Subject: robot: OK\n\nrobot: sending message \n To: $to \n From: $from \n Subject: $subject \nOn $dest\n\nSendmail sed:\n"); open (errormessage, "<$errormessage"); while () {print (sendmail $_)} close errormessage; close sendmail; } system "rm -f $tmpfilename"; system "rm -f $errormessage"; Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 14 декабря, 2001 Жалоба Поделиться Опубликовано 14 декабря, 2001 лови пример робота. Если в сабджекте стоит имя сист. юзера, письмо пересылается ему, иначе - постоперу. Писано наспех потому можно многое улучшить, но работает. #!/usr/bin/perl $conf = "/etc/robot.conf"; # загоняем с конфиг файла какие-то переменные # файл в формате переменная::значение на строку if ( -r $conf ) { open (conf, "<".$conf); while () { if (!((/#.*/) or (/\A\s*\Z/))) { tr /\n\r//d; $config{lc((split(/::/))[0])} = (split(/::/))[1] } } close conf; } # смотрим системных юзерей open (pass, "/passwd"); while () { @name = split(/:/); @names = ($name[0], @names); } close pass; # а также алиасы open (aliases, "/aliases"); while () { if (!(/#.*/) && ($_ ne "\n")) { @name = split(/:/); @names = ($name[0], @names); } } close aliases; # какие-то умолчания $delivered = 0; $header = 1; $begin = 1; $prevline = "nothing"; $tmpfilename = "/tmp/robot.$$"; $errormessage = "/tmp/robot_err.$$"; $dest = "$config{postoper}"; # открываем тмп файл open (tmpfile, ">$tmpfilename"); # и читаем пришедшее мыло с стдин while () { if ($header) { # если заголовок - читаем if (!($begin && ($_ eq "\n"))) { if (!($_ eq "\n")) { $header_cont = $header_cont.$_; if (lc()=~/(subject:)(.*)/) { $subject = $2; $prevline = "subject"} elsif (lc()=~/(to:)(.*)/) { $to = $2; $prevline = "to" } elsif (lc()=~/(from:)(.*)/) { $from = $2; $prevline = "from" } elsif ((/(\t)(.*)/) && ($prevline ne "nothing")) {$$prevline = $$prevline." ".$2 } else {$prevline = "nothing"} $begin = 0 } else { $header = 0; ##################### rules: # здесь собственно правила обработки мыла # например, если от robot@liga.kiev.ua, то переслать юзеру liga if ($from=~/(\s*)(robot\@liga.kiev.ua)(.*)/ ) {$dest = "liga"} # а если сабджекте в стоит имя сист. юзера, письмо пересылается ему foreach (@names) { if ($subject=~/(\A\s*)(\b$_\(\s*\Z)/ ) {$dest = "$_"} } ##################### end of rules if ($config{"warn_$dest"} eq "") {$config{"warn_$dest"} = "mail" } if ($config{"ok_$dest"} eq "") {$config{"ok_$dest"} = "mail" } print (tmpfile "$header_cont\n"); } } } else { # если тело - тупо переписываем print (tmpfile $_); } } close tmpfile; # отсылаем письмо system "sendmail $dest < $tmpfilename > $errormessage"; # и отчитываемся руту if( $config{"ok_$dest"} eq "mail") { # если в конфиге сказано отчитываться по почте, то по почте. open (sendmail, "|sendmail $config{root}"); print (sendmail "Subject: robot: OK\n\nrobot: sending message \n To: $to \n From: $from \n Subject: $subject \nOn $dest\n\nSendmail sed:\n"); open (errormessage, "<$errormessage"); while () {print (sendmail $_)} close errormessage; close sendmail; } system "rm -f $tmpfilename"; system "rm -f $errormessage"; Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.