Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание почтового робота на Perl. 
:(
    Опции темы
Гость_Alex
Дата 12.8.2004, 14:01 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Здравствуйте!
Собственно встала проблема. Нужно написать почтового робота на Perl.
Основные требования такие:
1. Прием писем на определенный адрес.
2. Разбор письма (на head и body) и сохранение вложения на диск.

С п.1 понятно, а вот с п.2 проблема.
Может, кто знает соответствующие модули или готовые скрипты, посоветуйте.

Заранее благодарен.

  Вверх
ElectricalStorm
Дата 13.8.2004, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 547
Регистрация: 22.1.2004

Репутация: нет
Всего: 9



что значит "Прием писем на определенный адрес." ???


--------------------
Нужно знать инструмент, которым пользуешься
PM MAIL   Вверх
Guest
Дата 16.8.2004, 08:52 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Я имею ввиду, что после получения письма на определенный адрес (например [email protected]) скрипт начинает работать. Другими словами sendmail отсылает письмо на вход данной программы. (Test: "|/usr/home/test.pl"). Скрипт считывает входной поток (из STDIN) и т.д. Вот приблизительно так я представляю.

  Вверх
Secandr
Дата 16.8.2004, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: нет
Всего: 39



логично.
А по второму пункту: регекспы(регулярные выражения). В книге О`Рейли "регулярные выражения" описана система разбора письма. Советую купить за 200р и почитать - можная вещь.


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Guest
Дата 16.8.2004, 10:10 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Книга это, конечно хорошо. Но, пока найдешь, пока купишь... время уходит.
В принципе, разбор письма без вложения и отправленного простым текстом задача не такая уж и сложная задача. (От начала и до первой пустой строки - заголовок, все остальное -тело) .
Затык в том,что письмо содержит с вложение.
  Вверх
Secandr
Дата 16.8.2004, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: нет
Всего: 39



Так с чем имено сложность, опиши!


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Guest
Дата 16.8.2004, 10:29 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Как выдернуть вложение, раскодировать и сохранить на диск.
  Вверх
Secandr
Дата 16.8.2004, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: нет
Всего: 39



запость пример письма с вложением и то как ты его пытаешься азобрать.


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Гость_Alex
Дата 16.8.2004, 12:53 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Вот пример письма.

Код

From [email protected]  Mon Aug 16 13:06:54 2004
Received: from localhost.somebody.ru (sr-zgres-001.somebody.ru [10.160.1.2])
From: [email protected]
To: [email protected]
Subject: Here is the file
Date: Mon, 16 Aug 2004 13:06:54 +0400
X-Mailer: Perl script "sen.pl"
using Mail::Sender 0.8.10 by Jenda Krynicky, Czechlands
running on localhost.somebody.ru (127.0.0.1)
under account "sysadm"
Message-ID: <[email protected]>
MIME-Version: 1.0
Content-type: multipart/mixed;
boundary="Message-Boundary-by-Mail-Sender-1092647214"

This message is in MIME format. Since your mail reader does not understand
this format, some or all of this message may not be legible.

--Message-Boundary-by-Mail-Sender-1092647214
Content-type: text/plain; charset="US-ASCII"
Content-description: Mail message body
Content-transfer-encoding: 7BIT
Content-disposition: inline

I'm sending you the list you wanted.
--Message-Boundary-by-Mail-Sender-1092647214
Content-type: application/octet-stream; name="dbmshs.xls"; type=Unknown;
Content-description: dbmshs.xls
Content-transfer-encoding: Base64
Content-disposition: attachment; filename="dbmshs.xls"

0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAABAAAAIQAAAAAAAAAA
EAAA/v///wAAAAD+////AAAAACAAAAD/////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
[color=red]--------- Здесь обрезал -----[/color]bQBtAGEAcgB5AEkAbgBmAG8AcgBtAGEAdABpAG8AbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ACgAAgEBAAAAAwAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAA
ABAAAAAAAAAFAEQAbwBjAHUAbQBlAG4AdABTAHUAbQBtAGEAcgB5AEkAbgBmAG8AcgBtAGEAdABp
AG8AbgAAAAAAAAAAAAAAOAACAf///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAABgAAAAAEAAAAAAAAA==
--Message-Boundary-by-Mail-Sender-1092647214--



Все это мне сделал вот такой скрипт.

Код

#!/usr/local/bin/perl

my @mail = <STDIN>;

open(OUT, ">/usr/home/sysadm/work/SendMessages/out.txt");

print OUT @mail;
close(OUT);


А, как разобрать ума не приложу.
может быть так:
Код

$/='';

while(<>) {
if ($.==1) { #со второго абзаца
push (@body, @_);


а дальше не знаю.


  Вверх
Secandr
Дата 16.8.2004, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: нет
Всего: 39



думаю что надо читать файл построчно и искать Content-disposition: attachment;
а затем копировать всё в переменную до строки содержащей --Message-.....

Искать лучше регекспами, примерно так
Код
if ($str=~m/Content-disposition:[ ]+attachment;[ ]+name[ ]*=[ ]*"([^"])")/i)
{
echo $1; # имя файла
}

Добавлено @ 14:13
P.S. Я тоже хотел написать такую программу, что бы она сортировала почту и отправляла мне уведомления на сотовый, но не судьба sad.gif


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
GoodBoy
Дата 16.8.2004, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Главный джедай
****


Профиль
Группа: Модератор
Сообщений: 3886
Регистрация: 8.1.2003
Где: КМВ

Репутация: 4
Всего: 83



Писал для свое фирмы систему обработки возвратов писем после рассылки. Алгоритм (упрощенно), применительно для тебя, может быть такой:
(естественно use POP3Client;)
Код
1. коннектимся к почтовому серваку:
my $pop = new POP3Client(USER => "user", PASSWORD => "password", HOST => "pop.mail.ru");

2. читаем по очереди все письма:
for (my $i=1; $i<=$pop->Count(); $i++) {

3. читаем заголовок текущего письма:
   foreach my $head ($pop->Head($i)) {

4. ищем имя файла (как написано у Secandr'а):
       my $fname = '';
       if ($str=~ /Content-disposition:[ ]+attachment;[ ]+name[ ]*=[ ]*"([^"])")/i) {
           $fname = $1;
           last;
       }
   } # конец блока foreach my $head ($pop->Head($i))

5. если имя файла нашли, то читаем тело письма:
   my $body = '';
   foreach my $line ($pop->Body($i)) {

6. до тех пор, пока не встретим признак конца вложения:
       if ($line !~ '--Message-Boundary') {
           $body .= $line;
       } else {
           last;
       }

7. раскодируем вложение из Base64 и запишем в файл:
       use MIME::Base64;
       my $decoded = MIME::Base64::decode($body);
       open(FL, $fname);
       print FL $decoded;
       close FL;
   } # конец блока foreach my $line ($pop->Body($i))
   $pop->Delete($i); # удалим обработанное письмо
} # конец блока for (my $i=1; $i<=$pop->Count(); $i++)

8. закрываем соединение с почтовым сервером:
$pop->Close();


Наверное так...


--------------------
Чем дальше в лес, тем толще партизаны...

Цитата(igorold @  1.5.2016,  17:40 Найти цитируемый пост)
Индейцы не обратили внимания на поток беженцев из Европы… Теперь они живут в резервациях. 
PM MAIL   Вверх
Secandr
Дата 16.8.2004, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: нет
Всего: 39



GoodBoy
класный скрипт, повешу себе, пусть разбирает почту с ящика, куда будут сыпаться все уведомления с форумов и с других скриптов.
Добавлено @ 16:18
POP3Client - стандартная библиотека?


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
GoodBoy
Дата 16.8.2004, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Главный джедай
****


Профиль
Группа: Модератор
Сообщений: 3886
Регистрация: 8.1.2003
Где: КМВ

Репутация: 4
Всего: 83



Secandr
Это конечно все ОЧЕНЬ упрощенно... У меня так работает робот, который собирает возвраты от мэйл-демонов после проведения рассылки. Потом начинается анализ причин, по которым письмо не доставлено (блин с разных серваков такие перлы приходят... только сообщение о том, что такого пользователя не существует мне встречалось более чем в 80 видах...)

А ваще, вот примерный хэш ошибок:
Код
my %error_type = (
   1    => 'Адресат не существует',
   2    => 'Адресат в данное время недоступен',
   3    => 'Адресат заблокирован',
   4    => 'Ящик адресата переполнен',

   10   => 'Требуется аутентификация',
   11   => 'Закрыт доступ с нашего почтового сервера',
   12   => 'Сообщение расценено как СПАМ',
   13   => 'Сообщение отвергнуто по политикам получателя',
   14   => 'Сообщение расценено как вирус или "бомба"',
   15   => 'Не разрешен доступ с нашего почтового сервера',
   16   => 'Используется SMTP-сервер не провайдера',
   17   => 'Сообщение отвергнуто одним из промежуточных серверов',
   18   => 'Возможно неверное имя нашего почтового серверв',

   20   => 'Неизвестное имя сервера',
   21   => 'Несуществующий почтовый сервер',
   22   => 'Неопознан адрес маршрутизации',
   23   => 'Ошибка сервера при SMTP-обмене',
   24   => 'Локальная ошибка сервера получателя',
   25   => 'Связь с сервером была прекращена',
   26   => 'SMTP-сервер получателя недоступен',
   27   => 'Сервер получателя не принимает сообщение',
   28   => 'Нет связи с почтовым сервером адресата',

   30   => 'Неопознаная почтовая ошибка',
   31   => 'Слишком длинный путь возврата письма',
   32   => 'Путь возврата письма зациклен',
   33   => 'Ошибочный формат данных/Сбой в формате данных'
);

клёво, да??? всего более 250 разных вариантов сводятся к этим классам...
Добавлено @ 16:31
POP3Client - на CPANe есть.


--------------------
Чем дальше в лес, тем толще партизаны...

Цитата(igorold @  1.5.2016,  17:40 Найти цитируемый пост)
Индейцы не обратили внимания на поток беженцев из Европы… Теперь они живут в резервациях. 
PM MAIL   Вверх
Secandr
Дата 16.8.2004, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: нет
Всего: 39



буду пользоваться но позже.
Где взять этот POP3Client ?


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
GoodBoy
Дата 16.8.2004, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Главный джедай
****


Профиль
Группа: Модератор
Сообщений: 3886
Регистрация: 8.1.2003
Где: КМВ

Репутация: 4
Всего: 83





--------------------
Чем дальше в лес, тем толще партизаны...

Цитата(igorold @  1.5.2016,  17:40 Найти цитируемый пост)
Индейцы не обратили внимания на поток беженцев из Европы… Теперь они живут в резервациях. 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.0921 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.