навигация
вход на сайт
Логин
Пароль
 

информация
календарь
 
«    Май 2007    »
ПнВтСрЧтПтСбВс
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
опрос
Курить любите?

Да!
Ну так..
Нет!


 

Топ 30

Скрипты >> Форма - мылом... 27 мая 2007
Конечной целью планируемых мной нескольких заметок будет написание "джентельменского набора" скриптов - отправка заполненной формы со странички по E-mail, счетчик и поисковик. Дальше, если возникнет желание, вы сможете написать еще что-нибудь, используя выученные команды и методы как шаблоны.

Для начала, вам надо связаться с провайдером и убедиться, что он разрешает использовать CGI. Если да, то узнайте у него где находится Perl (скорее всего, это будет /usr/local/bin/perl), а также где находится sendmail - программа, занимающаяся отправкой почты (скорее всего, это будет что-то вроде /usr/sbin/sendmail). Если же провайдер не разрешает использование скриптов, то Вам придется либо искать другого провайдера, либо обходиться без скриптов, либо использовать какой-нибудь бесплатный сервис.

Итак, мы хотим, чтобы посетитель нашей странички мог отправлять сообщения заполняя форму на сайте. Начать имеет смысл с подготовки странички с формой. Я исхожу из того, что HTML вы знаете (или, как минимум, у вас есть справочник) и нижеследующий текст загадки представлять не будет:











Здесь мы создали пустой HTML файл с тремя текстовыми полями для ввода имени пользователя, его почтового адреса и комментария, а также кнопку для отправки собщения. Команда action="formmail.cgi" задает имя скрипта, который мы будем писать. Здесь предполагается, что скрипт расположен в той же директории, что и сам файл. Если по каким-либо соображениям вы его перенесете, то надо будет указать путь к файлу скрипта. Команда method=POST определяет способ передачи информации. Есть два метода: GET и POST. Никакой принципиальной разницы между ними нет, за исключением того, что в случае GET информация будет передаваться открыто в адресе, т.е. у вас получится что-то вроде www.vasya.pupkin.ru/formmail.cgi?username=petya&useremail=... , а в случае POST передаваемая информация видна не будет. Со стороны же скрипта, единственная разница заключается в том, откуда брать информацию: из строки запроса или со стандартного ввода.

Теперь начинается самое интересное: написание скрипта. Создайте пустой текстовый файл и напишите в первой строке:
#!/usr/local/bin/perl
Здесь надо указать расположение Perl-овского интерпретатора, которое вам сообщил провайдер. Эта команда нужна для того, чтобы указать системе, что данный скрипт написан именно на Perl-е и должна присутствовать в каждом скрипте, который вы пишете.

Теперь нам надо определить некоторые переменные, которыми мы будем пользоваться (например, расположение почтовой программы и ваш адрес). Перл язык умный и не требует от вас ни выделения памяти для переменных, ни определения их типа, ни каких-то других премудростей. Переменные в Перле начинаются со знака доллара, а тип их определяется исходя из контекста. Поэтому, следующими сторочками мы пишем:
$mail_prog = '/usr/sbin/sendmail';
$receipient = "petya\@vasya.pupkin.ru";
Обратите внимание на точку с запятой в конце строк - так оканчиваются операторы. Также, посмотрите на разницу в написании строк - в первом случае я использовал апострофы для определения строки, а во втором - кавычки. Разница между ними заключается в том, что строки внутри кавычек проверяются интерпретатором и, например, встреченные переменные заменяются на их значения. Массивы в Perl-е начинаются с символа @, именно поэтому в адресе стоит \@ - обратная косая указывает Perl-у, что имеется в виду не массив @vasya, а символ @. После обработки интерпретатором эта строка превратится в нормальный адрес. Учтите, что перл различает большие и маленькие буквы, поэтому набирайте переменные аккуратно.

