email (664985), страница 5
Текст из файла (страница 5)
2.2.2. MIME.
Система MIME - наиболее впечатляющее расширение для существующих почтовых систем. Она не предполагает вмешательства в деятельность агентов передачи почты. Два агента пользователя, понимающие MIME, могут общаться друг с другом при помощи обыкновенных МТА. В MIME к сообщению просто добавляются несколько полей заголовка:
-
MIME-Version (версия MIME)
-
Content-Type (тип содержимого)
-
Content-Transfer-Encoding (тип кодировки содержимого)
-
Content-ID (идентификатор содержимого)
-
Content-Description (описание содержимого)
Номера версий MIME меняются по мере его развития. Поле MIME-Version задает номер версии расширения MIME, которое данный агент пользователя умеет обрабатывать. Номер версии в заголовке предохраняет агента от неправильной интерпретации сообщения, в случае, если версии MIME сообщения агента не совпадают. Вот образец полей заголовка MIME-Version и Content-Type:
Mime-Version: 1.О
Content-Type: TEXT/PLAIN; charset=US-ASCII
В этом примере сообщение создано MIME версии 1.0. Тип содержимого – TEXT, подтип - PLAIN, кодовая таблица (набор символов) US-ASCII. В табл. 4 приведены существующие в данный момент типы и подтипы MIME.
Таблица 4
Существующие типы и подтипы MIME
Тип | Подтип | Описание |
Text | Plain | Неформатированный текст. |
| Richtext | Текст с элементами форматирования и выделениями, например с курсивом, подчеркиваниями, жирными буквами и т.д. |
| Enriched | Усовершенствованный и упрощенный вариант подтипа richtext. |
Multipart | Mixed | Тело сообщения состоит из нескольких частей; обрабатывать последовательно. |
| Parallel | Тело сообщения состоит из нескольких частей; обрабатывать параллельно. |
| Digest | Дайджест электронной почты. |
| Alternative | Тело сообщения состоит из нескольких частей; все части семантически идентичны. |
Message | RFC822 | В теле содержится почтовое сообщение стандарта RFC 822. |
| Partial | Фрагмент почтового сообщения. |
| External-Body | Указатель на действительное почтовое сообщение (не включенное в тело данного сообщения). |
Application | Octet-Stream | Произвольные двоичные данные. |
| Postscript | Программа на языке Postscript. |
Image | JPEG | Формат ISO 10918. |
| GIF | Графический формат фирмы Compuserve. |
Audio | Basic | Звук в 8-битном ISDN-формате mu-law. |
Video | MPEG | Формат ISO11172 |
Поля заголовка Content-ID и Content-Description могут отсутствовать. Первое служит для идентификации MIME-содержимого электронного письма, а второе может содержать дополнительное описание. Например, если MIME-содержимым является графический образ, в поле Content-Description можно поместить описание этого образа. В табл. 5 перечислены возможные значения Content-Transfer-Encoding, доступные в настоящее время.
Таблица 5
Допустимые значения поля Content-Tfansfer-Encoding
Content-Transfer-Encoding | Описание |
7bit | Формат NVT-ASCII – стандартный формат почтовых сообщений. |
Quoted-printable | Полезен в случае, если текст содержит небольшое количество восьмибитных символов. |
Base64 | Формат, в котором три байта данных упакованы в четыре шестибитных значения. |
8bit | Содержит текст, в котором не все символы принадлежат стандартному набору ASCII (то есть в некоторых установлен восьмой бит). |
Binary | Восьмибитные данные без символов окончания строки. |
По умолчанию формат почтовых сообщений удовлетворяет кодовому набору NVT-ASCII. 8-битные агенты МТА сейчас практически отсутствуют, но как только они получат широкое распространение, вероятно, передача бинарной и текстовой информации в 8-битной кодировке возрастет. В настоящий момент для передачи 8-битной информации по 7-битным каналам Internet лучше всего использовать кодировки quoted-printable или base64.
2.2.3. Способы кодирования MIME.
Для кодирования небольшого количества 8-битных данных в 7-битный формат NVT ASCII лучше всего подходит схема quoted printable. 8-битный символ в этой схеме представляется в виде последовательности из трех символов. Последовательность всегда начинается со знака “равно” (=). Сразу за знаком “равно” следует двузначное шестнадцатиричное число, представляющее код ASCII кодируемого символа. Рассмотрим закодированную quoted printable последовательность JAMSA PRESS. Хоть она и не содержит 8-битных символов, зато позволяет хорошо проиллюстрировать принцип кодирования. Закодированное сочетание JAMSA PRESS выглядит так:
=4A=41=4D=53=41=20=50=52=45=53=53
Другими словами, буква J имеет шестнадцатиричный код ASCII 0x4A, буква А – 0х41 и т.д. Схема quoted printable передает ASCII код для каждого символа последовательности. То есть для знака А (ASCII 0x4A) передается код знака “равно” (ASCII 0x3D), код цифры 4 (ASCII 0x34) и код знака А (0х41). Данную схему довольно удобно использовать, но она утраивает общее количество информации в сообщении. Таким образом, область применения quoted printable – сообщение с небольшим количеством символов, в которых установлен старший (восьмой) бит. Основная часть сообщения должна состоять обычных семибитных символов.
В отличие от quoted printable, кодирование Base-64 увеличивает размер сообщения всего лишь на одну треть. Каждая последовательность из трех байтов (24 бита) превращается в четыре шестибитовых (тоже 24 бита). Шестибитные символы соответствуют формату NVT ASCII и приведены в табл. 6.
Таблица 6
Таблица кодировки Base-64
6 бит | ASCII | 6 бит | ASCII | 6 бит | ASCII | 6 бит | ASCII |
0 | A | 16 | Q | 32 | g | 48 | w |
1 | B | 17 | R | 33 | h | 49 | x |
2 | C | 18 | S | 34 | i | 50 | y |
3 | D | 19 | T | 35 | j | 51 | z |
4 | E | 20 | U | 36 | k | 52 | 0 |
5 | F | 21 | V | 37 | l | 53 | 1 |
6 | G | 22 | W | 38 | m | 54 | 2 |
7 | H | 23 | X | 39 | n | 55 | 3 |
8 | I | 24 | Y | 40 | o | 56 | 4 |
9 | J | 25 | Z | 41 | p | 57 | 5 |
10 | K | 26 | a | 42 | q | 58 | 6 |
11 | L | 27 | b | 43 | r | 59 | 7 |
12 | M | 28 | c | 44 | s | 60 | 8 |
13 | N | 29 | d | 45 | t | 61 | 9 |
14 | O | 30 | e | 46 | u | 62 | + |
15 | P | 31 | f | 47 | v | 63 | / |
Если количество байтов (символов) в сообщении не кратно трем, используются дополняющие символы “равно”. Например, слово KEN в формате Base-64 выглядит как “S0VO” (дополнительных символов не требуется). Слово COPE в формате Base-64 выглядит как “Q09QRQ==” (требуются два дополнительных символа-нуля). Слово JAMSA в формате Base-64 выглядит как “SkFNU0E=” (требуется один дополнительный символ-ноль).
2.2.4. Реализации метода Base-64.
Далее рассмотрен процесс кодирования слова KEN методом Base-64. Описания участвующих в процессе переменных:
BYTE cTemp, cTempHigh, cTempLow;
BYTE cFirst6Bits, cSecond6Bits;
BYTE cThird6Bits, cFourth6Bits;
BYTE cFirstLetter = ‘K’;
BYTE cSecondLetter = ‘E’;
BYTE cThirdLetter = ‘N’;
Кодирование данных по методу Base-64
Операторы языка C/C++, реализующие способ кодирования Base-64:
cFirst5Bits = cFirthLetter >> 2; (1)
cTemp = cFirstLetter << 4; (2A)