16+
ComputerPrice
НА ГЛАВНУЮ СТАТЬИ НОВОСТИ О НАС




Яндекс цитирования


Версия для печати

Модуль поиска не установлен.

Электронная почта изнутри

01.07.2003

Дмитрий Репин aka cmapuk[0nline] - <cmapuk@pisem.net>

Кто стучится в дверь ко мне,
с толстой сумкой на ремне?
Это он, это он!
Ленинградский почтальон!

Ху is кто?

Вполне вероятно, что если бы не было систем обмена короткими сообщениями типа ICQ, AOL Instant Messenger, Odigo и т.п., то электронная почта занимала бы самую большую часть сетевого трафика в сети Интернет. О популярности этого сервиса даже спорить нет смысла, это очевидно. Для работы системы электронной почты минимально необходимы три вещи: почтовый сервер и две клиентские почтовые программы. Ну, и связь между этими тремя компонентами, естественно. Но это всего лишь приспособления для связи. А что же собой представляет сама электронная почта? Что есть письмо?

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

Протоколы

Вы наверняка часто слышите фразы типа "связь по протоколу", "основано на протоколе" и т.п. Что же из себя представляет этот мифический "протокол"? Протокол - это всего лишь набор правил для осуществления какой-либо операции. Представьте себе, как в старые времена работала бумажная почта. Множество людей в разных частях света занимались ручным перебором гор конвертов, сортируя их для отправки. В наше время существует система "индексов". В специально отведённом месте на конверте вы заполняете поле индексом получателя. На почтовых узлах письма попадают на конвейер с анализатором этого самого индекса, который сортирует почту по городам, районам и т.п. Так вот, в данном случае протоколом можно назвать точно указанное месторасположение поля для индекса на конверте, его размер и вид цифр. Основываясь на этих правилах, и работает автоматическая система. Если вы заполните неправильно поле индекса или же само поле на конверте будет сдвинуто (ошибка типографии), то ваше письмо в лучшем случае будет идти ооочень долго, а то и вообще потеряется. Эта аналогия, как мне кажется, хорошо описывает понятие протокола, а применительно к протоколам электронной почты особенно.

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

Как пишутся письма

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

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

Таким образом, электронное письмо представляет собой текстовое сообщение в формате MIME, упакованное в "конверт" формата RFC822. Теперь достанем микроскоп и взглянем на всё это поближе.

Конверт и письмо

Конверт электронного письма состоит из заголовков и собственно тела письма. Заголовки - это строки, разделённые двоеточием. Слева от двоеточия стоит имя заголовка, а справа - значение. Заголовок отделяется от тела письма пустой строкой:

Заголовок: значение

...
Заголовок: значение
<пустая строка>

Тело

Это примерная схема сообщения, а вот как выглядит реальный заголовок полученного адресатом письма. Подчёркиванием выделены заголовки, которые вставляют сервера, а остальные передаются клиентской программой (см. листинг 1.).

Заголовки Recieved показывают узлы, на которых побывало письмо в пути. Каждый сервер, передавая письмо дальше, добавляет информацию о себе в этот заголовок. Конечно, они не обязаны это делать, но так принято. Без этой информации было бы сложно определить виновника возникновения неисправностей системы, если такие возникают. К примеру, письмо может быть испорчено неправильной перекодировкой содержимого. В этом случае можно найти виновный сервер из цепочки заголовков Recieved, отправив копию и описание проблемы хозяевам этих серверов.

Название поля Date говорит само за себя. Это поле заполняется вашим почтовым клиентом при создании письма. В списке пришедших писем в вашей программе вы наверняка видели столбец "Создано". Эта информация получена как раз из этого заголовка.

Поле From служит для того, чтобы ваш почтовый клиент показывал, от кого пришло письмо (см. рис 1).

Поле X-Mailer создаёт ваша почтовая программа и указывает там своё название.

Поле Reply-To служит для указания, что автоматически вписывать в графе "Кому" в новом письме, когда вы нажимаете "Ответить" в вашей программе.

В принципе, все эти поля совершенно не обязательны. Они создаются для удобства пользователей, однако письмо можно отправить и получить и без них. К полям "для удобства" относятся и Organization, и To, и Subject. Поля MIME-Version и Content-Type тоже не обязательны, однако это очень важные поля для распознавания писем почтовыми программами. Поле MIME-Version показывает, по какой версии протокола MIME создано тело сообщения, а Content-Type указывает на тип содержимого. В данном примере письмо является текстом в кодировке koi8-r.

В таком виде это письмо является как раз сообщением в старом формате RFC822. Если указать в поле Content-Type формат text/html, а в теле письма использовать HTML-тэги, то почтовая программа при просмотре этого письма отобразит его как веб-страницу (если не отключен автопросмотр HTML-писем, который стоит по-умолчанию). Но самое главное и полезное в этом поле то, что, указывая тип содержимого вида multipart/mixed (вместо mixed можно указать и другие типы, описанные в RFC2045), мы имеем полное право укладывать в тело письма файлы и тексты в каком угодно количестве. Чем мы сейчас и займемся (см. листинг 2.).

Попробуйте скопировать эти "магические надписи" в текстовый файл (хотя бы в блокнот) и сохраните файл с расширением *.msg (например, test.msg). Теперь, при двойном щелчке мышью на этом файле откроется ваша почтовая программа и вы увидите полноценное письмо с прикреплённым файлом ZIP-архива. Теперь рассмотрим поподробнее вышеописанное заклинание.

Заголовки From, To, и Subject мы уже видели. В данный момент нас больше интересует заголовок Content-Type. В этом примере он указывает на то, что тело письма делится на части, а также говорит нам (точнее, нашей почтовой программе), что части различаются строкой вида "----------10A186201CCCA79", что мы и можем наблюдать. Части письма начинаются с двух символов "-" и вышеуказанной строки. Конец всего письма указывается также, но в конце разграничителя добавляется тоже "--". Строка-разграничитель создаётся совершенно случайно, и для каждого письма эти строки различны.

Теперь разберёмся с частями тела письма.

Часть письма тоже имеет заголовки и тело, которые разделяются пустой строкой. В заголовках описывается тип содержимого, описание его свойств, а также тип кодирования данных при передаче. Итак, первая часть нашего письма - это простой текст в кодировке Windows-1251, передаваемый "как есть" (об этом говорит строка "8bit"). Вторая часть нашего сообщения - это ZIP-архив. Об этом говорит поле Content-Type. Также оно сообщает нам об имени файла. Заголовок Content-Transfer-Encoding указывает на тип кодирования данных. В данном случае содержимое упаковано в формат Base64. Base64 - это технология, разработанная для кодирования любых данных в набор из ограниченного количества знаков. Всего этих знаков 65 (A-Za-z0-9+/=). Эти знаки представляют собой набор US-ASCII, т.е. базовый набор символов, которые будут выглядеть одинаково в любой кодировке, а кроме того, для этих знаков используется всего 6 бит, т.е. меньше байта (если вы не в курсе, байт состоит из 8 битов). Хоть какая-то, да экономия =).

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

Content-Disposition указывает позицию данных в письме. В нашем случае слово attachment говорит о том, что наш файл является прикреплённым к письму. Вот, собственно, и весь формат письма вкратце. А теперь, в качестве домашнего задания...

Домашнее задание

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

В заголовке текстовой части сообщения поставьте Content-Type: text/html, а в самом теле этой части поставьте <img src="cid:768444021@22032003-040d">. После этого, в заголовке той части письма, где описан файл картинки, уберите заголовок Content-Deposition и поставьте на его место вот такой:

Content-ID: <768444021@22032003-040d>

А теперь сохраните этот файл и откройте его в своей почтовой программе и включите просмотр в формате HTML. Вуаля! Теперь картинка показывается прямо в письме, как на веб-страницах.

Пара хитростей

Если у вас установлен файл-менеджер Windows Commander (Total Commander), то переименуйте файл письма MSG в файл с расширением B64 (например, test.b64) и запустите его. Файл менеджер распакует письмо, вытащив из него все прикреплённые файлы. Кроме того, с помощью этого файл-менеджера вы можете произвести обратную операцию:выделите какой-нибудь нетекстовый файл, например ZIP-архив, а потом выберите в меню File команду Encode File (MIME...). Вы получите файл с расширением B64, открыв который в блокноте, увидите данные, упакованные в MIME-вид и готовые для вставки в письмо.

Чуть-чуть практики

В заключение хотелось бы пояснить ещё один момент. Практически все прикладные протоколы для передачи данных, такие как HTTP, SMTP, POP3 и т.п., являются текстовыми. Это означает, что все данные, относящиеся к заголовкам, команды и другая служебная информация передаются простым текстом. В качестве примера я покажу, как можно отправить письмо, напрямую связываясь с почтовым сервером.

Для начала с помощью программы telnet нужно соединиться с вашим почтовым сервером. Для этого в меню "Пуск" выберите команду "Выполнить" и наберите telnet (если у вас Windows, конечно =)). В зависимости от версии программы, у вас появится либо консольное окно, либо окошечный вариант. В консольном варианте наберите open vash_server.ru 25, а в "окошечном" введите через меню имя сервера и порт 25. После соединения с сервером наберите следующие команды:

HELO macrohard.com
MAIL FROM: user@vasya.com
RCPT TO: тут@ваш.е-мэйл
DATA

Здесь что-нибудь из примеров этой статьи с заголовками или просто текст.

QUIT

Сразу скажу, что строка с одной только точкой в конце данных обязательна. Если вы всё сделали правильно, то проверяйте почту =)

Листинг 1.

Received: from terra.comprice.ru ([111.11.11.11])
by relay4.mailru.com (8.12.6/8.12.2) with ESMTP id h1EETteK095470
for <cmapuk@pisem.net>; Fri, 14 Feb 2003 17:29:56 +0300 (MSK)
(envelope-from cmapuk@comprice.ru)
Received: from server.comprice.ru ([222.222.222.222])
by terra.comprice.ru (8.12.5+Sun/8.12.1) with ESMTP id h1EERVKU027356
for <cmapuk@pisem.net>; Fri, 14 Feb 2003 17:27:32 +0300 (MSK)
Date: Fri, 14 Feb 2003 17:37:34 +0300
From: "cmapuk[0nline]" <cmapuk@comprice.ru>
X-Mailer: The Bat! (v1.61)
Reply-To: "cmapuk[0nline]" <cmapuk@pisem.net>
Organization: Computer Price
Message-ID: <1351207915062.20030214173734@comprice.ru>
To: cmapuk@pisem.net
Subject: Test
MIME-Version: 1.0
Content-Type: text/plain; charset=koi8-r

Листинг 2.

From: "cmapuk[0nline]" <cmapuk@comprice.ru>
To: cmapuk@comprice.ru
Subject: TEST
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="----------10A186201CCCA79"

------------10A186201CCCA79
Content-Type: text/plain; charset=Windows-1251
Content-Transfer-Encoding: 8bit

Текст письма!
------------10A186201CCCA79
Content-Type: application/x-zip-compressed; name="test.zip"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="test.zip"

UEsDBBQAAgAIAJK5di7tcDWTCwAAAAgAAAAEAAAAdGVzdDv/4uOfN0+/vQMAUEsBAhQAFAACAAgA
krl2Lu1wNZMLAAAACAAAAAQAAAAAAAAAAAAgAAAAAAAAAHRlc3RQSwUGAAAAAAEAAQAyAAAALQAA
AAAA
------------10A186201CCCA79--



статьи
статьи
 / 
новости
новости
 / 
контакты
контакты