![]() |
Библиотека Интернет Индустрии I2R.ru |
||
Чтение почты через Web-интерфейсВ последнее время довольно популярными стали почтовые системы с Web-интерфейсом. 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() сего объекта.
if ($pop->Count() == -1 ) {
print "Не удалось соединиться с сервером!<br>\n";
} else {
print "В вашем почтовом ящике ",$pop->Count()," сообщений.<br>\n";
}
, то выглядеть наш скрипт будет несколько приличнее (как-никак, обработка нештатной ситуации:). new( USER => 'user', PASSWORD => 'password', HOST => 'host', PORT => 110, DEBUG => 0, AUTH_MODE => 'BEST', 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;
# Разбор строки параметров
if ($temp ne '') {
@pairs=split(/&/,$temp);
foreach $item(@pairs) {
($key,$content)=split (/=/,$item,2); # Режем на название ключа и значение.
# Названия параметров и значения помещаем в хэш
$data=$content;
}
}
# Открываем соединение
$pop = new Mail::POP3Client( USER => $login,
PASSWORD => $password,
HOST => $mailserver );
# Если был передан параметр view со значением, то просматриваем
# сообщение с номером view
if ($data ne '') {
&get_body($data);
} 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 eq 'POST') {
read(STDIN,$temp,$ENV);
}
т.е. читать нужно из стандартного потока ввода. Разбор строки точно такой же, как и в методе GET. Для дальнейшей работы с почтовым ящиком пару логин/пароль можно сохранить в скрытом поле или в cookie с периодом устаревания ,например, пол-часа. Далее, первым делом после печати строки Content-type:text/html\n\n, прочтем сей куки: $cookie = $ENV; дальше его разбираем, как нам угодно. Я предлагаю следующую реализацию: if ($data and $data) {
# Запомним пароль/логин в куки в виде строки:
# login::password, время устаревания = 1 час.
print "Set-Cookie: login=$form::$form; expires=+1H;";
print "Content-type:text/html\n\n";
# попытка создать соединение с POP3 сервером
$pop = new Mail::POP3Client( USER => $data,
PASSWORD => $data,
HOST => $mailserver );
} else {
print "Content-type:text/html\n\n";
$cookie = $ENV;
# Разбираем строку, полученную из cookie
if ($cookie =~ "login") {
($nm,$vals) = split(/=/,$cookie);
($login,$passwd) = split(/::/,$vals);
$pop = new Mail::POP3Client( USER => $login,
PASSWORD => $password,
HOST => $mailserver );
# Далее по тексту....
}
Вот в принципе и все - небольшой простенький mailreader готов. Но есть один существенный недостаток: Alexander |
|
| 2000-2008 г. Все авторские права соблюдены. |