Смекни!
smekni.com

Электронная почта как сервис глобальной сети. Протоколы передачи почты (стр. 6 из 12)

Местным расширением является любое поле, команда или название опции, начинающееся с буквы X.

При разработке собственных расширений почтовой системы необходимо, чтобы имена всех новых объектов начинались с буквы X. Например, пользовательский вариант декодирования тела сообщения должен называться не DECODE, как можно было бы предположить, a XDECODE. SMTP-сервер организации при этом должен включить местное расширение XDECODE в список, выдаваемый по команде EHLO (с кодом ответа 250):

250 XDECODE

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)

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.