Спецификация MIME

На главную страницу


MIME (Multipurpose Internet Mail Extension)


Стандарт MIME, или в нотации Internet RFC-1341, RFC-1521, предназначен для описания тела почтового сообщения Internet. Предшественником MIME является стандарт почтового сообщения ARPA (RFC822). Стандарт RFC822 был разработан для обмена текстовыми сообщениями. С момента опубликования стандарта возможности аппаратных средств и телекоммуникаций ушли далеко вперед и стало ясно, что многие типы информации, которые широко используются в сети невозможно передать по почте без специальных ухищрений. Так в тело сообщения нельзя включить графику, аудио, видео и другие типы информации. RFC822 не дает возможностей для передачи даже текстовой информации, которую нельзя реализовать в семибитовой кодировке ASCII. Естественно, что при использовании RFC822 не может быть и речи о передаче размеченного текста для отображения его различными стилями. Ограничения RFC822 становятся еще более очевидными, когда речь заходит об обмене сообщениями в разных почтовых системах. Например, для приема/передачи сообщений из/в X.400, который позволяет иметь двоичные данные в теле сообщения, ограничения старого стандарта могут стать фатальными, так как не спасает старый испытанный способ кодировки информации процедурой uuencode, так как эти данные могут быть по-различному проинтерпретированы в X.400 и программе рассылки почты в Internet (mail-agent). Расширением стандарта RFC-1341 является стандарт RFC-1521 , который добавляет некоторые новые типы данных и поля тела сообщения.

В некотором смысле стандарт MIME ортогонален стандарту RFC822. Если последний подробно описывает в заголовке почтового сообщения текстовое тело письма и механизм его рассылки, то MIME, главным образом, сориентирован на описание в заголовке письма структуры тела почтового сообщения и возможности составления письма из информационных единиц различных типов.

В стандарте зарезервировано несколько способов представления разнородной информации. Для этой цели используются специальные поля заголовка почтового сообщения:

Стандарт MIME разработан как расширяемая спецификация, в которой подразумевается, что число типов данных будет расти по мере развития форм представления данных. При этом следует учитывать, что анархия типов (безграничное их увеличение) тоже не допустима. Каждый новый тип в обязательном порядке должен быть зарегистрирован в IANA (Internet Assigned Numbers Authority). Остановимся подробнее на форме и назначении полей, определяемых стандартом.

Поле типа кодирования почтового сообщения (Content-Transfer-Encoding).
Многие данные передаются по почте в их исходном виде. Это могут быть 7bit символы, 8bit символы, 64base символы и т.п. Однако при работе в разнородных почтовых средах необходимо определить механизм их представления в стандартном виде - US-ASCII. Для этого существуют процедуры кодирования такого сорта данных. Наиболее широко применяемая - uuencode. Для того, чтобы при получении данные были бы правильно распакованы и введено в стандарт поле "Сontent-Transfer-Encoding". Синтаксис этого поля следующий:

	Content-Transfer-Encoding:= "BASE64" / "QUOTED-PRINTABLE" /
		                    "8BIT"   / "7BIT" /
		                    "BINARY" / x-token

Каждая из альтернатив применяется в своем подходящем случае. Альтернативы "8bit", "7bit", "BINARY" реально никакого преобразования не требуют, так как почта передается байтами и SMTP не делает различия между ними. Однако они введены для строгости описания типов. "BASE64" обычно используется в связке с типом "text/ISO-8859-1", "x-token" позволяет пользователю описать свою процедуру преобразования.

Поле версии MIME (MIME-Version)

Поле версии указывается в заголовке почтового сообщения и позволяет определить программе рассылки почты, что сообщение подготовлено в стандарте MIME. Формат поля выглядит как:

  MIME-Version: 1.0

Поле версии указывается в общем заголовке почтового сообщения и относится ко всему сообщению целиком. Здесь уместно отметить, что в отличие от стандарта RFC822, стандарт MIME позволяет перемешивать поля заголовка сообщения с телом сообщения. Поэтому все поля делятся на два класса: общие поля заголовка, которые записываются в начале почтового сообщения и частные поля заголовка, которые относятся только к отдельным частям составного сообщения и записываются перед ними.

Поле типа содержания тела почтового сообщения (Content-Type)

Поле типа используется для описания типа данных, которые содержатся в теле почтового сообщения. Это поле сообщает программе чтения почты какого сорта преобразования необходимы для того, чтобы сообщение правильно проинтерпретировать. Эта же информация используется и программой рассылки при кодировании/декодировании почты. Стандарт MIME определяет семь типов данных, которые можно передавать в теле письма:

  1. текст (text);
  2. смешанный тип (multipart);
  3. почтовое сообщение (message);
  4. графический образ (image);
  5. аудио информация (audio);
  6. фильм или видео (video);
  7. приложение (application).
Общая форма записи поля выглядит в записи Бекуса-Наура как:
   Content-Type:= type "/" subtype *[";" parameter]        
   type:=    "application" /"audio"
             / "image"           / "message"
             / "multipart"       / "text"
             / "video"           / x-token        
   x-token := <Два символа "X-", за которыми без пробела
		    следует последовательность любых символов>
   subtype := token        
   parameter:= attribute "=" value        
   attribute:= token	
   value := token / quoted-string	
   token := 1*<любой символ кроме пробела и управляющего символа,
            или tspecials>
   tspecials:=  "(" /")" / "<" / ">" / "@"      ; Обязательно 
                /  "," / ";" / ":" / "\" / <">  ; должны быть,
                /  "/" / "[" / "]" / "?" / "."  ; заключены в 
                /  "="                          ; кавычки.

Остановимся подробнее на каждом из типов, разрешенных стандартом MIME.

"Text".
Этот тип указывает на то, что в теле сообщения содержится текст. Основным подтипом типа "text" является "plain", что обозначает так называемый планарный текст. Понятие планарного текста появилось в связи с тем, что существует еще размеченный текст, т.е. текст со встроенными в него символами управления отображением, и гипертекст, т.е. текст, который можно просматривать не последовательно, а произвольно, следуя гипертекстовым ссылкам. Для обозначения размеченного текста используют подтип "richtext", а для обозначения гипертекста подтип "html". Вообще говоря, "html" - это специальный вид размеченного текста, который используется для представления гипертекстовой информации в системе World Wide Web, которая получила в последнее время широкое распространение в Internet. Понятие размеченного текста требует более подробного обсуждения, так как его передача и интерпретация являются одной из причин появления стандарта MIME.

"Richtext" определяет текст со встроенными в него специальными управляющими последовательностями, которые в соответствии со стандартом языка разметки документов SGML называются тагами. Таги представляют из себя последовательность символов типа "< строка-символов>". "Строка-символов" определяет управляющее действие. Таги делятся на таги начала элемента текста ("<......>") и таги конца элемента текста ("</......>"). В качестве примера такой разметки можно привести следующий фрагмент текста:

	<bold>Now</bold> is the time for
	<italic>all</italic> good men
        <smaller>(and <lt>women>)</smaller> to
	<ignoreme></ignoreme> come	to the aid of their
	<nl>

В этом фрагменте <bold> означает выделение "жирным" шрифтом, <italic> - курсив, <smaller> - мелкий шрифт, <lt> - знак "<", игнорирование обозначено как <ignoreme>, новая строка как <nl>.

