Создание почтовых роботов на Perl

| | Comments (0) | TrackBacks (0)

То, что в Fido называлось FAQServer, и работало по 5 минут после каждого письма в среде *nix/Internet оказалось очень легко реализовать. Из-за необходимости работы с текстами разумно будет писать робот на Perl, хотя можно и на C. Это, скорее, вопрос «религии», найдуться умельцы, которые смогут запросто написать подобное на bash или csh.

Современные MTA (Mail Transport Agents) предоставляют удобный интерфейс для почтовых роботов — письмо пришедшее на заданный alias перенаправляется на STDIN программы обработчика. В случае, если используется Postfix (с виртуальными доменами postfix-style) возникает проблема — в перечне виртуальных доменов нельзя указать программу — только логин или e-mail. В FAQ Postfix предлагается перейти на sendmail-style virtual domains. На самом деле в файле virtual можно указать не login, а alias и всё будет работать. В обоих случаях в aliases нужно прописать строку вида mysuperrobot "|/usr/local/sbin/mysuperrobot". Потом надо запустить команду newaliases, которая обновит базу данных.

В Postfix придётся ещё написать в файле virtual адрес в виртуальном домене (если, конечно, используются виртуальные домены): /^mysuperrobot\@domain\.tld$/ mysuperrobot\@real.server.hostname. Этот пример работает в случае, если разрешены регулярные выражения. Затем надо сохранить файл, обновить базу и перезапустить Postfix:

# postmap virtual
# postfix reload

>Реализация

Теперь собственно о роботе. Тут всё просто. Надо по строке разбирать STDIN. Например вот так:

while(<STDIN>) { chomp $_; if(/From:/) { ($fake, $sender) = split(/ /, $_, 2); } if(/Subject:/) { ($fake, $subj) = split(/ /, $_, 2); $subj = "Re: $subj"; } # Вот в этом месте уместо аналогичным # образом обрабатывать команды тела # письма, а не заголовки }

Код отображения справки в ответ на команду help будет выглядеть вот так:

if(/help/) { $msg.="> $_\n"; open(HELP, "/full/path/to/help.txt"); while($i=<HELP>) { $msg.=$i; } close(HELP); $msg.="\n"; }

Путь везде надо указывать полный. Если за этим не следить — глюки вылезут в самых неожиданных местах.

А дальше надо просто отправить ответ обычным способом:

open(MAIL,"|/usr/sbin/sendmail -t"); print MAIL "To: $sender\n"; print MAIL "From: \"Mail robot\" <mysuperrobot\@domain.tld>\n"; print MAIL "Subject: $subj\n\n"; print MAIL $msg."\n"; close(MAIL);

Подразумевается, что в $msg находится текст сообщения.

Безопасность

Скрипт запускается с правами nobody, так что надо установить необходимые права доступа (755). Можно использовать скрипты с аттрибутом SUID. Остальное — как в CGI. Нельзя допускать передачу указанных пользователем параметров функциям без их тщательной проверки. Все подозрительные места можно обнаружить автоматически, если есть возможность установить на скрипт права SUID root. Потом, конечно, надо будет отключить этот бит. Кстати говоря, если скрипт завершится с ошибкой, то ошибка придёт по e-mail отправителю запроса — интересный способ отладки.

Если скрипт на C++ то надо все стандартные ошибки проверять. Переполнение буфера, пропуск строки формата в printf, и т.д.

0 TrackBacks

Listed below are links to blogs that reference this entry: Создание почтовых роботов на Perl.

TrackBack URL for this entry: http://www.ptitov.ru/mt/mt-tb.cgi/2

Leave a comment

About this Entry

This page contains a single entry by Pavel Titov published on March 19, 2002 6:12 AM.

Делаем Rock Box was the previous entry in this blog.

Использование нейросетей в криптографии is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.

Powered by Movable Type 4.01

Страницы