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 yVý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 BorensteinPodtypy: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.
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:Oblast na konci mailu se označuje jako fantom tělo a je většinou ignorováno.Content-Transfer-Encoding: binary TOTO NENI SKUTECNE TELO ZPRAVY!
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.