Специальный тип разметки задается подтипом "html". Это так называемый гипертекст. Разметка гипертекста строится по тому же принципу как и в тексте типа "richtext".Однако применяются таги, позволяющие описать гипертекстовые ссылки. К таким тагам относятся "< A HREF="......">.....</A>", <IMG ....>, < A NAME="...."></A>. Таг "<A HREF="......"> .......</A> определяет следующий фрагмент текста, который будет просматриваться. При этом текст между тагом начала и тагом конца будет выделен в программе просмотра цветом или другим способом и используется как контекстная гипертекстовая ссылка. Таг <IMG .....> задет встроенный в текст документа графический образ. В некотором смысле этот таг аналогичен "multipart", который разрешает комбинировать сообщение из нескольких фрагментов разного типа. Таг <A NAME...> определяет "якорь", т.е. место внутри документа, на которое можно сослаться как на метку. В качестве примера такой разметки текста можно привести следующий фрагмент:

	Это пример разметки документа в формате HTML.	        
                <H1>Это заголовок документа</H1>
	        <P> - Это параграф.
	        <A HREF="test.html#mark1">
	Это пример гипертекстовой ссылки.</A>
	        <IMG SRC="test.gif" ALIGN=Bottom>
 	Это встроенный image.
	        <A NAME="mark1"></A>
	Это "якорь" внутри текста документа.

"Multipart".
Этот тип содержания тела почтового сообщения определяет смешанный документ. Смешанный документ может состоять из фрагментов данных разного типа. Данный тип имеет ряд подтипов.

Подтип "mixed" - задает сообщение, состоящее из нескольких фрагментов, которые разделены между собой границей, задаваемой в качестве параметра подтипа. Приведем простой пример:

	
        From: Nathaniel Borenstein <nsb@bellcore.com>
        To: Ned Freed <ned@innosoft.com>
        Subject: Sample message
        MIME-Version: 1.0
        Content-type: multipart/mixed; boundary="simple boundary"
        This is the preamble.  It is to be ignored, though it is a
	handy place for mail composers to include an explanatory
	note to non-MIME compliant readers.
        --simple boundary
        This is implicitly typed plain ASCII text.
        It does NOT end with a linebreak.
        --simple boundary
        Content-type: text/plain; charset=us-ascii
        This is explicitly typed plain ASCII text.
        It DOES end with a linebreak.
        --simple boundary--
        This is the epilogue.  It is also to be ignored.

В данном примере поле "Content-Type" определяет подтип "mixed" и границу между фрагментами, как строку "--simple boundary--". В начале каждого фрагмента может быть задана своя строка с полем "Content-Type". Как видно из примера, существует два фрагмента, которые не отображаются: преамбула и эпилог, в которые можно поместить комментарии.

Другим подтипом может быть подтип "alternative". Данный подтип позволяет организовать вариабельный просмотр почтового сообщения в зависимости от типа программы просмотра. Приведем пример:

	
        From:  Nathaniel Borenstein <nsb@bellcore.com>
	To: Ned Freed <ned@innosoft.com>
	Subject: Formatted text mail
        MIME-Version: 1.0
	Content-Type: multipart/alternative; boundary=boundary42
	--boundary42
	1 фрагмент
	Content-Type: text/plain; charset=us-ascii
        ...plain text version of message goes here....
	--boundary42
	2 фрагмент
        Content-Type: text/richtext
        .... richtext version of same message goes here ...
        --boundary42
	3 фрагмент
        Content-Type: text/x-whatever
        .... fanciest formatted version of same  message  goes  here ...
        --boundary42--

В этом примере для работы с планарным текстом при использовании алфавитно-цифровых программ просмотра предназначен первый фрагмент текста. Для просмотра размеченного текста используется второй фрагмент, для специальной программы просмотра может быть подготовлен специальный вариант (фрагмент 3).

Подтип "digest" предназначен для многоцелевого почтового сообщения, когда различным частям хотят приписать более детальную информацию, чем просто тип:

	From: Moderator-Address
	MIME-Version: 1.0
	Subject: Internet Digest, volume 42
	Content-Type: multipart/digest;
		boundary="---- next message ----"
		------ next message ----
	From: someone-else
	Subject: my opinion
	...body goes here ...
		------ next message ----
	From: someone-else-again
	Subject: my different opinion
	... another body goes here...
		------ next message ------

Приведенный пример показывает как можно воспользоваться подтипом "digest" для рассылки почты разным пользователям и по-разному поводу, используя поля "From:" и "Subject" в качестве частных заголовков.

Подтип "parallel" предназначен для составления такого почтового сообщения, части которого должны отображаться одновременно, что предполагает запуск сразу нескольких программ просмотра. Синтаксис такого сообщения аналогичен рассмотренным выше.

