программирование на PHP
Bullet (black) Email иконка RSS иконка
  • Урок 11. Функция отправки почты на PHP. Создаем форму обратной связи на сайте.

    Август 7th, 2008 Александр 124 Комментариев

    В данном уроке я хочу подойти к проблеме реализации обратной связи с администрацией сайта. Частично, такую возможность мы рассматривали в 5 уроке. В нем мы разбирали скрипт добавления комментариев на сайте, ну или попросту пример использования гостевой книги в качестве средства связи. Но что если на сайте необходимо организовать связь только администрацией, с целью получения приватных сообщений? Для этого идеально подходит форма обратной связи с администратором сайта.Вообще, организовать связь можно несколькими способами:

    1. Размещение адреса электронной почты на какой либо странице,в качестве контактных данных , что конечно же со временем повлечет огромные объемы спама;
    2. Создание ссылки типа <a href=”mailto:admin@site.ru?subject=Технический вопрос”>Написать письмо</a>. Такая ссылка, попросту будет запускать почтовую программу, по умолчанию установленную на вашем компьютере. Этот способ  простой, но опять же это не спасет вас от спама.
    3. Создание формы обратной связи с проверкой на валидность заполняемых данных, установкой простой капчи, будет лучшим способом, т.к. сведет к минимуму получение спама с вашего сайта.Давайте разберем этот пример.

    Детали

    Чтобы  создать форму отправки сообщения на сайте, нам необходимо ознакомиться с некоторыми новыми функциями:

    • Функция отправки почты mail();
    • Использование регулярных выражений, предназначенных для проверки заполняемых данных;
    • Установка графической капчи, т.е. подтверждение набора символов, отображаемых на картинке.

    Схема работы нашего скрипта

    Форма ввода данных

    Форма будет представлять из себя html-блок, который содержит несколько полей: имя, обратный эл.адрес, поле ввода сообщения.
    Что то похожее мы рассматривали в 5 уроке. Но сейчас мы немного модернизируем нашу форму:

    index.php

    [cc lang="php"]
    session_start();
    //Генерируем шестизначный ключ, далее передаем его в скрытом поле
    if($_SESSION['uid'] =='') {$_SESSION['uid'] = mt_rand(100000,999999); }

    echo '

    Ваше имя



    Ваш e-mail



    Сообщение






    ‘;

    ?>
    [/cc]

    Форма содержит функцию инициализации сессии. Далее в начале страницы мы регистрируем имя сессии uid и присваиваем ей сгенерированный ключ ($_SESSION['uid'] = mt_rand(100000,999999);), который мы передаем скрытым параметром (sid) скрипту send.php. Смысл в том, что если робот будет использовать прямое обращение к скрипту send.php, то ничего сделать он не сможет, т.к. не будет обладать необходимым ключем, который присваивается ТОЛЬКО на странице index.php.

    Скрипт отправки почты

    Сам скрипт отправки почты расположен в файле send.php. И содержит в себе логические операции, а также подключение необходимых функций и конфигов. Здесь происходит извлечения данных из массива $_POST и проверяем их.

    send.php

    [cc lang="php"]
    //Запускаем сессию
    session_start();
    //Подключаем функции
    include("functions.php");
    //Подключаем файл конфигурации
    include("config.php");

    //Создаем шапку
    echo '


    ‘;
    //Проверяем совпадает ли переданный идентификатор с реальным
    if($_SESSION['uid'] == $_POST['sid']){

    //Разрушаем сессию
    session_destroy();

    //Чистим входящие данные
    $name = strip_tags(stripslashes(substr($_POST['name'],0,20)));
    $mail = strip_tags(stripslashes(substr($_POST['email'],0,30)));
    $message = strip_tags(stripslashes(substr($_POST['message'],0,3000)));
    //Проверяем, была ли нажата кнопка
    if($_POST['do']) {
    //Проверяем, было ли введено имя
    if($name != ”) {
    //Запускаем функцию по проверке e-mail адреса
    if(checkmail($mail) !== -1) {
    //Проверяем, было ли введено сообщение письма
    if($message != ”) {
    //Подключаем файл шаблона
    include(“tpl.php”);
    //Передаем функции необходимые аргументы
    if(sendmail($mailto,”Сообщение с сайта”,$tpl,$headers) !== FALSE) {
    //При условии что функция сработала – выводим сообщение об удачно завершенной операции
    echo ‘

    Сообщение отправлено
    назад

    ‘;

    }
    else {
    //Иначе, сообщаем об ошибке
    echo ‘

    Возникла ошибка при отправке, повторите позднее
    назад

    ‘;

    }
    }

    else {echo ‘

    Введите комментарий назад

    ‘;}
    }
    else {echo ‘

    Введите корректный электронный адрес назад

    ‘;}
    }
    else { echo ‘

    Введите имя назад

    ‘; }
    }
    else {echo ‘

    назад

    ‘; };

    }
    //Здесь срабатывает исключение, если страница была обновлена клавишей F5
    else { echo ‘

    Ошибка

    ‘;
    //Разрушаем сессию
    session_destroy();}

    echo ‘‘;
    //Разрушаем сессию
    session_destroy();
    ?>
    [/cc]

    В самом начале файла происходит инициализация сессии, после этого подключаем файл с функциями и файл конфигурации. Также мы подключаем файл шаблон, который рассмотрим позже.
    Далее переходи к логической части, которая проверяет правильность вводимых данных. Здесь используем стандартные конструкции if else. Первым проверяется переданный ключ, содержащийся в $_POST['sid'] и ключ зарегистрированный в  $_SESSION['uid'] на главной странице. Если ключи совпадают, переходим к чистке входящих данных, предварительно разрушив сессию. Мы делаем это специально, для того чтобы при обновлении страницы клавишей F5, повторно не происходило отправки сообщения,т.е. при вызове функции session_destroy(), идентификатор $_SESSION['uid'] будет уничтожен. Далее производим проверку всех остальных данных, если они являются пустыми, то попросту выводим соответствующее сообщение.

    Хочу обратить ваше внимание на то, как происходит проверка электронного адреса. Здесь в условии стоит функция, которая при неверном или пустом e-mail’е возвращает -1.

    //Запускаем функцию по проверке e-mail адреса
    if(checkmail($mail) !== -1) {}

    Соответственно, если электронный адрес был введен некорректно, то выводим сообщение об ошибке. После того как были проверены входящие данные, мы передаем полученные данные данные в качестве аргументов функции sendmail(), где:

    • $mailto - адрес куда необходимо отправить сообщение (указывается в файле конфигурации);
    • $subject – тема сообщения;
    • $tpl- шаблон, включающий в себя имя отправителя, электронный адрес и текст сообщения;
    • $headers – заголовки(находятся в файле конфигурации, вынесены туда специально).

    Если функция вернула TRUE (“положительный ответ”) выводим сообщение об успешной отсылке письма, иначе сообщаем пользователю что возникла ошибка.

    Функция отправки почты

    Файл functions.php содержит всего 2 функции:

    checkmail() . Необходима для проверки введенного электронного адреса. Основой является функция preg_match(), которая ищет совпадения в строке и проверяет его при помощи регулярных выражений по шаблону name_of_box@domain.* .Если функции передается пустота, то она возвращает -1, если e-mail адрес не является валидным возвращается -1. Если электронный адрес соответствует шаблону то возвращается значение $mail. Эти результаты мы и рассматривали выше. Я нехочу сейчас углубляться в регулярные выражения, т.к. это достаточно емкий материал, поэтому я взял уже готовый пример, предварительно немного его доработав.

    sendmail(). Отправляет почту и возвращает TRUE при удаче. В ней как раз и используется функция mail(), которая отправляет почту по указанному адресу. Её полный синтаксис таков:

    mail(адрес_куда_отправить,тема_сообщения,текст_сообщения, заголовки);

    Хочу предупредить вас, что на многих серверах используется ограничение на отправку писем, поэтому если скрипт будет работать с перебоями, то возможно это проблемы на хостинге. На бесплатных хостигах функция mail() может быть вообще отключена.

    functions.php

    [cc lang="php"]

    function checkmail($mail) {
    // режем левые символы и крайние пробелы
    $mail=trim($mail);
    // если пусто - выход
    if (strlen($mail)==0) return -1;
    if (!preg_match("/^[a-z0-9_-]{1,20}+(\.){0,2}+([a-z0-9_-]){0,5}@(([a-z0-9-]+\.)+(com|net|org|mil|".
    "edu|gov|arpa|info|biz|inc|name|[a-z]{2})|[0-9]{1,3}\.[0-9]{1,3}\.[0-".
    "9]{1,3}\.[0-9]{1,3})$/is",$mail))
    return -1;
    return $mail;
    }

    function sendmail($mail,$subject,$message,$headers) {

    if(mail($mail,$subject,$message,$headers)) { return TRUE;}
    else {return FALSE;}

    }

    ?>
    [/cc]

    Файл конфигурации

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

    config.php

    [cc lang="php"]

    // Для отправки e-mail в виде HTML устанавливаем необходимый mime-тип и кодировку
    $headers = 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'Content-type: text/html; charset=windows-1251' . "\r\n";

    // Откуда пришло
    $headers .= 'From: FeedbackForm' . "\r\n";
    //На какой адрес отвечать
    $headers.='Reply-To:'.$mail.'' . "\r\n" ;
    //Здесь укажите электронный адрес, куда будут уходить сообщения
    $mailto = "admin@site.ru";

    ?>
    [/cc]

    Шаблон письма

    Чтобы в любой момент мы могли изменить внешний вид письма, которое приходит к вам на ящик, создаем шаблон, который будет являться телом письма.

    tpl.php

    [cc lang="php"]

    $tpl = '

    Письмо от: ‘.$name.’ ‘.$mail.’
    ‘.$message.’
         


    ‘;

    ?>
    [/cc]

    Как видите это простой html-код, присвоенный переменной $tpl. В необходимых ячейках находятся переменные $mail,$name и $message. При отсылке письма они будут заменятся на данные введенные в форме.

    Создание капчи

    Скрипт капчи, который я приведу, достаточно простой. Его цель остановить “простых” спам-ботов. Сама капча представляет собой изображение, которое будет генерироваться скриптом. Он будет использовать 3 типа подложки и шрифт, который усложнит распознавание изображения. Ниже преведен код, отвечающий за его построение:

    image.php

    [cc lang="php"]
    //Запускаем сессию
    session_start();
    //Создаем изображение из 3-х возможных подложек
    $im=ImageCreateFromJpeg(round(mt_rand(1,3)).".jpg");
    //Генерируем цвет надписи
    $color=ImageColorAllocate($im,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
    //Формируем надпись, используя шрифт
    ImageTtfText($im, 23, mt_rand(-5,5), 3, 30, $color, "addict.ttf", $_SESSION['uid']);
    //Указываем тип содержимого
    Header("Content-type: image/jpeg");
    //Создаем и выводим изображение
    ImageJpeg($im);
    //Разрушаем изображение
    ImageDestroy($im);
    ?>
    [/cc]

    В уроке по созданию счетчика мы уже работали с графической библиотекой, но там было немного проще, т.к. для построения надписи использовали функцию imagestring(). В нашем случае мы используем шрифт, поэтому функция для построения надписи будет imageTtfText().Приведу её краткое описание, и какие аргументы необходимы для построения надписи:

    imageTtfText(подложка,размер,угол_наклона,отступ_по_x,отступ_по_y,цвет,шрифт,текст_надписи);

    В нашем примере я использовал разный угол наклона надписи, т.е. он генерируется функцией mt_rand, и варьируется от -5 до 5 градусов, все остальные атрибуты нам известны, подложка – $im, отступ от верхнего левого края  подбираем самостоятельно, цвет у нас определен в переменной – $color, шрифт тоже известен, он лежит в той же папке что и скрипт, текст надписи является шестизначным кодом сгенерированным на главной странице – $_SESSION['uid'].
    Сохраняем файл в папке img, с именем image.php. В этой же папке у нас должны находиться подложки для построения изображения (1.jpg, 2.jpg, 3.jpg) и шрифт addict.ttf. Чтобы капча заработала, необходимо внести некоторые изменения в файл index.php.

    index.php

    Здесь вместо hidden поля:
    <input name=”sid” type=”hidden” value=”‘.$_SESSION['uid'].’”>
    вставляем следующий код:
    <img src=”img/image.php” alt=”" width=”120″ height=”33″ border=”0″ /><br/> <input style=”margin:5px;font-size:30px;height:34px;width:120px;”  type=”text” name=”sid” value=”" size=”6″ maxlength=”6″/>

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

    Скрипт обратной формы связи

    В архиве предоставлены скрипты, а также изображения и шрифты.
    Пример работы можно посмотреть здесь

    feedbackform.zip

    Ссылки

    http://php.spb.ru/php/regexp.html

    http://ru.wikipedia.org/wiki/капча

    Заключение

    В принципе это неплохой скрипт для связи с администратором сайта. В нем используется грамотная проверка вводимых данных, а также обработка ошибок. Снижается к минимуму риск попадания вашего e-maila в листы спам рассылок.  Для более эффективной борьбы используется капча ( дополнительное поле, в которое необходимо ввести символы с изображения), которую вы можете по желанию самостоятельно подключить. Считаю что данный урок поможет вам в понять как отправить почту, создать форму обратной связи и защитить от спама свой почтовый ящик.

    UPDATE

    В уроке был доработан файл send.php и index.php, теперь кнопка имеет простой стандартный вид и тип submit. В файле send.php проверяется только наличие переменной $_POST['do']. Связано это с неккоректной передачей переменной, если кнопка имеет тип image.

    Google Bookmarks БобрДобр.ru Memori.ru rucity.com МоёМесто.ru Mister Wong
    rss-лентаПодпишись на RSS, впереди много интересного.

    124 Responses to “Урок 11. Функция отправки почты на PHP. Создаем форму обратной связи на сайте.”

    Страницы: [13] 12 11 10 9 8 7 6 5 4 3 … 1 » Show All

    1. 124
      IvanNo Gravatar Says:

      ваша форма НЕ работает как не раз уже было написано выше. действительно – то что написано в уроке и то что в архиве различается…
      вы даете неработающий пример действуя по принципу “догадайся сам” ??? или это скрытая издёвка человека который уже освоил данную ступень знаний?? если уж не хотите выкладывать работающие примеры – так и пишите “пример не рабочий”
      в любом случае учится нужно наглядно чтоб понять КАК это работает. (имеется ввиду php).
      чтоб не быто голословным выдается например такая ошибка при попытке отправить (из вашей формы)

      Warning: session_destroy() [function.session-destroy]: Trying to destroy uninitialized session in /home/www/тест.ру/11/send.php on line 73

    2. 123
      ARtNo Gravatar Says:

      Спасибо, он мне пригодится. Как раз искал такой скрипт. Напишу о freshcoder.ru статью, классный ресурс

    3. 122
      RLNo Gravatar Says:

      Скрипт работает, тем более что тут разжевано проще некуда, дописал в строку с регулярным выражением домен ru, и даже примитивную здесь капчу(она действительно крайне простая по степени защиты) заменил на более продвинутую.

    4. 121
      МарияNo Gravatar Says:

      Подскажите, пожалуйста… Ошибок не выдает, выдает сообщение, что письмо отправлено, но на почту оно не приходит.. Где может быть ошибка?

    Страницы: [13] 12 11 10 9 8 7 6 5 4 3 … 1 » Show All

    Leave a Reply


freshcoder.ru © 2008 • При использовании материалов активная ссылка на сайт обязательна.
SEO Powered by Platinum SEO from Techblissonline