Вернуться на сайт гостевой книги Power Perl Educaton Help Download Links Off-line version

Приложение A.
Форматы MIME. Работа с почтой.
Дополнительные поля HTTP заголовка; работа с Cookie

MIME

MIME (Multipurpose Internet Mail Extensions) - Многоцелевые расширения почты интернета, были разработаны как стандарт идентификации различных типов файлов для отправки их по почте, но в последствии их функции были расширены и на другие сервисы Интернета. Для типа MIME, который прописывается в реестре Windows и используется различными программами, в частности, указывается расширение файла и программа, с помощью которой данный тип файлов будет обрабатываться.

Типы MIMEТип файла
Архив RARapplication/x-tar
Архив ZIPapplication/x-zip-compressed
Исполняемый файл (.exe)application/octet-stream
Аудио- или видеозапись ASFvideo/x-ms-asf
Аудио- или видеозапись WMVvideo/x-ms-wmv
Аудиозапись AIFFaudio/aiff
Аудиозапись AUaudio/basic
Аудиозапись MIDIaudio/mid
Аудиозапись MP3audio/mpeg
Аудиозапись WAVaudio/wav
Аудиозапись WMAaudio/x-ms-wma
Аудиозапись AVIvideo/avi
Аудиозапись AVI (.avi)video/x-msvideo
Видеозапись Indeo (IVF)video/x-ivf
Видеозапись MPEG (.mpeg .mpg .mpe)video/mpeg
Видеозапись QuickTime (.qt .mov)video/quicktime
Визитная карточка, используемая почтовыми программами для хранения данных об адресатеtext/x-vcard
Графический файл ARTimage/x-jg
Графический файл BMPimage/bmp
Графический файл GIFimage/gif
Графический файл JPEGimage/jpeg
Графический файл Macromedia Flashapplication/futuresplash
Графический файл TIFFimage/tiff
Документ Adobe Acrobatapplication/pdf
Документ HTMLtext/html
Документ Microsoft Excelapplication/x-msexcel
Документ Microsoft Wordapplication/msword
Документ RTFapplication/msword
Документ RTXtext/richtext
Документ XMLtext/xml
Приложениеapplication/x-msdownload
Приложение HTML (HTA)application/hta
Таблица стилей HTMLtext/css
Текстовой документtext/plain

Почтовые рассылки

чтобы средствами Perl можно было отсылать почту, необходимо чтобы на сервере была установленна программа "sendmail". Версию под Windows пожно скачать из раздела "Download".

что делаем. Открываем функцией Open программу, и ей на вход подаем нашу почтовую форму:

open (MAIL,"|/usr/lib/sendmail -t");
print MAIL "To: to\@e.mail\n";
print MAIL "From: from\@e.mail\n";
print MAIL "Subject: Subject\n\n";

print MAIL "Body\n";
close MAIL;

Как и HTTP запрос, Email запрос состоит из заголовка и тела. Разберем подробнее заголовок:
To: - Email адрес получателя письма;
From: - Email адрес отправителя;
Subject: - тема.
Как и в HTTP запросе, тело от заголока отделяется пустой строкой.

А Вот форма более продвинутого содержания:

print <<END;
From: admin@myhost.ru
To: user@myhost.ru
Cc: admin@myhost.ru
Subject: Subject
MIME-Version: 1.0
Content-Type: text/plain; charset=windows-1251
X-Mailer: Perl build-in mailer
X-Priority: 3
X-MSMail-Priority: Normal

Body
END
;

В общем, почти то же самое, только информации передается побольше и добавлено поле Cc - адресат скрытой копии.

Еще один интересный код, дает возможность передавать вложенные файлы:

$to = '"Your Name" <yourname@yourdomain.com>';
$recip = 'yourname@yourdomain.com';
$from = '"Your Name" <yourname@yourdomain.com>';
$subject = "This is the subject";
$mainbody = "This is the main body\n";
$attachment = "This is an attachment\n";

$message = MakeMessage($to, $from, $subject, $mainbody, $attachment);

open (MAIL, "|sendmail -t");
print MAIL $message;
close (MAIL);




sub MakeMessage
{
 # make a composite message containing a main body and one attachment
 my ($to, $from, $subject, $mainbody, $attachment) = @_;
my $message = <<"__EOM__";
From: $from
To: $to
Subject: $subject
MIME-Version: 1.0
Content-Type: multipart/mixed;
	boundary=\"----=_NextPart_000_0012_01BDDCAE.46F62A80\"
X-Priority: 3
X-MSMail-Priority: Normal

This is a multi-part message in MIME format.

------=_NextPart_000_0012_01BDDCAE.46F62A80
Content-Type: text/plain;
	charset=\"iso-8859-1\"
Content-Transfer-Encoding: 7bit

$mainbody

------=_NextPart_000_0012_01BDDCAE.46F62A80
Content-Type: text/plain;
	name=\"attach.txt\"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
	filename=\"attach.txt\"

$attachment

------=_NextPart_000_0012_01BDDCAE.46F62A80--
__EOM__

 return $message;
}

Дополнительные поля HTTP заголовка

Далее я расскажу только о 3-х, самых основных полях HTTP заголовка.

Поле Status: передает браузеру код завершения обработки запроса. В случае успешной обработки передается код "200", в случае ошибки на сервере -"500" и т.д.

Поле Location: передает браузеру альтернативный URL. После приема заголовка с таким полем, браузер обычно переходит по означенной в поле ссылке.
Код ниже генерирует заголовок, являющимся скриптом-редиректом:


print "Content-Type: text/html\n";
print "Status: 302 Moved\n";
print "Location: http://goout.ru\n\n";

код 302 означает, что ресурс временно недоступен.

Работа с Cookie

(отрывок из статьи "Что такое Cookies и с чем их едят")

Что такое cookie?

Cookie является решением одной из наследственных проблем HTTP спецификации. Эта проблема заключается в непостоянстве соединения между клиентом и сервером, как при FTP или Telnet сессии, т.е. для каждого документа (или файла) при передаче по HTTP протоколу посылается отдельный запрос. Включение cookie в HTTP протокол дало частичное решение этой проблемы.

Cookie это небольшая порция информации, которую сервер передает клиенту. Клиент (броузер) будет хранить эту информацию и передавать ее серверу с каждым запросом как часть HTTP заголовка. Некоторые cookie хранятся только в течение одной сессии, они удаляются после закрытия броузера. Другие, установленные на некоторый период времени, записываются в файл. Обычно этот файл называется 'cookie.txt'.

Что можно делать с помощью cookie?

Сами по себе cookies не могут делать ничего, это только лишь некоторая информация. Однако, сервер может на содержащуюся в cookies информацию. Например, в случае авторизованного доступа к чему либо через WWW, в cookies сохраняется login и password в течение сессии, что позволяет не вводить их при запросе каждого запаролированного документа. Другой пример: cookies могут использоваться для построения персонализированных страниц. Чаще всего встречается такое - на некотором сервере Вас просят ввести свое имя, и каждый раз, когда Вы заходите на первую страницу этого сервера, Вам пишут что-то типа "Hello, your_name!". На использовании cookies также часто строят функцию оформления заказа в онлайновых магазинах, в частности, в Амазоне, такая своеобразная виртуальная корзина покупателя, как в обычном реальном супермаркете.

У Cookies есть 2 основных параметра: содержание и время жизни, по истечении которого Cookies не передаются серверу. Чтобы с помощью CGI установить Cookies, нужно добавить в HTTP заголовок строку такого вида:

Set-Cookie: key=value; expires=date;

[key=value] - тело;
[date] -время жизни.

Время жизни представляет собой критическую дату, после которой Cookies считается не действительным. Она указывается весьма своеобразным способом:

Set-Cookie: Name=CowBoy; expires=Fri, 31-Dec-02 23:59:59 GMT;

Это значит, что Cookies будут жить только до 31 декабря 2002 года.

Один документ может содержать несколько Cookies. Код ниже формирует HTTP заголовок с установкой Cookies:

print "Content-Type: text/html\n";
print "Status: 200 Ok\n";
print "Set-Cookie: name=Robert; expires=Sat, 26-Aug-03 15:45:30 GMT;\n";
print "Set-Cookie: nick=Pauls; expires=Sat, 26-Aug-03 15:45:30 GMT;\n\n";

Чтобы автоматизировать процесс выставления Cookies, написана процедура set_cookie. Она принимает 3 параметра: время жизни в часах, ключ, значение.

sub set_cookie($$$){
my($year,$date,@day,$ret,$time);
$time=time+($_[0]*3600);
$year=(localtime($time))[5];
$date=localtime($time);
@day=split(/ /,$date);
$year =~ s/\d*(\d\d)/$1/;
$ret="Set-Cookie: $_[1]=$_[2]; expires=";
$ret.="$day[0], $day[2]-$day[1]-$year $day[3] GMT;";
return $ret
}

Посмотрите как просто с помощью неё устанавливать Cookies:

print set_cookie(10,"name","Robert"),"\n";
print set_cookie(10,"nick","Pauls"),"\n\n";

sub set_cookie($$$){
my($year,$date,@day,$ret,$time);
$time=time+($_[0]*3600);
$year=(localtime($time))[5];
$date=localtime($time);
@day=split(/ /,$date);
$year =~ s/\d*(\d\d)/$1/;
$ret="Set-Cookie: $_[1]=$_[2]; expires=";
$ret.="$day[0], $day[2]-$day[1]-$year $day[3] GMT;";
return $ret
}

Чтение ранее записанных значений Cookies производится из переменной окружения $ENV{'HTTP_COOKIE'}. Для удобства получения данных написана процедура get_cookie.

sub get_cookie{
my (@coo_pairs,$pair,$name,$value);
@coo_pairs = split(/; /, $ENV{'HTTP_COOKIE'});
foreach $pair (@coo_pairs)
{
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
$COOKIE{$name} = $value;}
}

Она создает хеш %COOKIE, в котором данные представлены в виде ключ-значения.
скрипт ниже создает и считывает значения из Cookies

#!/usr/bin/perl

print "Content-Type: text/html\n";
print &set_cookie(1,"name","Robert"),"\n";
print &set_cookie(1,"nick","Pauls"),"\n\n";

sub set_cookie($$$){
my($year,$date,@day,$ret,$time);
$time=time+($_[0]*3600);
$year=(localtime($time))[5];
$date=localtime($time);
@day=split(/ /,$date);
$year =~ s/\d*(\d\d)/$1/;
$ret="Set-Cookie: $_[1]=$_[2]; expires=";
$ret.="$day[0], $day[2]-$day[1]-$year $day[3] GMT;";
return $ret
}

sub get_cookie{
my (@coo_pairs,$pair,$name,$value);
@coo_pairs = split(/; /, $ENV{'HTTP_COOKIE'});
foreach $pair (@coo_pairs)
{
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
$COOKIE{$name} = $value;}
}
get_cookie;

print $COOKIE{'name'},"<br>";
print $COOKIE{'nick'};

[Содержание]  [Вступление]  [необходимое для начала изучения]  [урок 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]  [правила хорошего тона]  [приложение A]  [приложение Б]  [приложение В]  [заключение]  [благодарности] 


107642

103
15

HOLMS.ru Counter -эфхъё ЎшЄшЁютрэш  Counter CO.KZ


Copyright © ClericICN, 2002 - 2003