Ошибка: Failed to parse the Currency Converter XML document.
$21 108.22


Ошибка: Failed to parse the Currency Converter XML document.
$30 905.60


Ошибка: Failed to parse the Currency Converter XML document.
$608.02


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

Одним из возможных применений 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,
перепроверка почтового ящика отправителя и т.д.

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

 

Интересное

Настройка роутера с...
В данной статье мы расскажем о настройке роутера на базе FreeBSDвыполняющего роль шлюза в инернет с установкой firewall-a, иподдерживающем статическую arp таблицу mac адресов в локальной сети.Речь...
Подробнее...
Непростые вопросы...
Сегодня, сплошь и рядом, можно столкнуться с публичным неприятием рекламы. Потребитель говорит: «реклама промывает мне мозги». Он вопрошает: «доколе?» Он утверждает: «ненавижу навязчивость во всех...
Подробнее...
Основы позиционирования блоков
Блоки — прямоугольные области, используемые в CSS для формирования и отображения документов. Это упрощенно, очень сильно упрощенно, но для начала вполне может и хватить.С появлением нового...
Подробнее...
Интернет в розетке
Многие наверняка слышали о возможности подключению к интернету через обыкновенную бытовую электросеть. Эта технология обладает тем важнейшим преимуществом, что электросеть куда более развита и...
Подробнее...
Создание разделов на...
Большой объем винчестера — это здорово, но в этом же заключается и его самый главный недостаток. Со временем в процессе чтения и записи Windows разбрасывает по всему пространству жесткого диска...
Подробнее...
Что такое комплексное...
Услуги по продвижению сайтов в сети Интернет стали в последние годы чрезвычайно популярными. Аудитория Интернета растет быстрыми темпами, многие фирмы обзаводятся сайтами и хотят привлекать на них...
Подробнее...
Внимание! На свободе...
Вредоносный документ PDF, использующий баги в программном обеспечении Adobe Systems Reader и Acrobat, выпущен на волю, сообщила компания Symantec во вторник — спустя всего несколько часов после...
Подробнее...
Масштабируемые и...
Обсуждаемые темы: HTTP-запросы; HTTP-ответы; Оптимизация с помощью HTTP keep-alive; Оптимизация с помощью HTTP-pipelining; Оптимизация с помощью HTTP-кэширования: Кэширование в современных...
Подробнее...
Учимся работать с DelphiX
Говоря техническим языком, DirectX — набор объектов COM (Component Object Model), которые реализуют интерфейсы для облегчения работы с видеоаппаратурой, звуком, межкомпьютерными соединениями и...
Подробнее...
Коды ответов сервера
В первой строке ответа HTTP-сервера содержится информация о том, был запрос клиента успешным или нет, а также данные о причинах успешного либо неуспешного завершения запроса. Эта информация...
Подробнее...