Большой архив статей, книг, документации по программированию, вебдизайну, компьютерной графике, сетям, операционным системам и многому другому
 
<Добавить в Избранное>    <Сделать стартовой>    <Реклама на сайте>    <Контакты>
  Главная Документация Новости ИТ Программы Книги 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
Антивирус Касперского Personal 5.0.303 beta 2
Xilisoft 3GP Video Converter v2.1.52.831b
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 -> Почтовые функции в РНР


Почтовые функции в РНР

Одним из возможных применений imap функций является создание почтового демона, который будет управлять подпиской и отпиской пользователей от вашей почтовой рассылки. Для реализации этой задачи, обычно в рассылках используются два метода. Первый предполагает, что пользователь должен зайти на некую страницу и подтвердить свои действия, второй требует отправки письма. Второй так же требует, чтобы скрипт-обработчик регулярно запускался cron daemon?om. Из-за этого он не настолько популярен как первый способ.

Но, как можно заметить, наиболее серьезные рассылки используют второй способ. Поэтому, если у вас есть возможность использования crond, воспользуйтесь им.

Собственно, разобраться в функциях не так сложно. Человек, который раньше работал на РНР, без труда поймет, как с ними работать. Некоторые затруднения могут возникнуть с разбором заголовков писем, которые будет обрабатывать скрипт.

Алгоритм работы самого скрипта придумать несложно. Демон устанавливает соединение с почтовым сервером, и проверяет наличие на нем писем. В случае если писем нет, работа скрипта прекращается.
Если письма есть, то происходит разбор заголовков первого письма. Просматривается поля from и subject. Если поле subject содержит один из двух допустимых вариантов заголовка (подписка или отписка), то запись, которой соответствует значение поля from либо становится активной (подтвержденной), либо удаляется из таблицы. В обоих случаях на адрес, указанный в поле from посылается соответствующее извещение о действиях скрипта. После этого письмо помечается для удаления. В случае если subject не содержит допустимых тем, посылается уведомление об ошибке, и письмо так же помечается для удаления. Затем скрипт переходит к следующему письму.
Закончив разбор всех писем, он очищает ящик.

Не буду утомлять читателя блок-схемами, так что сразу перейдем к делу. Для открытия ящика используется функция imap_open. Поскольку РНР поддерживает работу с несколькими протоколами, то необходимо явно указать, какой протокол используется для работы с ящиком. В нашем случае это POP3 на 110 порту (стандарт). Присваиваем результат выполнения скрипта переменной $my_box.

 

$my_box = imap_open("{you.pop.host/pop3:110}", "login", "password");


В дальнейшем вы увидите, что эта переменная будет использоваться пратически во всех imap функциях. Далее проверяем ящик на наличие писем. Проверку выполняет функция imap_num_msg.

 

$n = imap_num_msg($my_box);


В результате переменная $n будет содержать количество писем в ящике. Число это может быть или больше нуля, или равно ему (если ящик пуст).
Если письма есть, то в цикле while выполняем разбор писем, последовательно увеличивая номер письма на единицу. Обратите внимание, что первое письмо в ящике будет иметь номер 0, как, и первый элемент массива.
Для увеличения номера письма, присваиваем переменной $m значение 0, а потом в условиях выполнения цикла увеличиваем ее на единицу $m++.

Для разбора интересующих нас заголовков достаточно двух функций: imap_header и imap_fetch_overview. Для выполнения каждой из их, помимо ящика, нужно указывать номер письма. В нашем случае, внутри цикла он будет равен переменной $m.

Imap_header возвращает в результате выполнения объект, содержащий исчерпывающую информацию о заголовке письма. Среди всего прочего, этот объект содержит массив from, в котором содержаться четыре значения. Это personal, adl, mailbox и host. Нас из них интересуют только mailbox и host. Подставляя их, мы получим адрес, с которого было отправлено письмо.

