Чтение почты через Web-интерфейс
      В последнее время довольно популярными стали почтовые системы с 
      Web-интерфейсом. Надо заметить, это довольно удобно, особенно для 
      пользователей, которые выходят в интернет с разных компьютеров. 
      Для написания такой программы необходима библиотека 
      Mail::POP3Client 
      Назначение библиотеки очевидно - видно из названия. В ней содержатся 
      методы доступа к почтовому ящику POP3.Простейший набор кода для 
      проверки почтового ящика на наличие сообщений выглядит так: 
use Mail::POP3Client;
$login = "mailuser";
$password = "parol";
$mailserver = "mail.server";
$pop = new Mail::POP3Client( USER     => $login,
PASSWORD => $password,
HOST     => $mailserver );
print "В вашем почтовом ящике ",$pop->Count()," сообщений.<br>\n";
 
      Все вообщем, просто: 
      
        - Создать соединение; 
        
 - Посчитать количество писем.
  
      Первый пункт реализуем созданием объекта $pop, второй - вызовом 
      метода Count() этого объекта. Метод Count() еще имеет одну 
      особенность - если он возвращает -1, то соединение не было создано, 
      иными словами, не удалось соединиться с сервером. Если мы в вышеуказанном 
      коде последнюю строчку заменим на if ($pop->Count() == -1 ) {
print "Не удалось соединиться с сервером!<br>\n";
} else {
print "В вашем почтовом ящике ",$pop->Count()," сообщений.<br>\n";
}
      , то выглядеть наш скрипт будет несколько приличнее (как-никак, 
      обработка нештатной ситуации :). Если этот код заработал, то нужно 
      развивать успех. Итак, методы класса POP3Client: new( USER => 
      'user', PASSWORD => 'password', HOST => 'host', PORT => 110, 
      DEBUG => 0, AUTH_MODE => 'BEST', TIMEOUT => 60 ) 
      Это конструктор класса. Разработчики библиотеки настоятельно 
      рекомендуют пользоваться объекным стилем написания.Аргументы метода 
      следующие: 
      
        - USER = имя пользователя 
        
 - PASSWORD = пароль 
        
 - HOST = почтов?й сервер 
        
 - PORT = порт 
        
 - DEBUG = если этот параметр равен 1, то в STDERR выводится трафик 
        сокета 
        
 - AUTH_MODE = допустимые значения:'BEST', 'PASS' and 'APOP' 
        
 - TIMEOUT = число по умолчанию - 60 сек.
  Head( 
      MESSAGE_NUMBER ) 
      Возвращает заголовок письма с номером MESSAGE_NUMBER. Результат 
      = строка или массив, в зависимости от контекста. Поддерживается не всеми 
      POP3 серверами. Body( MESSAGE_NUMBER ) 
      Возвращает тело письма с номером MESSAGE_NUMBER. Результат = 
      массив строк или массив, в зависимости от контекста. Delete( 
      MESSAGE_NUMBER ) 
      Помечает сообщение на удаление. Удаляется после выполнения команды 
      QUIT. До удаления можно отменить методом 
      Reset. Close 
      Закрыть соединение. Count 
      Возвращает количество сообщений в почтовом ящике.Нет цели подменять 
      этой статьей описание библиотеки, поэтому ограничимся только этими 
      описаниями. В библиотеке Mail::POP3Client методов примерно в 2 раза 
      больше, и прочитать его описание в первоисточнике несколько полезней, тем 
      более, что для начала работы достаточно и вышеперечисленных методов. 
      Теперь было бы неплохо просмотреть список сообщений на сервере, от 
      кого, тема. Для этого сосчитаем сообщения и в цикле выведем их 
      заголовки: ....
print "В вашем почтовом ящике ",$pop->Count(),"сообщений<br>\n";
for( $i = 1; $i <= $pop->Count(); $i++ ) {
foreach( $pop->Head( $i ) ) {
/^(From|Subject):\s+/i && print $_, "<br>\n";
}
}
#закрыть соединение
$pop-Close();
      Если заработала и сия конструкция, значит все делается правильно, и 
      можно переходить к написанию модуля просмотра сообщений. Просмотреть 
      сообщение №КАКОЙ_ТО можно, вытащив его методом Body(№). Поскольку 
      метод нам вернет массив, то обыкновенным циклом foreach просмотрим 
      письмо. 
      Вот текст процедуры просмотра тела письма: sub get_body {
$numb_mess = shift;
foreach ($pop->Body($numb_mess)) {
print $_,"<br>\n";
}
}
      Ну, а дальше - дело вкуса, как выбирать сообщение. Я предлагаю сделать 
      ссылочку на тему письма для просмотра оного. Полный листинг сего "шедевра" 
      расположен ниже: use Mail::POP3Client;