Тип "message".
Данный тип предназначен для работы с обычными почтовыми сообщениями, которые однако не могут быть переданы по почте по разного рода причинам. Эти причины объясняются подтипами данного типа.

Подтип "partial" предназначен для передачи одного большого сообщения по частям для последующей автоматической сборки у получателя.
Этот механизм может пригодиться, когда промежуточные почтовые шлюзы ограничивают индивидуальный размер пересылаемых писем. Т.о., этот подтип говорит о том, что письмо содержит лишь часть большого послания.

Для этого подтипа необходимо указание трех параметров:

  1. "id" - уникальный идентификатор, позволяющий обнаружить остальные части послания.
  2. "number" - целое число, означающее номер части послания.
  3. "total" - целое число, означающее общее количество частей. Требуется лишь в последней части и не обязателен (хотя рекомендуется) для предыдущих частей. Эти параметры могут следовать в произвольном порядке.
При "сборке" таких посланий в пункте назначения должны учитываться следующие правила:
  1. Все поля заголовка части 1, кроме начинающихся с "Content-" и специальных "Message-ID", "Encrypted" и "MIME-Version" должны быть скопированы в заголовок нового (общего) письма.
  2. Только поля заголовка ВЛОЖЕННОГО письма, начинающиеся с "Content-", а также поля "Message-ID", "Encrypted" и "MIME-Version", должны быть добавлены к заголовку нового общего письма, все остальные поля должны игнорироваться
  3. Заголовки второй и последующих частей целиком игнорируются.

Замечание по кодированию тела MIME-письма, заключенного внутри тела message/partial: так как данные типа "message" никогда не могут быть кодированы в Base64 или Quoted-Printable, следующая проблема может возникнуть в случае, если тела писем типа message/partial созданы в системе, поддерживающей 8-битный транспорт. Двоичные данные будут разбиты на несколько message/partial-объектов, каждому из которых требуется транспортировка в двоичном виде. Если бы таким объектам пришлось пройти через шлюз в 7-битную транспортную среду, их невозможно было бы перекодировать в сеимбитную форму без ожидания прибытия всех частей послания, собирания их воедино и затем кодирования целого послания в 7-битную кодировку (base64 или quoted-printable). Поскльку существует вероятность, что разные части пойдут разными путями (через различные шлюзы), то подобное решение не приемлимо. Поэтому MIME определяет, что письма типа message/partial должны иметь 7-битную кодировку и соответствующее ей значение поля content-transfer-encoding. Даже для систем с транспортом, поддерживающим "8-бит" и "binary", запрещается их использование для данных message/partial.

Многие почтовые агенты могут автоматически фрагментировать большие письма.

Включение поля "References" в заголовки второй и последующих частей, ссылающегося на идентификатор предыдущей части, может оказаться полезным для почтовых программ, понимающих и обрабатывающих ссылки. Однако, наличие этого поля не обязательно.

Поле заголовка "Encrypted" вышло из употребления, но вышеприведенные правила обеспечивают корректную его интерпретацию, если оно встречается при обработке фрагментов типа message/partial. Приведем пример передачи аудио сообщения разбитого на части:

	X-Weird-Header-1: Foo
	From: Bill@host.com
	To: joe@otherhost.com
	Subject: Audio mail
		Message-ID: id1@host.com
	MIME-Version: 1.0
	Content-type: message/partial;
		id="ABC@host.com";
	        number=1; total=2
	X-Weird-Header-1: Bar
	X-Weird-Header-2: Hello
	Message-ID: anotherid@foo.com
	Content-type: audio/basic
	Content-transfer-encoding: base64
	... first half of encoded audio data goes here...
        and the second half might look something like this:
	From: Bill@host.com
	To: joe@otherhost.com
	Subject: Audio mail
	MIME-Version: 1.0
	Message-ID: id2@host.com
	Content-type: message/partial;
		id="ABC@host.com"; number=2; total=2
	... second half of encoded audio data goes here...

