Это сообщение из нескольких частей в формате mime

Обновлено: 06.07.2024

MIME
Protocol stack
Purpose Передача различных типов данных по электронной почте
Developer(s) IETF (Internet Engineering Task Force)
Introduced 1991 ; 31 years ago ( 1991 )
OSI layer Уровень представления
RFC(s) RFC 1341, RFC 1342, RFC 2045, RFC 2046, RFC 2047, RFC 4288, RFC 4289, RFC 2049, RFC 2045, RFC 1521, RFC 1522, RFC 2183, RFC 2231, RFC 6152, RFC 3030, RFC 2822, RFC 2387, RFC 2388, RFC 6522, RFC 1847, RFC 3156, RFC 7578, RFC 2616

MIME добавляет следующие функции в службу электронной почты:

MIME указан в шести связанных RFC-стандартах: RFC 2045, RFC 2046, RFC 2047, RFC 4288, RFC 4289 и RFC 2049 с интеграцией с электронной почтой SMTP, подробно описанной в RFC 1521 и RFC 1522.

Содержание

Заголовки MIME

MIME-Version


По словам создателя MIME Натаниэля Боренштейна, целью было разрешить MIME изменяться до версии 2.0 и так далее, но это решение привело к противоположному результату. Стало почти невозможно создать новую версию стандарта. Со слов Боренштейна они не определили как будут обрабатывать будущую версию MIME.

Content-Type

Content-Disposition

В дополнение к стилю представления данный заголовок также предоставляет поля для указания имени файла, даты создания и даты изменения, которые могут использоваться почтовым агентом читателя для хранения вложения. Следующий пример взят из RFC 2183, где определяется заголовок:

Имя файла может быть закодировано в соответствии с RFC 2231.

Content-Transfer-Encoding

В июне 1992 года MIME определил набор методов для представления двоичных данных в форматах, отличных от текстового формата ASCII. Кодирование передачи содержимого (Content-Transfer-Encoding): заголовок MIME имеет двустороннее значение:

Не определено кодирование, которое явно предназначено для отправки произвольных двоичных данных через SMTP с расширением 8BITMIME. Таким образом, если BINARYMIME не поддерживается, иногда полезно использовать base64 или quoted-printable (с их ассоциированной неэффективностью). Это ограничение не распространяется на другие виды использования MIME, такие как веб-службы с MIME-приложениями или MTOM.

Закодированные слова

Различия между кодированием Quoted-printable и Q-кодированием

Например, Subject: =?iso-8859-1?Q?=A1Hola,_se=F1or!?= Это можно перевести как: "Subject:¡Hola, señor!"

Смешанный

Дайджест

Альтернативный

Связанный

Отчёт

Подписанный

Зашифрованные

Form-Data

Смешанно-заменяемый

Byteranges

Тест Марка Криспина

Марк Криспин, автор протокола IMAP, написал тест для проверки корректности обработки MIME. Тест представляет собой письмо в формате mbox с таким содержанием: "Это сумасшедшее письмо! В нём около 30 вложенных друг в друга частей. Очень хороший тест". [Источник 4]

В любом случае приложению должны быть предоставлены разрешения на доступ к элементу Outlook или записи, чтобы применить операцию get-message или get-attachment.

Что такое MIME?

MIME — это стандарт, используемый для электронной почты в Интернете, чтобы передавать контент следующих типов по протоколу SMTP:

Пример

Ниже приведен отклик. Содержимое MIME начинается с заголовка MIME-Version .

Пример

Ниже приведен отклик. Содержимое MIME начинается с заголовка MIME-Version .

Медиа тип (так же известный как Multipurpose Internet Mail Extensions или MIME тип) является стандартом, который описывает природу и формат документа, файла или набора байтов. Он определён и стандартизирован в спецификации RFC 6838 .

Организация Internet Assigned Numbers Authority (IANA) является ответственной за все официально признанные MIME типы, и вы можете найти самый последний и полный лист MIME типов на их странице Медиа Типов.

Важно: Для принятия решения о том, как обрабатывать URL, браузеры используют MIME типы, а не расширения файлов, так что серверам необходимо отправлять правильные MIME типы в Content-Type заголовке ответа. При неточном задавании этого заголовка, браузеры с большой вероятностью будут неправильно интерпретировать и обрабатывать содержание файлов, из-за чего сайт будет работать неверно.

Структура MIME типа

Простейший MIME тип состоит из типа и подтипа — двух строк разделённых наклонной чертой ( / ), без использования пробелов.

