Php руководство по рнр 3 0 почтовые функции


Содержание

Php руководство по рнр 3 0 почтовые функции

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

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

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

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

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

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

В результате переменная $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);
>

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

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

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

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

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

Извините но этот почтовый ящик используется
только для администрирования рассылки»;
$err_sbj = «Error»;
$headers = «From: Subscribe Robot

Content-type: text/plain; charset=windows-1251
«;
if($n != 0) <
while($m++ 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, перепроверка почтового ящика отправителя и т.д. Это уже функциональные излишества, которые каждый может добавить по мере необходимости.

операторы присваивания, вызовы методов объектов, операторы инкремента и декремента и т.д. Как и других языках программирования, в PHP можно объединять последовательности инструкций в блоки, получая составную инструкцию. Для этого последовательность инструкций заключается в фигурные скобки. В дальнейшем под инструкцией понимается простая либо составная инструкция.

Условная инструкция IF

Цикл WHILE с предусловием

Цикл WHILE с постусловием

Цикл FOR

Пример цикла for :

Результат:
1 + 0 = 1
2 + 1 = 3
3 + 2 = 5
4 + 3 = 7

Инструкция SWITCH

Если вариантов значения условия много, и последовательность вложенных инструкций IF получается слишком громоздкой, удобна инструкция SWITCH :

Оператор break прекращает выполнение оператора switch в случае найденного соответствия; если его не поставить, будут выполняться все последующие проверки case .

Например, следующий цикл прервется на второй проверке и установит значение monthName = ‘февраль’

Инструкции BREAK и CONTINUE

Применяются в циклах всех типов. Инструкция break завершает выполнение всего цикла, а continue — очередной итерации.

Php руководство по рнр 3 0 почтовые функции

error_log — отослать сообщение об ошибке

Описание int error_log(string message, int message_type, string [ destination ], string [ extra_headers ]);

П осылает сообщение об ошибке в web сервер лог, TCP порт или в файл. Первый параметр, message, определяет сообщение об ошибке, которое должно быть отослано. Второй параметр, message_type, определяет способ передачи сообщения:

error_log() лог типы

message посылается в системный лог PHP, используя механизм системного логирования Операционной Системы или в файл, в зависимости от того, как определена конфигурация error_log директивы.
1 message посылается по электронной почте, адрес определен в destination параметре. Только для этого типа сообщений используется параметр extra_headers.Этот тип использует ту же внутреннюю функцию, что и Mail().
2 message отсылается через соединение PHP отладки. Эта опция доступна только тогда, когда установлена remote debugging has been enabled. В этом случае параметр destinationопределяет имя машины или IP адрес и опционально, номер порта, сокета получающего отладочную информацию.
3 message добавляется к файлу, определенному в destination.

Пример. примеры error_log()

error_reporting — устанавливает уровень сообщений об ошибках PHP

Описание int error_reporting(int [ level ]);

У станавливает уровень сообщений об ошибках PHP и возвращает старый уровень. Уровень сообщений об ошибках задается битовой маской и использует следующие значения (используйте линки для получения информации об их назначении):

error_reporting() битовые значения

значение внутреннее имя
1 E_ERROR
2 E_WARNING
4 E_PARSE
8 E_NOTICE
16 E_CORE_ERROR
32 E_CORE_WARNING

getenv — Получить значение переменной среды окружения.

Описание string getenv(string varname);

В озвращает значение переменной среды окружения varname, или false(ложь) в случае ошибки.

$ip = getenv(«REMOTE_ADDR»); // получить ip номер пользователя

get_cfg_var — Получить значение опции конфигурации PHP.

Описание string get_cfg_var(string varname);

В озвращает текущее значение опции конфигурации PHP, заданной в varname, или false(ложь), если произошла ошибка.

Н е возвращает информацию конфигурации, установленную при компиляции PHP, или прочитанную из файла конфигурации Apache (использование php3_configuration_option директив).

Ч то бы проверить, использует ли система php3.ini файл, попробуйте получить значение cfg_file_path. Если оно установлено, то php3.ini файл используется.

get_current_user — Получить имя владельца текущего PHP скрипта.

Описание string get_current_user(void);

В озвращает имя владельца текущего PHP скрипта.

get_magic_quotes_gpc — Получить текущие активные установки magic_quotes_gpc.

Описание long get_magic_quotes_gpc(void);

В озвращает текущие активные установки magic_quotes_gpc. (0 для выключенных(off), 1 для включенных(on))

get_magic_quotes_runtime — Получить текущие активные установки magic_quotes_runtime.

Описание long get_magic_quotes_runtime(void);

В озвращает текущие активные установки magic_quotes_runtime. (0 для выключенных(off), 1 для включенных(on))

getlastmod — Получить время последней модификации страницы.

Описание int getlastmod(void);

В озвращает время последней модификации текущей страницы. Возвращаемое значение — Unix timestamp, подходящее для использование в функции date(). Возвращает false(ложь) при ошибке.

Пример. getlastmod() пример
// выводит что-то вроде этого «Последнее изменение: March 04 1998 20:43:59.»
echo «Последнее изменение: «.date( «F d Y H:i:s.», getlastmod() );

getmyinode — Получить inode текущего скрипта.

Описание int getmyinode(void);

В озвращает inode текущего скрипта, или false(ложь) при ошибке.

getmypid — Получить ID процесса PHP.

Описание int getmypid(void);

В озвращает текущий ID процесса PHP, или false(ложь) при ошибке.

О братите внимание, что при работе PHP как модуля сервера, вы не получите точный IP процесса.

getmyuid — Получить UID владельца скрипта PHP.

Описание int getmyuid(void);

В озвращает UID текущего скрипта, или false(ложь) при ошибке.

phpinfo — Вывод большого количества информации о PHP.

Описание int phpinfo(void);

В ывод большого количества информации о текущем состоянии PHP. Это включает информацию относительно опций компиляции и расширений PHP, версию PHP, информации сервера и среды окружения (если скомпилировано как модуль), среда окружения PHP, информация о версии операционной системы, пути, основных и локальных опций конфигурации, HTTP заголовок и GNU Public License.

phpversion — Получить текущую версию PHP.

Описание string phpversion(void);

В озвращает строку, содержащую версию запущенного в данный момент PHP.

Пример. phpversion() пример
// Печатает что-то вроде этого «Текущая версия PHP: 3.0rel-dev»
echo «Текущая версия PHP: «.phpversion();

putenv — Устанавливает значение переменной среды окружения.

Описание void putenv(string setting);

Д обавляет setting в среду окружения.

Пример. Устанавливает значение переменной среды окружения
putenv(«UNIQ >

set_magic_quotes_runtime — Устанавливает в текущих активных установках конфигурации установки для magic_quotes_runtime.

Описание long get_magic_quotes_runtime(int new_setting);

У станавливает в текущих активных установках конфигурации установки для magic_quotes_runtime. (0 для выключенных(off), 1 для включенных(on))

set_time_limit — Установка лимита на максимальное время работы скрипта

Описание void set_time_limit(int seconds);

У станавливает длительность в секундах, во время которого скрипт должен быть выполнен. Если период превышен, то скрипт возвращает фатальную ошибку. По умолчанию лимит составляет 30 секунд или, если этот параметр установлен, значение max_execution_time в php3.ini. Если значение установлено в ноль(0), то лимит выключен.

П ри вызове, set_time_limit() перезапускает счетчик времени исполнения с нуля. Другими словами, если установлен лимит по умолчанию 30 секунд, и прошло 25 секунд со времени запуска, то после вызова set_time_limit( 20 ) общее время будет составлять 45 секунд после с начала запуска скрипта.

Чтение почты с помощью php через pop3

Дополнительная документация на русском:
Почтовый стандарт «MIME» (RFC1521) — поможет разобраться с заголовками и с закодированным содержанием писем.
Описание почтового протокола POP3 — список команд и описание.
Обязательно ознакомьтесь с этой документацией, я приведу только не большой пример работы с почтой.

В своей предыдущей статье я писал про отправку почты через SMTP с помощью php, так вот получение почты очень похоже, тоже отправлять команды и получать ответы от сервера. Вот только анализировать полученную информацию не так просто. В этой статье я постараюсь рассказать, как правильно обрабатывать полученную информацию от сервера.
Общение клиент-сервер происходит точно так же, как и при общении с smtp сервером, только команды другие.

Илон Маск рекомендует:  Тег sup

Для начала сделаем функцию, для получения данных от сервера.

function get_data ( $pop_conn )
<
$data = «» ;
while (! feof ( $pop_conn )) <
$buffer = chop ( fgets ( $pop_conn , 1024 ));
$data .= «$buffer\r\n» ;
if( trim ( $buffer ) == «.» ) break;
>
return $data ;
>
?>
Эта функция будет получать данные от сервера, которые при выводе занимают более одной строки.
Для однострочных ответов будем использовать просто

Начинаем коннект к pop — серверу, на примере бесплатного почтовика bk.ru от mail.ru

= fsockopen ( «pop.bk.ru» , 110 , $errno , $errstr , 10 );
print fgets ( $pop_conn , 1024 );
?>

Если все нормально, ответ будет

Теперь нужно авторизоваться. Посылаем команду USER с указанием имени пользователя

( $pop_conn , «USER webi\r\n» );
print fgets ( $pop_conn , 1024 );
?>

+OK Password required for user webi

Вводим пароль с помощью команды PASS

( $pop_conn , «PASS password\r\n» );
print fgets ( $pop_conn , 1024 );
?>

+OK webi@bk.ru maildrop has 2 messages (8192 octets)

В данном ответе говорится, что в ящике имеется 2 письма общим размером 8192 байт.
Сейчас авторизация пройдена и можно начинать получать информацию.
Например, команда STAT

( $pop_conn , «STAT\r\n» );
print fgets ( $pop_conn , 1024 );
?>

Покажет сколько писем в ящике и их общий размер

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

( $pop_conn , «LIST\r\n» );
print get_data ( $pop_conn );
?>

Покажет такой ответ

+OK 2 messages (8192 octets)
1 6654
2 1372
.

Показывает общую информацию и показывает размер каждого письма.
Цифры 1 и 2 в данном случае номера писем, именно по этим номерам и можно будет обращаться к письмам.
Заканчивается многострочный ответ точкой.

С помощью команды LIST можно получить информацию о размере любого письма, например второго.

( $pop_conn , «LIST 2\r\n» );
print fgets ( $pop_conn );
?>

Вот такой ответ

Второе письмо 1372 байта.

Теперь рассмотрим команду TOP. Она показывает заголовки письма и несколько строк самого письма.

( $pop_conn , «TOP 1 3\r\n» );
print get_data ( $pop_conn );
?>

+OK
Received: from [212.164.71.38] (port=43490 helo=imx2.ngs.ru)
by mx26.mail.ru with esmtp
Date: Mon, 27 Aug 2007 18:08:00 +0700
X-Mailer: The Bat! (v3.99.3) Professional
X-Priority: 3 (Normal)
X-Spam: Not detected
[. тут идут дальше заголовки, я их вырезал, в целях экономии места. ]

это идет текст письма.

В данном примере я вырезал часть заголовков, чтобы не засорять лишними текстами страницу.
Здесь показаны три строки первого письма(TOP 1 3).
И обратите внимание, что многострочный ответ заканчивается точкой.

Сейчас рассмотрим удаление писем.

( $pop_conn , «DELE 2\r\n» );
print fgets ( $pop_conn );
?>

+OK message 2 deleted

В данном случае удалилось второе письмо. Точнее сказать не удалилось, а пометилось для удаления. Помеченные письма удалятся только после завершения работы с сервером, т.е. после того, как будет отправлена команда QUIT.
Если есть необходимость отменить пометки об удалении, можно воспользоваться такой командой

( $pop_conn , «RSET\r\n» );
print fgets ( $pop_conn );
?>

Ответ
+OK maildrop has 2 messages (8192 octets)

Все основные команды рассмотрены, остались две, это чтение письма и закрытие сессии. Закрывать соединение нужно обязательно, чтобы помеченные к удалению письма удалились.

( $pop_conn , «RETR 1\r\n» );
print get_data ( $pop_conn );
fputs ( $pop_conn , «QUIT\r\n» );
?>

Ответ на эту команду будет естественно вывод первого письма, всего полностью, вместе со всеми заголовками и после этого идет команда выхода.
И вот тут то и начинается самое интересное. Как видно из примеров, получить письмо, это дело не хитрое, а теперь ведь нужно его разобрать, если в нем только текст, то достаточно отбросить заголовки и оставить тело. Но не все предусматривают письма, закодированные 7bit, 8 bit, а еще вложенные файлы.
Попробую продемонстрировать разбор заголовков на примерах, ну а дальше уже все будет понятно.
Обязательно почитайте Почтовый стандарт «MIME» (RFC1521) на нем все основано, и про заголовки и про кодирование тут все написано.
Я приведу только не большой пример, чтобы все предусмотреть, нужно знать стандарт.

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

// При отправке почты, все не латинские символы в заголовках кодируется,
// например тема письма может выглядеть так =?windows-1251?B?7/Du4uXw6uA=?=
// вот такие тексты и будет преобразовывать эта функция
function decode_mime_string ( $subject ) <
$string = $subject ;
if(( $pos = strpos ( $string , «=?» )) === false ) return $string ;
while(!( $pos === false )) <
$newresult .= substr ( $string , 0 , $pos );
$string = substr ( $string , $pos + 2 , strlen ( $string ));
$intpos = strpos ( $string , «?» );
$charset = substr ( $string , 0 , $intpos );
$enctype = strtolower ( substr ( $string , $intpos + 1 , 1 ));
$string = substr ( $string , $intpos + 3 , strlen ( $string ));
$endpos = strpos ( $string , «?=» );
$mystring = substr ( $string , 0 , $endpos );
$string = substr ( $string , $endpos + 2 , strlen ( $string ));
if( $enctype == «q» ) $mystring = quoted_printable_decode ( ereg_replace ( «_» , » » , $mystring ));
else if ( $enctype == «b» ) $mystring = base64_decode ( $mystring );
$newresult .= $mystring ;
$pos = strpos ( $string , «=?» );
>

$result = $newresult . $string ;
if( ereg ( «koi8» , $subject )) $result = convert_cyr_string ( $result , «k» , «w» );
if( ereg ( «KOI8» , $subject )) $result = convert_cyr_string ( $result , «k» , «w» );
return $result ;
>

// перекодировщик тела письма.
// Само письмо может быть закодировано и данная функция приводит тело письма в нормальный вид.
// Так же и вложенные файлы будут перекодироваться этой функцией.
function compile_body ( $body , $enctype , $ctype ) <
$enctype = explode ( » » , $enctype ); $enctype = $enctype [ 0 ];
if( strtolower ( $enctype ) == «base64» )
$body = base64_decode ( $body );
elseif( strtolower ( $enctype ) == «quoted-printable» )
$body = quoted_printable_decode ( $body );
if( ereg ( «koi8» , $ctype )) $body = convert_cyr_string ( $body , «k» , «w» );
return $body ;
>

// Функция для выдергивания метки boundary из заголовка Content-Type
// boundary это разделитель между разным содержимым в письме,
// например, чтобы отделить файл от текста письма
function get_boundary ( $ctype ) <
if( preg_match ( ‘/boundary[ ]?=[ ]?([«]?.*)/i’ , $ctype , $regs )) <
$boundary = preg_replace ( ‘/^\»(.*)\»$/’ , «\1» , $regs [ 1 ]);
return trim ( «—$boundary» );
>
>

// если письмо будет состоять из нескольких частей (текст, файлы и т.д.)
// то эта функция разобьет такое письмо на части (в массив), согласно разделителю boundary
function split_parts ( $boundary , $body ) <
$startpos = strpos ( $body , $boundary )+ strlen ( $boundary )+ 2 ;
$lenbody = strpos ( $body , «\r\n$boundary—» ) — $startpos ;
$body = substr ( $body , $startpos , $lenbody );
return explode ( $boundary . «\r\n» , $body );
>

// Эта функция отделяет заголовки от тела.
// и возвращает массив с заголовками и телом
function fetch_structure ( $email ) <
$ARemail = Array();
$separador = «\r\n\r\n» ;
$header = trim ( substr ( $email , 0 , strpos ( $email , $separador )));
$bodypos = strlen ( $header )+ strlen ( $separador );
$body = substr ( $email , $bodypos , strlen ( $email )- $bodypos );
$ARemail [ «header» ] = $header ;
$ARemail [ «body» ] = $body ;
return $ARemail ;
>

// разбирает все заголовки и выводит массив, в котором каждый элемент является соответсвующим заголовком
function decode_header ( $header ) <
$headers = explode ( «\r\n» , $header );
$decodedheaders = Array();
for( $i = 0 ; $i count ( $headers ); $i ++) <
$thisheader = trim ( $headers [ $i ]);
if(!empty( $thisheader ))
if(! ereg ( «^[A-Z0-9a-z_-]+:» , $thisheader ))
$decodedheaders [ $lasthead ] .= » $thisheader» ;
else <
$dbpoint = strpos ( $thisheader , «:» );
$headname = strtolower ( substr ( $thisheader , 0 , $dbpoint ));
$headvalue = trim ( substr ( $thisheader , $dbpoint + 1 ));
if( $decodedheaders [ $headname ] != «» ) $decodedheaders [ $headname ] .= «; $headvalue» ;
else $decodedheaders [ $headname ] = $headvalue ;
$lasthead = $headname ;
>
>
return $decodedheaders ;
>

// эта функция нам уже знакома. она получает данные и реагирует на точку, которая ставится сервером в конце вывода.
function get_data ( $pop_conn )
<
$data = «» ;
while (! feof ( $pop_conn )) <
$buffer = chop ( fgets ( $pop_conn , 1024 ));
$data .= «$buffer\r\n» ;
if( trim ( $buffer ) == «.» ) break;
>
return $data ;
>
?>

Вот имея эти функции можно уже начать работать с почтой.
Предположим, читаем первое письмо

= fsockopen ( «pop.bk.ru» , 110 , $errno , $errstr , 10 );
$code = fgets ( $pop_conn , 1024 );
fputs ( $pop_conn , «USER webi\r\n» );
$code = fgets ( $pop_conn , 1024 );
fputs ( $pop_conn , «PASS password\r\n» );
$code = fgets ( $pop_conn , 1024 );

fputs ( $pop_conn , «RETR 1\r\n» );
$text .= get_data ( $pop_conn );
// в переменной $text сейчас все письмо вместе с заголовками.

// разделяем письмо на заголовки и тело, еще раз советую почитать Почтовый стандарт «MIME» (RFC1521) (http://webi.ru/webi_files/26_15_f.html)
$struct = fetch_structure ( $text );

// теперь раскладываем заголовки по полочкам
// и получаем удобный ассоциативный массив с удобным обращением к любому заголовку.
// например $mass_header[‘subject’] == «=?windows-1251?B?7/Do4uXy?=»
$mass_header = decode_header ( $struct [ ‘header’ ]);

// чтобы воспользоваться заголовком, который может содержать не латинские символы
// например тема письма, нужно прогнать заголовок через функцию декодирования.
$mass_header [ «subject» ] = decode_mime_string ( $mass_header [ «subject» ]);
// теперь можно использовать тему, теперь тут обычный читаемый текст

// Сейчас разберем заголовок Content-Type, это тип содержимого. Определим, что в письме, только текст или еще и файлы.
// Content-Type: text/plain; charset=Windows-1251 это обычное текстовое письмо
// Content-Type: multipart/mixed; boundary=»_———-=_118224799143839″ это составное письмо из нескольких частей, с вложенными файлами.
$type = $ctype = $mass_header [ ‘content-type’ ];
$ctype = split ( «;» , $ctype );
$types = split ( «/» , $ctype [ 0 ]);
$maintype = trim ( strtolower ( $types [ 0 ])); // text или multipart
$subtype = trim ( strtolower ( $types [ 1 ])); // а это подтип(plain, html, mixed)

// сейчас проверяем тип содержимого письма
// Если это обычное текстовое содержимое (текст или html) без вложений
if( $maintype == «text» )
<
// $subtype можно использовать эту переменную для определения текстовое письмо или html
// эту проверку можете поставить сами
// Передаем тело письма в функцию, на перекодирование. И так же посылаем заголовки, информирующие о том, как было закодировано письмо.
$body = compile_body ( $struct [ ‘body’ ], $mass_header [ «content-transfer-encoding» ], $mass_header [ «content-type» ]);
print $body ;
>

// теперь рассмотрим вариант, если письмо имеет несколько разных частей.
// тут рассматриваю подтипы signed,mixed,related, но есть еще подтип alternative, который служит для альтернативного отображения письма.
// например, письмо в html и к нему же можно добавить альтернативное текстовое содержание.
// подробнее читайте про этот подтип в Почтовом стандарте «MIME» (RFC1521) (http://webi.ru/webi_files/26_15_f.html)
elseif( $maintype == «multipart» and ereg ( $subtype , «signed,mixed,related» ))
<
// получаем метку-разделитель частей письма
$boundary = get_boundary ( $mass_header [ ‘content-type’ ]);

// на основе этого разделителя разбиваем письмо на части
$part = split_parts ( $boundary , $struct [ ‘body’ ]);

// теперь обрабатываем каждую часть письма
for( $i = 0 ; $i count ( $part ); $i ++) <

// разбиваем текущую часть на тело и заголовки
$email = fetch_structure ( $part [ $i ]);
$header = $email [ «header» ];
$body = $email [ «body» ];

// разбираем заголовки на массив
$headers = decode_header ( $header );
$ctype = $headers [ «content-type» ];
$cid = $headers [ «content-id» ];
$Actype = split ( «;» , $headers [ «content-type» ]);
$types = split ( «/» , $Actype [ 0 ]);
$rctype = strtolower ( $Actype [ 0 ]);

// теперь проверяем, является ли эта часть прикрепленным файлом
$is_download = ( ereg ( «name=» , $headers [ «content-disposition» ]. $headers [ «content-type» ]) || $headers [ «content-id» ] != «» || $rctype == «message/rfc822» );

// и наконец, если это файл
elseif( $is_download ) <

// Имя файла можно выдернуть из заголовков Content-Type или Content-Disposition
$cdisp = $headers [ «content-disposition» ];
$ctype = $headers [ «content-type» ];
$ctype2 = explode ( «;» , $ctype );
$ctype2 = $ctype2 [ 0 ];
$Atype = split ( «/» , $ctype );
$Acdisp = split ( «;» , $cdisp );
$fname = $Acdisp [ 1 ];
if( ereg ( «filename=(.*)» , $fname , $regs ))
$filename = $regs [ 1 ];
if( $filename == «» && ereg ( «name=(.*)» , $ctype , $regs ))
$filename = $regs [ 1 ];
$filename = ereg_replace ( «\»(.*)\»» , «\1» , $filename );

// как получили имя файла, теперь его нужно декодировать
$filename = trim ( decode_mime_string ( $filename ));

// теперь читаем файл в переменную.
$body = compile_body ( $body , $headers [ «content-transfer-encoding» ], $ctype );
// содержимое файла теперь в переменной $body и сейчас можно отдать содержимое файла в браузер или например сохранить на диске
$ft = fopen ( $filename , «wb» );
fwrite ( $ft , $body );
fclose ( $ft );
>
>
>
?>

Вот такой вот полностью рабочий пример работы с почтой.
Конечно, я не стал предусматривать все возможные варианты писем, существуют еще типы multipart/alternative, multipart/digest. Возможно что-то еще упустил.
Вам достаточно даже бегло ознакомиться с почтовым стандартом, поизучать заголовки писем и сможете обрабатывать письма любых форматов.
Хочу предупредить, если вы будете разглядывать заголовки писем через The Bat, то лучше сохранять письмо в файл и открыв в текстовом редакторе уже его изучать.
Так как БАТ скрывает заголовки писем состоящих из нескольких частей, то есть показывает только основной заголовок письма.

Если заметили неточность или опечатку или хотите дополнить, пишите, поправлю, добавлю.

Комментарии

19.10.2007 Станислав
Спасибо, человечище!

26.11.2007 Алексей
Огромное спасибо. Сегодня целый день в нете в поисках примера. везде только все не то попадалось

04.12.2007 Игорь
В скрипте опечатка небольшая
вместо
if(strtolower($enctype) == «base64»)

надо
if(strtolower($enctype) == «base64;»)

хотя автору все равно спасибо

15.12.2007 Админ
А помоему не надо там точки с запятой.

20.12.2007 Александр
Спасибо большое! А то ничего похожево не найдешь в инете!

18.01.2008 Лекс
Хм. У меня аттачи Outlook не хочет понимать.

27.01.2008 artem2005
// теперь читаем файл в переменную.
$body = compile_body($body,$headers[«content-transfer-encoding»],$ctype);

Вместо $ctype в этой строчке здесь нужно подставить $ctype2.

И — спасибо огромное за статью!

31.01.2008 samodelkin(at)gmail.com
Спасибо большое за статью!

Взял за основу, использовал модуль imap + преобразование всего в utf-8, слегка модифицировав ваши функции.

05.03.2008 Олег
Супер Большое спасибо

13.06.2008 Виталий
Супер статья! Большое спасибо!

30.06.2008 Константин
Аффтару уважишище. Весь день искал, единственное что находил было завязано на имапе, а отдельный пакет ставить не хотелось, а тут бац и все сразу сходу рабочее =) И переобразование кодировок так же заслуживает похвалы) Спасибо =)
Кстати, насчет строчки с base64 — там точка с запятой не нужна — она коверкает файлы приаттаченные. Правда, с другой стороны убирает точку в конце))