Атрибуты подтипа определяют идентификатор сообщения (id), номер порции (number) и общее число порций (total). Следует обратить внимание на то, что каждая часть имеет свое поле "Content-Type". Это означает, что все сообщение может состоять из частей разных типов.

Другим подтипом является "External-Body", который позволяет ссылаться на внешние, относительно сообщения, информационные источники. Этот подтип похож на гипертекстовую ссылку из типа "text". Приведем конкретный пример:

	From: Whomever
	Subject: whatever
	MIME-Version: 1.0
	Message-ID: id1@host.com
	Content-Type: multipart/alternative; boundary=42
	--42
        Content-Type: message/external-body;
		name="BodyFormats.ps";
		site="thumper.bellcore.com";
		access-type=ANON-FTP;
		directory="pub";
		mode="image";
		expiration="Fri, 14 Jun 1991 19:13:14 -0400 (EDT)"
	Content-type: application/postscript
	--42
	Content-Type: message/external-body;
		name="/u/nsb/writing/rfcs/RFC-XXXX.ps";
		site="thumper.bellcore.com";
		access-type=AFS
		expiration="Fri, 14 Jun 1991 19:13:14 -0400 (EDT)"
	Content-type: application/postscript
	--42
	Content-Type: message/external-body;
		access-type=mail-server
		server="listserv@bogus.bitnet";
		expiration="Fri, 14 Jun 1991 19:13:14 -0400 (EDT)"
	Content-type: application/postscript
	get rfc-xxxx doc
	--42--

В данном примере приведено использование "External-Body" и "multipart/alternative". Все сообщение разбито на несколько фрагментов. В каждом из фрагментов находится ссылка на внешний файл. Реально тела почтового сообщения нет (границы программами просмотра не отображаются). Однако если программа просмотра способна работать с внешними протоколами, то можно ссылки разрешить автоматически, запуская соответствующий сервис.

Единственный всегда обязательный параметр для 'message/external-body' - "access-type". Остальные параметры могут быть или не быть обязательными в зависимости от значения параметра "access-type".

Значение этого параметра - слово, нечувствительное к регистру букв, означающее механизм доступа, с помощью которого файл или данные могут быть получены. Значения могут быть следующими (но не ограничиваются этим рядом): "FTP", "ANON-FTP", "TFTP", "AFS", "LOCAL-FILE" и "MAIL-SERVER". Будущие возможные значения, кроме экспериментальных, начинающихся с "X-", должны быть зарегистрированы в IANA.

Дополнительно, следующие три параметра являются необязательными для всех способов доступа:

EXPIRATION -- Дата (RFC 822 "date-time" синтаксис допускает 4 цифры в этом поле), после которой существование внешних данных не гарантируется.

SIZE -- размер (в байтах) данных. Позволяет получателю решить, расходовать ли ресурсы на считывание внешних данных. Размер указывается для канонической формы данных (то есть, до применения каких-либо преобразований).

PERMISSION -- нечувствительное к регистру букв поле, говорящее о том, ожидается или нет, что клиент может перезаписывать данные. По умолчанию или когда этот параметр имеет значение "read", полагается, что клиент не имеет на это права, и что если данные однажды считаны, то больше они не понадобятся. Если PERMISSION имеет значение "read-write", любая локальная копия может рассматриваться не более как кэш. "read" и "write" - единственные предопределенные значения для PERMISSION.

Вложенные заголовки во ВСЕХ телах типа message/external-body ДОЛЖНЫ включать поле заголовка Content-ID для задания уникального идентификатора, указывающего на внешние данные.

Обозначения, описывающие данные типа external-body, такие как имена файлов или команды mail-сервера, должны быть в символьном наборе US-ASCII.

Как и для типа message/partial, тело типа message/external-body должно иметь значение content-transfer-encoding "7-bit" (по умолчанию). В частности, даже в системах, поддержиавющих 8-битный транспорт, применение content-transfer-encoding "8-bit" и "binary" запрещено для данных типа message/external-body.

back contents next

Hosted by uCoz