Опубликован: 10.10.2007 | Уровень: специалист | Доступ: платный
Лекция 3:

Протокол электронной почты. Примеры и расширения

< Лекция 2 || Лекция 3: 123 || Лекция 4 >

Синтаксис кодировочных слов (encoded-words)

Кодировочное слово определено согласно следующей ABNF-грамматике. Используется нотация RFC-822, за исключением того, что символы white space (HT и SP – символы табуляции и пробела) не должны появляться между компонентами кодировочного слова.

encoded-word = "=?" charset "?" encoding "?" encoded-text "?="
charset = token
encoding = token
token = 1*
especials = "(" / ")" / "<" / ">" / "@" / "," / ";" / ":" / 
  " <"> / "/" / "[" / "]" / "?" / "." / "="
encoded-text = 1*<Любой печатный ASCII-символ, отличный от "?" или пробела (SP)>
; (см. "Использование encoded-words в заголовках сообщений")

Слова encoding и charset не зависят от регистра, в котором напечатаны. Таким образом, символьный набор с именем ISO-8859-1 эквивалентен iso-8859-1, а кодирование с именем "Q" может записываться как "Q" или "q".

Кодировочное слово не может быть длиннее 75 символов, включая charset, encoding, encoded-text и разделители. Если желательно закодировать текст, больший, чем 75 символов, можно использовать несколько кодировочных слов, разделенных CRLF SP.

Хотя ограничений на длину многострочного поля заголовка нет, каждая строка поля заголовка, которая содержит одно или более кодировочных слов, ограничена 76 символами.

Ограничения длины введены, чтобы облегчить сетевое взаимодействие различных почтовых шлюзов и упростить работу программ разборки кодировочных слов.

Кодировочные слова сконструированы так, чтобы быть узнаваемыми как атомы программой грамматического разбора RFC-822. Как следствие, незакодированные символы SP и HT в пределах кодировочных слов запрещены. Например, символьная последовательность

=?iso-8859-1?q?this is some text?=

будет воспринята программой разборки RFC-822 как четыре атома, а не как один атом или как кодировочное слово (в случае программы разборки, воспринимающей кодировочные слова). Правильный способ закодировать строку "this is some text" — это кодировать и сами пробелы, например:

=?iso-8859-1?q?this=20is=20some=20text?=

Символьный набор

Секция charset кодировочного слова специфицирует символьный набор, соответствующий незакодированному тексту. Charset может представлять любой символьный набор, разрешенный параметром charset MIME части тела text/plain, или любой символьный набор с именем, зарегистрированным IANA для использования с типом содержимого text/plain MIME.

Некоторые символьные наборы используют технику переключения кодов для перехода между режимом ASCII и другими режимами. Если текст в кодировочном слове содержит последовательность, которая заставляет интерпретатор символьного набора переключиться из режима ASCII, он должен содержать дополнительные управляющие коды, которые переключат систему в ASCII-режим в конце кодировочного слова.

Когда имеется возможность использования более одного символьного набора для представления текста в кодировочном слове и в отсутствие частного соглашения между отправителем и получателем сообщения, рекомендуется использовать объекты символьного семейства ISO-8859-*.

Кодирование

Первоначально легальными значениями кодирования являются Q и B. Эти кодировки описаны ниже. Кодирование Q рекомендуется для использования, когда большинство символов, которые нужно преобразовать, представлены в наборе ASCII; в противном случае, следует использовать B-кодирование. Несмотря ни на что, программа, читающая почту, которая воспринимает кодировочные слова, должна быть способна обрабатывать любые кодировки для любых символьных наборов, которые она поддерживает.

В кодированном тексте может использоваться только субнабор печатных ASCII-символов. Символы SP и HT не допустимы, чтобы начало и конец кодировочного слова были выделены однозначно. Символ "?" используется в кодировочном слове для разделения различных частей этого слова друг от друга. По этой причине "?" не может появляться в секциях кодировочного слова. Другие символы могут также оказаться нелегальными в определенном контексте. Например, encoded-word во фразе, предшествующей адресу в поле заголовка From, не может содержать какие-либо специальные символы, определенные в RFC-822. Наконец, некоторые другие символы также недопустимы в определенных контекстах, это связано с необходимостью обеспечить надежность пересылки сообщений через почтовые шлюзы.

B-кодирование автоматически отвечает этим требованиям. Q-кодирование допускает использование широкого перечня печатных символов в некритических позициях заголовка сообщения (например, в Subject), с ограниченным списком символов, допустимых в других полях. B-кодирование идентично BASE64, описанному RFC-2045.

Q-кодирование

