Z tohoto pohledu měla původní norma pro formát mailových zpráv dvě zásadní omezení:
Tento nový standard řeší dvě otázky:
MIME zavádí další 4 hlavičky:
Mime-Version: 1.0
Hlavička musí být uvedena na začátku zprávy.
Všechny hlavičky mailu mohou obsahovat komentář, tj. hlavičky:
Mime-Version: 1.0
Mime-Version: 1.0 (Generated by GBD-killer 3.7)
jsou totožné.
Hlavička specifikuje charakter obsahu zprávy pomocí typu a podtypu a případně pomocí doplňkových informací. Doplňkové informace jsou uvedeny jako parametry ve tvaru parametr=hodnota. Parametrů může být uvedeno i více a na jejich pořadí nezáleží.
Typ specifikuje o jaký typ dat se jedná, zda je v těle zprávy obsažen text, obrázek nebo např obecný binární soubor.
Podtyp pak specifikuje konkrétní formát obrázku, textu a pod.
Např. hlavička
Content-Type: image/xyz
informuje klienta o tom, že obsahem zprávy je obrázek, aniž by klient musel znát konkrétní formát obrázku xyz.
RFC1521 definuje 7 základních typů:
Obecný tvar hlavičky:
Content-Type: typ/podtyp parametr1=hodnota;parametr2=hodnota.
Jména typů, podtypů a parametry jsou case-insenzitive, tj. nezávislé na tom, zda je píšeme velkými nebo malými písmeny.
Pro různá data je nevýhodné definovat univerzální typ kódování. Proto se definuje několik typů kódování.
Hodnoty 8bit, 7bit a binary vlastně nepředstavují žádné kódování, žádné kódování dat se ve skutečnosti neprovádí. Tyto hodnoty jsou potencionálně užitečné jako indikace typu dat v objektu.
Musíme připomenou, že e-mail je znakově orientovaný, tj. mechanismus kódování se uplatní na osmice bitů nikoli na jednotlivé bity. Proto musí být posloupnost bitů před kódováním nejprve rozdělena na osmice - byty.
Kódovací mechanismus kóduje všechna data do ASCII znaků. Výsledkem kódování je tedy ASCII řetězec.
Hlavičky:
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: base64
pak interpretujeme jako: tělo zprávy je řetězec ascii znaků vzniklých kódování base64. Původní data byla ve znakové sadě ISO-8859-1 a musí být do této sady opět převedena.
Experimentální kódování musí být odlišeno od standardu prefixem x-. Je ho možné použít pro experimenty nebo v případě že klien i server jsou na tomto kódování dohodnuti.
Kódován může být i text , který obsahuje pouze ascii znaky a to např. z důvodu zajištění integrity dat, pokud data prochází přes gateway, která provádí náhradu znaků a/nebo zarovnání řádky.
Pravidla kódování
Kódovací algoritmus je jednoduchý. Používá 65 US-ascii znaků, u nichž 6 bitů představuje tisknutelný znak. Znak "=" (ž65) se používá ke speciálnímu účelu. Na začátku kódování se kódovaný text rozdělí na sekvence 24 bitů a ty následně na 4 šestice bitů. Každá šestice reprezentuje jeden znak v abecedě base64. Kóduje se zleva doprava. Každých 6 bitů je nahrazeno odpovídající znakem z tabulky znaků abecedy base64.
Tabulka abecedy base64:
Value Encoding Value Encoding Value Encoding Value Encoding
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w (pad) =
15 P 32 g 49 x
16 Q 33 h 50 y
Výstupní - zakódovaný text musí být uspořádán do řádek max 76 znaků dlouhých.Všechny znaky pro konec řádky a jiné znaky, které nejsou obsaženy v tabulce base64, musí být dekódovacím programem ignorovány, mohou indikovat chybu přenosu.
Zbyde-li na konci textu po rozdělení méně než 24 bitů, doplní se nulové bity zprava. Přidáním na konec je indikováno znakem "=".
Příklad:
Content-Description: "obrazek Prazskeho hradu".
Popis musí být v us-ascii.
V souladu s definovanými typy a podtypy tedy zpráva podle RFC822 může být uvozena hlavičkou:
Content-Type: text/plain; charset=us-ascii
Tento tvar hlavičky je implicitní. RFC1521 definuje pouze podtyp text/plain.
RFC1521 definuje charset pro účely MIME jako jednoznačné mapování řetězce bytů na znaky, které již nepotřebuje žádné dodatečné informace.
RFC1521 uvádí seznam předdefinovaných znakových sad. Další znakové sady mohou být registrovány prostřednictvím IANA.
Pokud znaková sada obsahuje 8-bitové znaky, pak při přenosu mailem - protokolem SMTP je použita hlavička Content-Transfer-Encoding a odpovídající kódování.
Jednotlivé části nejsou interpretovány podle RFC822. Mohou ale také nemusí obsahovat hlavičky. Pokud nejsou hlavičky u části uvedeny, uplatní se implicitní hlavičky.
Pro tento typ jsou použitelné pouze tři metody kódování: 7bit, 8bit, binary.
Oddělovač je speciální sekvence znaků, která se nesmí vyskytnou nikde uvnitř částí. Oddělovač se definuje v parametru hlavičky.
Parametr má tvar boundary=řetězec. Oddělovač je pak řádka, která začína dvěma pomlčkami "--", pak následuje řetězec z parametru. Maximální délka oddělovače je 70 znaků.
Příklad:
Content-Type: multipart/mixed; boundary="gc0p4J:2408t"
Tato hlavička vyjadřuje, že je tělo zprávy složeno z několika částí, každá část má strukturu podle RFC822, přičemž hlavičky jednotlivých částí nemusí být uvedeny. Každá část začíná řádkou:
--gc0p4J:2408t
Koncový oddělovač určuje, že již nenásleduje žádná část a má tvar:
--gc0p4J:2408t--
tj. je na konci doplněný ješte dvěma pomlčkami.
Příklad mailu o dvou částech:
From: Nathaniel Borenstein
To: Ned Freed
Subject: Sample message
MIME-Version: 1.0
Content-type: multipart/mixed; boundary="simple boundary"
Toto je preambule, která je ignorována. Je to proto místo
vhodné k vložení informací pro klienty, kteří
nepodporují MIME.
--simple boundary
Toto je implicitně plain ascii text.
Text nekončí konecem řádky.
--simple boundary
Content-type: text/plain; charset=us-ascii
Toto je explicitně plain ascii text.
Text je ukončen koncem řádky.
--simple boundary--
Toto je závěr, je také ignorován.
Podtypy:
Příklad:
From: Nathaniel BorensteinSoftware vytvářející zprávu tohoto typu musí řadit části ve vzrůstající kvalitě.To: Ned Freed Subject: Formatted text mail MIME-Version: 1.0 Content-Type: multipart/alternative; boundary=boundary42 --boundary42 Content-Type: text/plain; charset=us-ascii ...plain text version of message goes here.... --boundary42 Content-Type: text/richtext .... RFC 1341 richtext version of same message goes here ... --boundary42 Content-Type: text/x-whatever .... fanciest formatted version of same message goes here ... --boundary42--
Příklad:
From: Moderator-Address
To: Recipient-List
MIME-Version: 1.0
Subject: Internet Digest, volume 42
Content-Type: multipart/digest;
boundary="---- next message ----"
------ next message ----
From: nekoho
Subject: muj nazor
...zde je telo zpravy ...
------ next message ----
From: nekoho
Subject: muj dalsi nazor
... zde je telo jine zpravy...
------ next message ------
Definované podtypy:
Pro tento typ Message/Partial je potředa uvést tři parametry:
Příklad audio zprávy rozdělené do dvou částí:
1. část
X-Weird-Header-1: Foo
From: Bill@host.com
To: joe@otherhost.com
Subject: Audio mail
Message-ID:
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:
MIME-Version: 1.0
Content-type: audio/basic
Content-transfer-encoding: base64
... prvni cast kodovanych audio dat...
2. část
From: Bill@host.com
To: joe@otherhost.com
Subject: Audio mail
MIME-Version: 1.0
Message-ID:
Content-type: message/partial;
id="ABC@host.com"; number=2; total=2
... druha cast kodovanych audio dat...
Pokud je zpráva typu Message/External-Body, je tvořena hlavičkou, následuje 2 krát CRLF a hlavička vnořené zprávy. Povinný parametr je access-type, který specifikuje mechanismus získání dat.
Možné mechanismy jsou:
Jako volitelné parametry je možné uvést:
Jedna z hlaviček vnořené zprávy musí být Content-ID, tj. jednoznační identifikátor, kterým je na data odkazováno.
Příklad:
Content-type: message/external-body; access-
type=local-file;
name="/u/nsb/Me.gif"
Content-type: image/gif
Content-ID:
Content-Transfer-Encoding: binary
TOTO NENI SKUTECNE TELO ZPRAVY!
Oblast na konci mailu se označuje jako fantom tělo a je většinou ignorováno.aceess-type nabývá hodnot:
Podtypy:
Doporučená akce při obdržení takovéto zprávy je uložit data do souboru, bez dekódování a použít aplikaci.