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.
Vrátí-li se nám náš mail jako nedoručitelný, pak se často setkáváme, že mailový server, který zprávu vrací, použije právě kódování quoted-printable.
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 "=" (65) se používá ke speciálnímu účelu.
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.
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ím znakem z tabulky znaků abecedy base64.
Tabulka 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 "=".
RFC2047 řeší otázku jak do parametrů hlaviček dodat ne ASCII znaky. Problém i zde se skládá ze dvou částí:
=?charset?kódování?řetězec?=
charset je např. iso-8859-x
kódování je buď b pro base64 bebo q pro
quoted printable.
From: =?iso8859-2?q?V=E1clav Vopi=E8ka?=
Je zpráva od Václava Vopičky
Primární subtyp je plain, který označuje neformátovaný text. Subtypy se používají pro obohacené texty, texty s vylepšeným vzhledem. Příkladem je např. podtyp html, kdy text obsahuje příkazy jazyka HTML. Vlastností těchto textů je, že jsou čitelné i bez použití speciálního softwaru. To je odlišuje od textově nečitelných dat jako je obrázek.
V souladu s definovanými typy a podtypy tedy zpráva podle RFC822 může být uvozena např. hlavičkou:
Content-Type: text/plain; charset=us-ascii
Tento tvar hlavičky je implicitní.
RFC2045 až RFC2049 definuje pouze podtyp text/plain. RFC2068 (protokol HTTP/1.1) specifikuje subtyp html.
Příklad:
Content-Type: text/html; charset=ISO-8859-2
RFC2045 až RFC2049 definuje charset jako jednoznačné mapování řetězce bytů na znaky, které již nepotřebuje žádné dodatečné informace.
RFC2045 až RFC2049 uvádí seznam předdefinovaných znakových sad. Další znakové sady mohou být registrovány prostřednictvím IANA.
Jednotlivé registrované znakové sady jsou uveřejněny na:
ftp://ftp.isi.edu/in-notes/iana/assignments/character-sets
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/html; charset=ISO-8859-2
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říklad:
Content-Type: application/octet-stream; name="coin.ani"
Příklad:
Content-Type: image/jpeg
Příklad:
Content-Type: audio/wav
Příklad:
Content-Type: video/mpeg
Model může zahrnovat další faktory jako je síla, rychlost, zrychlení, hybnost, čas atd.
Model se skládá z jednoho nebo více objektů mezi kterými je definován scénář typu master/slave. Objekt se skládá s elementů, které mají mezi sebou definovány vztahy.
Hovorově se místo slova model používá označení "virtuální realita".
Příklad:
Content-Type: model/vrml
Nyní se budeme zabývat zprávami složenými z více jednotlivých zpráv. Zpráva může ve svém těle nést:
Jednotlivé dílčí zprávy nejsou interpretovány podle RFC822. 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í vyskytnou 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ů.
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.
Podtypy:
Příklad mailu o dvou částech:
From: Libor Dostalek <dostalek@pvt.cz>
To: drdak@pvt.net
Subject: Zprava obsahujici me 2 nazory
MIME-Version: 1.0
Content-type: multipart/mixed; boundary="HRANICE"
Toto je preambule, která je ignorována. Je to proto místo
vhodné k vlození informací pro klienty, kterí
nepodporují MIME.
--HRANICE
Prvni nazor
Vsimnete si, ze tato cast neobsahuje zadne hlavicky,
presto obsahuje prazdny radek oddelujici zahlavi od tela.
Text nekonci koncem radky.
--HRANICE
Content-type: text/plain; charset=iso-8859-2
Druhy názor (tentokrat s hackami a carkami)
Text je ukoncen koncem radky.
--HRANICE--
Toto je zaver, je také ignorován.
Příklad:
From: bilbo@pvt.net To: gandalf@hrad.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ě.
V praxi se setkáváme s případem, že zpráva je tvořena pomocí multipart/mixed dvěmi dílčími zprávami. První dílčí zpráva tvoří obsah a druhá pomoci multipart/digest se skládá z jednotlivých kapitol.
Implicitní hlavička Content-Type pro jednotlivé části je změněna z text/plain na message/rfc822.
Příklad:
From:
To:
Date:
Subject: Internet Digest
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="---- Hlavni hranice
----"
------ Hlavni hranice ----
... Seznam zprav, ktere posilam ...
(Napr. Posilam ti zpet maily, ktere nejsem schopen dale dorucit)
------ Hlavni hranice ----
Content-Type: multipart/digest; boundary="----
Hranice ----"
------ Hranice ----
From: odesilatel1
Date:
To:
Subject: Zprava1
Telo zpravy
------ Hranice ----
From: odesilatel2
Date:
To:
Subject: Zprava2
Telo zpravy2
------ Hranice ------
------ Hlavni hranice ------
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
Prvni dilci zprava
--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-kodovane mono se vzorkovacim kmitoctem 8 KHz
--unique-boundary-2
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
... base64-kodovany obrazek formatu JPEG
--unique-boundary-2--
--unique-boundary-1--
Subtyp Multipart/Signed spcifikuje zprávu skládající se ze dvou částí:
Není definován subtyp pro zprávy elektronicky podepsané a zároveň šifrované. Na takovýto požadavek je nutné uplatnit oba typy postupně za sebou.
Subtypy Multipart/Signed a Multipart/Encrypted otevřely cestu k použití tzv. bezpečného mailu. Dnes existují čtyři nezávislé standardy pro bezpečný mail:
MOSS a S/MIME používá subtypy Multipart/Signed a Multipart/Encrypted. S/MIME (Secure MIME) je využito v popularním Netscape Comunicatoru, takže jeho masové nasazení lze předpokládat.
Existuje i rozšířeni S/MIME pro dávkové transkace realizující elektronické platby označované jako S/MIME-3P ("trojstranné bezpečné MIME") umožňující transakce mezi zákazníkem, obchodníkem a bankou.
Této preoblematice se budeme podobněji věnovat v samostatném textu.
Definované podtypy:
RFC 2046 uvádí následující příklad. Příjemce obdržel 2 maily:
From: Bill@host.com
To: joe@otherhost.com Date: Fri, 26 Mar 1993 12:59:38 -0500 (EST) Subject: Audio mail (part 1 of 2) Message-ID: <id1@host.com> MIME-Version: 1.0 Content-type: message/partial; id="ABC@host.com"; number=1; total=2 Message-ID: <anotherid@foo.com>
... Prvni cast audio mailu ... |
From: Bill@host.com
To: joe@otherhost.com Date: Fri, 26 Mar 1993 12:59:38 -0500 (EST) Subject: Audio mail (part 2 of 2) MIME-Version: 1.0 Message-ID: <id2@host.com> Content-type: message/partial; id="ABC@host.com"; number=2; total=2 ... druha cast audiomailu ... |
From: Bill@host.com
To: joe@otherhost.com Date: Fri, 26 Mar 1993 12:59:38 -0500 (EST) Subject: Audio mail Message-ID: <anotherid@foo.com> MIME-Version: 1.0 Content-type: audio/basic Content-transfer-encoding: base64 ... prvni cast audiomailu ...
|
Parametr acces-type specifikuje o jaký server (protokol) se jedná. Nejčastější typy servery jsou ftp, anon-ftp (anonymní FTP-server), mail-server (list server) a local-file (soubor na lokálním počítači). Další typy lze nalézt na: ftp://ftp.isi.edu/in-notes/iana/assignments/access-types
Význam některých dalších parametrů:
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: