Местным расширением является любое поле, команда или название опции, начинающееся с буквы X.
При разработке собственных расширений почтовой системы необходимо, чтобы имена всех новых объектов начинались с буквы X. Например, пользовательский вариант декодирования тела сообщения должен называться не DECODE, как можно было бы предположить, a XDECODE. SMTP-сервер организации при этом должен включить местное расширение XDECODE в список, выдаваемый по команде EHLO (с кодом ответа 250):
250 XDECODE2.2.2. MIME.
Система MIME - наиболее впечатляющее расширение для существующих почтовых систем. Она не предполагает вмешательства в деятельность агентов передачи почты. Два агента пользователя, понимающие MIME, могут общаться друг с другом при помощи обыкновенных МТА. В MIME к сообщению просто добавляются несколько полей заголовка:
Номера версий 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)
cTempHigh = cTemp & 0x30; (2B)
cTempLow = cSecondLetter >> 4; (2C)
cSecond6Bits = cTempHigh | cTempL w; (2D)
cTemp = cSecondLetter << 2; (3A)
cTempHigh = cTemp & 0x3C; (3B)
cTempLow = cThirdLetter >> 6; (3C)
cThird6Bits = cTempHigh | c TempLow; (3D)
cFourth6Bits = cThirdLetter & 0x3F; (4)
Первым делом биты переменной сFirstLetter (символа K) сдвигаются вправо на две позиции. Получается новый байт, содержащий первые шесть бит нашей последовательности. Далее полученное значение записывается в переменную cFirst6Bits. Дальше, чтобы получить следующее значение, нужно объединить два младших бита первого символа (K) с четырьмя старшими второго (E), т.е. нужно переместить первый и второй биты буквы K на позиции 5 и 6 – они будут старшими битами следующего шестибитного символа. Операция 2А, двоичный сдвиг влево на четыре позиции демонстрирует, как это делается. Результат сдвига запоминается во вспомогательной переменной cTemp.
Сдвиг оператором 2А очищает позиции с 1 по 4, а биты 3 и 4 буквы K теперь расположены на позициях 7 и 8. Позиции 7 и 8 необходимо очистить, поскольку нам нужны только первые шесть битов нового символа. Для этого выполняется оператор 2В, “двоичное И”. Битовая маска 00110000 (0х30) очищает все позиции, кроме пятой и шестой (в них содержатся интересующие нас данные). Поскольку биты 5 и 6 теперь старшие для нового символа Base-64, результат помещается (оператором 2В) во вспомогательную переменную cTempHigh.