$h = imap_header($my_box, $m);
$h = $h->from;
:
foreach ($h as $k => $v) {
$mailbox = $v->mailbox;
$host = $v->host;
$personal = $v->personal;
$email = $mailbox . <@> . $host;


imap_fetch_overview - позволит нам узнать тему письма. Для этих же целей можно было бы использовать и imap_header но по ряду причин это, иногда может не сработать. Из массива, который возвращает эта функция, нам нужно только поле subject

$s = imap_fetch_overview($my_box, $m);
foreach ($s as $k => $v) {
$subj = $v->subject;
}


Дальнейшие наши действия сводятся к тому, чтобы вытащить email из базы, и в случае наличия его там, пометить всю строку с этой записью как <проверенную>, либо удалить. Предположим, что после заполнения формы рассылки на сайте, подписчику присваивается статус 0, а после подтверждения подписки он меняется на 1.

if ($subj == "SUBSCRIBE") {
mysql_query("UPDATE subscribe SET stat=1 WHERE email=$my_email");
$del = imap_delete($my_box, $m);
mail($email, $add_sbj, $add_text, $headers);
}
elseif ($subj == "UNSUBSCRIBE") {
mysql_query("DELETE FROM subscribe WHERE email = $my_email");
$del = imap_delete($my_box, $m);
mail($email, $del_sbj, $del_text, $headers);
}
else {
$del = imap_delete($my_box, $m);
mail($email, $err_sbj, $err_text, $headers);
}


как уже говорилось выше, после выполнения всех действий скрипт очищает ящик.

$clear = imap_expunge($my_box);


Данная простейшая программа, лишь демонстрация того, что на РНР можно писать не только динамически изменяющиеся сайты, но и сервисы, которые пользователю вообще не видны. Конечно, по части написания скриптов для shell, рнр неприменим, в отличие от своего конкурента Perl, но тем не менее:

Листинг всей программы за исключением параметров соединения с базой (db.php):

<?
include "db.php";
$my_box = imap_open("{you.pop.host/pop3:110}", "login", "password");
$n = imap_num_msg($my_box);
$m = 0;
$add_text = "

Спасибо за подтверждение вашей подписки ";
$add_sbj = "You added!";
$del_text = "

Вы были удалены из списка рассылки. ";
$del_sbj = "Delete from list";
$err_text = "

Извините но этот почтовый ящик используется
только для администрирования рассылки";
$err_sbj = "Error";
$headers = "From: Subscribe Robot <You@mail.box>

X-mailer: PHP4

Content-type: text/plain; charset=windows-1251
";
if($n != 0) {
while($m++ < $n) {
$h = imap_header($my_box, $m);
$s = imap_fetch_overview($my_box, $m);
$h = $h->from;
foreach ($h as $k =>$v) {
$mailbox = $v->mailbox;
$host = $v->host;
$personal = $v->personal;
$email = $mailbox . "@" . $host;
$my_email = mysql_escape_string($email);
}
foreach ($s as $k =>$v) {
$subj = $v->subject;
}
if ($subj == "SUBSCRIBE") {
mysql_query("UPDATE table SET stat=1 WHERE email=$my_email");
//print mysql_error();
$del = imap_delete($my_box, $m);
mail($email, $add_sbj, $add_text, $headers);
}
elseif ($subj == "UNSUBSCRIBE") {
mysql_query("DELETE FROM table WHERE email = $my_email");
$del = imap_delete($my_box, $m);
mail($email, $del_sbj, $del_text, $headers);
}
else {
$del = imap_delete($open_box, $m);
mail($email, $err_sbj, $err_text, $headers);
}
}
$clear = imap_expunge($my_box);
}
?>


В листинг отсутствуют некоторые детали, например возможное конвертирование из win в koi, перепроверка почтового ящика отправителя и т.д. Это уже функциональные излишества, которые каждый может добавить по мере необходимости.

Автор: Сергей Лисин



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

Solid Works. Практическое руководство

Подробнее

Delphi 7. Карманный справочник с примерами

Подробнее

Общая информатика. Универсальный курс

Подробнее

 
 

 
Новости ИТ
13.10.2008  Шведская пара назвала своего ребенка Линуксом в честь Linux
13.10.2008  Движок для форумов MyBB становится открытым под GPL
13.10.2008  Wikipedia перевела 400 серверов с Red Hat на Ubuntu Linux
13.10.2008  Mono 2.0 -- новый релиз открытой реализации платформы .NET
13.10.2008  Слух: HTC Touch HD станет вторым телефоном T-Mobile с Android
13.10.2008  Openmoko расширяет сотрудничество с FreeSmartphone.Org
13.10.2008  Японскую видеоигру подключат к мозгу геймера
12.10.2008  Kingston пополняет линейку накопителей DataTraveler 32-ГБ моделью
12.10.2008  Scythe выпускает Musashi, свой первый кулер для видеокарт
12.10.2008  Motorola Q11: тонкий коммуникатор с GPS и QWERTY-клавиатурой
12.10.2008  Agilent Technologies выпустила первый в мире карманный цифровой мультиметр с OLED-дисплеем
12.10.2008  Мини-ПК eMachines EL1200 ценой менее $300 построены на процессорах AMD с пониженным энергопотреблением
12.10.2008  Накопители StorX Duo-HDD NAS объемом до 2 ТБ поддерживают функцию горячей замены HDD
12.10.2008  AIMP 2.5
11.10.2008  Системная плата DFI LANPARTY UT X58
11.10.2008  Sony готовится начать поставки наушников MDR-NC7, эффективно подавляющих шум
11.10.2008  HTC T8290, первый коммуникатор с WiMAX, стартует с России
11.10.2008  Веб-браузеры: GooglePreviewIE v.1.5
11.10.2008  Графика: GIMP Portable v.2.6.1
11.10.2008  Мультимедиа: LameXP v.3.05 Hotfix 5
 
Полезно

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