Большой архив статей, книг, документации по программированию, вебдизайну, компьютерной графике, сетям, операционным системам и многому другому
 
<Добавить в Избранное>    <Сделать стартовой>    <Реклама на сайте>    <Контакты>
  Главная Документация Новости ИТ Программы Книги Games   Обои   Экспорт RSS E-Books
 
Поиск по сайту

TOP-10 программ
Symantec Norton Ghost 9.0
Partition Magic 8.0.2 Pro
Xilisoft 3GP Video Converter v3.1.7.0616b
Norton AntiVirus 2005
Xilisoft 3GP Video Converter v2.1.52.831b
Антивирус Касперского Personal 5.0.303 beta 2
RAR Password Cracker 4.12
ABBYY PDF Transformer v1.00.820
MP3 To Ringtone Gold v3.02
Mobtime Cell Phone Manager v5.3.1
 
Наши сервисы
Рассылка новостей. Подпишитесь на рассылку сейчас и вы всегда будете в курсе последних событий в мире информационных технологий.
Новостные информеры. Поставьте наши информеры к себе и у вас на сайте появится дополнительный постоянно обновляемый раздел.
Добавление статей. Если вы являетесь автором статьи или обзора на тему ИТ присылайте материал нам, мы с удовольствием опубликуем его у себя на сайте.
 
 

   Интернет технологии -> PHP -> Чтение почты через Web-интерфейс


Чтение почты через 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 );
    # Далее по тексту....
}

Вот в принципе и все - небольшой простенький mailreader готов. Но есть один существенный недостаток: "Кириллические" тексты зачастую в письме хранятся в виде mime encoded. Поэтому чтобы их прочесть, нужно использовать соответствующие библиотеки или писать свои конвертеры, но это уже другая тема...

Автор: Александр Сухилин
Источник: www.shurick31.narod.ru

 
Популярные книги

Технология программирования на C++. Начальный курс

Подробнее

SQL для "чайников", 5-е издание

Подробнее

Введение в ИТ Сервис-менеджмент

Подробнее

 

 
Новости ИТ
21.11.2008  Thunderbird 2.0.0.18
21.11.2008  Miranda IM 0.7.13
21.11.2008  Dr. Web 5 Beta
21.11.2008  KAV/KIS 2009 8.0.0.506
21.11.2008  avast! 4.8 (1290)
21.11.2008  Radmin 3.3
21.11.2008  DVR-X162J - новый внешний DVD-привод от Pioneer
21.11.2008  Дизайнерские системные блоки от Smooth Creations
21.11.2008  SPARKLE представляет Calibre P980X+, видеокарту с необычным дизайном
21.11.2008  Titan представляет куллер для Intel i7
21.11.2008  Компактный ПК для дома Acer Aspire X3200 - в России
21.11.2008  Hitachi Data Systems объявляет о новом плане инвестиций в России и странах СНГ
21.11.2008  Назначен новый президент Microsoft в России
21.11.2008  Mustek: новые цифровые видеокамеры начального уровня
21.11.2008  Серверные Core i7 - быстры ли они? Да, и очень, судя по тестам в SPECfp
21.11.2008  NETGEAR: акция для партнеров
21.11.2008  Персональные фотокарты на Яндексе
21.11.2008  Программа для стартапов Microsoft BizSpark анонсирована в России
21.11.2008  Средства защиты от утечек конфиденциальных данных Symantec DLP 8.1 теперь и в России
21.11.2008  Axis: первый 6-канальный IP-видеосервер с поддержкой H.264/M-JPEG
 
Полезно

 
Copyright © CompDoc.Ru
При цитировании и перепечатке ссылка на www.compdoc.ru обязательна. Карта сайта.
 
Rambler's Top100