Скрипт отправки форм на Email и в Telegram

21.12.2017 23.02.2018 14 минут

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

Плюсы описываемого скрипта:

Теория

Для того, чтобы мы с вами разговаривали на одном языке, покажу как в коде страницы может выглядеть HTML форма:

<form method="POST" action="mail.php">
  <input name="Имя" placeholder="Имя">
  <input type="tel" name="Телефон" placeholder="Телефон" required>
  <input type="submit" value="Отправить">
</form>

Существует 2 основных метода передачи данных из заполненной формы на сервер: GET и POST. GET лучше не использовать, так как он имеет ограничение по длине отправляемого запроса. Указанием method="POST" мы включаем отправку методом POST.

В action="mail.php" мы сообщаем на какой URL слать данные. URL может быть как абсолютным (http://example.com/mail.php), так и относительным, как в нашем случае (файл mail.php находится в текущем каталоге).

name="Имя" и name="Телефон" - названия полей формы. Именно эти названия будут фигурировать в уведомлениях, например:
Имя: Вася
Телефон: +7 (123) 456-78-90

placeholder="Имя" и placeholder="Телефон" - подписи полей. Этот текст будет указан внутри поля в качестве подсказки.

type="tel" у поля Телефон делает так, что при нажатии на это поле на смартфонах откроется цифровая клавиатура.

required делает поле с телефоном обязательным к заполнению. То есть, заявка не отправится, пока не будет указан телефон.

type="submit" value="Отправить" превращает поле в кнопку отправки формы. Вместо <input> может использоваться тег <button>.

Если нужна возможность прикрепления файлов, в код необходимо внести некоторые изменения. Во-первых, к тегу <form> нужно дописать атрибут enctype="multipart/form-data", во-вторых, добавить поле для файлов.

Для загрузки одного файла:

<input type="file" name="Файл">

Для загрузки одновременно нескольких файлов. Скобки [] в имени поля обязательны:

<input type="file" name="Файлы[]" multiple>

В итоге форма с файлами выглядит так:

<form method="POST" action="mail.php" enctype="multipart/form-data">
  <input name="Имя" placeholder="Имя">
  <input type="tel" name="Телефон" placeholder="Телефон" required>
  <input type="file" name="Файлы[]" multiple>
  <input type="submit" value="Отправить">
</form>

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

Более подробное описание HTML форм, полей и всех их атрибутов можно найти на htmlbook.ru

Практика

Для подключения скрипта обработки нужно прописать адрес (URL) этого скрипта в атрибуте action. Всё. Остальное скрипт сделает сам. Примет данные и файлы, разберет их и отправит на указанный email или в Telegram чат.

Скачайте скрипт, откройте в любимом редакторе и в блоке Настройки вместо mail@example.com укажите свой Email для заявок.

<?php
const NOTIFICATIONS_EMAIL = "stas@biscripter.ru";

Если хотите получать уведомления в Telegram, нужно создать бота. Для этого:

  1. Найдите контакт @BotFather и начните с ним диалог
  2. Создайте нового бота командой /newbot
  3. Придумайте ему имя. Я своего назвал Заявкер
  4. Придумайте username. Обязательно с bot на конце. Например zayavker_bot
Создание бота в Telegram

Создание бота в Telegram

@BotFather любезно создал для нас бота и предоставил его token (466450872:AAFmf6a-ihEP6t4Qc1jkOVnBZeY0osFEEfo). Скопируйте этот токен и вставьте в настройки скрипта.

<?php
const TELEGRAM_TOKEN = "466450872:AAFmf6a-ihEP6t4Qc1jkOVnBZeY0osFEEfo";

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

Создание группы с ботом

Создание группы с ботом

Чат создан, бот приглашен, осталось получить id этого чата. Отправьте в группу любое сообщение, начинающееся слешем (например /hi) затем откройте в браузере следующий URL: https://api.telegram.org/botYOUR_TOKEN/getUpdates. Вместо YOUR_TOKEN подставьте токен бота, полученный ранее. В моем случае, полный адрес будет таким: https://api.telegram.org/bot466450872:AAFmf6a-ihEP6t4Qc1jkOVnBZeY0osFEEfo/getUpdates.

На открывшейся странице найдите id чата:

id чата Telegram

id чата Telegram

Скопируйте найденное значение и вставьте в настройки скрипта.

<?php
const TELEGRAM_CHAT_ID = "-307415180";

В итоге секция настроек должна выглядеть так:

<?php
const NOTIFICATIONS_EMAIL = "stas@biscripter.ru";
const TELEGRAM_TOKEN = "466450872:AAFmf6a-ihEP6t4Qc1jkOVnBZeY0osFEEfo";
const TELEGRAM_CHAT_ID = "-307415180";

Готово. Теперь достаточно положить файл mail.php на хостинг в каталог с лендингом и указать его в качестве action в каждой форме.

> Читайте также: Увеличение конверсии лендинга

Для демонстрации давайте рассмотрим следующие сценарии использования:

Поехали…

Отправка формы → страница благодарности по-умолчанию

Просто открываем лендинг (страницу index.html) в текстовом редакторе, ищем форму и в action указываем наш mail.php:

<form action="mail.php" method="POST" enctype="multipart/form-data">
  <input name="Имя" placeholder="Имя">
  <input type="tel" name="Телефон" placeholder="Телефон" required>
  <input type="file" multiple name="Файлы[]">
  <input type="submit" value="Отправить">
</form>
Отправка формы

Отправка формы

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

Стандартная страница благодарности

Стандартная страница благодарности

Отправка формы → страница с апселлами → страница благодарности после апселла

Для того, чтобы после отправки формы редиректить посетителя на другую страницу (в нашем случае, на страницу с апселлами), нужно добавить в форму скрытое поле (type="hidden") с именем redirect и адресом страницы:

<form action="mail.php" method="POST" enctype="multipart/form-data">
  <input name="Имя" placeholder="Имя">
  <input type="tel" name="Телефон" placeholder="Телефон" required>
  <input type="file" multiple name="Файлы[]">
  <input type="hidden" name="redirect" value="upsell.html">
  <input type="submit" value="Отправить">
</form>

Теперь, отправив форму, покупатель попадет на страницу upsell.html. На ней можно предложить добавить к заказу какой-нибудь товар смежной тематики со скидкой. Форма на этой странице может выглядеть вот так:

<form action="mail.php" method="POST">
  <input type="hidden" name="Товар" value="Батарейки пальчиковые - 6 шт.">
  <input type="hidden" name="leadId">
  <input type="submit" value="Добавить к заказу">
</form>

Всего 2 поля (и те скрыты) и кнопка. В поле Товар указано название добавляемого товара (в моем случае, это батарейки). Для того, чтобы mail.php распознал в принимаемой форме апселл, в поле leadId нужно записать ID заказа. Этот ID формируется автоматически при отправке формы и подставляется к адресу редиректа (пример: http://example.com/upsell.html?leadId=123456). Нам остается только взять leadId из адреса и добавить к форме. Есть 2 способа сделать это:

  1. Переименовать upsell.html в upsell.php и изменить форму следующим образом:

    <form action="mail.php" method="POST">
      <input type="hidden" name="Товар" value="Батарейки пальчиковые - 6 шт.">
      <input type="hidden" name="leadId" value="<?php echo $_GET['leadId'] ?>">
      <input type="submit" value="Добавить к заказу">
    </form>

  2. Ничего не переименовывать, а просто добавить на страницу (перед закрывающим тегом </body>) небольшой кусок javascript кода:

    <script>
    (function(){
      var leadId = 0;
      try {
        leadId = window.location.search.split("leadId=")[1].split("&")[0];
      } catch(e) {
      }
      var input = document.querySelector("input[name='leadId']");
      if (input) input.value = leadId;
    })();
    </script>

Апселл

Апселл

Отправка формы → страница с апселлами 1 → страница с апселлами 2 → и т.д.

Добавив к форме апселла редирект, можно настроить сколь угодно длинную цепочку апселлов. Например, в основной форме указать редирект на страницу upsell1.html:

<form action="mail.php" method="POST">
  <input type="hidden" name="Товар" value="Батарейки пальчиковые - 6 шт.">
  <input type="hidden" name="leadId">
  <input type="submit" value="Добавить к заказу">
  <input type="hidden" name="redirect" value="upsell1.html">
</form>

На upsell1.html указать редирект на upsell2.html:

<form action="mail.php" method="POST">
  <input type="hidden" name="Товар" value="Нож-кредитка">
  <input type="hidden" name="leadId">
  <input type="submit" value="Добавить к заказу">
  <input type="hidden" name="redirect" value="upsell2.html">
</form>

С upsell2.html - на upsell3.html и так далее, пока не надоест. То есть, посетитель, оставив заявку, попадет на страницу с предложением добавить к заказу батарейки. Нажав на кнопку Добавить к заказу, он попадет на страницу с предложением ножа-кредитки со скидкой и т.п. Я встречал подобное на лендингах Дунаева. Могу только догадываться о его среднем чеке =)

Отправка формы → страница с апселлами с добавлением товаров без перезагрузки страницы

Для того, чтобы добавлять товары к заказу без перезагрузки страницы (удобно, если на странице апселлов предлагается несколько товаров), скачайте и подключите к ней файл forms.js непосредственно перед закрывающим тегом </body>:

    <script src="forms.js"></script>
</body>
Апселл без перезагрузки

Апселл без перезагрузки

Отправка формы без перезагрузки страницы

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

Отправка формы без перезагрузки

Отправка формы без перезагрузки

Имейте в виду, что подключение forms.js не отменяет настроенный ранее редирект, поэтому, если он вам не нужен, не забудьте удалить:

<input type="hidden" name="redirect" value="upsell.html">

Обработка ошибок

Если по какой-то причине заявка не отправилась ни на Email, ни в Telegram, посетителю будет показано сообщение об ошибке с просьбой повторить попытку позднее. Обязательно проверяйте работу всех форм перед запуском трафика на сайт

Ошибка отправки формы

Ошибка отправки формы

В PHP существует ряд ограничений (настраиваемых) на отправку форм. Одно из них - максимальный размер отправляемых методом POST данных (текст + все вложенные файлы). В настройках PHP это ограничение регулируется переменной post_max_size. При превышении этого размера, форма не отправится, а посетитель увидит ошибку:

Превышение post_max_size

Превышение post_max_size

Следующее ограничение - максимальный размер файла (каждого), загружаемого через форму. Регулируется настройкой upload_max_filesize. Сообщение об ошибке выглядит так:

Превышение upload_max_filesize

Превышение upload_max_filesize

Аналитика

Если после отправки формы вы редиректите покупателя на другую страницу, цель вешается на посещение этой страницы, тут всё просто и вы, скорее всего уже делали это много раз.

При отправке формы с помощью ajax (без перезагрузки) настроить цели тоже не особо сложно. Во-первых, их нужно предварительно создать:

В скрипте forms.js уже есть строки:

if (xhr.status === 200) {
  if (typeof dataLayer !== 'undefined') {
    dataLayer.push({
      'event': 'submit'
    });
  }
}

Они вызываются сразу после успешной отправки формы и, если вы используете Google Tag Manager, передают в dataLayer событие с именем submit. В интерфейсе GTM создайте триггер на это событие, а к триггеру - теги на срабатывание целей в Google Analytics, Яндекс.Метрике и т.д.

GTM. Триггер отправки формы

GTM. Триггер отправки формы

GTM. Тег для отправки цели в Google Analytics

GTM. Тег для отправки цели в Google Analytics

GTM. Тег для отправки цели в Яндекс.Метрику

GTM. Тег для отправки цели в Яндекс.Метрику

Если GTM вы не используете и вам нужна только Метрика, можно добавить вызов цели прямо в forms.js:

if (xhr.status === 200) {
  if (typeof dataLayer !== 'undefined') {
    dataLayer.push({
      'event': 'submit'
    });
  }
  if (typeof yaCounterXXXXXXXX !== 'undefined') {
    yaCounterXXXXXXXX.reachGoal('submit');
  }
}

Вместо XXXXXXXX подставьте номер своего счетчика.

Остался еще один вариант: вы не используете редирект и не отправляете форму без перезагрузки, а оставили всё как есть и пользователю показывается встроенная страница благодарности. Как в таком случае настроить аналитику?

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

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

Партнерка LetyShops

Партнерка LetyShops

В кнопке - партнерская ссылка на лендинг сервиса. Всё просто. Люди переходили и регистрировались. Я даже выводил деньги пару раз. Давно это было, но сейчас зашел в кабинет Admitad и увидел вот это:

Баланс Admitad

Баланс Admitad

Какие-то копейки капают до сих пор =)

Почему не приходит Email?

Самый распространенный вопрос. А вот самые распространенные причины:

Письма приходят, но попадают в спам

В 80% случаев проблема именно в этом. Проверьте папку Спам. Чтобы письма не попадали в спам, нужно правильно настроить почтовый сервер, но эта тема выходит за рамки статьи.

Выключена поддержка PHP

Проверьте, включен ли на вашем хостинге PHP.

Shared хостинг: погуглите как включить PHP в ИМЯ_ВАШЕГО_ХОСТИНГА или обратитесь в поддержку.

VPS/VDS: поищите как настраивается PHP в используемой на сервере операционной системе.

В PHP выключена поддержка отправки писем

Shared хостинг: некоторые хостинг-провайдеры блокируют отправку писем с помощью функции mail. Гуглите как включить PHP mail в ИМЯ_ВАШЕГО_ХОСТИНГА или напишите в поддержку.

VPS/VDS: здесь всё сложней, вам возможно потребуется сначала установить и настроить почтовый сервер. Гугл/фрилансер/ знакомый сисадмин в помощь. Или вы можете обратиться ко мне.

На хостинге стоит старая версия PHP

Shared hosting: убедитесь, что текущая версия PHP - не меньше, чем 5.6. У большинства хостинг-провайдеров в панели управления есть настройка, за это отвечающая.

VPS/VDS: установите свежую версию PHP.

Ваши вопросы

Если есть пожелания/вопросы по работе или функционалу скрипта - пишите в комментарии. Нашли ошибки в скрипте - туда же, поправлю.

Пожалуйста, не пишите Я установил скрипт, но заявки не приходят. Такие комментарии абсолютно не информативны и я буду их сразу удалять. Если вы все сделали как описано, но скрипт всё равно не работает - то эту проблемы мы в комментариях не решим, поэтому пишите сразу мне в личку в vk, будем разбираться.

Файлы

Все скрипты и примеры из статьи на github.

Подписывайтесь, чтобы не пропустить следующую статью.

Please share

Читайте также

Подпишитесь на обновления блога в Vk и/или в Telegram