Formát zpráv protokolu SMTP definovaný normou RFC-822 umožňoval přenášet data pouze formátu US-ASCII. Brzy se však ukázalo, že tento standard nevyhovuje mnohým požadavkům uživatelů, kteří chtějí elektronickou poštu využít i pro posílání textu jiných znakových sad, formátovaného textu, obrázků, zvuků, obecně binárních souborů atp. V poslední době pak přibyl požadavek na posílání zabezpečených zpráv, tj. šifrovaných zpráv nebo elektronicky podepsaných zpráv.
Požadavky uživatelů rychle překročily možnosti nabízené normou RFC821. Objevilo se tak rozšíření MIME (Multipurpose Internet Mail Extension) dnes specifikované normami RFC-2045 až 2049.
Problém jak poslat elektronickou poštou zprávu obsahující jiná data než text v kódu US-ASCII lze řešit i bez MIME. Znamená to zprávu před odeslání zakódovat do US-ASCII. Příjemce pak musí nejprve zprávu dekódovat a pak ji může teprve zpracovat (přečíst). Odesilatel a příjemce se musí jinou cestou dohodnout na typu kódování přenášených dat do US-ASCII. V praxi se zpravidla používá kódování Base64, Quotet Printable nebo v UNIXu kódování UUENCODE. Zkušený příjemce se podívá na zakódovaná data a na první pohled vidí jak jsou data zakódovaná a podle kódování se rozhodne použít vhodný dekódovací program na přijatá data před tím, než je bude zpracovávat (např. číst).
Tato cesta je pro běžné uživatele nepřijatelná. Uživatel si
nepřeje se nějakým kódování zabývat – přeje si, aby tyto problémy za něj
vyřešil software poštovního klienta sám. Pro běžného uživatele je tak přijatelná
druhá možnost spočívající v myšlence rozšířit repertoár hlaviček zprávy o
hlavičky popisující typ přenášených dat a algoritmus, kterým byla data před
odesláním zakódována do US-ASCII. Tím je pak možné celý proces zautomatizovat,
aniž by do něj musel uživatel zasahovat. Popis dodatečných hlaviček specifikuje
právě norma MIME.
V tomto případě může příjemcův software z hlaviček automaticky rozeznat, jak byla data kódována, a automaticky zprávu dekódovat. Navíc v hlavičce Content-Type odesilatelův software uloží typ přenášených dat, podle kterého příjemcův software automaticky rozpozná, jakým prohlížečem má data příjemci zobrazit. Příjemci pak podle typu přenášených dat spustí příslušný prohlížeč:
Tyto dodatečné informace o přenášených datech nesou hlavičky začínající řetězcem "Content-", které specifikuje norma MIME. MIME je standardem, který doplňuje normu RFC-822 a zajišťuje zpětnou kompatibilitu. MIME je navrženo tak, aby mohly být posílány stávajícím poštovním systémem zprávy obsahující diakritiku, obrázky, zvuk atd.
Tento standard řeší dvě otázky:
MIME zavádí hlavičky:
Tato hlavička je jediná hlavička MIME nezačínající řetězcem "Content-". Hlavička specifikuje verzi normy MIME. Důvodem zavedení této hlavičky je zajištění kompatibility. Tj. podle přítomnosti této hlavičky software klienta rozpozná, že jde o zprávu rozšířenou podle MIME, a dále rozezná verzi MIME, podle kterého byla zpráva rozšířena. Rozšíření MIME podle RFC2045 až RFC2049 je verze 1.0. V budoucnu však mohou přijít další verze MIME s jiným repertoárem hlaviček.
Protokol HTTP používá také hlavičky vycházející z filosofie MIME a mnohé rovněž začínají řetězcem „Content-“, ale jsou uzpůsobeny protokolu HTTP. Právě skutečnost, že záhlaví HTTP není zcela kompatibilní s MIME, je v protokolu HTTP signalizováno neexistencí hlavičky Mime-Version v záhlaví HTTP zprávy.
Zpráva sestavená podle RFC2045 až RFC2049 musí tuto hlavičku vždy obsahovat. Tedy konkrétní tvar hlavičky vypadá takto:
Mime-Version: 1.0
Hlavička musí být uvedena před ostatními hlavičkami MIME.
Hlavička popisuje typ dat obsažených v těle zprávy tak, aby klient, který tuto zprávu obdrží, mohl zvolit vhodný způsob prezentace obsahu zprávy. Hlavička má tvar:
Content-Type: typ/podtyp; parametry
Hlavička specifikuje charakter obsahu zprávy pomocí typu a podtypu a případně pomocí doplňkových parametrů. Parametry mají tvar:
atribut=hodnota; …
Parametrů může být i více – jsou pak odděleny středníkem 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 (image) nebo např. obecný binární soubor (octet stram). Podtyp pak specifikuje konkrétní formát obrázku, textu apod.
Např. hlavička
Content-Type: image/jpeg
informuje příjemce o tom, že obsahem zprávy je obrázek formátu JPEG. RFC2045 až RFC2049 definuje několik základních typů. Způsob registrace dalších typů je popsán v RFC2048.
Typy jsou dvojího druhu:
Lze použít i experimentální typy, ty je však potřeba odlišit od standardních typů prefixem x- před jménem typu. Např. pro zprávu VRML se kdysi používalo x-world/x-vrml. Dnes však VRML (po ukončení experimentů) používá model/vrml.
Jména typů, podtypů a parametry jsou nezávislé na tom, zda je píšeme velkými nebo malými písmeny.
Data, která chceme posílat elektronickou poštou, jsou často 8bitová nebo binární. Tato data není možné zpravidla poslat přímo. Proto je potřeba definovat mechanismus převodu – kódování, jakým se data převedou na data, která jsou v kódu US-ASCII, tj. jsou převedena do 7bitového tvaru. Použitý typ kódování je uveden právě v hlavičce Content-Transfer-Encoding.
Ona hlavička Content-Transfer-Encoding v podstatě nenese pouze informaci o tom, jakým algoritmem jsou přenášená data kódována, ale v případě, že kódována nejsou, tak nese informaci o datech jako takových: jsou-li sedmibitová, osmibitová či binární (7bit, 8bit či binary).
MIME definuje dva algoritmy kódování dat: Quoted-Printable a Base64. Další algoritmy mohou být registrovány rovněž podle RFC2048.
Hlavička Content-Transfer-Encoding tak nejčastější nese následující způsoby kódování:
Hodnoty 8bit, 7bit a binary nepředstavují žádné kódování. Tyto hodnoty jsou užitečné jako indikace typu dat.
Hlavička Content-Transfer-Encoding se vztahuje k celému tělu zprávy. Pokud se hlavička objeví v konkrétní části zprávy, pak se vztahuje pouze na tuto část. Problém, jak kódovat ne US-ASCII informace v hlavičce, je popsán v kapitole „Znaky v hlavičce, které nejsou US-ASCII“.
Kódovací mechanismus kóduje všechna data do ASCII znaků. Výsledkem kódování je tedy US-ASCII řetězec.
Příklad
Content-Type: text/plain;
charset=ISO-8859-2
Content-Transfer-Encoding: base64
interpretujeme takto: tělo zprávy je řetězec znaků US-ASCII vzniklých kódováním base64. Původní data byla ve znakové sadě ISO-8859-2 a musí být do této sady opět převedena při zobrazování příjemci.
Hlavička nese jednoznačnou identifikaci obsahu zprávy. Hlavička je volitelná, její použití je ale v některých případech povinné – např. v implementacích používajících data typu message/external-body.
Hlavička obsahuje popisné informace o přenášené zprávě, např. název obrázku, který je jako tělo posílán.
Příklad:
Content-Description: "Obrazek Prazskeho hradu".
Popis musí být v US-ASCII.
Hlavička Content-Disposition určuje, zda-li jsou přenášená data určena k automatickému zobrazení příjemci (inline) či nejsou určena k automatickému zobrazení příjemci (attachment), tj. příjemce je má zpracovávat ručně (např. se jedná o soubor, který má být uložen na lokální disk). Dále hlavička může obsahovat další parametry:
Příklad (zpráva nesoucí zvuk, který se má příjemci
přehrát):
Message-ID: <335A2639.C79@pvt.cz>
Date: Sun, 20 Apr 1997 16:20:41 +0200
From: Libor Dostalek <dostalek@pvt.cz>
X-Mailer: Mozilla 3.01Gold (WinNT; I)
MIME-Version: 1.0
To: dostalek@pvt.net
Subject: (no subject)
Content-Type: audio/wav
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename="ding.wav"
UklGRkYtAABXQVZFZm10IBAAAAABAAEAIlYAACJWAAABAAgAZGF0YSItAACAgICAgICAgICA
gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA
gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
...
Kódovací mechanismus převádí osmibitová data na sedmibitová (tj. data obsahující pouze znaky US-ASCII).
MIME definuje dva kódovací mechanismy: Quoted-printable a Base64. Pro úplnost se zmíníme ještě o mechanismu Radix-64, který používá PGP.
Toto kódování je určeno pro data, která z větší části obsahují znaky US-ASCII. Výsledkem kódování je text, který je i bez dekódování z velké části pro člověka čitelný.
Pravidla kódování
Tento způsob kódování není příliš úsporný. V případě, že všechny přenášené znaky jsou ne US-ASCII, pak se přenášená data zvětší na trojnásobek.
Příklad:
Řetězec Václav Vopička bude kódován v quoted-printable jako V=E1clav Vopi=E8ka protože:
Tento způsob kódování by v případě, že by všechny znaky byly ne US-ASCII, prodloužil původní text na trojnásobek. Naopak kódování Base64 prodlouží text pouze právě o třetinu.
Kódování Base64 je určeno pro kódování obecných binárních data, která nemusí být čitelná pro člověka. Kódovaná data jsou pouze o třetinu delší než data původní.
Kódovací algoritmus je jednoduchý. Používá tabulku base64 o 64 znacích (a znak "="). Pro kódování 64 znaků je třeba 6 bitů (26=64).
Znak "=" (6510) se používá ke speciálnímu účelu pro označení výplně na konci textu.
Z hlediska kódování se na zprávu nehledí jako na proud osmic bitů (bajtů), ale jako na proud šestic bitů. Každá šestice se pak kóduje podle tabulky base64. Viz obr. 3-1.
Na začátku kódování se kódovaný text rozdělí na sekvence 24 bitů (trojice bajtů). Každá trojice bajtů se rozdělí 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ím znakem z tabulky znaků abecedy base64.
Tabulka base64:
Hodnota Kódováno Hodnota Kódováno Hodnota Kódováno Hodnota Kódováno
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 (výplň 002) =
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 maximálně dlouhých 76 znaků.
Obr. 3-1 Kódování Base64
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.
Zbude-li na konci textu po rozdělení méně než 24 bitů, doplní se nulové bity zprava. Přidání na konec je indikováno znakem "=".
Jenže jak je to přesně s tím „=“. Problém je v tom, že´délka textu, který se kóduje, nemusí být dělitelná třemi. Rozdělí-li se text vstupující do kódování na skupiny po třech bajtech, pak poslední skupina:
· Má rovněž tři bajty. Nedochází k žádné komplikaci a žádné znaky „=“ se na konec nepřidávají.
· Má dva bajty (16 bitů), pak se prvních dvanáct bitů kóduje normálně dle tabulky Base64. Zbylé 4 bity se doplní dvěma binárními nulami na 6 bitů a výsledek se rovněž kóduje Base64. Avšak na konec se přidá jeden znak „=“ signalizující doplnění výplní dlouhou dva bity.
· Má jeden bajt (8 bitů), pak se prvních 6 bitů kóduje normálně dle tabulky Base64. Zbylé dva bity se doplní čtyřmi binárními nulami a výsledek se kóduje dle tabulky Base64. Na konec se přidají dva znaky „=“ signalizující výplň dlouhou 4 bity.
Nejlépe se princip pochopí na příkladech:
Příklad: délka vstupního
textu je dělitelná třemi
Vstup 8-bit: |
01101101 01001000 01111011 11100011
10101010 11110001 |
Vstup 6-bit: |
011011 010100 100001 111011
111000 111010 101011 110001 |
Desítkově: |
27 20 33 59 56 58 43
49 |
Base64 (výstup): |
b U h 7 4 6 r x |
Příklad: poslední skupina
má dva bajty
Vstup 8-bit: |
01101101 01001000 01111011 11100011
10101010 |
Výplň: |
00 |
Vstup 6-bit: |
011011 010100 100001 111011
111000 111010 101000 |
Desítkově: |
27 20 33 59 56 58 40
|
Base64 (výstup): |
b U h 7 4 6 o
= |
Příklad: poslední skupina
má jeden bajt
Vstup 8-bit: |
01101101 01001000 01111011 11100011 |
Výplň: |
0000 |
Vstup 6-bit: |
011011 010100 100001 111011
111000 110000 |
Desítkově: |
27 20 33 59 56 48 |
Base64 (výstup): |
b U h 7 4 w ==
|
Kódování Radix-64 je popsáno v RFC-2440, které specifikuje formát zprávy PGP. Jedná se o rozšíření kódování Base64 o kontrolní součet. Data jsou kódována Base64. Za Base64 kódovanými daty následuje nový řádek (CRLF), znak „=“ a 24 bitů dlouhý kontrolní součet z původních nekódovaných dat počítaný algoritmem CRC-24. Sám kontrolní součet je též kódován Base64. Zdrojový kód algoritmu CRC-24 je uveden v RFC-2440.
Příklad (RFC-2440):
-----BEGIN PGP MESSAGE-----
Version:
OpenPrivacy 0.99
yDgBO22WxBHv7O8X7O/jygAEzol56iUKiXmV+XmpCtmpqQUKiQrFqclFqUDBovzS
vBSFjNSiVHsuAA==
=njUN
-----END
PGP MESSAGE-----
V případě, že Váš software nepodporuje kódování Radix-64, pak stačí vypustit poslední řádek a data dekódovat běžným software pro Base64 kódování.
Znaky, které nejsou ASCII, by se v žádném případě neměly vyskytnout v záhlaví zprávy. Na otázku co se stane, když se tam takový znak vyskytne, není jednoznačná odpověď. Zpráva může dojít příjemci bez problému, zpráva může být nějakým serverem na cestě vrácena nebo se může ztratit.
RFC-2047 řeší otázku, jak do parametrů hlaviček dodat znaky, které nejsou ASCII. I zde se problém skládá ze dvou částí:
Syntaxe parametru hlavičky obsahujícího znaky, které nejsou ASCII, je:
=?charset?kódování?řetězec?=
kódování je buď b pro base64 nebo q pro quoted printable.
Příklad:
Chce-li si odesilatel do hlavičky From zadat své jméno s diakritikou, pak:
From: =?iso8859-2?q?V=E1clav Vopi=E8ka?= <Vaclav.Vopicka@firma.cz>
Je zpráva od Václava Vopičky, který má poštovní adresu Vaclav.Vopicka@firma.cz, ale nemá rád své jméno bez háčků a čárek, tak si jej dal alespoň do ignorované časti hlavičky From:. Václav Vopička použil znakovou zadu iso8859-2.
Jednoduché typy v podstatě sdělují, jaký software má příjemcův poštovní klient použít pro zobrazení zprávy adresátovi. Zda-li zprávu má zobrazit textovým editorem, grafickým editorem, přehrávačem zvuku, videa či snad dokonce zobrazit jako virtuální realitu.
Typ text je určen pro textové zprávy.
Typ text může mít mj. následující podtypy:
Primární podtyp je plain, který označuje neformátovaný text. Podtypy se používají pro formátované texty. Příkladem je např. podtyp html, kdy text obsahuje příkazy jazyka HTML.
U typu text je možné použít parametr charset, který indikuje použitou znakovou sadu. Pro nás jsou zajímavé zejména sady US-ASCII, ISO-8859-2 („ISO-LATIN2“), Windows-1250 a případně IBM850.
Příklad:
Content-Type: text/plain; charset=us-ascii
Tento typ je implicitní. Tj. pokud ve zprávě MIME hlavička Content-Type uvedena není, pak se má za to, že zpráva je typu text/plain a použitá znaková sada je US-ASCII.
Příklad:
Content-Type: text/html;
charset=ISO-8859-2
Tento typ je určen pro data, která je třeba zpracovat nějakou aplikací, aby byla čitelná pro uživatele. Jsou definovány podtypy: octet-stream a PostScript. Obecně podtyp bývá jménem aplikace, pro kterou jsou data určena. Uživatel musí být nějakým způsobem informován, jak dotyčná data zpracovat, např. průvodním dopisem. Pouze z hlavičky se o jejich bližším charakteru uživatel nemusí dozvědět všechny informace.
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.
Příkald:
Content-Type: application/msword
Content-Disposition: attachment; filename="soubor.doc"
Typ image specifikuje obrázek, tj. obsahem těla zprávy je obrázek. K jeho prezentaci je třeba odpovídající prohlížeč. Podtypy jsou mj.:
Příklad:
Content-Type: image/jpeg
Content-Disposition: inline; filename="soubor.jpg"
Typ audio specifikuje zvuk. K prezentaci
je třeba odpovídající přehrávač. Podtypy jsou mj.:
Příklad:
Content-Type: audio/wav
Obsahem těla zprávy je video, implicitní podtyp je mpeg.
Příklad:
Content-Type: video/mpeg
Typ model je určen pro vícedimenzionální struktury (např. pro virtuální realitu). Typem model se zabývá RFC-2077.
Doposud jsme se zabývali pouze jednoduchými zprávami, tj. zprávami, které se skládaly z jedné části (viz obr. 3-2).
Obr. 3-2 Struktura standardní zprávy dle RFC-822
Nyní se budeme zabývat zprávami složenými z více jednotlivých zpráv. Každá jednotlivá zpráva se může opět skládat z dílčích zpráv nebo již může být jednoduchou zprávou.
Zpráva může ve svém těle nést:
Tělo zprávy tohoto typu obsahuje několik různých částí - několik dílčích zpráv. Každá část těla celkové zprávy začíná úvodním oddělovačem, pak následují hlavičky této části, prázdný řádek a vlastní tělo dílčí zprávy. Poslední část je ukončena koncovým oddělovačem.
Jednotlivé dílčí zprávy nejsou interpretovány podle RFC-822. Mohou, ale také nemusí obsahovat hlavičky (prázdný řádek za záhlavím však musí být vždy uveden). Pokud nejsou hlavičky u části uvedeny, uplatní se implicitní hlavičky ze záhlaví celé zprávy.
Oddělovač je speciální sekvence znaků, která se nesmí vyskytnout nikde uvnitř částí. Oddělovač se definuje v záhlaví celé zprávy v hlavičce Content-Type parametrem boundary.
Parametr má tvar boundary=řetězec. Oddělovač je pak řádka, která začíná dvěma pomlčkami "- -", pak následuje řetězec z parametru. Maximální délka oddělovače je 70 znaků.
|
From: Libor Dostalek <dostalek@pvt.cz> Toto je preambule, která je ignorována. Je to proto místo
vhodné k vložení informací pro klienty, kteří Prvni nazor Druhy názor (tentokrát s háčky a čárkami) --gc0p4J:2408t-- |
Obr. 3-3 Zpráva typu multipart/mixed
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í, 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ště dvěma pomlčkami.
Podtypy:
·
Multipart/Mixed - je primárním podtypem. Je
určen pro zprávy, které obsahují nezávislé části, které je potřeba svázat v
daném konkrétním pořadí. Klasickým případem podtypu multipart/mixed je zpráva elektronické pošty obsahující
jeden nebo více příloh.
Příklad:
From: andel@pvt.cz
To: cert@peklo.org
Subject: Pozvani
MIME-Version: 1.0
Content-Type: multipart/alternative; boundary=boundary42
Pro pripad, ze Tvuj prohlizec neumi MIME,
tak Te proste zvu na vylet.
--boundary42
Content-Type: text/plain; charset=us-ascii
Zvu te i bez hacku a carek
--boundary42
Content-Type: text/html; charset=us/ascii
Pridej se <H1>k nam</H1>
--boundary42
Content-Type: audio/basic
Content-Transfer-Encoding: base64
UklGRkYtAABXQVZFZm10IBAAAAABAAEAIlYAACJWAAABAAgAZGF0YSItAACAgICAgICAgICA
gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA
gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA
...
--boundary42--
Software vytvářející zprávu tohoto typu musí řadit části ve vzrůstající kvalitě.
MIME-Version: 1.0
From:
To:
Date:
Subject: Priklad
Content-Type: multipart/mixed; boundary=unique-boundary-1
Zde je misto pro text, kterym je mozne
objasnit smysl zpravy pro ty,
kteri nejsou schopni zpravu podle MIME interpretovat.
Treti dilci zprava obsahuje obrazek, na jehoz
pozadi se ma spustit hudba.
--unique-boundary-1
První dílčí zpráva
--unique-boundary-1
Content-type: text/plain; charset=US-ASCII
Druha dilci zprava
--unique-boundary-1
Content-Type: multipart/parallel; boundary=unique-boundary-2
--unique-boundary-2
Content-Type: audio/basic
Content-Transfer-Encoding: base64
... base64-kódované mono se vzorkovacím
kmitočtem 8 KHz
--unique-boundary-2
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
... base64-kódovaný obrázek formátu JPEG
--unique-boundary-2--
--unique-boundary-1—
Subtyp Multipart/Encrypted specifikuje zprávu v elektronické obálce (šifrovanou zprávu). Skládá se opět ze dvou částí:
Není definován subtyp pro zprávy elektronicky podepsané a zároveň šifrované. Na takovýto požadavek je nutné zprávu nejprve elektronicky podepsat a výsledek pak celý šifrovat.
Příkladem může být PGP.
Pokud nepoužijete MIME, pak se veškeré informace ukládá do datové části
zprávy. Např.:
Subject: Tajna zprava
Date: Sat, 19 Apr 1997 17:16:27 +0200
From: Libor Dostalek <dostalek@pvt.cz>
To: alena@pvt.net
-----BEGIN PGP MESSAGE-----
Version: 2.6.3i
hEwDVzIQ/0AACWUBAgCjg7Plko8fm4nrCZOn7LQprCvcMelrF7qr2N5S5adUHujQ
hiUmcIMDK8zx+Cvm52lD68NZxKybexuaAESa+fMgpgAAALFXB4DlbeEWRHe6GwDz
vYMsWPbK7+UFC9ZXeHsKc+c6iPokzMG/NWHf76/OLJXV3iKIKrfRFycA77Pu1G/X
IccoMlAIfC29cqT7Y//q5TvYAwDoqpfIjoVaqz8dIjqy2G/2rf+acb4nyitLEtwL
NE0huVXKsgenm39MqQp9A5W+dWzC8OcB2uHTzdzpQgNzJJ5JYf1/L75XZ0la3jyA
t7HvXV6IPqQPIw0s0uChsEaKDPI=
-----END PGP MESSAGE-----
Takovou zprávu musíme nejprve uložit do souboru a pak na tento soubor spustit program PGP. Zejména příjemce musí rozpoznat, že jde o zprávu, kterou má zpracovat programem PGP.
RFC2015 zavádí typy:
· application/pgp-encrypted
· application/pgp-signature
· application/pgp-keys
Takže náš příklad může vypadat např. následovně:
Subject: Tajna zprava
Date: Sat, 19 Apr 1997 17:16:27 +0200
From: Libor Dostalek <dostalek@pvt.cz>
To: alena@pvt.net
Mime-Version: 1.0
Content-Type: multipart/encrypted; boundery=hranice;
protocol=application/pgp-encrypted
--hranice
Contentn-Type: application/pgp-encrypted
Version: 1.
--hranice
Content-Type: application/octet-stream
-----BEGIN PGP MESSAGE-----
Version: 2.6.3i
hEwDVzIQ/0AACWUBAgCjg7Plko8fm4nrCZOn7LQprCvcMelrF7qr2N5S5adUHujQ
hiUmcIMDK8zx+Cvm52lD68NZxKybexuaAESa+fMgpgAAALFXB4DlbeEWRHe6GwDz
vYMsWPbK7+UFC9ZXeHsKc+c6iPokzMG/NWHf76/OLJXV3iKIKrfRFycA77Pu1G/X
IccoMlAIfC29cqT7Y//q5TvYAwDoqpfIjoVaqz8dIjqy2G/2rf+acb4nyitLEtwL
NE0huVXKsgenm39MqQp9A5W+dWzC8OcB2uHTzdzpQgNzJJ5JYf1/L75XZ0la3jyA
t7HvXV6IPqQPIw0s0uChsEaKDPI=
-----END PGP MESSAGE-----
--hranice--
Za povšimnutí stojí, že první část nenese žádné kryptografické údaje - vše je v druhé části. První část nese pouze informaci o verzi PGP/MIME, tj. je umělá, aby syntaxe vyhovovala MIME.
Tento typ umožňuje odeslat poštovní zprávu jako tělo jiné poštovní zprávy (message/rfc822), dlouhou zprávu odeslat jako několik kratších (message/partial) nebo namísto těla zprávy odeslat jen informace, že se zpráva nachází na nějakém serveru (message/external-body).
Podtypy jsou mj.:
RFC 2046 uvádí následující příklad. Příjemce obdržel 2 maily:
From:
Bill@host.com Message-ID:
<anotherid@foo.com> ... Prvni cast audio mailu ... |
From:
Bill@host.com ... druha cast audiomailu ... |
Příjemcův software zjistil, že se jedná o dvě části téže zprávy o identifikaci (id) ABC@host.com. Jednotlivé části jsou číslovány pomocí parametru number. Celkový počet částí (total) je 2. Takže příjemcův software má k dispozici celou zprávu a může ji zobrazit jako:
From:
Bill@host.com ... prvni cast audiomailu
... |
Jelikož se jedná o Content-Type: audio/basic, tak zpráva není zobrazena jako
textový soubor, ale přehrána jako audio.
Příklad (RFC 2046):
From:
To:
Date:
Subject:
MIME-Version: 1.0
Message-ID: <id1@host.com>
Content-Type:
multipart/alternative; boundary=42
Content-ID:
<id001@guppylake.bellcore.com>
--42
Content-Type:
message/external-body; name="BodyFormats.ps";
site="thumper.bellcore.com"; mode="image";
access-type=ANON-FTP; directory="pub"; expiration="Fri, 14 Jun
1991 19:13:14 -0400 (EDT)"
Content-type:
application/postscript
Content-ID:
<id42@guppylake.bellcore.com>
--42
Content-Type:
message/external-body; access-type=local-file;
name="/u/nsb/writing/rfcs/RFC-MIME.ps";
site="thumper.bellcore.com"; expiration="Fri, 14 Jun 1991
19:13:14 -0400 (EDT)"
Content-type:
application/postscript
Content-ID:
<id42@guppylake.bellcore.com>
--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
Content-ID:
<id42@guppylake.bellcore.com>
--42--
V tomto příkladu odesilatel posílá tři odkazy na stejná data. První kopie dat je na anonymním FTP-serveru, druhá na lokálním disku a třetí lze získat z archivu list serveru.
Zatímco identifikace celé zprávy je nepovinná (<id1@host.com>), tak identifikace obsahu dílčí zprávy je povinná (<id42@guppylake.bellcore.com>).
Důležité je si také uvědomit, že obsahem těla dílčí zprávy nejsou data, ale informace o této zprávě. Hlavičku Content-Type tak máme použitu celkem ve třech různých významech:
1.
Content-Type: multipart/alternative;
boundary=42
Specifikuje typ zprávy jako celku.
2.
Content-Type:
message/external-body;
Specifikuje, typ dílčí zprávy - jedná se o odkaz.
3.
Content-Type:
application/postscript
Toto v podstatě není hlavička, ale obsah zprávy, kterým se specifikuje typ dat,
na které je odkazováno.