Q-кодирование подобно закавыченным строкам печатных символов (Quoted-Printable), описанным в RFC-2045. Оно создано, чтобы позволить читать текст, содержащий по большей части ASCII-символы, на алфавитно-цифровом терминале без декодирования.

  1. Любой 8-битовый код может быть представлен с помощью символа "=", за которым следуют два шестнадцатеричных числа. Например, если бы используемый символьный набор был ISO-8859-1, символ "=" кодировался как "=3D", а пробел (SP) как "=20". (Для шестнадцатеричных чисел следует использовать верхний регистр "A" - "F".)
  2. 8-битовое шестнадцатеричное число 20 (напр., ISO-8859-1 SPACE) может быть представлено как "_" (знак подчеркивания, ASCII 95). (Этот символ может не пройти через некоторые почтовые шлюзы, но его использование существенно улучшает читаемость Q-кодированных данных в почтовых системах, которые поддерживают этот вид кодирования). Заметим, что "_" всегда представляется шестнадцатеричным кодом 20, даже если символ пробел (SPACE) занимает другую кодовую позицию в используемом символьном наборе
  3. 8-битовые значения, которые соответствуют печатным ASCII-символам, отличным от "=", "?" и "_", могут быть представлены самими собой. SP и HT не должны представляться самими собой в пределах кодировочных слов

Использование кодировочных слов в заголовках сообщений

Encoded-word может появиться в заголовке сообщения или в заголовке тела секции в соответствии со следующими правилами.

  1. encoded-word может заменить текстовую лексему (как это определено в RFC-822) в любом из полей заголовка Subject или Comments, в любом поле расширения заголовка или любом поле секции тела MIME. Обычный ASCII-текст и кодировочные слова могут появляться совместно в пределах одного и того же поля заголовка. Однако кодировочное слово, появляющееся в поле заголовка, определенное как '*text', должно быть отделено от любого смежного encoded-word или текста с помощью LWS (HT|SP|CRLF)
  2. encoded-word может появляться внутри комментария, ограниченного "(" и ")", т.е., там, где допустим 'ctext'. Более точно, ABNF-определение (RFC-822) для 'comment' следует скорректировать как:
    comment = "(" *(ctext | quoted-pair | comment | encoded-word) ")"

    Q-кодированное encoded-word, которое появляется в комментарии, не должно содержать символов "(", ")" или ". Кодировочное слово, появляющееся в комментарии, должно отделяться от смежного encoded-word или ctext с помощью LWS.

    Важно заметить, что комментарии распознаются только внутри структурированных полей тела. В полях, чьи тела определены как '*text', "(" и ")" обрабатываются как обычные символы, а не как разделители комментариев, и применимо правило (1) этой секции.

  3. encoded-word может появляться в качестве замены для объекта word во фразе, например, перед адресом в заголовке From, To или Cc. ABNF-определение для phrase RFC-822 приобретает вид:
    phrase = 1*( encoded-word / word)

    В этом случае набор символов, который можно использовать с Q-кодированным encoded-word, ограничивается до: <ASCII-буква верхнего и нижнего регистров, десятичные цифры, "!", "*", "+", "-", "/", "=" и "_" (ASCII 95)>. Кодировочное слово, которое появляется внутри фразы, должно быть отделено от любого смежного слова, текста или специального символа посредством LWS. Это единственные места, где может появиться encoded-word. В частности:

    • encoded-word не должно появляться в любой части addr-spec ;
    • encoded-word не должно появляться в пределах quoted-string (закавыченная строка);
    • encoded-word не должно использоваться в поле заголовка Received ;
    • encoded-word не должно использоваться в параметре MIME поля Content-Type, или Content-Disposition, или в любом структурированном поле тела, за исключением comment или phrase.

Кодированный текст не должен продолжаться от одного encodedword к другому. Это предполагает, что секция кодированного текста будет иметь длину, кратную 4 символам; для Q-encoded-word, за любым символом "=", который появляется в секции кодированного текста, следуют две шестнадцатеричные цифры.

Каждое encoded-word должно кодировать полное число октетов. Кодированный текст в каждом encoded-word должен быть хорошо оформлен согласно специфицированному кодированию.

Каждое encoded-word должно представлять собой целое число символов. Многооктетные символы не могут расщепляться между смежными кодировочными словами.

< Лекция 2 || Лекция 3: 123 || Лекция 4 >
Наталья Шульга
Наталья Шульга

Курс "информационная безопасность" .

Можно ли на него записаться на ПЕРЕПОДГОТОВКУ по данному курсу? Выдается ли диплом в бумажном варианте и высылается ли он по почте?

Нияз Сабиров
Нияз Сабиров

Здравствуйте. А уточните, пожалуйста, по какой причине стоимость изменилась? Была стоимость в 1 рубль, стала в 9900 рублей.

Роман Ижванов
Роман Ижванов
Россия, Университет природы, общества и человека «Дубна»
Анастасия Шмакова
Анастасия Шмакова
Россия, Тольятти, ПВГУС, 2013