Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Экзамен / web / example1 / Введение в PHP.doc
Скачиваний:
101
Добавлен:
18.05.2015
Размер:
3 Mб
Скачать

Чтение почты через 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";

Все вообщем, просто:

1. Создать соединение;

2. Посчитать количество писем.

Первый пункт реализуем созданием объекта $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 );

# Далее по тексту....

}

Соседние файлы в папке example1