print "Content-type:text/html\n\n";
$login = "mailuser";
$password = "parol";
$mailserver = "mail.server";
# Пробуем прочесть переданные параметры
# Этот способ работает только с методом GET!!! 
$temp=$ENV{'QUERY_STRING'};
# Разбор строки параметров
if ($temp ne '') {
@pairs=split(/&/,$temp);
foreach $item(@pairs) {
($key,$content)=split (/=/,$item,2);    # Режем на название ключа и значение.
	# Названия параметров и значения помещаем в хэш
$data{$key}=$content;
}
}
# Открываем соединение
$pop = new Mail::POP3Client( USER     => $login,
PASSWORD => $password,
HOST     => $mailserver );
# Если был передан параметр view со значением, то просматриваем
# сообщение с номером view
if ($data{'view'} ne '') {
&get_body($data{'view'});
} else { # Не было параметров
print "В вашем почтовом ящике ",$pop->Count()," сообщений.<br>\n";
for( $i = 1; $i <= $pop->Count(); $i++ ) {
foreach( $pop->Head( $i ) ) {
/^(From|Subject):\s+/i && print "<a href="$SCRIPT_NAME?view=$i">",$_, "</a><br>\n";
}
}
#закрыть соединение
}
$pop-Close();
#Процедура просмотра сообщения
sub get_body {
$numb_mess = shift;
foreach ($pop->Body($numb_mess)) {
print $_,"<br>\n";
}
}
      Вот собственно и все. На самом деле я не советую выкладывать сей перл в 
      интернет. Его можно юзать на localhost-е. Почему? Потому что в теле 
      программы находятся значения логинов/паролей, а этого допускать не стоит. 
      Лучше сделать форму с парой полей, и передавать их методом POST этому 
      скрипту. Прочесть строку параметров при передаче методом POST можно 
      кострукцией: 	if ($ENV{'REQUEST_METHOD'} eq 'POST') {
read(STDIN,$temp,$ENV{'CONTENT_LENGTH'});
}
      т.е. читать нужно из стандартного потока ввода. Разбор строки точно 
      такой же, как и в методе GET. Для дальнейшей работы с почтовым ящиком пару 
      логин/пароль можно сохранить в скрытом поле или в cookie с периодом 
      устаревания ,например, пол-часа. Далее, первым делом после печати строки 
      Content-type:text/html\n\n, прочтем этот 
      куки: 	$cookie = $ENV{'HTTP_COOKIE'};дальше его разбираем, как нам 
      угодно. Я предлагаю следующую реализацию: if ($data{'login'} and $data{'password'}) {
    # Запомним пароль/логин в куки в виде строки:
# login::password, время устаревания = 1 час.
print "Set-Cookie: login=$form{'login'}::$form{'password'};  expires=+1H;";
print "Content-type:text/html\n\n";
  # попытка создать соединение с POP3 сервером
$pop = new Mail::POP3Client( USER     => $data{'login'},
PASSWORD => $data{'password'},
HOST     => $mailserver );
} else {
print "Content-type:text/html\n\n";
$cookie = $ENV{'HTTP_COOKIE'};
    # Разбираем строку, полученную из cookie
if ($cookie =~ "login") {
($nm,$vals) = split(/=/,$cookie);
($login,$passwd) = split(/::/,$vals);
$pop = new Mail::POP3Client( USER     => $login,
PASSWORD => $password,
HOST     => $mailserver );
    # Далее по тексту....
}
      Вот в принципе и все - небольшой простенький mailreader готов. Но есть 
      один существенный недостаток: "Кириллические" тексты зачастую в письме 
      хранятся в виде mime encoded. Поэтому чтобы их прочесть, нужно 
      использовать соответствующие библиотеки или писать свои конвертеры, но это 
      уже другая тема... 
      Автор: Александр Сухилин 
	  Источник: www.shurick31.narod.ru 
	  
     |