Сервис email-рассылки - это главный инструмент email-маркетолога, его основная среда работы. В идеале он должен комплексно решать задачи бизнеса в сфере email- или direct-маркетинга. При чем, в контексте и функционала, и подхода к профессии.
Подход к профессии - это то, как идеологи сервиса понимают задачи, потребности, вызовы внутри сообщества email-маркетологов. Именно на этой базе строится функционал их продукта.
Поэтому простой способ не ошибиться с выбором сервиса email-рассылок - ознакомиться с контентом, который генерируется в его рамках. Если ваши взгляды совпадают со взглядами идеологов, скорее всего, сервис вам подойдет.
Если вы выбрали и начали развиваться внутри неподходящего сервиса, вам предстоит болезненный, долгий и ресурсозатратный переезд. Поскольку сегодня email-маркетинг базируется, преимущественно, на автоматизации, провести реинтеграцию, качественно перенести все базы данных в другой сервис будет весьма сложно.
Поэтому, определяясь с выбором, пройдите по такому чек-листу:
Сервисов для email-рассылок очень много. Только в рейтинге EmailSoldiers участвует порядка 20 платформ. Разумеется, в рамках одной статьи вы не сможете найти полноценный обзор всех инструментов, поэтому мы сосредоточимся только на некоторых из них.
В обзор также не вошли сервисы:
Первое - при чтении обзоров, учитывайте, что возможности и функционал сервисов меняются регулярно. То, что сегодня можно назвать фишкой, завтра уже станет анахронизмом. Так что не слишком углубляйтесь в частности, обращайте внимание, на чем базируется сервис, в чем его главная идея.
Второе - определитесь, к какой нише относится ваш бизнес и какие задачи вы хотите решать в области email-маркетинга. Обращайте внимание на клиентский портфель сервисов. Если в нем есть похожие на ваш проекты - возможно, и вам подойдет это решение.
Третье - учитывайте мнение всех, кто будет работать в команде email-маркетинга.
Четвертое - не рассуждайте о стоимости сервиса в узкой перспективе. Учитывайте также: какие затраты понадобятся для настройки интеграции, сколько будут стоить кастомные настройки, есть ли у сервиса платный функционал и нужен ли он вам.
Разные сервисы монетизируются по-разному. Например, MailChimp можно использовать бесплатно на базовых настройках, в нем есть функционал, доступный только для платных аккаунтов, а ещё есть pro-уровень. То же касается Getresponse.
В eSputnik или Unisender абсолютно весь функционал доступен в любом тарифе.
Пятое - обращайте внимание на то, как позиционирует себя сам сервис. Например, сервис для ecommerce проектов с базой от 50 000 контактов. Если вы являетесь целевой аудиторией компании, то, скорее всего, она предлагает специальные решения для вашей ниши.
Этот обзор, как и любые другие обзоры - очень субъективен. Как бы вы ни старались объективизировать информацию, всегда столкнетесь с противоречием:
Важно! В конце статьи будет таблица со сравнением сервисов email-рассылки по нескольким критериям.
До этого я рассмотрю только особые, в основном, уникальные характеристики сервисов.
Идеально подойдет: контентным проектам, малому и среднему бизнесу для решения несложных задач.
Главные особенности.
1. Автоматизация, ориентированная на результат
Раньше в области автоматизации сервис предлагал только планировщик писем. При этом, в отчетах накапливались данные обо всех отправляемых письмах цепочки, но каждый день - заново. Таким образом, посмотреть общую статистику триггерного письма было нельзя.
Теперь сервис предлагает новую автоматизацию, в которой можно строить сценарии, состоящие из «действий», «узлов» (проверок и анализа) и «результата» (успех или провал). Отчасти верный и интересный подход, но довольно спорный.
Зато теперь можно отслеживать статистику по каждой цепочке и фиксировать, сколько пользователей пришло к «успеху», а сколько - к «провалу».
С их помощью можно наблюдать за активностью аудитории, исследуя разные типы писем по отдельности. Аналогичная статистика есть в eSputnik, но здесь она появилась раньше.
Это не уникальная особенность, она есть и в других сервисах, но стоит сказать о ней пару слов. Вы можете создавать сегменты внутри списков, используя личный рейтинг пользователей, который формируется по их активности. Правда, принцип, по которому присваивается рейтинг, не до конца прозрачен и проверить достоверность такой сегментации сложно.
В целом, мне не очень нравится сегментация в Unisender. Как и в Mailchimp, она строится на двух понятиях: списки и сегменты внутри списков. При этом, нельзя объединять или комбинировать сегменты из разных списков в один, не прибегая к экспорту-импорту.
Общие впечатления
Очень популярный сервис на СНГ пространстве, с хорошей аналитикой и визуализацией, но с ограниченными возможностями в сегментации и автоматизации.
Идеально подойдет: интернет-магазинам и маркетплейсам.
Главные особенности.
Отчеты eSputnik позволяют очень быстро понять, если с письмом что-то не так. Статистика по доменам покажет, если вы попали в спам, даже без обращения к PostMaster. Такая же есть и в платной версии MailChimp.
В отличие от других сервисов, здесь вы можете отслеживать не только эффективность рассылок в динамике, но и состояние контактной базы, смотреть с какой скоростью она растет, из каких источников пополняется, можете видеть динамику прироста отдельных групп и многое другое.
Дополнительный бонус - интеграция с BigQuery для формирования кастомных отчетов.
2. Гибкая сегментация
Огромное количество условий и всего три типа групп позволяют создавать какие-угодно комбинации. Самая востребованная в ecommerce - сегментация по RFM-матрице. Например, вы можете создать группу «Клиенты с количеством покупок больше 10, со средним чеком $100, совершившие последнюю покупку 30 дней назад».
Сегментация - наверное, самая сильная сторона eSputnik. И идеологи сервиса планируют активно развивать эту сторону, открывая ещё больше возможностей.
3. Гибкая автоматизация
Несмотря на то, что сервис не интегрирован практически ни с одной CRM/CMS платформой, его API позволяет решать любые маркетинговые задачи.
На этапе интеграции вам точно понадобится программист, зато авто-начинка сервиса позволит забыть об этом в будущем. У пользователя есть доступ ко всем событиям и данным, которые передаются в систему. Вы легко сможете жонглировать любыми массивами для создания самых сложных и запутанных сценариев.
4. Решения для интернет-магазинов
За счет того, что сервис сфокусирован на ecommerce, он предлагает готовые решения, необходимые интернет-магазинам: , товарные рекомендации, реактивационные триггерные сообщения, интеграция с базой заказов и многое другое.
5. Редактор писем, которому нет равных
Новый редактор писем (приложение Stripo , если вы хотите воспользоваться им, работая с другим сервисом) - несомненно, одна из сильных сторон продукта.
Здесь вы сможете создать любое письмо с нестандартным дизайном, используя только ручной интерфейс. При этом, у вас также есть доступ к коду всего письма и отдельным его элементам, что исключают другие редакторы.
В интерфейсе вы также можете настроить адаптивный дизайн и существенно изменить верстку письма для мобильных телефонов.
Редакторы других сервисов позволяют вручную создавать относительно простые шаблонные письма. Для MailChimp, которым пользуются, преимущественно, на Западе, это точно не проблема. Но если у вас есть необычный сложный дизайн, то придется верстать его отдельно, а затем заливать в систему готовый код.
Единственный недостаток редактора eSputnik - за счет большого количества опций в интерфейсе письмо весит довольно много и иногда нужно вручную удалять лишний код.
Общие впечатления
В целом сервис демонстрирует функционал, характерный больше для «маркетинг +» уровня, а если говорить о ценовой политике - доступнее многих более слабых платформ.
Идеально подойдет: контентным проектам, малому бизнесу.
Главные особенности.
Не уверена, что можно назвать это преимуществом, но особенностью - точно. Не так давно автоматизация была платной опцией MailChimp, теперь она доступна всем пользователям. Тот, кто не очень дружит с программированием, легко разберется с тем, как она работает, так как разные задачи здесь объединены логическими блоками. Например:
Простые цепочки, запускаемые триггерами определенного типа, создаются и редактируются очень легко. В аналитике вы видите статистику не только отдельных триггерных писем, но и всей цепочки.
2. Интеграция с большим количеством платформ
Поскольку сервис - мировой лидер, большинство компаний интегрируются с ним по своей инициативе. И это удобно. Например, работа в связке MailChimp-SUMO - сплошное удовольствие.
Я назвала сервис оптимальным для контентных проектов еще и потому, что он позволяет генерировать внутри себя посадочные страницы и даже добавлять в цепочки писем рекламные объявления. Отличные инструменты, сопровождающие эту нишу.
4. Отслеживание выполненных целей
Это действительно ценный отчет, которого нет, например, в eSputnik. Функция называется Analytics360 и доступна только для pro-аккаунтов. С ее помощью вы сможете отслеживать конверсии, доход, выполненные цели, считать ROI.
5. Ручная кастомизация всего, что связано с формами подписки
Регулируйте вручную, как будут выглядеть формы и страницы подписки, отписки, обновления данных, попапы и статические формы. Легко устанавливайте сгенерированный код на сайт. То, чего не хватает в eSputnik.
Недостатки
Сегментация - то, что больше всего не нравится мне в MailChimp. За счет того, что сервис монетизируется, отталкиваясь от общего количества пользователей в каждом списке по отдельности, здесь очень сложно провести какие-либо манипуляции с группами, не удвоив размер своего тарифного плана. Не говоря о том, что если один пользователь находится в трех разных списках, чтобы покинуть базу, ему придется отписаться от всех трех.
Общие впечатления
Сервис массовый с огромным количеством пользователей, поэтому его функционал - универсальный и довольно простой. Для новичков - отличный выбор. Pro-функционал хороший, но на рынке есть более доступные и универсальные решения.
Идеально подойдет: образовательным платформам, инфобизнесу, b2b.
Главные особенности.
1. Инструменты комплексного маркетинга
Я уже упоминала о лендингах, которые можно создавать прямо в MailChimp и использовать их в email-кампаниях. Это не так сложно, если честно, учитывая, что редактор - всё тот же, что и редактор писем. Красивый маркетинговый ход.
Но у Getresponse есть и другие фишки, кроме лендингов, - платформа для проведения вебинаров, сервис для создания опросов.
Отличное сочетание для инфобизнеса и образовательных платформ.
CRM-вкладка - ещё одна находка для тех, кто работает с небольшими базами подписчиков и длинными этапами сделок. Этот функционал окончательно определил аудиторию, на которую ориентируется сервис.
2. Шаблоны автоматизации
Примерно та же история, что с MailChimp, но удобнее. Шаблонов действительно много. Вам не нужно разбираться, как работают цепочки для достижения тех или иных целей - просто берите и используйте их.
Если у вас есть регулярно обновляемый блог, с помощью RSS модуля вы сможете настроить отправку дайджеста с заданной регулярностью по заданному шаблону заданной группе получателей. Функционал очень удобный. Аналогичный есть в MailChimp и Unisender.
4. Скоринг и тегирование пользователей
За любое выбранное вами действие присваивайте пользователю баллы. Такую сегментацию можно использовать для создания более персонализированных цепочек. Аналогично - с тегами. Отмечайте пользователей особыми метками и меняйте коммуникацию с ними.
Общие впечатления
Интерфейс очень френдли, есть масса обучающих хорошо визуализированных материалов.
Идеально подойдет: малому и среднему бизнесу.
Главные особенности.
Конечно, это не решающее преимущество, но особенность, которой, по крайней мере, нет в других обозреваемых сервисах.
Многоканальность - одна из фишек сервиса. Вам доступны не только email, но и sms, push, viber каналы коммуникации. Недостаток в том, что все эти каналы нельзя комбинировать в одном сценарии. Для каждого из них нужно использовать свою автоматизацию.
Зато можно создавать нестандартные формы подписки на push, например, всплывающие popup-окна.
SMTP (Simple Mail Transfer Protocol) - предоставляемое сервисом решение для отправки транзакционных сообщений. Вы можете интегрировать его со своей системой отправки транзакционных сообщений, при этом, контролировать доставляемость и смотреть статистику отправленных писем в аккаунте SendPulse.
Надежные серверы, выделенные IP адреса, SPF и DKIM записи увеличивают вероятность того, что ваши письма не попадут в спам.
Общие впечатления
Сервис отлично подходит для несложных задач, в интерфейсе нет ничего лишнего, в нем легко разберется новичок. Но сегментация практически отсутствует, функционал слабый для среднего и крупного бизнеса.
Критерий / Сервис | |||||
---|---|---|---|---|---|
Редактор писем | Адаптивный | Адаптивный | Адаптивный | Адаптивный, ограниченные возможности | |
Сегментация | Средний уровень | RFM сегментация, высокий уровень гибкости | Высокий уровень | Средний уровень | Средний уровень |
Аналитика | Средний уровень | Высокий уровень | Высокий уровень | Средний уровень | Средний уровень |
Интеграция | API, 25+ платформ | API, Zapier | API, 200+ платформ | API, 200+ платформ | API, 25+ платформ |
Автоматизация | Есть планировщик рассылок, автоматизация в бета-режиме | Есть редактор сценариев и система учета событий | Есть редактор сценариев, скоринг, тегирование клиентов | Автоматизация, основанная на задачах маркетинга | Есть редактор сценариев |
Мультиканальность | Email, SMS | Email, SMS, Push, Viber | Email, SMS, Push, Viber | ||
Техподдержка | Русскоязычная, несколько каналов, ответ в рабочее время — в течение 10 минут | Русскоязычная, email, чат, ответ в течение 30 минут | Англоязычная, несколько каналов, ответ в рабочее время — в течение 2-3 часов | Русскоязычная, несколько каналов, ответ в рабочее время — в течение 10 минут | |
Ежемесячный тариф при объеме базы в 10 000 контактов | $51 | $59 | от $65 | от $80 | от $35 |
Самое важное в выборе сервиса - определиться со своими целями и задачами . Если цели и задачи станут вашим основным критерием, вы сможете найти ответ, подходит ли вам сервис email рассылки, даже пообщавшись с его менеджером по продажам. Так как мало кто будет брать на себя ответственность за обещание того, что не в силах выполнить.
Агентства или независимые email-маркетологи тоже имеют весьма аргументированную позицию в отношении сервисов. Узнайте - может ли опытный маркетолог решить ваши задачи. Если да, выясните - какой сервис он собирается для этого использовать.
Пообщайтесь с идеологами сервиса - узнайте, как они подходят к решению задач маркетологов. Это многое расскажет о функционале их продукта.
Зарегистрируйтесь и протестируйте несколько сервисов самостоятельно. Но приступайте к интеграции и автоматизации только когда будете уверены, что готовы развиваться в рамках именно этой платформы.
Если вас интересует комплексный для вашего бизнеса, и наши специалисты дадут профессиональную бесплатную консультацию .
Введение.
В этой статье я хочу рассказать о CGI интерфейсе вообще, его реализации для windows и использовании при написании CGI-программ языка ассемблер в частности. В рамки этой статьи не входит полное описание CGI, так-как в Интернете материала по этому вопросу просто море и пересказывать все это здесь я просто не вижу смысла.
Теория CGI .
CGI – (Common Gateway Interface) – Общий Шлюзовый Интерфейс. Как не трудно догадаться интерфейс этот служит шлюзом между сервером (здесь я подразумеваю программу - сервер) и какой-либо внешней программой написанной для ОС на которой этот самый сервер запущен. Таким образом CGI отвечает за то, каким именно образом данные будут переданы от программы-сервера к CGI-программе и обратно. Интерфейс не накладывает никаких ограничений на то, на чем должна быть написана CGI-программа, это может быть как обычный исполнимый файл, так и любой другой файл – главное, чтобы сервер смог его запустить (в среде windows это например может быть файл с расширением, привязанным к какой-либо программе).
С момента когда Вы вызвали (например нажали кнопку формы, к которой привязан вызов CGI-программы) CGI-программу до получения вами результата в окно браузера происходит следующее:
Вэб-клиент (например браузер) создает подключение к серверу, указанному в URL;
Вэб-клиент посылает запрос серверу, запрос этот обычно делается с помощью двух методов GET или POST;
Данные из запроса клиента (например значения полей формы) передаются сервером, используя CGI-интерфейс, CGI-программе, указанной в URL;
CGI-программа обрабатывает данные клиента, полученные от сервера и генерирует на основе этой обработки ответ клиенту, который она передает по все тому же CGI-интерфейсу серверу, а он в свою очередь передает его уже непосредственно клиенту;
Сервер разрывает соединение с клиентом.
В стандартной спецификации CGI принято, что сервер может обмениваться с программой следующими способами:
Переменные окружения – они могут быть установлены сервером при запуске программы;
Стандартный поток ввода (STDIN) – с его помощью сервер может передать данные программе;
Стандартный поток вывода (STDOUT) – программа может писать в него свой вывод, передающийся серверу;
Командная строка – в ней сервер может передать некоторые параметры программе.
Стандартные потоки ввода/вывода весьма удобны и широко используются на UNIX-системах, чего не скажешь о windows, поэтому существует спецификация CGI, разработанная специально для windows-систем так и называемая «Windows CGI». Но, естественно, и стандартные потоки ввода/вывода так же можно использовать в windows CGI программировании. Здесь я не буду затрагивать стандарт «Windows CGI», и на это существует по крайней мере две причины – первая, и самая главная – на данный момент не все http-сервера под windows поддерживают эту спецификацию (в частности мой любимый Apache 1.3.19). Вторую причину вы можете наблюдать набрав в любой поисковой системе строчку «Windows CGI». Отмечу относительно этого интерфейса лишь общие детали – все данные от сервера к клиенту передаются посредством обычного для windows *.ini файла, имя которого передается программе в командной строке. При этом все данные в файле уже заботливо разбиты по секциям сервером и вам лишь остается используя функции «GetPrivateProfile*» извлечь их оттуда. Ответ серверу передается опять же посредством файла, имя которого указано в соответствующей записи ini-файла.
Какие же данные могут быть переданы клиентом CGI-программе? – практически любые. В общем случае программе передаются значения полей формы, которые заполняет клиент, но это также могут быть и какие-либо двоичные данные, например файл с картинкой или музыкой. Данные могут быть переданы на сервер двумя различными методами – это метод GET и метод POST. Когда мы создаем форму для заполнения на нашей страничке мы явно указываем каким из приведенных методов мы хотим отправить введенные пользователем данные, делается это в основном тэге формы примерно так:
При отправке данных методом GET данные браузером считываются из формы и помещаются следом за URL скрипта, за знаком вопроса, если значимых полей в форме несколько, то они передаются все через значёк «&», имя поля и его значение пишутся в URL через знак «=». Например запрос, сгенерированный браузером из формы при нажатии на кнопку, к которой привязан скрипт «/cgi-bin/test.exe», при учете что первое поле формы называется «your_name», второе – «your_age», может выглядеть так:
GET /cgi-bin/test.exe?your_name=Pupkin&your_age=90 HTTP/1.0
Использование метода GET имеет сразу несколько слабых сторон – первое и самое главное – т.к. данные передаются в URL то он имеет ограничение на количество этих самых передаваемых данных. Вторая слабость опять же вытекает из URL – это конфиденциальность, при такой передаче данные остаются абсолютно открытыми. Итак, хорошо если у нас в форме 2-3 небольших поля… встает вопрос что же делать если данных больше? Ответ – использовать метод POST!
При использовании метода POST данные передаются серверу как блок данных, а не в URL, что несколько развязывает нам руки для увеличения объема передаваемой информации, для вышеприведенного примера формы POST блок, посылаемый серверу будет примерно такой:
POST /cgi-bin/test.exe HTTP/1.0
Accept: text/plain
Accept: text/html
Accept: */*
Content-type: application/x-www-form-urlencoded
Content-length: 36
your_name=Pupkin&your_age=90
Как уже говорилось выше, после получения данных сервер должен преобразовать их и передать CGI программе. В стандартной спецификации CGI введенные клиентом данные при запросе GET помещаются сервером в переменную среды программы «QUERY_STRING». При запросе POST данные помещаются в стандартный поток ввода приложения, откуда могут быть им считаны. Кроме того, при таком запросе сервером устанавливаются еще две переменные среды - CONTENT_LENGTH и CONTENT_TYPE, по которым можно судить о длине запроса в байтах и о его содержании.
Помимо самих данных сервером устанавливаются и другие переменные окружения вызываемой программы, приведу некоторые из них:
REQUEST_METHOD
Описывает каким именно методом получены данные
Пример :REQUEST_METHOD=GET
QUERY_STRING
Строка запроса, если использовался метод GET
Пример :QUERY_STRING= your_name=Pupkin&your_age=90&hobby=asm
CONTENT_LENGTH
Длина в байтах тела запроса
Пример:CONTENT_LENGTH=31
CONTENT_TYPE
Тип тела запроса
GATEWAY_INTERFACE
Версия протокола CGI
Пример: GATEWAY _ INTERFACE = CGI /1.1
REMOTE_ADDR
IP-Адрес удаленного хоста, то бишь клиента, нажавшего кнопочку в форме
Пример:REMOTE_ADDR=10.21.23.10
REMOTE_HOST
Имя удаленного хоста, это может быть его доменное имя или например имя компьютера в среде Windows, если таковые получены быть не могут, то поле содержит его IP
Пример :REMOTE_HOST=wasm.ru
SCRIPT_NAME
Имя скрипта, использованное в запросе.
Пример :SCRIPT_NAME=/cgi-bin/gols.pl
SCRIPT_FILENAME
Имя файла скрипта на сервере.
Пример :SCRIPT_FILENAME=c:/page/cgi-bin/gols.pl
SERVER _ SOFTWARE
Программное обеспечение сервера
Пример:Apache/1.3.19 (WIN 32)
В общем-то это вкратце все, для получения более подробной информации об Общем Шлюзовом Интерфейсе смотрите специализированную документацию, это описание я сделал для того, чтобы напомнить вам, а если не знали то ввести в курс дела. Давайте попробуем что-нибудь сделать на практике.
Практическая часть.
Для практики нам понадобятся как минимум 3 вещи – какой-нибудь http-сервер для Windows, все примеры я пробовал на Apache 1.3.19 для Windows, сервер бесплатный, скачать его можно с http://httpd.apache.org/download.cgi . Да, и сервер нам понадобится не абы – какой, а настроенный для запуска cgi-скриптов! Как это делается для сервера используемого вами смотрите документацию. Вторая вещь, которая нам понадобится это, естественно, ассемблер, так же необходимо, чтобы компилятор поддерживал создание консольных WIN32 приложений, я использую Tasm, но прекрасно подойдут и Fasm и Masm и множество других *asm’ов. Ну и наконец самое главное, что потребуется это желание.
Итак, я допускаю, что сервер был вами благополучно поставлен и настроен, так, что в корневой директории документов сервера лежит файлик index.html, который замечательно показывается в браузере, когда вы набираете адрес http://127.0.0.1 . Так же я учту, что где-то в дебрях папок сервера существует папочка «cgi-bin», в которой разрешен запуск скриптов.
Давайте проверим настройку сервера, а заодно и напишем небольшой скрипт. Скрипт наш будет обычным *.bat файлом. Предвижу вопросы – как? неужели? Да, это обычный командный файл, как уже говорилось выше спецификация CGI не делает различий между типами файлов, главное, чтобы сервер мог его запустить, а он в свою очередь, имел доступ к stdin/stdout и переменным окружения, bat-файл, пусть и не в полной мере, но для примера нас вполне устроит. Создадим файл примерно такого содержания:
@echo off rem Заголовок апроса echo Content-type: text/html echo. rem Тело запроса echo "
Привет!Файл назовем test.bat и поместим его в директорию для запуска скриптов, скорее всего это будет директория «cgi-bin». Следующее, что нам нужно будет сделать, это каким либо образом вызвать этот скрипт, в принципе, сделать это можно напрямую набрав в окошке адреса браузера примерно следующее «http://127.0.0.1/cgi-bin/test.bat», но давайте сделаем его вызов с нашей главной странички, заодно проверим работу метода GET. Создадим в корне сервера файл index.html со следующим содержанием:
Теперь при входе на сервер (http://127.0.0.1 в строке адреса браузера) должна появиться форма, наберите в ней что-нибудь и нажмите кнопку «послать», если все было сделано правильно, Вы увидите в окне браузера ответ нашего bat-скрипта. Теперь давайте посмотрим что же мы там намутили.
Как можно догадаться команда «echo» осуществляет вывод в stdout, первым делом мы передаем серверу заголовок нашего ответа – «echo Content-type: text/html». Это есть стандартный заголовок спецификации CGI, говорящий о том, что передавать мы хотим текст или документ html, существуют и другие заголовки. Очень важный момент – заголовок должен отделяться от тела ответа пустой строкой, что мы и делаем следующей командой «echo.». Дальше передается тело самого ответа – это обычный html-документ, в теле документа я для наглядности отображаю одну из переменных среды, переданной нам сервером – «QUERY_STRING», как уже говорилось при методе GET (а это именно наш случай) в этой переменной передаются все введенные пользователем данные, что мы и можем наблюдать в ответе скрипта. Вы могли заметить «кавычки не к месту» в последних 2-х строках файла, сразу после «echo», стоят они там из-за специфичности bat-файлов, как можно заметить тэги html обрамляются символами «<» и «>», в тоже время эти символы служат перенаправлением ввода/вывода в bat-файлах, а посему мы не можем их здесь свободно использовать.
Рекомендую немного побаловаться с подобными bat-скриптами, это бывает очень полезно, попробуйте посмотреть другие переменные окружения. Немного скажу, отступив от темы, на UNIX-системах языки командных интерпретаторов очень сильно развиты и грань между программированием на языке командного интерпретатора и программированием на «реальном» языке программирования весьма и весьма размыта в некоторых случаях, поэтому на UNIX-системах частенько простенькие скрипты пишутся именно на языках командных интерпретаторов, но windows-интерпретатор cmd.exe или, ранее, command.com явно слабоваты для этих целей.
Теперь перейдем к самой главной задаче этой статьи, к собственно написанию CGI-программы на ассемблере. В принципе, если учесть все вышесказанное о CGI мы можем сделать вывод о том, что требует CGI-интерфейс от нашей программы:
2. Программа должна уметь писать в стандартный поток вывода (stdout), чтобы передать результат своей работы серверу;
3. Из первых двух пунктов следует, то, что для того, чтобы сервер мог передать нашей программе что-либо в stdin, а она могла ему что-либо ответить в stdout CGI-программа должна быть консольным приложением;
Этого вполне достаточно для создания полноценного CGI-приложения.
Начнем с последнего пункта. Для получения доступа к переменным окружения Windows-приложения используется функция API «GetEnvironmentStrings», функция не имеет аргументов и возвращает указатель на массив переменных окружения (ИМЯ=ЗНАЧЕНИЕ) разделенных между собой нулем, массив закрывается двойным нулем, при запуске программы сервером в окружение программы помимо стандартных переменных добавляются специфические CGI-переменные, описанные выше, при запуске программы из командной строки вы их не увидите, естественно.
Для того, что бы писать что-то в stdout или читать из stdin сначала мы должны получить хэндлы этих потоков, делается это с помощью функции API «GetStdHandle», в качестве параметра функции передается одно из следующих значений:
STD_INPUT_HANDLE - для stdin (стандартный ввод);
STD_OUTPUT_HANDLE - для stdout (стандартный вывод);
STD_ERROR_HANDLE - для stderr.
Функция возвратит необходимый нам для операций чтения/записи хэндл. Следующее что нам необходимо делать это писать/читать эти потоки. Делается это обычными операциями чтения/записи файлов, т.е. ReadFile и WriteFile. Тут есть одна тонкость, можно подумать, что для этих целей можно использовать WriteConsole/ReadConsole, да это действительно справедливо для консоли и будет прекрасно работать, результаты, так же как и с WriteFile будут выводиться на консоль, но продолжаться это будет пока мы не запустим нашу программу как скрипт на сервере. Происходит это потому что, когда нашу программу запускает сервер хэндлы, возвращаемые функцией «GetStdHandle» уже не будут хэндлами консоли как таковыми, они будут хэндлами pipe, что необходимо для связи двух приложений.
Вот небольшой пример того, как должна выглядеть CGI-программа на ассемблере, думаю разобраться в ней не составит большого труда:>
386 .model flat,stdcall includelib import32.lib .const PAGE_READWRITE = 4h MEM_COMMIT = 1000h MEM_RESERVE = 2000h STD_INPUT_HANDLE = -10 STD_OUTPUT_HANDLE = -11 .data hStdout dd ? hStdin dd ? hMem dd ? header: db "Content-Type: text/html",13,10,13,10,0 start_html: db "
Окружение CGI-программы выглядит \ так:Исполняемый файл строится командами:
tasm32.exe /ml test.asm
tlink32.exe /Tpe /ap /o test.obj
Не забудьте, что программа должна быть консольной.
Архив с программой .
Вызывать эту программу можно используя вышеописанную html-форму, нужно только поменять имя test.bat в форме на test.exe и скопировать его в /cgi-bin/ соответственно, при том можно выставить в методе запроса POST, программа его обрабатывает.
Еще хочу отметить, что можно вызывать программу и по-другому, можно создать в каталоге cgi-bin файл например test.cgi с одной единственной строчкой «#!c:/_путь_/test.exe» и вызывать в запросах его, а сервер в свою очередь будет читать первую его строчку и запускать exe-файл, для этого необходимо, чтобы в настройках http-сервера было прописано расширение *.cgi как расширение для скриптов. При таком подходе сервер запустит нашу программу с командной строкой «test.exe путь_к_test.exe» это имеет несколько плюсов – первое, это то, что человек, запускающий наш скрипт не будет даже догадываться на чем скрипт написан, второе – так-как нам передается имя файла с нашей строчкой мы можем например дописать в этот файл какие-либо настройки для нашего скрипта, что упрощает отладку, кстати именно так работают все интерпретаторы – вы успели заметить, что во всех perl/php/итд программах, присутствует подобная строка – указывающая на сам командный интерпретатор. Так вот сервер при запуске cgi-программы, если расширение программы прописано у него как скрипт в настройках читает первую строку файла, и если она оказывается описанного выше формата, то запускает указанную в строчке программу с именем этого файла ч/з пробел, допустим что в строчке указан интерпретатор перла, он получив такой подарок начинает его выполнение, т.к. комментарий в перле это символ «#», то первую строчку он пропускает и идет дальнейшее выполнение скрипта, в общем штука удобная.
Вот в общем и все о чем я хотел написать, не знаю насколько это все окажется Вам полезным, но скажу что у меня работает сервер интрасети используя скрипты на ассемблере. Каюсь, больших оснований делать это не было, но все же я сделал это сначала просто из эстетических соображений и некоторой не охоты учить перл/php или что-то еще. НО я никоим образом не отговариваю Вас учить перл, а наоборот скажу что сделать это нужно, и даже очень нужно, это я понял позже, но все же считаю, что на сильно загруженных серверах, где скорость выполнения, загрузки и объем памяти занимаемый приложением играет решающую роль cgi-скрипты, написанные на ассемблере займут свое достойное место.