Работа с электронной почтой

Чего вожделеет каждый веб-мастер, создав на странице форму? Да, отправить ее содержимое себе по почте. А сделать это на PHP очень просто - есть функция mail($to,$subj,$body, $header). Но есть и тонкость: почта будет уходить от имени www-сервера (как пользователя). Не забывайте, пожалуйста, про четвертый аргумент $header, в котором вы можете указывать любой параметр заголовка письма (см. RFC-822):

mail('user@isp.ru','test message','Выполучили письмо', "From: bill@gates.ru\nContent-type: text/plain; charset=windows-1251");

Указывайте хотя бы From: и Content-type: - это предохранит вас от раздраженных получателей писем или, если получаете вы, от получения писем в непонятной кодировке неизвестно от кого.

Одно время у провайдеров были популярны системы чтения/отправки электронной почты с www-сайта. На PHP вы можете сделать то же самое. Достаточно лишь почитать описание протоколов POP и IMAP и открыть сетевое соединение с почтовым сервером. Функция fsockopen(хост, порт) открывает сетевое соединение, а пользоваться им можно при помощи обычных файловых функций. Только не открывайте соединение к своему www-серверу и не запрашивайте свой же скрипт - веб-мастеру это может сильно не понравиться. В целом работа с сетью в PHP оставляет желать лучшего - надеюсь, многие изъяны будут исправлены в четвертой версии. В первую очередь не хватает функции select() или аналога соответствующему вызову POSIX. Сетевое соединение - это не совсем файл, оно может прерваться, другая программа может не закрыть соединение и завершиться/зависнуть и т. п. Функция select() позволяет сделать работу с сетью более надежной. Подождем.

О корректной работе PHP

Не следует забывать еще про одно сетевое соединение - соединение клиента с веб-сервером, во время которого выполняется скрипт. Представьте себе ситуацию, когда ваш скрипт обрабатывает сложный запрос, что-то читает из базы, пишет в файл, изменяет данные в базе и т. д., а во время этого процесса клиент нажал кнопку «Стоп» и разорвал соединение. Процесс работы вашей программы будет прерван в самый неожиданный момент, и обработка не будет завершена. Но частично-то работа проделана. Необходимо как-то откатить назад внесенные изменения. Для этого в PHP встроен механизм контроля за соединением. Вы можете подготовить функцию аварийной остановки с помощью register_shutdown_function(функция). Заданная функция вызывается интерпретатором PHP при завершении работы скрипта. Сетевое соединение в PHP находится в следующих состояниях:
0 - NORMAL;
1 - ABORTED;
2 - TIMEOUT.