Встала задача организовать на сайте "Уголок веб-разработчика" форму обратной связи для сбора пользовательских мнений о том, какую тему они хотели бы видеть раскрытой на сайте. Естественно, форма не должна пропускать спам. В этой заметке я рассказываю, как сделать подобную форму.
Самый простой способ защиты формы от спама - это использование CAPTCHA. Как сделать собственную CAPTCHA можно прочитать в моей статье "Скрипт текстовой CAPTCHA для защиты от спам-ботов". Но в данном примере мы используем проект KCAPTCHA - готовое решение, разработанное Сергеем Кругловым.
Скачаем содержимое KCAPTCHA с сайта автора и обязательно сохраним в корень сайта, в котором будет выполняться наш скрипт с формой.
Далее - спроектируем форму с интеграцией модуля KCAPTCHA. Файл, содержащий форму обязательно должен быть PHP-скриптом и в самой верхней строчке должен содержать функцию session_start().
<form method="post"> <input type="hidden" name="send" value="1"/> <p>Уважаемый гость! Если Вам интересен наш проект, предложите, пожалуйста, тему, которую Вам было бы интересно видеть разобранной на страницах нашего сайта или блога:</p> <textarea name="theme"></textarea> <br/> <img src="kindex.php?<?php echo session_name()?>=<?php echo session_id()?>" width="120" height="60"><br/> Введите анти-спам код с картинки:<br/> <input name="keystring"><br/> <input type="submit" value="Отправить"/> </table> </form>
Форма приведена без какого-либо оформления и CSS-стилей.
Далее рассмотрим скрипт отправки письма:
// получение темы $theme = htmlspecialchars($_REQUEST['theme'], ENT_QUOTES); // отправка письма $subject = 'Тема для разбора с сайта codething.ru'; $mailto = 'mike@pestr.ru'; $headers = "From: mike@pestr.ru"; $message = "Тема: $theme"; $message = iconv("utf-8", "koi8-r", $message); mail($mailto, $subject, $message, $headers);
Не забывайте заменить мой почтовый адрес mike@pestr.ru на свой!
Перед отправкой функцией mail() сообщение перекодируется в кодировку KOI8-R (так исторически сложилось для электронной почты), в данном скрипте перекодировка идет из формата UTF-8, т.к. сами скрипты я всегда сохраняю в UTF-8, но если вы решите, что вам удобнее использовать windows-кодировку, то пожалуйста, только не забудьте заменить "UTF-8" на "CP1251" в вызове функции iconv() и перекодировка также будет проходить нормально.
Теперь осталось собрать всё в кучу и добавить проверку правильности ввода CAPTCHA для защиты от спама.
Получившийся в итоге программный код будет выглядеть так:
<?php session_start(); if ($_REQUEST['send']!='') { if(!isset($_SESSION['captcha_keystring']) || $_SESSION['captcha_keystring'] != $_REQUEST['keystring']) { $message="<p>Форма не отправлена!</p>"; } else { // получение темы $theme = htmlspecialchars($_REQUEST['theme'], ENT_QUOTES); // отправка письма $subject = 'Тема для разбора с сайта codething.ru'; $mailto = 'mike@pestr.ru'; $headers = "From: mike@pestr.ru"; $message = "Тема: $theme"; $message = iconv("utf-8", "koi8-r", $message); mail($mailto, $subject, $message, $headers); $message="<p>Форма отправлена!</p>"; } } if ($message!="") { echo $message; } else { ?> <form method="post"> <input type="hidden" name="send" value="1"/> <p>Уважаемый гость! Если Вам интересен наш проект, предложите, пожалуйста, тему, которую Вам было бы интересно видеть разобранной на страницах нашего сайта или блога:</p> <textarea name="theme" ></textarea> <br/> <img src="kindex.php?<?php echo session_name()?>=<?php echo session_id()?>" width="120" height="60"><br/> Введите анти-спам код с картинки:<br/> <input name="keystring"><br/> <input type="submit" value="Отправить"/> </table> </form> <? } ?>
Конечно, код упрощен и не содержит дизайна и оформления. Отчасти это сделано специально, чтобы облегчить понимание примера.
Вставку этого кода к себе на сайт я сделал через тег <IFRAME>, можно посмотреть, как это работает на главной странице сайта codething.ru.