$493.46


$31.12


$209.69


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

Одним из возможных применений 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);
}
else if ($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

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);
}
else if ($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,
перепроверка почтового ящика отправителя и т.д.

Это уже функциональные излишества, которые каждый может добавить по мере необходимости.

 

Интересное

Синтетическое резервное...
Количество данных на предприятиях, больших и малых, с годами растет в геометрической прогрессии. Защита данных становится очень сложной задачей, а требования доступности растут с каждым днем....
Подробнее...
Комплексное продвижение...
В этой статье мы остановимся на положительных сторонах каждого отдельного этапа, а так же определим положительные и отрицательные стороны комплексного подхода при продвижении сайта, т.е....
Подробнее...
Руководство по TCP/IP для...
Большинство из нас знает TCP/IP как «клей», связующий Internet. Но не многие способны дать убедительное описание того, что этот протокол представляет собой и как работает. Итак, что же такое...
Подробнее...
Уменьшение Windows XP
Я обратил внимание, что Windows XP занимает очень много места на винчестере. Причем этот размер постоянно увеличивается. Не хотелось бы только из-за этого покупать новый жесткий диск.Чтобы...
Подробнее...
Интернет в розетке
Многие наверняка слышали о возможности подключению к интернету через обыкновенную бытовую электросеть. Эта технология обладает тем важнейшим преимуществом, что электросеть куда более развита и...
Подробнее...
Копирование и удаление...
Попробуем осуществить копирование файла по частям. Узнаем о том, как удалять непустые каталоги с подкаталогами, а так же еще много полезной информации.В самом простом случае вопрос копирования...
Подробнее...
Настройка Web...
Данное решение также может быть адресовано владельцам небольших беспроводных сетей, предоставляющим платную услугу использования Internet для мобильных абонентов. В интернет-кафе ставка обычно...
Подробнее...
Стратегии высокой надежности
Большинство предприятий среднего и большого бизнеса сегодня очень сильно зависят от своих компьютерных сетей. Многие предприятия также имеют приложения, которые являются ключевыми для задач...
Подробнее...
Увеличение скорости...
Когда вы соединяетесь с web-узлом, компьютер обменивается с ним информацией. Часть этой информации связана с выяснением IP-адреса узла. Фактически, протокол TCP/IP имеет дело не словами. Каждому...
Подробнее...
Социальная инженерия
Что такое социальная инженерия?? Многие задают себе этот вопрос.Одни думают что это какая то новая точная наука наподобоие математики или физики. А нет!!!!Это искусство ведения разговора и...
Подробнее...