17.07.2008 Александр
одно плохо если сервак использует tsl от этого скрипта толку 0

06.10.2008 Владимир
Спасибо, отличная статья, но у меня возникла ошибка если данные с сервера загружаются дольше чем за 30 секунд, то возникает ошибка

Maximum execution time of 30 seconds exceeded in test3.php on line 103

21.10.2008 админ
Это уже настройки php.
По умолчанию php скрипт способен работать не более 30 секунд.
Если есть доступ к php.ini можете увеличить время работы скрипта, параметр max_execution_time.
Использовать примерно так:
max_execution_time = 180;
Установлено на 180 секунд.

18.11.2008 lux
Ничего особенного когда знаешь, но попробуй найти информацию. Особенно когда она нужна срочно.

20.11.2008 Kamerad Rover
Молодец.

10.01.2009 Виталий
Скрипт — шедевр.
Автору заслуживает невероятной благодарности,за то, что делиться такой работой с общественностью.
Огромное спасибо!

27.01.2009 Владимир
Отлично

29.01.2009 Me
супер! то что нужно! молодец +1

06.02.2009 Алексей
Сохраняет файлы не в полном объеме, на 98% примерно. Ни у кого не было такой проблемы?

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

mail

Синтаксис:

mail($to, $subject, $msg [,$headers]);

