Перейти к содержанию

mailrobot


Гость

Рекомендуемые сообщения

Нужно написать почтового робота.

Письма перенапрявляются на скрипт:

кусок файла /etc/aliases:

#

support: |/www/robot/robot

Вопрос состоит в том как получить содержимое пришедшего письма и обработать его?

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Ну если о перле речь,

В алиасы прописываешь типа

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<-------------------------

В общих чертах - сообщение вводится из стдина.

Удачи! Wink)

:wq

Ссылка на комментарий
Поделиться на другие сайты

  • 3 месяца спустя...

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

#!/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$_\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";

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...