Получение содержимого mime сообщенияget mime content of a message

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

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


тип/подтип

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

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

тип/подтип;параметр=значение

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

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

В настоящее время на IANA зарегистрированы следующие дискретные типы:

Любой вид бинарных данных, явно не попадающих ни в одну другу группу типов. Данные, которые будут выполняться или как-либо интерпретироваться, или данные для выполнения, которых необходимо отдельное приложение. Для указания базового типа бинарных данных (данных без определённого типа) используют тип . Другие распространённые примеры включают , и .
Аудио или музыкальные данные. Примеры: , .
Тип, зарезервированный для написания примеров, отображающих использование MIME типов. Этот тип никогда не должен использоваться вне примеров кода или документации. может так же использоваться, как подтип.
Данные шрифтов. Распространённые примеры включают , и .
Изображения или графические данные, включая векторную и растровую графику, а так же анимированные версии форматов неподвижных изображений, таких как  GIF или APNG. Распространённые примеры включают , и .
Данные моделей для 3D объектов или сцен. Примеры: и .
Любые текстовые данные, так или иначе доступные для чтения человеку, а так же  исходный код или текстовые данные для программ. Примеры: , и .
Видео данные или файлы. Например, MP4 фильмы ().

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

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

За исключением типа, используемого в методе HTML форм, и типа, используемом в ответе для отправки части документа, HTTP никаким особым образом не обрабатывает многокомпонентные типы, и просто отправляет данные в браузер (который, с большой вероятностью, предложит сохранить переданный файл, тоже не зная как его обработать).

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

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

Технологии шифрования сообщенийRelated message encryption technologies

Различные технологии шифрования используются совместно для обеспечения защиты сообщений, хранящихся в почтовых ящиках и при пересылке. Протокол S/MIME может работать одновременно со следующими технологиями, но не зависит от них:A variety of encryption technologies work together to provide protection for messages at rest and in transit. S/MIME can work simultaneously with the following technologies but isn’t dependent on them:

  • Примечание

    Теперь для шифрования данных, которыми обмениваются компьютерные системы, используется протокол TLS вместо протокола SSL. Эти протоколы настолько сходны между собой, что термины «SSL» и «TLS» (без версий) часто используются как взаимозаменяемые. Поэтому когда в статьях по Exchange, Центр администрирования Exchange и Командная консоль Exchange упоминается термин «SSL», часто под ним подразумевается как протокол SSL, так и протокол TLS. Как правило, термин «SSL» обозначает именно протокол SSL только в тех случаях, когда указан номер версии (например, SSL 3.0). О том, почему следует отключить протокол SSL и перейти на протокол TLS, см. в статье Как устранить уязвимость SSL 3.0.Secure Sockets Layer (SSL) is being replaced by Transport Layer Security (TLS) as the protocol that’s used to encrypt data sent between computer systems. They’re so closely related that the terms «SSL» and «TLS» (without versions) are often used interchangeably. Because of this similarity, references to «SSL» in Exchange topics, the Exchange admin center, and the Exchange Management Shell have often been used to encompass both the SSL and TLS protocols. Typically, «SSL» refers to the actual SSL protocol only when a version is also provided (for example, SSL 3.0). To find out why you should disable the SSL protocol and switch to TLS, check out Protecting you against the SSL 3.0 vulnerability.

  • BitLocker: шифрует данные на жестком диске в центре обработки данных, поэтому если кто-то получит несанкционированный доступ, он не сможет прочитать его.BitLocker: Encrypts the data on a hard drive in a datacenter so that if someone gets unauthorized access, they can’t read it. Дополнительные сведения см. в разделе BitLocker: как развертывать в Windows Server 2012 и более поздних версийFor more information, see BitLocker: How to deploy on Windows Server 2012 and later

Sintaxe

Estrutura geral

tipo/subtipo

A estrutura de um MIME type é muito simples; Consiste de um tipo e um subtipo, duas strings, separados por um ‘/’. Nenhum espaço é permitido. O tipo representa a categoria e pode ser um tipo discreto ou multipart. O subtipo é específico para cada tipo.

Um MIME type é case-insensitive mas tradicionalmente é escrito tudo em minúsculas.

Tipos discretos

text/plain
text/html
image/jpeg
image/png
audio/mpeg
audio/ogg
audio/*
video/mp4
application/octet-stream
…

Tipos discretos indicam a categoria do documento, ele pode ser um dos seguintes:

Tipo Descrição Exemplos de subtipos típicos
Representa qualquer documento que contenha texto e é teoricamente legivel para o ser humano. , ,
Representa qualquer tipo de imagens. Os vídeos não estão incluídos, embora imagens animadas (como gif animado) sejam descritas com um tipo de imagem. , , , ,
Representa qualquer tipo de arquivo de audio ,
Representa qualquer tipo de arquivo de video ,
Representa qualquer tipo de dados binários. , , , , , 

Para documentos de texto sem um subtipo especifico,  deverá ser usado. Assim como, para documentos binários sem subtipo especifico ou conhecido,  deverá ser usado.

Tipos de multipart

multipart/form-data
multipart/byteranges

Multipart types indicam uma categoria de documento que são quebrados em partes distintas, muitas vezes com diferentes tipos MIME. É uma maneira de representar um documento composto. Com exceção de , que são usados ​​em relação de formularios HTML e metodo , e  que são usados em conjunto com 

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

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

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

  • RAR-сжатые файлы. В этом случае самым правильным вариантом было бы задать тип изначального ресурса; но это не всегда выполнимо, так как .RAR файлы могут хранить в себе несколько типов данных. Тогда, настройте сервер на отправку MIME типа вместе с RAR ресурсами.
  • Аудио и видео. Только ресурсы с правильно заданными MIME типами могут производиться в и элементах. Убедитесь, что вы используете правильные типы для аудио и видео данных.
  • Запатентованные типы файлов. Избегайте использования при их отправке, так как большинство браузеров не позволит определять способы обработки (например, «Открыть в Word») для этого базового MIME типа. Используйте специальные типы, например , чтобы позволить пользователям открывать загруженный ресурс в программе по их выбору.

Другие методы сообщения о типе ресурса

MIME типы не являются единственным способом сообщения типа документа:

  • Суффиксы в названиях файлов могут указывать на тип документа, главным образом на Microsoft Windows. Но не все операционные системы могут считать их имеющими смысл (например, Linux или MacOS). А так же нет никакой гарантии, что они будут указывать на правильный тип.
  • Магические числа. Синтаксисы различных форматов позволяют узнавать их тип, через анализ их структуры байтов. Например, GIF файлы начинаются с шестнадцатеричного значения (), а PNG файлы с (). Опять же, не все типы документов имеют магические числа, так что этот подход так же не надёжен на 100%.

func TypeByExtension ¶

func TypeByExtension(ext ) 

TypeByExtension returns the MIME type associated with the file extension ext. The extension ext should begin with a leading dot, as in «.html». When ext has no associated type, TypeByExtension returns «».

Extensions are looked up first case-sensitively, then case-insensitively.

The built-in table is small but on unix it is augmented by the local system’s mime.types file(s) if available under one or more of these names:

/etc/mime.types
/etc/apache2/mime.types
/etc/apache/mime.types

On Windows, MIME types are extracted from the registry.

Text types have the charset parameter set to «utf-8» by default.

type WordEncoder ¶ 1.5

A WordEncoder is an RFC 2047 encoded-word encoder.

type WordEncoder 

func (WordEncoder) 1.5

func (e ) Encode(charset, s ) 

Encode returns the encoded-word form of s. If s is ASCII without special characters, it is returned unchanged. The provided charset is the IANA charset name of s. It is case insensitive.

▹ Example

▾ Example

package main

import ( «fmt» «mime» )

func main() { fmt.Println(mime.QEncoding.Encode(«utf-8», «¡Hola, señor!»)) fmt.Println(mime.QEncoding.Encode(«utf-8», «Hello!»)) fmt.Println(mime.BEncoding.Encode(«UTF-8», «¡Hola, señor!»)) fmt.Println(mime.QEncoding.Encode(«ISO-8859-1», «Caf\xE9»)) }

=?utf-8?q?=C2=A1Hola,_se=C3=B1or!?=
Hello!
=?UTF-8?b?wqFIb2xhLCBzZcOxb3Ih?=
=?ISO-8859-1?q?Caf=E9?=

Run Format

Importância de definir o MIME type correto

A maioria dos servidores web envia recursos de tipo desconhecido usando o tipo MIME de application/octet-stream padrão. Por razões de segurança, a maioria dos navegadores não permite definir uma ação padrão personalizada para esses recursos, forçando o usuário a armazená-lo no disco para usá-lo. Algumas configurações de servidor incorretamente exibidas ocorrem com os seguintes tipos de arquivo:

  • Arquivos RAR-codificados. Neste caso, o ideal seria definir o verdadeiro tipo de arquivos codificados; Isso muitas vezes não é possível (como pode não ser conhecido para o servidor e esses arquivos podem conter vários recursos de tipos diferentes). Nesse caso, configure o servidor para enviar o tipo MIME .

  • Tipos de arquivos proprietários. Preste especial atenção ao servir um tipo de arquivo proprietário. Evite usar o como manipulação especial não será possível: a maioria dos navegadores não permitem definir um comportamento padrão (como «Abertura no Word») para este tipo MIME genérico.

语法

通用结构

type/subtype

MIME的组成结构非常简单;由类型与子类型两个字符串中间用分隔而组成。不允许空格存在。type 表示可以被分多个子类的独立类别。subtype 表示细分后的每个类型。

MIME类型对大小写不敏感,但是传统写法都是小写。

独立类型

text/plain
text/html
image/jpeg
image/png
audio/mpeg
audio/ogg
audio/*
video/mp4
application/*
application/json
application/javascript
application/ecmascript
application/octet-stream
…

独立类型表明了对文件的分类,可以是如下之一:

类型 描述 典型示例
表明文件是普通文本,理论上是人类可读 , ,
表明是某种图像。不包括视频,但是动态图(比如动态gif)也使用image类型 , , , , , ,
表明是某种音频文件 ,
表明是某种视频文件 ,
表明是某种二进制数据

, , , , , 


对于text文件类型若没有特定的subtype,就使用 。类似的,二进制文件没有特定或已知的 subtype,即使用 。

Multipart 类型

multipart/form-data
multipart/byteranges

Multipart 类型表示细分领域的文件类型的种类,经常对应不同的 MIME 类型。这是复合文件的一种表现方式。 可用于联系 HTML Forms 和 方法,此外 使用状态码 来发送整个文件的子集,而HTTP对不能处理的复合文件使用特殊的方式:将信息直接传送给浏览器(这时可能会建立一个“另存为”窗口,但是却不知道如何去显示内联文件。)

type WordDecoder ¶ 1.5

A WordDecoder decodes MIME headers containing RFC 2047 encoded-words.

type WordDecoder struct {
    
    
    
    
    
    
    CharsetReader func(charset , input io.) (io., )
}

func (*WordDecoder) 1.5

func (d *) Decode(word ) (, )

Decode decodes an RFC 2047 encoded-word.

▹ Example

▾ Example

package main

import ( «bytes» «fmt» «io» «io/ioutil» «mime» )

func main() { dec := new(mime.WordDecoder) header, err := dec.Decode(«=?utf-8?q?=C2=A1Hola,_se=C3=B1or!?=») if err != nil { panic(err) } fmt.Println(header)

dec.CharsetReader = func(charset string, input io.Reader) (io.Reader, error) { switch charset { case «x-case»: // Fake character set for example. // Real use would integrate with packages such // as code.google.com/p/go-charset content, err := ioutil.ReadAll(input) if err != nil { return nil, err } return bytes.NewReader(bytes.ToUpper(content)), nil default: return nil, fmt.Errorf(«unhandled charset %q», charset) } } header, err = dec.Decode(«=?x-case?q?hello!?=») if err != nil { panic(err) } fmt.Println(header) }

¡Hola, señor!
HELLO!

Run Format

func (*WordDecoder) 1.5

func (d *) DecodeHeader(header ) (, )

DecodeHeader decodes all encoded-words of the given string. It returns an error if and only if CharsetReader of d returns an error.

▹ Example

▾ Example

package main

import ( «bytes» «fmt» «io» «io/ioutil» «mime» )

func main() { dec := new(mime.WordDecoder) header, err := dec.DecodeHeader(«=?utf-8?q?=C3=89ric?= <eric@example.org>, =?utf-8?q?Ana=C3=AFs?= <anais@example.org>») if err != nil { panic(err) } fmt.Println(header)

header, err = dec.DecodeHeader(«=?utf-8?q?=C2=A1Hola,?= =?utf-8?q?_se=C3=B1or!?=») if err != nil { panic(err) } fmt.Println(header)

dec.CharsetReader = func(charset string, input io.Reader) (io.Reader, error) { switch charset { case «x-case»: // Fake character set for example. // Real use would integrate with packages such // as code.google.com/p/go-charset content, err := ioutil.ReadAll(input) if err != nil { return nil, err } return bytes.NewReader(bytes.ToUpper(content)), nil default: return nil, fmt.Errorf(«unhandled charset %q», charset) } } header, err = dec.DecodeHeader(«=?x-case?q?hello_?= =?x-case?q?world!?=») if err != nil { panic(err) } fmt.Println(header) }

Éric <eric@example.org>, Anaïs <anais@example.org>
¡Hola, señor!
HELLO WORLD!

Run Format

Поддерживаемые сценарии и технические особенности S/MIMESupported scenarios and technical considerations for S/MIME

S/MIME можно настроить для работы со следующими конечными точками:You can set up S/MIME to work with any of the following end points:

  • Outlook 2010 или более поздней версии;Outlook 2010 or later

  • Outlook в Интернете (предыдущее название Outlook Web App);Outlook on the web (formerly known as Outlook Web App)

  • Exchange ActiveSync (EAS).Exchange ActiveSync (EAS)

Действия по настройке S/MIME для каждой из этих конечных точек несколько различаются. Ниже приведены общие инструкции.The steps that you follow to set up S/MIME with each of these endpoints are slightly different. Generally, you need to complete these steps:

  1. Установка центра сертификации на основе Windows и настройка инфраструктуры открытых ключей для выдачи сертификатов S/MIME.Install a Windows-based Certification Authority and set up a public key infrastructure to issue S/MIME certificates. Поддерживаются сертификаты, выданные сторонними поставщиками сертификатов.Certificates issued by third-party certificate providers are supported. Подробнее: Обзор развертывания сертификата сервера.For details, see Server Certificate Deployment Overview.

  2. Опубликуйте сертификат пользователя в локальной учетной записи доменных служб Active Directory (AD DS) в атрибутах UserSMIMECertificate и/или UserCertificate .Publish the user certificate in an on-premises Active Directory Domain Services (AD DS) account in the UserSMIMECertificate and/or UserCertificate attributes. Доменные службы Active Directory должны располагаться на компьютерах в физическом расположении, которое вы управляете, а не в удаленном средстве или облачной службе в другом месте в Интернете.Your AD DS needs to be located on computers at a physical location that you control and not at a remote facility or cloud-based service somewhere on the Internet. Для получения дополнительных сведений о доменных службах Active Directory обратитесь к разделу Обзор доменных служб Active Directory.For more information about AD DS, see Active Directory Domain Services Overview.

  3. Настройте конечную точку Outlook или EAS для использования S/MIME.Set up the Outlook or EAS end point to use S/MIME.

重要的MIME类型

这是应用程序文件的默认值。意思是 未知的应用程序文件 ,浏览器一般不会自动执行或询问执行。浏览器会像对待 设置了HTTP头 值为 的文件一样来对待这类文件。

文本文件默认值。即使它意味着未知的文本文件,但浏览器认为是可以直接展示的。


并不是意味着某种文本数据。如果浏览器想要一个文本文件的明确类型,浏览器并不会考虑他们是否匹配。比如说,如果通过一个表明是下载CSS文件的链接下载了一个 文件。如果提供的信息是text/plain,浏览器并不会认出这是有效的CSS文件。CSS类型需要使用text/css。

在网页中要被解析为CSS的任何CSS文件必须指定MIME为。通常,服务器不识别以.css为后缀的文件的MIME类型,而是将其以MIME为 或  来发送给浏览器:在这种情况下,大多数浏览器不识别其为CSS文件,直接忽略掉。特别要注意为CSS文件提供正确的MIME类型。

所有的HTML内容都应该使用这种类型。XHTML的其他MIME类型(如)现在基本不再使用(HTML5统一了这些格式)。

Note: You still need to use or if you intend to make use of XML’s strict parsing rules, use or elements from non‑HTML, non‑SVG or non‑MathML XML namespaces, as ’s parsing semantics are subtly incompatible with those of .

据 MIME 嗅探标准,下面是有效的 JavaScript MIME 类型

所有的 JavaScript 类型已经被 RFC 4329 废弃。

图片类型

只有一小部分图片类型是被广泛支持的,Web安全的,可随时在Web页面中使用的:

MIME 类型 图片类型
GIF 图片 (无损耗压缩方面被PNG所替代)
JPEG 图片
PNG 图片
SVG图片 (矢量图)

此处的类型划分有一定的争议,有人认为此处应该增加 WebP(),但是每个新增的图片类型都会增加代码的数量,这会带来一些新的安全问题,所以浏览器供应商对于添加类型非常小心。

另外的一些图片种类可以在Web文档中找到。比如很多浏览器支持 icon 类型的图标作为 favicons或者类似的图标,并且浏览器在MIME类型中的 支持ICO图像。

Footnote 1
尽管 在ANA注册, 它仍然不被广泛支持, 被作为替代品使用。

音频与视频类型

HTML并没有明确定义被用于和元素所支持的文件类型,所以在web上使用的只有相对较小的一组类型。 文章 Media formats supported by the HTML audio and video elements 解释了可以被使用的解码器或视频文件格式。

在web环境最常用的视频文件的格式,是以下这些这些文件类型:

MIME 类型 音频或视频类型
音频流媒体文件。一般支持PCM音频编码 (WAVE codec «1») ,其他解码器有限支持(如果有的话)。
 WebM 音频文件格式。Vorbis 和 Opus 是其最常用的解码器。 
采用WebM视频文件格式的音视频文件。VP8 和 VP9是其最常用的视频解码器。Vorbis 和 Opus 是其最常用的音频解码器。 
采用OGG多媒体文件格式的音频文件。 Vorbis 是这个多媒体文件格式最常用的音频解码器。
采用OGG多媒体文件格式的音视频文件。常用的视频解码器是 Theora;音频解码器为Vorbis 。
采用OGG多媒体文件格式的音视频文件。常用的视频解码器是 Theora;音频解码器为Vorbis 。
application/json (MIME_type)https://www.iana.org/assignments/media-types/application/json

可用于HTML表单从浏览器发送信息给服务器。作为多部分文档格式,它由边界线(一个由开始的字符串)划分出的不同部分组成。每一部分有自己的实体,以及自己的 HTTP 请求头,和 用于文件上传领域,最常用的 ( 因为边界线作为分隔符而被忽略)。

Content-Type: multipart/form-data; boundary=aBoundaryString
(other headers associated with the multipart document as a whole)

--aBoundaryString
Content-Disposition: form-data; name="myFile"; filename="img.jpg"
Content-Type: image/jpeg

(data)
--aBoundaryString
Content-Disposition: form-data; name="myField"

(data)
--aBoundaryString
(more subparts)
--aBoundaryString--

如下所示的表单:

<form action="http://localhost:8000/" method="post" enctype="multipart/form-data">
  <input type="text" name="myTextField">
  <input type="checkbox" name="myCheckBox">Check</input>
  <input type="file" name="myFile">
  <button>Send the file</button>
</form>

会发送这样的请求:

POST / HTTP/1.1
Host: localhost:8000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Content-Type: multipart/form-data; boundary=---------------------------8721656041911415653955004498
Content-Length: 465

-----------------------------8721656041911415653955004498
Content-Disposition: form-data; name="myTextField"

Test
-----------------------------8721656041911415653955004498
Content-Disposition: form-data; name="myCheckBox"

on
-----------------------------8721656041911415653955004498
Content-Disposition: form-data; name="myFile"; filename="test.txt"
Content-Type: text/plain

Simple file.
-----------------------------8721656041911415653955004498--

用于把部分的响应报文发送回浏览器。当发送状态码 时,这个MIME类型用于指出这个文件由若干部分组成,每一个都有其请求范围。就像其他很多类型使用分隔符来制定分界线。每一个不同的部分都有这样的HTTP头来说明文件的实际类型,以及 来说明其范围。


С этим читают