Функция mail() посылает сообщение с телом $msg (это может быть «многострочная строка», т.е. переменная, содержащая несколько строк, разделенных символом перевода строки) по адресу $to. Можно задать сразу несколько получателей, разделив их адреса пробелами в параметре $to.

Пример:

«Первая строка Вторая строка Третья строка»

В случае, если указан четвертый параметр, переданная в нем строка вставляется между концом стандартных почтовых заголовков (таких как To, Content-type и т.д.) и началом текста письма. Обычно этот параметр используется для задания дополнительных заголовков письма.

Пример:

«X-Mailer: PHP/» . phpvarsion()

Похожие главы из других книг

Почтовые программы

Почтовые программы Один из самых важных инструментов для полноценной работы с Интернетом – почтовый клиент, поэтому к нему предъявляются достаточно высокие требования. Современные почтовые клиенты не только отправляют и принимают почту, но и сортируют поступающую

2.1. Почтовые программы

2.1. Почтовые программы Электронная почта – самый старый способ совместной работы. Она работает по принципу обычной почты.Чтобы иметь возможность общаться с определенным человеком, необходимо знать адрес его электронной почты. Формат этого адреса следующий:

Альтернативные почтовые программы

Альтернативные почтовые программы Хотя Outlook Express достаточно проста в настройке и использовании, она все же предоставляет меньше возможностей, чем некоторые другие программы ее класса. Возможности подобных почтовых клиентов также самые разные: от мощных

Почтовые вложения

Почтовые вложения Еще одной возможностью, поддерживаемой почтовым клиентом Почта Windows, является определение действий, которые будут выполняться операционной системой при попытке открыть файлы определенного типа, являющиеся почтовыми вложениями.Действия операционной

Почтовые ящики

Почтовые ящики Как и именованные каналы, почтовые ящики (mailslots) Windows снабжаются именами, которые могут быть использованы для обеспечения взаимодействия между независимыми каналами. Почтовые ящики представляют собой широковещательный механизм, основанный на

Почтовые утилиты

Почтовые утилиты Современные почтовые клиенты различаются и по качеству, и по функциональным возможностям. Одни их них интегрированы в операционную систему (как Microsoft Outlook Express), другие работают на любой платформе (как The Bat!). Несмотря на наличие больших функциональных

Почтовые гиперссылки

Почтовые гиперссылки HTML позволяет нам создать гиперссылку, указывающую на адрес электронной почты (почтовую гиперссылку). Щелчок на ней запустит программу почтового клиента, установленную в системе по умолчанию. Интернет-адрес такой гиперссылки записывается особым

Почтовые гиперссылки

Почтовые гиперссылки HTML позволяет нам создать гиперссылку, указывающую на адрес электронной почты (почтовую гиперссылку). Щелчок на ней запустит программу почтового клиента, установленную в системе по умолчанию. Интернет-адрес такой гиперссылки записывается особым

Бесплатные почтовые ящики

Бесплатные почтовые ящики Как правило, провайдеры предоставляют своим клиентам почтовые ящики – места на почтовом сервере, предназначенные для хранения их корреспонденции. Если ящик у вас есть, то это замечательно. Однако может случиться так, что вы поменяете

Почтовые программы

Почтовые программы Почтовые программы – это специальные приложения, предназначенные для работы с электронной почтой.В отличие от работы посредством веб-интерфейса, где приходится загружать множество ненужной информации, включая назойливую рекламу, почтовые программы

Почтовые

Почтовые Почтовые игры, или РВЕМ (Play By E-Mail), – это сетевые игры, обмен данными в которых осуществляется посредством электронной почты. Да-да, не удивляйтесь, самой обыкновенной электронной почты.Сразу предвижу кислые выражения лиц любителей новомодных «стрелялок»,

Почтовые программы

Почтовые программы Для работы со своим почтовым ящиком предназначены специальные почтовые программы, которые называются почтовыми клиентами. Примечание Вообще, в компьютерных технологиях клиентами называются различные программы, а не человек — заказчик каких-либо

Интеграция в почтовые клиенты.

Интеграция в почтовые клиенты. Интеграция PGP в почтовые клиенты для автоматического кодирования, декодирования и подписи проста и почти не зависит от используемого почтового клиента.В качестве примера я расскажу про интеграцию PGP в Pine. Надеюсь, читатель использует

10.4. Почтовые клиенты

10.4. Почтовые клиенты В некоторых дистрибутивах устанавливается много разных почтовых клиентов (в одном я насчитал целых шесть!). В Ubuntu всего один почтовый клиент, но зато удобный. Для его запуска используется команда меню Приложения | Офис | Электронная почта и календарь

Почтовые рассылки

Почтовые рассылки Электронные рассылки – один из мощнейших способов продвижения своего Internet-узла. Однако он требует наибольшей аккуратности при использовании. Очевидно, что для приятного общения в сети Internet следует соблюдать некоторые правила так называемого сетевого

Php руководство по рнр 3 0 почтовые функции

CREATE DATABASE mail_collector DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

CREATE TABLE mailboxes ( id int PRIMARY KEY NOT NULL AUTO_INCREMENT, email varchar(50) NOT NULL, password varchar(50) NOT NULL, host varchar(50) NOT NULL, port varchar(50) NOT NULL, is_ssl bit NOT NULL, is_deleted bit NOT NULL, last_message_uid int NOT NULL );

INSERT INTO mailboxes(email,password,host,port,is_ssl,is_deleted) VALUES (‘mail.collector.kz@gmail.com’,’mail.collector’,’imap.gmail.com’,’993′,1,0,0), (‘mail.collector.kz@mail.ru’,’mail.collector’,’imap.mail.ru’,’143′,0,0,0), (‘mail.collector.kz@yandex.ru’,’mail.collector’,’imap.yandex.ru’,’993′,1,0,0)

CREATE TABLE messages ( id int PRIMARY KEY NOT NULL AUTO_INCREMENT, mailbox_id int NOT NULL, uid int NOT NULL, subject varchar(255), body_text text, body_html text, attachment_count int, header text, message_date datetime, create_date datetime NOT NULL, modify_date datetime, is_ready bit NOT NULL );

ALTER TABLE messages ADD CONSTRAINT fk_messages_user_id FOREIGN KEY (mailbox_id) REFERENCES mailboxes(id);

CREATE TABLE addresses ( id int PRIMARY KEY NOT NULL AUTO_INCREMENT, message_id int NOT NULL, type varchar(10) NOT NULL, email varchar(50) NOT NULL );

ALTER TABLE addresses ADD CONSTRAINT fk_addresses_message_id FOREIGN KEY (message_id) REFERENCES messages(id);

CREATE TABLE attachments ( id int PRIMARY KEY NOT NULL AUTO_INCREMENT, message_id int NOT NULL, file_name varchar(255) NOT NULL, mime_type varchar(255) NOT NULL, file_size int NOT NULL, location varchar(255) NOT NULL );

ALTER TABLE attachments ADD CONSTRAINT fk_attachments_message_id FOREIGN KEY (message_id) REFERENCES messages(id);

u );//завершаем транзакцию //закрываем IMAP-поток imap_close($mail); > ?>

Php руководство по рнр 3 0 почтовые функции

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

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

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

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

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

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

В результате переменная $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);
>

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

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

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

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

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

Извините но этот почтовый ящик используется
только для администрирования рассылки»;
$err_sbj = «Error»;
$headers = «From: Subscribe Robot

Content-type: text/plain; charset=windows-1251
«;
if($n != 0) <
while($m++ 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, перепроверка почтового ящика отправителя и т.д. Это уже функциональные излишества, которые каждый может добавить по мере необходимости.

Php руководство по рнр 3 0 почтовые функции

Форум Приднестровской поддержки CMS XOOPS.

По ссылке вы можете скачать последнюю версию CMS XOOPS. А так же прочитать инструкции по установке XOOPS и модулей

По данным ссылкам можно скачать модули нашей разработки.

Модуль инструкций. Ознакомьтесь с установкой XOOPS. C начальными познаниями по HTML,CSS, JS, PHP и др.

Добро пожаловать на сайт поддержки XOOPS.

Приднестровская поддержка XOOPS

PHP-код встраивается в документ с помощью дескрипторов, иногда называемых также тегами:
:

echo «Hello, world\n» ; ?>
Отключить поддержку этих дескрипторов нельзя. Настоятельно рекомендую использовать именно их;

echo «Hello, world\n» ; ?>

Доступны, только если директива short_open_tag имеет значение On . При использовании этих дескрипторов следует помнить, что могут возникнуть проблемы при выводе XML-документов, так как последовательность будет воспринята как выделение РНР-кода.
Выражение
echo «Hello, world\n» ; ?>
можно записать в более компактном виде:
«Hello, world\n» ?>

Однако следует помнить, что этот вариант возможен, только если директива short_open_tag в файле конфигурации php.ini имеет значение On ;
□ % и % >:
% echo «Hello, world\n» ; % >
Для использования этого дескриптора необходимо включить поддержку в файле php.ini . Для этого строку
asp_tags = Off
нужно заменить на
asp_tags = On

а затем перезапустить сервер Apache. В РНР 6 поддержка этих дескрипторов полностью удалена;

. Удивлены? Внедрить РНР-код можно точно так же, как и JavaScript -код. Нужно только указать в параметре language значение РНР:

На практике такими дескрипторами никто не пользуется.

Программирование на языке PHP для чайников. Часть 1

Предлагаю вашему вниманию краткое руководство по языку PHP для чайников в нескольких частях. Гарантирую, написать свой первый рабочий PHP код вы сможете уже после прочтения этой серии статей (или в процессе чтения). Язык PHP один из самых простых в освоении языков программирования, это серверный (исполняется на стороне сервера) язык сценариев (интерпретируемый язык).

Используется он для создания веб-проектов. Может использоваться прямо в HTML коде. И хотя результат работы скрипта часто выводится непосредственно в браузере клиента, для работы PHP не достаточно только одного браузера. То-есть вам не получится запустить index.php файл прямо в браузере, как вы уже наверняка делали с файлом index.html. Для работы PHP сценариев и веб-страниц созданных с применением PHP потребуется веб-сервер.

Если у вас еще нет хостинг площадки для вашего сайта, тогда рекомендую поэкспериментировать с PHP сценариями на локальном сервере, предназначенном для тестирования проектов. Для организации локального сервера в операционной системе Windows (WAMP, Windows-Apache-MySQL-PHP) могут быть полезны пакеты: Денвер, XAMPP, AppServ, OpenServer и т.д. После установки этих пакетов, вы получите уже настроенный и готовый к использованию сервер, а управляться он будет через удобное меню самой программы. Также, существуют и отдельные реализации APACHE, MySQL и PHP для операционной системы Windows, но настраивать их придется уже самостоятельно через конфигурационные файлы и не будет никакого меню с галочками. Для запуска, перезапуска и остановки такого сервера можно будет использовать пакетные файлы *.bat или *.cmd (батник) с командами запуска, перезапуска или остановки служб APACHE и MySQL. Третий и самый непростой для новичка вариант — это виртуальная машина с установленной и настроенной операционной системой Linux (LAMP, Linux-Apache-MySQL-PHP). Готовые образы таких «виртуалок» часто встречаются в Интернете, так что вам могут понадобиться только знания настройки программ типа VirtualBox или VMware.

Подготовка к программированию на языке PHP для чайников

  1. PHP код следует помещать в файле index.php, сам файл должен быть размещен в корневом каталоге сайта, расположенного на веб-сервере.
  1. Весь код на языке PHP должен быть заключен между дескрипторами или сокращенный вариант , но веб-сервер может быть не сконфигурирован для использования сокращенного варианта такой записи, поэтому предпочтителен первый вариант.
  2. Вставлен PHP код может быть в любое место HTML кода.
  3. Комментирование в PHP коде осуществляется следующим образом:
  1. Для того, чтобы посмотреть ваш код, откройте веб-браузер и в адресной строке введите: http://localhost/www/MyEX/index.php

Вывод данных на экран с помощью языка PHP для чайников

  1. Вывод данных в окно (клиентскую область веб-браузера) с помощью PHP можно выполнить посредством оператора echo. Этот оператор позволяет вывести данные различных типов: числа, символьные строки и т.д.
  2. Синтаксис оператора вывода:
  1. Строковые данные заключаются в двойные или одинарные кавычки. В двойных кавычках код интерпретируется PHP. Все, что заключено в одинарные кавычки выводится без какой бы ни было интерпретации. Пример:

Пример $x кода

Пример $x кода

  1. Для вывода более подробной информации о переменной, которая может понадобиться при отладке программы, служит функция var_dump(). Ее синтаксис:
  1. В списке переменных указывается одно или несколько имен переменных. Эта функция ничего не возвращает. Пример:
  1. Менее информативной, чем var_dump(), функцией вывода сведений о переменных является:
  1. Для переменных типа «массив» эта функция выводит список вида индекс => элемент.

Переменные языка РНР для чайников

  1. Переменные – контейнеры для хранения данных. Данные, сохраняемые в переменной, называют значением этой переменной.
  2. Переменная имеет имя – последовательность букв, цифр и символа подчеркивания без пробелов и знаков препинания, начинающаяся обязательно с символа доллара ($), за которым должна следовать буква или символ подчеркивания.
  3. Правильные имена переменных: $_tel, $tmp, $my_, $address_234_45.
  4. Неправильные имена переменных: $234tel, my address, $tel:234.
  5. РНР является регистро-ависимым языком относительно имен переменных и констант. Однако ключевые слова могут использоваться в любом регистре.

Типы данных языка РНР и преобразование данных для чайников

Тип данных Пример Описание значений
Строковый или символьный (string) «Привет всем»
«123456»
«25 рублей»
Последовательность символов, заключенная в кавычки
Целочисленный, числовой (integer) -234
25
Число или последовательность цифр, перед которыми может быть указан знак числа
Числовой с плавающей точкой (float) 5.47
21.4
35E-3
Число с дробной частью (35Е2 означает 3500)
Логический (булевый, boolean) true
false
Этот тип имеет два значения: true (истина, да), false (ложь, нет)
NULL null Этот тип данных имеет одно значение — null
Массив (Array) Этот тип данных имеет одно множество значений, которые могут быть различных типов
Объект (Object) Программный объект, определяемый своими свойствами
  1. Для того, чтобы узнать какой тип переменной, нужно воспользоваться функцией:
  1. Для явного задания типа можно воспользоваться одним из двух способов:

Константы языка PHP для чайников

  1. Константой называется именованная величина, которая не изменяется в процессе выполнения программы (скрипта).
  2. В отличие от переменных, вы не можете изменять значения констант, которые были им присвоены при их объявлении. Константы удобно использовать для хранения значений, которые не должны изменяться во время работы программы. Константы могут содержать только скалярные данные (логического, целого, плавающего и строкового типов).
  3. В РНР константы определяются функцией define(). Вот ее синтаксис:

$name — имя константы.
$value — значение константы.
$case_sen — необязательный параметр логического типа, указывающий, следует ли учитывать регистр букв (true) или нет (false).

  1. Для проверки существования константы можно использовать функцию defined(). Данная функция возвращает true, если константа объявлена. Пример:

Различия между константами и переменными в языке PHP для чайников

  1. У констант нет приставки в виде знака доллара ($).
  2. Константы можно определить только с помощью функции define(), а не присваиванием значения.
  3. Константы могут быть определены и доступны в любом месте без учета области видимости.
  4. Константы не могут быть определены или аннулированы после первоначального объявления.
  5. Константы могут иметь только скалярные значения.

В этой статье я перечислил базовые понятия языка PHP для чайников. Теперь пора ознакомиться с конструкциям этого языка и перейти, непосредственно, к программированию. Об этом моя следующая статья — PHP программирование для чайников.

Руководство по PHP

Руководство по PHP

PHP, что означает «PHP: Препроцессор Гипертекста», является широко используемым языком сценариев общего назначения с открытым исходным кодом. PHP создавался специально для ведения Web-разработок и может использоваться непосредственно в HTML-коде. Синтаксис языка берет начало из C, Java и Perl и является легким для изучения. Преимущественным назначением PHP является предоставление web-разработчикам возможности быстрого создания динамически генерируемых web-страниц, однако, область применения PHP не ограничивается только этим.
Это руководство состоит, главным образом, из справочника функций, а также содержит справочник языка, комментарии к наиболее важным из отличительных особенностей PHP, и другие дополнительные сведения.
Авторы: Stig Sæther Bakken, Alexander Aulbach, Egon Schmid, Jim Winstead, Lars Torben Wilson, Rasmus Lerdorf, Andrei Zmievski, Jouni Ahto

Содержание

Предисловие
I. Приступая к работе
1. Введение
2. Краткое руководство
3. Установка
4. Конфигурация
II. Справочник языка
5. Основы синтаксиса
6. Типы
7. Переменные
8. Константы
9. Выражения
10. Operators
11. Control Structures
12. Functions
13. Classes and Objects
14. References Explained
III. Безопасность
15. Безопасность
IV. Отличительные особенности
16. HTTP authentication with PHP
17. Cookies
18. Handling file uploads
19. Работа с удаленными файлами
20. Connection handling
21. Persistent Database Connections
22. Safe Mode
23. Использование PHP в командной строке
V. Справочник функций
I. Функции для работы с сервером Apache
II. Функции для работы с массивами
III. Aspell functions [deprecated]
IV. BCMath Arbitrary Precision Mathematics Functions
V. Функции сжатия Bzip2
VI. Calendar Functions
VII. CCVS API Functions [deprecated]
VIII. COM support functions for Windows
IX. Class/Object Functions
X. ClibPDF Functions
XI. Crack Functions
XII. Функции CURL, Client URL Library
XIII. Cybercash Payment Functions
XIV. Cyrus IMAP administration Functions
XV. Функции определения типа символов
XVI. Database (dbm-style) Abstraction Layer Functions
XVII. Функции для работы с датой и временем
XVIII. dBase Functions
XIX. DBM Functions [deprecated]
XX. dbx Functions
XXI. DB++ Functions
XXII. Direct IO Functions
XXIII. Функции для работы с каталогами
XXIV. DOM XML Functions
XXV. .NET Functions
XXVI. Error Handling and Logging Functions
XXVII. File Alteration Monitor Functions
XXVIII. FrontBase Functions
XXIX. filePro Functions
XXX. Функции для работы с файловой системой
XXXI. Forms Data Format Functions
XXXII. FriBiDi Functions
XXXIII. FTP Functions
XXXIV. Function Handling Functions
XXXV. Gettext
XXXVI. GMP Functions
XXXVII. Функции протокола HTTP
XXXVIII. Hyperwave Functions
XXXIX. Hyperwave API Functions
XL. iconv Functions
XLI. Image Functions
XLII. IMAP, POP3 and NNTP Functions
XLIII. Informix Functions
XLIV. InterBase Functions
XLV. Ingres II Functions
XLVI. IRC Gateway Functions
XLVII. PHP / Java Integration
XLVIII. LDAP Functions
XLIX. LZF Functions
L. Mail Functions
LI. mailparse Functions
LII. Mathematical Functions
LIII. Multibyte String Functions
LIV. MCAL Functions
LV. Mcrypt Encryption Functions
LVI. MCVE Payment Functions
LVII. Mhash Functions
LVIII. Mimetype Functions
LIX. Microsoft SQL Server Functions
LX. Ming functions for Flash
LXI. Miscellaneous Functions
LXII. mnoGoSearch Functions
LXIII. mSQL Functions
LXIV. Функции СУБД MySQL
LXV. Improved MySQL Extension
LXVI. Mohawk Software Session Handler Functions
LXVII. muscat Functions
LXVIII. Network Functions
LXIX. Ncurses Terminal Screen Control Functions
LXX. Lotus Notes Functions
LXXI. NSAPI-specific Functions
LXXII. Unified ODBC Functions
LXXIII. Object Aggregation/Composition Functions
LXXIV. Функции для работы с Oracle
LXXV. OpenSSL Functions
LXXVI. Oracle Functions
LXXVII. Ovrimos SQL Functions
LXXVIII. Output Control Functions
LXXIX. Object property and method call overloading
LXXX. PDF functions
LXXXI. Verisign Payflow Pro Functions
LXXXII. PHP Options&Information
LXXXIII. POSIX Functions
LXXXIV. PostgreSQL Functions
LXXXV. Process Control Functions
LXXXVI. Program Execution Functions
LXXXVII. Printer Functions
LXXXVIII. Pspell Functions
LXXXIX. GNU Readline
XC. GNU Recode Functions
XCI. Функции для работы с регулярными выражениями (Perl-совместимые)
XCII. qtdom Functions
XCIII. Regular Expression Functions (POSIX Extended)
XCIV. Semaphore, Shared Memory and IPC Functions
XCV. SESAM Database Functions
XCVI. Session Handling Functions
XCVII. Shared Memory Functions
XCVIII. SimpleXML functions
XCIX. SOAP Functions
C. SQLite
CI. Shockwave Flash Functions
CII. SNMP Functions
CIII. Socket Functions
CIV. Standard PHP Library (SPL) Functions
CV. Stream Functions
CVI. Функции обработки строк
CVII. Sybase Functions
CVIII. TCP Wrappers Functions
CIX. Tidy Functions
CX. Tokenizer Functions
CXI. URL Functions
CXII. Variable Functions
CXIII. vpopmail Functions
CXIV. W32api Functions
CXV. WDDX Functions
CXVI. XML Parser Functions
CXVII. XML-RPC Functions
CXVIII. xdiff Functions
CXIX. XSL functions
CXX. XSLT Functions
CXXI. YAZ Functions
CXXII. YP/NIS Functions
CXXIII. Zip File Functions (Read Only Access)
CXXIV. Zlib Compression Functions
VI. Zend API
24. Overview
25. Extension Possibilities
26. Source Layout
27. PHP’s Automatic Build System
28. Creating Extensions
29. Using Extensions
30. Troubleshooting
31. Source Discussion
32. Accepting Arguments
33. Creating Variables
34. Duplicating Variable Contents: The Copy Constructor
35. Returning Values
36. Printing Information
37. Startup and Shutdown Functions
38. Calling User Functions
39. Initialization File Support
40. Where to Go from Here
41. Reference: Some Configuration Macros
42. API Macros
VII. PHP API: интерфейс программирования для написания расширений
43. Streams API for PHP Extension Authors
VIII. ЧАВО: ЧАсто задаваемые Вопросы и Ответы на них
44. General Information
45. Mailing lists
46. Obtaining PHP
47. Database issues
48. Installation
49. Build Problems
50. Using PHP
51. PHP and HTML
52. PHP and COM
53. PHP and other languages
54. Migrating from PHP 2 to PHP 3
55. Migrating from PHP 3 to PHP 4
56. Miscellaneous Questions
IX. Приложения
A. История PHP и смежных проектов
B. Migrating from PHP 4 to PHP 5
C. Migrating from PHP 3 to PHP 4
D. Migrating from PHP/FI 2 to PHP 3
E. Отладка PHP
F. Extending PHP 3
G. Список псевдонимов функций
H. List of Reserved Words
I. List of Resource Types
J. List of Supported Protocols/Wrappers
K. List of Available Filters
L. Список поддерживаемых транспортных протоколов
M. Таблица сравнения типов в PHP
N. List of Parser Tokens
O. Об этом руководстве
P. Open Publication License
Q. Список функций
R. Что отсутствует в этом руководстве
X. Руководство в формате HTML Help
57. About This Edition
58. Using PHP Manual CHM Edition
59. The Full Text Search
60. Specialities of this Edition
61. Integrating the PHP Manual
62. Skin development
63. CHM Edition Credits

Бесплатно скачать электронную книгу в удобном формате, смотреть и читать:
Скачать книгу Руководство по PHP — fileskachat.com, быстрое и бесплатное скачивание.

Скачать chm
Ниже можно купить эту книгу по лучшей цене со скидкой с доставкой по всей России. Купить эту книгу

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL