Чтение почты через 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. Поэтому чтобы их прочесть, нужно
использовать соответствующие библиотеки
или писать свои конвертеры, но это уже
другая тема...
<< предыдущая
||
следующая >>
|