Тип представляет общую категорию, в которой находится тип данных, например video или text . Подтип же строго отождествляется с отдельным типом данных, представляемых данным MIME типом. Например, для MIME типа text , подтипы могут быть plain (простой текст), html (HTML source code) или calendar (для iCalendar/ . ics ).

Необязательный параметр может быть добавлен для указания дополнительных деталей

Например, для MIME типов категории text , необязательный параметр charset может быть задан для уточнения кодировки, используемой в документе. Для объявления, что пересылаемый файл имеет кодировку UTF-8, необходимо использовать MIME тип text/plain;charset=UTF-8 . При не указании параметра charset , его значение автоматически будет задано, как ASCII ( US - ASCII ), если в настройках браузера не будет определено иначе.

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

Дискретные типы

application Список IANA Любой вид бинарных данных, явно не попадающих ни в одну другу группу типов. Данные, которые будут выполняться или как-либо интерпретироваться, или данные для выполнения, которых необходимо отдельное приложение. Для указания базового типа бинарных данных (данных без определённого типа) используют тип application/octet-stream . Другие распространённые примеры включают application/pdf , application/pkcs8 и application/zip . audio Список IANA Аудио или музыкальные данные. Примеры: audio/mpeg , audio/vorbis . example Тип, зарезервированный для написания примеров, отображающих использование MIME типов. Этот тип никогда не должен использоваться вне примеров кода или документации. example может так же использоваться, как подтип. font Список IANA Данные шрифтов. Распространённые примеры включают font / woff , font / ttf и font / otf . image Список IANA Изображения или графические данные, включая векторную и растровую графику, а так же анимированные версии форматов неподвижных изображений, таких как GIF или APNG. Распространённые примеры включают image/ jpeg , image / png и image / svg + xml . model Список IANA Данные моделей для 3D объектов или сцен. Примеры: model/3mf и model/vml . text Список IANA Любые текстовые данные, так или иначе доступные для чтения человеку, а так же исходный код или текстовые данные для программ. Примеры: text / plain , text / csv и text / html . video Список IANA Видео данные или файлы. Например, MP4 фильмы ( video / mp 4 ).

Любые текстовые документы без определённого подтипа стоит отправлять, как text/plain тип. Аналогичным образом, application/octet-stream тип подойдёт бинарным документам при неопределённом или неизвестном подтипе.

Многокомпонентные типы

Существуют два многокомпонентных типа:

Важные для Web-разработчиков MIME типы

application/octet-stream

text/plain

Этот тип является базовым для текстовых файлов. Несмотря на то, что он означает "неопределённые текстовые данные", браузеры всё равно могут его отображать.

Заметьте: text/plain не означает "любой вид текстовых данных". Если браузер ожидает получения какого-то конкретного типа текстовых данных, то с большой вероятностью он не будет считать text/plain подходящим типом. Например, при загрузке text/plain документа через элемент, браузер не будет его признать правильным CSS файлом и использовать для применения стилей. Только text/css тип должен использоваться для загрузки CSS документов.

text/css

CSS документы, используемые для стилизации web-страниц должны отправляться, как text/css тип. Большинство браузеров не смогут распознавать CSS документы, загруженные с отличным от text/css MIME типом.

text/html

Все HTML данные должны пересылаться с данным типом. Альтернативные MIME типы для XHTML (например, application/xhtml+xml ) почти не используются в настоящее время.

Заметьте: Используйте application/xml или application/xhtml+xml , когда вам необходим строгий синтаксический анализ документов, разделы или элементы, не принадлежащие к пространствам имён HTML/SVG/MathML.

text/javascript

Согласно HTML спецификации: при пересылке JavaScript файлов, всегда должен использоваться MIME тип text/javascript .

По исторически сложившимся причинам, MIME Sniffing Standard (стандарт, определяющий, как браузеры должны интерпретировать медиа типы и выяснять, как обрабатывать данные при неправильно заданных медиа типах) позволяет серверам отправлять JavaScript документы, используя один из нижеперечисленных типов:

  • application/javascript
  • application/ecmascript
  • application/x-ecmascript
  • application/x-javascript
  • text/javascript
  • text/ecmascript
  • text/javascript1.0
  • text/javascript1.1
  • text/javascript1.2
  • text/javascript1.3
  • text/javascript1.4
  • text/javascript1.5
  • text/jscript
  • text/livescript
  • text/x-ecmascript
  • text/x-javascript

Заметьте: Несмотря на то, что некоторые user agent могут поддерживать какие-то из вышеперечисленных типов, вы всегда должны использовать text / javascript . Это единственный MIME тип, который гарантированно будет работать в настоящее время и в будущем.

Иногда вы можете заметить использование text/javascript MIME типа в связке с параметром charset , для уточнения кодировки, в которой был написан файл. Такое определение MIME типа является неправильным, и в большинстве случаев браузеры не станут загружать скрипт, передаваемый с таким типом.

Типы изображений

Файлы, MIME типом которых является image , содержат в себе данные изображений. Подтип определяет, какой конкретный формат изображения представлен в данных.

Лишь несколько типов изображений достаточно распространены, чтобы безопасно использоваться на веб-страницах.

Аудио и видео типы

Так же как в случае с изображениями, стандарт HTML не обязывает браузеры поддерживать какие-либо определённые форматы и кодеки для и элементов, так что при их выборе, важно брать в расчёт целевую аудиторию и диапазон браузеров (а так же версии этих браузеров), которые она может использовать.

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

Руководства по аудио и видео кодекам перечисляют часто поддерживаемые браузерами кодеки, предоставляя детали по их совместимости и техническую информацию, например как много аудио каналов они поддерживают, какой тип сжатия используют, и так далее. Руководство по используемым в WebRTC кодекам развивает эту тему ещё дальше, конкретно описывая кодеки, поддерживаемые популярными браузерами, так чтобы вы могли выбрать кодеки, которые имеют наилучшую поддержку в диапазоне браузеров по вашему выбору.

Что касается MIME типов для аудио и видео файлов, то чаще всего они указывают на формат контейнера (тип файла). Необязательный параметр codecs может быть добавлен к MIME типу для более точного указания, какой кодек и параметры использовались для пересылаемого файла.

Ниже перечислены наиболее часто используемые на веб-страницах MIME типы. Обратите внимание, что это не полный перечень всех доступных типов. Более полный список поддерживаемых форматов может быть наеден в руководстве по медиа форматам.

MIME тип Аудио или видео тип
audio/wave
audio/wav
audio/x-wav
audio/x-pn-wav
Аудио файл WAVE формата. С PCM аудио кодеком (WAVE кодек "1"), считающимся наиболее поддерживаемым, а так же другими, имеющими ограниченную поддержку.
audio/webm Аудио файл формата WebM. С Vorbis и Opus официально поддерживаемыми WebM спецификацией аудио кодеками.
video/webm Видео файл, с возможной аудио дорожкой, формата WebM. С VP8 и VP9, как наиболее распространёнными видео кодеками; Vorbis и Opus, как наиболее распространёнными аудио кодеками.
audio/ogg Аудио файл формата OGG. С Vorbis, как наиболее распространённым аудио кодеком. Хотя на данный момент имеется поддержка и Opus кодека.
video/ogg Видео файл, с возможной аудио дорожкой, в формате OGG. Где Theora – наиболее часто встречающийся видео кодек и Vorbis - наиболее часто встречающийся аудио кодек. Хотя использование кодека Opus становится всё более распространённым.
application/ogg Аудио или видео формата OGG. Где Theora – наиболее часто встречающийся видео кодек и Vorbis - наиболее часто встречающийся аудио кодек.

multipart/form-data

multipart/form-data тип может быть использован при отправке значений из заполненной HTML Формы на сервер.

multipart/byteranges

multipart/byteranges MIME тип используется для отправки данных в браузер по частям.

При отправке кода состояния 206 Partial Content , этот MIME тип будет означать, что документ состоит из нескольких частей, по одной для каждого отдельно запрашиваемого диапазона. Аналогично с остальными многокомпонентными типами, заголовок Content-Type используется для объявления границы boundary , разделяющей документ на отдельные компоненты. Каждый компонент имеет заголовок Content-Type , описывающий тип сегмента данных, и Content-Range (en-US), описывающий его диапазон.

Важность задания правильного MIME типа

Большинство серверов отправляет ресурсы неопределённого типа, как application/octet-stream MIME тип. Большинство же браузеров, в целях безопасности, не позволяет их никак обрабатывать, вынуждая пользователя сохранять их на жёсткий диск, для дальнейшего использования.

Несколько советов по правильной настройке MIME типов на серверах:

  • RAR-сжатые файлы. В этом случае самым правильным вариантом было бы задать тип изначального ресурса; но это не всегда выполнимо, так как .RAR файлы могут хранить в себе несколько типов данных. Тогда, настройте сервер на отправку application/x-rar-compressed MIME типа вместе с RAR ресурсами.
  • Аудио и видео. Только ресурсы с правильно заданными MIME типами могут производиться в и элементах. Убедитесь, что вы используете правильные типы для аудио и видео данных.
  • Запатентованные типы файлов. Избегайте использования application/octet-stream при их отправке, так как большинство браузеров не позволит определять способы обработки (например, "Открыть в Word") для этого базового MIME типа. Используйте специальные типы, например application/vnd.mspowerpoint , чтобы позволить пользователям открывать загруженный ресурс в программе по их выбору.

MIME sniffing

В отсутствии заданного MIME типа, или в определённых случаях, когда браузеры полагают, что MIME тип задан неправильно, они могут выполнять MIME sniffing — попытку угадать правильный MIME тип, анализируя характеристики ресурса.

Каждый браузер выполняет MIME sniffing по-своему и при разных условиях (например, Safari будет смотреть на расширение файла, если переданный MIME тип является неподходящим для документа). В этих случаях могут присутствовать опасения по поводу безопасности, так как некоторые MIME типы представляют исполняемые файлы. Сервера имеют возможность предотвращать MIME sniffing, отправляя X-Content-Type-Options заголовок ответа.

MIME

Самым важным заголовком MIME является Content-Type .

MIME тип состоит из двух слов, разделённых слэшем. Первое слово — тип содержимого. Текст — text . Изображение — image . Музыка — audio . Видосик — video . Это содержимое предназначено для обработки конкретной программой — application . Содержимое состоит из нескольких частей — multipart .

Второе слово — подтип содержимого. Просто текст без форматирования — text/plain , текст в HTML разметке — text/html . Изображение в JPEG — image/jpeg , в PNG — image/png . Аудио в MP3 — audio/mp3 , в Ogg Vorbis, или Opus, или Speex — audio/ogg . Видео в MP4 — video/mp4 , в Matroska — video/x-matroska . Текст в формате OpenDocument, подразумевается, что открываться должен в соответствующих программах, — application/vnd.oasis.opendocument.text . PDF документ, должен открываться в программах для просмотра PDF, — application/pdf .

Типы MIME, по-хорошему, положено регистрировать в IANA. Часто при этом, если за данным форматом данных стоит конкретная организация, подтип начинается с vnd. , например: application/vnd.ms-excel . Но, по устаревшим спецификациям, можно было не регистрировать подтипы, начинающиеся с x- . Они вроде как были экспериментальными, но некоторые так здорово прижились, что мы до сих пор имеем дело с ужастиками вроде application/x-www-form-urlencoded . Этот тип, кстати, обозначает один из способов отправки данных из HTML формы.

Вообще, когда у нас есть какой-то кусок байт, хорошо, если файл, то мы можем определить его содержимое несколькими способами. Можно попытаться открыть это во всех имеющихся программах, авось какая-то и переварит. Очевидно, это не очень эффективно. Если у нас есть имя файла, то значит у этого имени есть расширение (по факту — буквы после последней точки), а расширение часто даёт понять, что это за файл. Так до сих пор поступают нынешние ОС, у них записано, файлы с каким расширением в какой программе открывать. Но здесь нужно имя файла, а его может не быть, если байты пришли по Сети или вообще хранятся где-то в базе данных.

Если же у нас есть MIME тип, то мы прекрасно знаем, что это за данные. А современные ОС ещё и знают, какой программой данный MIME тип открывать. Получается, что ОС хранят соответствие между программой и расширениями имени файлов, а также между программой и связанными с нею MIME типами.

MIME type associations

Мораль такова. MIME тип всегда передаётся по сети. MIME тип однозначно даёт знать, что это за данные, и что с ними можно сделать. А значит, если вы сохраняете байтики в базу данных, или ещё куда-нибудь, не потеряйте MIME тип, сохраните его рядышком. Потом это может очень пригодиться.

А если вы создаёте свой формат данных, который может быть полезен за пределами данного запроса-ответа, который может быть стоит куда-то сохранить, придумайте для него свой MIME тип.

Trust Me

Распаковать это безобразие можно, например, с помощью программы munpack .

MIME multipart

Помните о MIME. Даже стандарты, которым уже больше тридцати лет, вполне себе существуют и работают где-то рядом. А MIME тип — это вообще штука, которая встречается на каждом шагу.

Первоначально SMTP был разработан для передачи только текстовых файлов (в кодировке ASCII ). С появлением мультимедиа и растущим использованием офисных приложений возникла потребность в обмене, помимо текстовых файлов, двоичными файлами (формат офисных приложений, изображения, звуки, сжатые файлы).

Резюме

Вступление

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

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

Заголовки MIME

MIME-Version

Content-Type

Этот механизм поддерживает, в частности:

Content-Transfer-Encoding

Спецификация MIME ( RFC 2045 ) определяет набор методов передачи или кодировок (упомянутых в этом списке IANA ) для представления произвольных данных в виде текста ASCII. Заголовок MIME " Content-Transfer-Encoding " указывает используемый метод. Он может иметь одно из следующих значений (не подвержен поломке ):

  • подходит для использования с SMTP:
    • 7bit - без преобразования, ограничивается символами ASCII (значения от 1 до 127) с не более чем 998 байтами на строку, а символы CR и LF (возврат каретки и прокрутка строки, коды 13 и 10 соответственно) зарезервированы для концов строки ( CRLF ). Это значение по умолчанию.
    • quoted-printable - кодирует произвольные данные в формате, удовлетворяющем 7- битным правилам . Разработано, чтобы быть эффективным и удобочитаемым при использовании для кодирования текста с большинством символов ASCII.
    • base64 - кодирует произвольные данные в формате, удовлетворяющем 7- битным правилам . Его размер фиксирован относительно размера исходных данных. Он используется для нетекстовых данных или текстов, не основанных на ASCII.
    • 8bit - без преобразования, последовательность произвольных байтов с не более 998 байт на одну строку и символы CR и LF зарезервированы для конца строки.
    • binary - без преобразования, любая последовательность байтов. Невозможно использовать с электронной почтой SMTP.

    Для отправки произвольных двоичных данных через транспорт SMTP с расширением 8BITMIME специально не указана кодировка. Следует использовать методы Base64 или Quoted-Printable (с их соответствующими недостатками). Эти ограничения не распространяются на другое использование MIME, такое как веб-службы с вложением MIME или MTOM .

    Кодировка текста

    Эту кодировку не следует путать с кодировкой передачи , указанной в заголовке " Content-Transfer-Encoding: ". В случае текстового контента две кодировки применяются последовательно. Например :

    Закодированные слова

    Разница между Q-кодировкой и Quoted-Printable

    Коды ASCII для вопросительного знака ( ? ) и знака равенства ( = ) не следует представлять напрямую, поскольку они используются для разграничения закодированных слов. Код ASCII для символа пробела также не следует использовать, так как он может вызвать ошибки на старых кодировщиках, такие как нежелательное разделение слов. Чтобы сделать кодировку более легкой и удобной для чтения, символ подчеркивания (" _ ") используется для обозначения пробела. Следовательно, символ подчеркивания больше не может быть представлен напрямую. Использование закодированных слов в определенных частях заголовков накладывает ограничения на символы, которые должны быть представлены напрямую.

    Тема: Привет, сеньор!

    Каждая из этих частей состоит из собственного заголовка содержимого (ноль, одно или несколько полей заголовка Content-*: ) и тела. Несколько частей могут быть включены в другие несколько частей, каждая со своей границей. Поле Content-Transfer-Encoding: типа multipart должно быть " 7bit ", " 8bit " или " binary ", чтобы избежать проблем с декодированием различных уровней multipart. Многокомпонентный блок не имеет набора символов, символы в заголовках, отличные от ASCII, обрабатываются системой кодированных слов, а тела могут иметь определенный набор символов, соответствующий их содержимому.

    Подтипы

    В основном используются следующие подтипы:

    mixed

    RFC также указывает, что все подтипы " multipart ", не распознаваемые реализацией, должны обрабатываться так же, как " multipart/mixed ".

    digest

    alternative

    Тип " multipart/alternative " (определенный в RFC2046, раздел 5.1.4 ) указывает, что каждая часть является альтернативной версией одного и того же содержимого в другом формате. Форматы отсортированы в порядке возрастания точности исходного содержимого. Таким образом, получатель может выбрать лучшее представление, которое он может обработать, в общем, последнее из списка.

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

    related

    report

    signed

    encrypted

    Тип " multipart/encrypted " (определенный в RFC1847, раздел 2.2 ) используется для отправки зашифрованного содержимого . Его первая часть определяет информацию, необходимую для расшифровки его второй части (типа " application/octet-stream ").

    form-data

    Рекомендации

    RFC 1847 Безопасность Multiparts для MIME: Multipart / Signed и Multipart / Encrypted RFC 2231 Значение параметра MIME и расширения закодированных слов: наборы символов, языки и продолжения. Н. Фрид, К. Мур. Ноябрь 1997 г. RFC 2387 Тип содержимого MIME Multipart / Related Content-type

    Читайте также: