Чтение почты на серверах РОРЗ

Проблема

Требуется принять почту с сервера РОРЗ. Например, программа может получать данные о непрочитанной почте, перемещать ее с удаленного сервера в локальный почтовый ящик или переключаться между Интернетом и локальной почтовой системой.

Решение

Воспользуйтесь модулем Net::POP3 с CPAN:
$pop = Net::POP3->new($mail_server)
  or die "Can't open connection to $mail_server : $!\n";
$pop->login($username, $password)
  or die "Can't authenticate: $!\n";
$messages = $pop->list
  or die "Can't get list of undeleted messages: $!\n";
foreach $msgid (keys %$messages) {
  $message = $pop->get($msgid);
  unless (defined $message) {
    warn "Couldn't fetch $msgid from server: $!\n";
    next;
  }
  # $message - ссылка на массив строк
  $pop->delete($msgid);
}

Комментарий

Традиционно в доставке почты участвовали три стороны: МТА (транспортный почтовый агент — системная программа типа sendmail) доставляет почту в накопитель (spool), а затем сообщения читаются с помощью MUA (пользовательокне почтовые агенты — программы типа mail). Такая схема появилась в те времена, когда почта хранилась на больших серверах, а пользователи читали сообщения на простейших терминалах. По мере развития PC и сетевых средств появилась потребность в MUA (таких, как Pine), которые бы работали на пользовательских компьютерах (а не на том компьютере, где находится накопитель). Протокол POP (Post Office Protocol) обеспечивает эффективное чтение и удаление сообщений во время сеансов TCP/IP.
Модуль Net::POP3 от CPAN обслуживает клиентскую сторону POP. Иначе говоря, он позволяет программе на Perl выполнять функции MUA. Работа с Net::POP3 начинается с создания нового объекта Net::POP3. Конструктору new передается имя сервера РОРЗ:
$рор = Net::POP3->new( "pop.myisp.com" )
  or die "Can't connect to pop.myisp.com: $!\n";
При возникновении ошибок все функции Net::POP3 возвращают undef или пустой список в зависимости от контекста вызова. При этом переменная $! может содержать осмысленное описание ошибки (а может и не содержать).
Кроме того, конструктору new можно передать дополнительные аргументы и определить тайм-аут (в секундах) для сетевых операций:
$рор = Net::POP3->new( "pop.myisp.com", Timeout => 30 )
  or die "Can't connect to pop.myisp.com : $!\n";
Метод login выполняет аутентификацию на сервере РОРЗ. Он получает два аргумента — имя пользователя и пароль, но оба аргумента являются необязательными. Если пропущено имя пользователя, используется текущее имя. Если пропущен пароль, Net::POP3 пытается определить пароль с помощью модуля Net::Netrc:
$рор ->login("gnat", "S33kr1T Pa55wOrD")
  or die "Hey, my username and password didn't work!\n";
$рор ->login( "midget" )    # Искать пароль с помощью Net::Netrc
  or die "Authentication failed.\n";
$рор ->login()              # Текущее имя пользователя и Net::Netrc
  or die "Authentication failed. Miserably.\n";
При вызове метода login пароль пересылается по сети в виде обычного текста. Это нежелательно, поэтому при наличии модуля MD5 от CPAN можно воспользоваться методом арор. Он полностью идентичен login за исключением того, что пароль пересылается в текстовом виде:
$рор->арор( $username, $password )
  or die "Couldn't authenticate: $!\n";
После аутентификации методы list, get и delete используются для работы с накопителем. Метод list выдает список неудаленных сообщений, хранящихся в накопителе. Он возвращает хэш, где ключом является номер сообщения, а ассоциированное значение — размер сообщения в байтах:
%undeleted = $pop->list();
foreach $msgnum (keys %undeleted) {
  print "Message $msgnum is $undeleted{$msgnum} bytes long.\n";
}
Чтобы принять сообщение, вызовите метод get с нужным номером. Метод возвращает ссылку на массив строк сообщения:
print "Retrieving $msgnum : ";
$message = $pop->get($msgnum);
if ($message) {
  # succeeded
  print "\n";
  print @$message;    # Вывести сообщение
} else {
    # failed
    print "failed ($!)\n";
  }
Метод delete помечает сообщение как удаленное. При вызове метода quit, завершающего сеанс РОРЗ, помеченные сообщения удаляются из почтового ящика. Метод reset отменяет все вызовы delete, сделанные во время сеанса. Если сеанс завершается из-за того, что объект Net::POP3 уничтожен при выходе из области действия, метод reset будет вызван автоматически.
Возможно, вы заметили, что мы ничего не сказали об отправке почты. РОРЗ поддерживает только чтение и удаление существующих сообщений. Новые сообщения приходится отправлять с помощью программ типа mail или sendmail или протокола SMTP.
Основная задача РОРЗ — подключение почтовых клиентов к почтовым серверам — также выполняется протоколом IMAP. IMAP обладает более широкими возможностями и чаще используется на очень больших узлах.

См. также




2013-09-10 17:05:19

Proverte kod v komentariyah gde pro list tam oshibki detskie




Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: