
678 Глава 7. Прикладной уровень
2. Сообщения на языках, использующих алфавиты, отличные от латинского (на-
пример, на иврите или русском).
3. Сообщения на языках без алфавитов (например, китайском, японском, корей-
ском).
4. Сообщения, вообще не являющиеся текстом (например, аудио или видео).
Решение было предложено в документе RFC 1341, а более новая редакция
была опубликована в RFC 2045-2049. Это решение, получившее название MIME
(Multipurpose Internet Mail Extensions, — многоцелевые расширения электронной
почты в Интернете), широко применяется в настоящий момент. Далее приведено
его описание. Дополнительную информацию о наборе стандартов MIME см. в RFC.
Основная идея стандартов MIME — продолжить использование формата
RFC 822, но с добавлением структуры к телу сообщения и с определением пра-
вил кодировки He-ASCII-сообщений. Не отклоняясь от стандарта RFC 822,
MIME-сообщения могут передаваться с помощью обычных почтовых программ
и протоколов. Все, что нужно изменить, — это отправляющие и принимающие
программы, которые пользователи могут создать для себя сами.
Стандартами MIME определяются пять новых заголовков сообщения, приве-
денных в табл. 7.6. Первый заголовок просто информирует пользовательского
агента, получающего сообщение, что тот имеет дело с сообщением MIME, а так-
же сообщает ему номер версии MIME, используемой в этом сообщении. Если со-
общение не содержит такого заголовка, то оно считается написанным на англий-
ском языке и обрабатывается соответствующим образом.
Таблица 7.6. Заголовки RFC 822, добавленные MIME
Заголовок
Описание
MIME-Version:
Content-Description:
Content-Id:
Content-Transfer-Encoding:
Content-Type:
Указывает версию стандартов MIME
Описание содержимого. Строка обычного текста,
информирующая о содержимом сообщения
Уникальный идентификатор
Указывает способ кодировки тела сообщения для его передачи
Тип и формат содержимого сообщения
Заголовок Content-Description представляет собой ASCII-строку, информирую-
щую о том, что находится в сообщении. Этот заголовок позволяет пользователю
принять решение о том, нужно ли ему декодировать и читать сообщение. Если в
строке сказано: «Фотография тушканчика Барбары», а получивший это сообще-
ние не является любителем тушканчиков, то, вероятнее всего, он сразу удалит
это сообщение, а не станет перекодировать его в цветную фотографию высокого
разрешения.
Заголовок Content-Id содержит идентификатор содержимого сообщения. В нем
используется тот же формат, что и в стандартном заголовке Message-Id:.
Заголовок Content-Transfer-Encoding сообщает о способе упаковки тела сооб-
щения для его передачи по сети, которая может возражать против символов, от-
личных от букв, цифр и знаков препинания. Разработано пять схем (имеется
Электронная почта 679
возможность добавления новых схем). Простейшая из них заключается в переда-
че просто ASCII-текста. Символы ASCII используют 7 разрядов и могут переда-
ваться напрямую протоколом электронной почты при условии, что строка не пре-
вышает 1000 символов.
Следующая по простоте схема аналогична предыдущей, но использует 8-раз-
рядные символы, то есть все значения байта от 0 до 255 включительно. Такая
схема кодировки нарушает (исходный) протокол электронной почты Интернета,
но используется в некоторых частях Интернета, в которых реализовано некото-
рое расширение исходного протокола. Хотя объявление о способе кодирования
не делает его использование автоматически законным, открытое объявление мо-
жет, по крайней мере, в случае чего объяснить неправильную работу почтовых
агентов. Сообщения, использующие 8-разрядную кодировку, также должны со-
блюдать правило о максимальной длине строки.
Еще хуже обстоит дело с сообщениями в двоичной кодировке. К ним отно-
сятся произвольные двоичные файлы, которые не только используют все 8 раз-
рядов в байте, но еще и не соблюдают ограничение на 1000 символов в строке.
К этой категории относятся исполняемые программные файлы. Не дается ника-
кой гарантии, что эти двоичные сообщения будут доставлены корректно, но, тем
не менее, очень многие пользователи все равно пересылают их друг другу.
Корректный способ кодирования двоичных сообщений состоит в использова-
нии кодировки base64 (64-символьная кодировка), иногда называемой ASCII
armor (ASCII-оплетка). При использовании данного метода группы по 24 бита
разбиваются на четыре 6-разрядные единицы, каждая из которых посылается в
виде обычного разрешенного ASCII-символа. В этой кодировке 6-разрядный
символ 0 кодируется ASCII-символом «А», 1 — ASCII-символом «В» и т. д. За-
тем следуют 26 строчных букв — это уже 10 разрядов, и наконец, + и / для коди-
рования 62 и 63 соответственно. Последовательности = и = говорят о том, что
последняя группа содержит только 8 или 16 бит соответственно. Символы пере-
вода строки и возврата каретки игнорируются, поэтому их можно вставлять в
любом месте для того, чтобы строки выглядели не слишком длинными. Таким
способом можно передать любой двоичный код.
Для сообщений, почти полностью состоящих из символов ASCII, но с неболь-
шими включениями не-ASCII-символов, подобный метод несколько неэффективен.
Вместо него лучше применять кодировку quoted-printable (цитируемое печат-
ное кодирование). Это просто 7-битный ASCII, в котором символы, соответст-
вующие значениям ASCII-кода свыше 127, кодируются знаком равенства, за ко-
торым следуют две шестнадцатеричных цифры — ASCII-код символа.
Итак, двоичные данные следует посылать в кодировке Base64 или quoted-prin-
table. Когда имеются веские причины не использовать эти методы, можно ука-
зать в заголовке Content-Transfer-Encoding: свою кодировку.
Последний заголовок в табл. 7.6 представляет наибольший интерес. Он ука-
зывает тип тела сообщения. В документе RFC 2045 определены семь типов со-
держимого сообщений, каждый из которых распадается на несколько подтипов.
Подтип отделяется от типа косой чертой, например,
Content-Type: video/mpeg