Дата добавления: 2011-12-01
Рассмотрим пример отправки сообщения с сайта на ваш электронный адрес. Зачем это нужно? Предположим, у вас на странице есть поле для комментариев, и вам нужно оперативно узнавать, что кто-то оставил комментарий. Не будете же вы каждую минуту заходить на свой сайт и проверять наличие новых комментариев.
Сам процесс создания формы и отправки письма несложен. Но есть некоторые моменты, которые могут испортить настроение на целый день.
Первая трудность - глупый и устаревший стандарт для писем на русском языке. Из-за него к вам на почту могут приходить письма с "кракозябрами". Особенно эта проблема заметна на почтовых клиентах типа Windows Mail, Outlook Express и т.д. Если читать письма через веб-интерфейс, то проблема не так актуальна. Многие почтовые сервера достаточно умны, чтобы корректно отобразить письмо.
Вторая проблема - нежелательные письма. Некоторые "альтернативно" одаренные личности могут без конца нажимать на кнопку отправления писем (флуд). К ним можно также отнести ботов - специально написанные программы, которые сами нажимают на кнопки.
Третья проблема - защита от уязвимостей. Если на сайте можно что-то вводить, значит существует вероятность взлома. Например, вы просите ввести в поле электронный адрес для регистрации, а хакер вводить специально заготовленный зловредный скрипт, который можно попортить вам сайт.
Если описанные трудности вас не успугали и вы хотите получать сообщения с сайта, то продолжим...
Начнем с простейшего примера без наворотов.
Создадим файл forms.php, который будет содержать форму для отправки сообщения.
Ваше имя:
Сообщение:
";
?>
Мы только что создали форму с двумя текстовыми полями и кнопкой. Обратите внимание, что у формы мы определили метод post и указали в параметре action путь к обработчику формы - mail.php. Естественно, вы можете указать свой адрес и другое имя для файла.
Теперь создадим файл mail.php (в нашем примере он должен находиться в той же папке).
$len) { exit("Ошибка. Сообщение не должно превышать ".$len. " знаков. "); } // здесь надо указать свой адрес электронной почты, чтобы получать письма $to = "[email protected]"; $subject="Письмо от ".$name; // конвертируем из windows-1251 в koi8-r $subject = convert_cyr_string($subject,"w","k"); // это само письмо $message ="
Новый комментарий:
". $message_text." "; // конвертируем из windows-1251 в koi8-r $message = convert_cyr_string($message,"w","k"); // заголовки письма $headers = "Content-Type: text/html; charset=KOI8-R\r\n"; // от кого письмо $headers .= "From: server\r\n\r\n"; if(mail($to,$subject,$message,$headers)) { echo "Письмо успешно отправлено."; } else { echo "Ошибка. Письмо не отправлено."; } ?>В принципе этого достаточно для отправки письма. Главное, убедитесь, что у вас на сайте разрешено использовать функцию mail(), так как некоторые хостеры отключают ее или вводят различные ограничения на количество отправляемых писем.
Укрепляем оборону
В описанном примере есть минимальная защита в виде функции htmlspecialchars . Еще одной формой защиты может стать использование сессий.
В самом начале первого файла введите следующее.
// инициализируем сессию session_start(); // выводим сообщения echo $er; // форма echo "
Теперь соберем все вместе.
Теперь сделаем так, чтобы поля в форме стали обязательными для заполнения. Имеем следующий код:
Создаем файл, принимающий данные из HTML формы
Это будет файл с именем send.php
В файле на первом этапе нужно принять данные из пост массива. Для этого создаем две переменные:
$fio = $_POST["fio"];
$email = $_POST["email"];
Перед названиями переменных в php ставиться знак $, в конце каждой строки ставиться точка с запятой. $_POST это массив в который передаются данный из формы. В форме html при этом указан метод отправки method="post". Так, приняты две переменные из формы html. Для целей защиты своего сайта нужно провести эти переменные через несколько фильтров - функций php.
Первая функция преобразует все символы, которые пользователь попытается добавить в форму:
При этом новые переменные в php не создаются, а используются уже имеющиеся. Что сделает фильтр, он преобразует символ "<" в "<". Также он поступить с другими символами, встречающимися в html коде.
Вторая функция декодирует url, если пользователь попытается его добавить в форму.
$fio = urldecode($fio);
$email = urldecode($email);
Третей функцией мы удалим пробелы с начала и конца строки, если таковые имеются:
$fio = trim($fio);
$email = trim($email);
Существуют и другие функции, позволяющие отфильтровать переменные php. Их использование зависит от того, насколько вы опасаетесь того, что злоумышленник попытается добавить программный код в данную форму отправки данных на почту html.
Проверка данных, передаваемых от HTML формы в файл PHP
Для того, чтобы проверить, работает ли этот код, передаются ли данные можно просто их вывести на экран при помощи функции echo:
echo $fio;
echo "
";
echo $fio;
Вторая строка здесь нужна для того, чтобы разделить вывод переменных php на разные строки.
Отправляем полученные данные из формы HTML на почту при помощи PHP
Для отправки данных на почту нужно воспользоваться функцией mail в PHP.
mail("на какой адрес отправить", "тема письма", "Сообщение (тело письма)","From: с какого email отправляется письмо \r\n");
Например, нужно отправить данные на email владельца сайта или менеджера [email protected].
Тема письма должна быть понятной, а сообщение письма должно содержать то, что указал пользователь в HTML форме.
mail("[email protected]", "Заявка с сайта", "ФИО:".$fio.". E-mail: ".$email ,"From: [email protected] \r\n");
Необходимо добавить условие, которе проверит отправилась ли форма при помощи PHP на указанные адрес электронной почты.
if (mail("[email protected]", "Заказ с сайта", "ФИО:".$fio.". E-mail: ".$email ,"From: [email protected] \r\n"))
{
echo "сообщение успешно отправлено";
} else {
}
Таким образом программный код файла send.php, который отправит данные HTML формы на почту будет выглядеть следующим образом:
$fio = $_POST["fio"];
$email = $_POST["email"];
$fio = htmlspecialchars($fio);
$email = htmlspecialchars($email);
$fio = urldecode($fio);
$email = urldecode($email);
$fio = trim($fio);
$email = trim($email);
//echo $fio;
//echo "
";
//echo $email;
if (mail("[email protected]", "Заявка с сайта", "ФИО:".$fio.". E-mail: ".$email ,"From: [email protected] \r\n"))
{ echo "сообщение успешно отправлено";
} else {
echo "при отправке сообщения возникли ошибки";
}?>
Три строки для проверки, передаются ли данные в файл закомментированы. При необходимости их можно удалить, так как они нужны были только для отладки.
Помещаем HTML и PHP код отправки формы в один файл
В комментариях к этой статье многие задают вопрос о том, как сделать, чтобы и HTML форма и PHP код отправки данных на почту находились в одном файле, а не двух.
Для реализации такой работы нужно поместить HTML код формы в файл send.php и добавить условие, которое будет проверять наличие переменных в массиве POST (этот массив передается из формы). То есть, если переменные в массиве не существуют, то нужно показать пользователю форму. Иначе нужно принять данные из массива и отправить их адресату.
Давайте посмотрим как изменить PHP код в файле send.php:
//проверяем, существуют ли переменные в массиве POST
if(!isset($_POST["fio"]) and !isset($_POST["email"])){
?> } else {
//показываем форму
$fio = $_POST["fio"];
$email = $_POST["email"];
$fio = htmlspecialchars($fio);
$email = htmlspecialchars($email);
$fio = urldecode($fio);
$email = urldecode($email);
$fio = trim($fio);
$email = trim($email);
if (mail("[email protected]", "Заявка с сайта", "ФИО:".$fio.". E-mail: ".$email ,"From: [email protected] \r\n")){
echo "Сообщение успешно отправлено";
} else {
echo "При отправке сообщения возникли ошибки";
}
}
?>
Существование переменной в POST массиве мы проверяем PHP функцией isset(). Восклицательный знак перед этой функцией в условии означает отрицание. То есть, если переменной не существует, то нужно показать нашу форму. Если бы я не поставил восклицательный знак, то условие дословно означало бы - "если существует, то показать форму". А это неправильно в нашем случае. Естественно, что вы можете переименовать его в index.php. Если будуту переименовывать файл, то не забудьте переименовать название файла и в строке