Теперь, пора переходить к действиям. Нам надо прочитать данные, отправленые формой, сохранить их в каких-то переменных, а затем создать и отправить письмо. Эти действия лучше вынести в отдельные подпрограммы, т.к. они являются достаточно стандартными и вы сможете использовать готовые блоки в разных скриптах. Имена подпрограмм в Perl-e начинаются с амперсанда (&). Поэтому, следующей строчкой мы пишем:
&GetFormInput;
Эту подпрограммку нам еще предстоит написать, а пока предположим, что она в качестве результата своей работы будет создавать массив @FORM в котором в качестве аргумента будет использоваться имя поля формы (в нашем примере - username, useremail, usercomment), а в качестве значения - содержимое соответствующего поля. Таким образом, например, $FORM{'username'} будет содержать значение, введенное пользователем в поле username. Соответственно, следующее, что мы напишем в скрипте будет:
$user = $FORM{'username'}; $email = $FORM{'useremail'}; $comment = $FORM{'usercomment'};

Осталось только указать подпрограмму, которая будет отправлять почту:
&transfer;
И теперь завершаем работу:
exit (0);

Теперь осталось оформить две нужные подпрограммы:
sub GetFormInput {
Эта строчка указывает, что дальше мы будем описывать подпрограмму GetFormInput. Все операторы, относящиеся к процедуре должны находиться между открывающей и закрывающей фигурными скобками.

read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
Эта команда читает стандартный ввод (помните, что мы используем метод POST?) и помещает данные в переменную $buffer. А переменная окружения CONTENT_LENGTH указывает на размер данных.

@pairs = split(/&/, $buffer);
Здесь мы разбиваем полученную длинную строку с данными на подстроки, причем разделителем является символ & (этот символ отделяет каждую пару имя=значение). Полученные подстроки записываются в массив @pairs

foreach $pair (@pairs) {
Цикл, который обрабатывает каждую получившуюся подстроку (точнее, каждый элемент массивы @pairs).

($name, $value) = split(/=/, $pair);
Каждая подстрока разбивается на две величины: имя и значение, причем разделителем служит знак равенства. Получившиеся величины сохраняются в переменных $name и $value.

$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
Эти строчки конвертируют специальные коды (вида =07=0А), которые могут быть отправлены формой в обычные символы.

$FORM{$name} = $value;
Записываем в массив (точнее в хэш - массив, в котором индехы - текстовые) соответствующие значения.
}
}

Теперь вторая подпрограмма, отправляющая форму:
sub transfer {
open (MAIL, "|$mail_prog $receipient");
print MAIL "Subject: web mail\n";
print MAIL "MIME-Version: 1.0\n";
print MAIL "Content-Type: text/plain; charset=\"koi8-r\"\n";
print MAIL "Content-Transfer-Encoding: 8bit\n";
print MAIL "\n\n";
print MAIL "Name: $user\n";
print MAIL "E-mail: $email\n";
print MAIL "Comment: $comment\n";
close (MAIL);
}
Здесь мы используем стандартную почтовую программу установленную на сервере и передаем ей команды используя ее синтаксис. Часто встречающееся \n означает переход на новую строчку (нажатие кнопки Enter, если бы вы выполняли эти команды вручную). Вспомните, что строки внутри кавычек обрабатываются интерпретатором и вместо переменных вставляются их значения.

Вот и все! У вас есть готовый скрипт, который вы написали самостоятельно! Осталось только положить его на сервер (вместе с HTML файлом) и опробовать. Не забудьте только, что скрипт надо выкладывать на сервер с помощью FTP клиента, переключенного в ASCII режим. А после выгрузки, указать, что это исполняемый файл (в большинстве современных FTP клиентов есть специальная функция для этого, которая называется, скорее всего chmod). Если вы не сумеете это сделать, тоо свяжитесь с провайдером и попросите его указать соответствующие права для вашего скрипта.

Разумеется, этот скрипт несколько "недоделанный". Например, он не выводит пользователю подтверждения, что его комментарий действительно отправлен. Но этим мы займемся как-нибудь в следующий раз! ;-)

От: nema72 | Просмотров [43556] | 

Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии в данной новости.
Реклама

 

наверхнаверх
реклама
реклама
реклама
     
Copyright: YourSite.ru
Hosting: Hosting
Support: DLE4U.NET
Engine: DataLife Engine v5.x
Добавить новость
Экспорт новостей
Обратная связь
Статистика
сopyright © 2007-2008 diz1.org