MIME

Co to jest?

MIME, czyli Multipurpose Internet Mail Extension - Wielozadaniowe rozszerzenie poczty w Internecie, jest standardem pozwalaj▒cym przesy│aµ w sieci Internet wszelkie dane (teksty, grafikΩ, zdjΩcia, d╝wiΩki, muzykΩ, programy) za pomoc▒ standardowych narzΩdzi, takich jak poczta, newsy czy WWW. Wbrew swojej nazwie (Mail Extension, czyli rozszerzenie poczty), zastosowanie MIME nie ogranicza siΩ wy│▒cznie do plik≤w przesy│anych poczt▒. Standard ten rozwin▒│ siΩ na tyle, ┐e wprowadzono go tak┐e do innych system≤w przesy│ania danych i obecnie jest to niekwestionowany standard we wszystkich us│ugach Internetu, kt≤rych podstawowym zadaniem jest przesy│anie tekstu.

Dlaczego akurat MIME

Podstawow▒ zalet▒ MIME jest to, ┐e jest to standard. Niemal wszystkie nowsze narzΩdzia pracuj▒ce w sieci Internet (nowsze, to znaczy powsta│e w przeci▒gu ostatnich 2-3 lat) potrafi▒ ten standard obs│u┐yµ. Jest to bardzo wa┐ne w sieci tak rozleg│ej i zr≤┐nicowanej jak Internet, w kt≤rej pracuj▒ kra±cowo r≤┐ne typy komputer≤w.

DziΩki MIME list zawieraj▒cy zdjΩcie i nagrany g│os nadawcy mo┐e zostaµ wys│any z komputera typu Macintosh, a nastΩpnie odebrany na komputerze Amiga, przy czym zar≤wno nadawca listu jak i odbiorca w og≤le nie zauwa┐▒ faktu, ┐e np. dane zawieraj▒ce obrazek zostan▒ po drodze zamienione na ci▒g literek wygl▒daj▒cych np tak:

M YP.?4)W0DI38Y0+E:JKK)50K:J2 *R$E*P0E'R5?!0^4CBH#+:PJU##Q*XP
MOST"2A7+SS,1EM-Q#]05GE$SKVD O J[5K!*8^*_R1"J4IIES>@/.VWRG=+A
M:>"I[+JK3_KCK/RYV#'J@C4G]B@0G#1%5A9OUPY2D!AH2I*%#: YT/'^28'&
...a do tego jeszcze plik zawieraj▒cy d╝wiΩk zosta│ zmieniony w "miΩdzyczasie" z formatu stosowanego na jednym komputerze na format stosowany na drugim.

I w│a╢nie na tym polega MIME - jest to niejako uniwersalny jΩzyk, co╢ jak ╢redniowieczna │acina czy obecnie jΩzyk angielski. Zamiast uczyµ siΩ dziesi▒tek r≤┐nych jΩzyk≤w (czytaj - zamiast przystosowywaµ programy do dziesi▒tek r≤┐nych standard≤w), wystarczy nauczyµ siΩ tego jednego jΩzyka, ┐eby m≤c siΩ porozumieµ ze wszystkimi (czytaj - ┐eby m≤c zrozumieµ dane wys│ane z komputera stosuj▒cego lokalnie dowolny standard).

Co ma MIME do ogonk≤w?

Niekt≤rzy pewnie siΩ ju┐ domy╢lili, ┐e dziΩki temu ┐e MIME jest uniwersalnym standardem, doskonale nadaje siΩ ono do rozwi▒zanie problem≤w z polskimi literkami w Internecie. Sytuacja obecnie jest taka, ┐e istnieje ponad 20 sposob≤w kodowanie polskich liter. Inne jest stosowane w systemie DOS, inne w Windows, jeszcze inne na komputerach Macintosh, etc... Nawet w tym samym systemie r≤┐ne programy mog▒ kodowaµ polskie znaki na r≤┐ne sposoby. DziΩki MIME, mo┐na z tak▒ sytuacj▒ poradziµ sobie w do╢µ prosty spos≤b. Ot≤┐ wystarczy, ┐eby program wysy│aj▒cy lub obieraj▒cy dane do/z sieci Internet, potrafi│ sobie przekodowaµ odpowiednio polskie literki na standard MIME. DziΩki temu u┐ytkownik w og≤le nie zauwa┐a, ┐e polskie literki s▒ zapisane w inny spos≤b ni┐ to jest stosowane zwykle w jego komputerze. Przyk│adowo:
Nowak pisze list za pomoc▒ programu Pegasus Mail pracuj▒cego w sieci Novell. U┐ywa polskich liter w standardzie CP852, popularnym w systemie DOS.
W momencie gdy zako±czy pisanie i wyda polecenie wys│ania listu, Pegasus Mail dokona automatycznie konwersji polskich znak≤w na standard ISO-8859-2 (przyjΩty w MIME jako standard kodowania znak≤w narodowych dla Europy ╢rodkowej i wschodniej), dopisze do nag│≤wka informacjΩ ┐e list zawiera ten w│a╢nie zestaw znak≤w, po czym wy╢le go do odbiorcy. Odbiorca listu, Kowalski, pracuje w systemie Unix, korzystaj▒c z programu pine. Na terminalu na kt≤rym pracuje Kowalski zainstalowano polskie litery wed│ug standardu Mazovii. Program pine jest tak skonfigurowany, ┐e "wie" i┐ polskie znaki nale┐y wy╢wietlaµ w standardzie Mazovii.
Dlatego te┐ po rozpoznaniu wed│ug nag│≤wka, ┐e list zawiera polskie litery, dokonuje automatycznej konwersji z ISO-8859-2 na MazoviΩ i w tej w│a╢nie postaci wy╢wietla list.
Chocia┐ z pozoru wygl▒da to bardzo skomplikowanie, to jednak w praktyce wszystko dzieje siΩ automatycznie - Kowalski pisze i wysy│a list, Nowak go odbiera i czyta. Chocia┐ obydwaj u┐ywaj▒ zupe│nie r≤┐nych system≤w i standard≤w kodowania, to jednak list wys│any od Kowalskiego dociera do Nowaka w dok│adnie takiej postaci w jakiej powinien.

Jak to wygl▒da "od ╢rodka"?

O ile, jak to wy┐ej napisa│em, sam spos≤b zapisu danych w formacie MIME nie powinien interesowaµ u┐ytkownika program≤w, to jednak mo┐e on zainteresowaµ kogo╢ kto sam stara siΩ przystosowaµ programy do wsp≤│pracy z MIME. Szczeg≤│owy opis tego formatu mo┐na znale╝µ w RFC1521 oraz RFC1522. Tutaj natomiast w du┐ym skr≤cie i w uproszczeniu.

Zasadniczo format MIME opiera siΩ na formacie stosowanym od zamierzch│ych czas≤w w sieci Internet w poczcie. Format ten opisany jest w RFC822, a polega w skr≤cie na tym, ┐e na pocz▒tku dokumentu znajduje siΩ tzw. nag│≤wek, kt≤rego poszczeg≤lne linijki zawieraj▒ r≤┐ne informacje, takie jak nadawca listu, data jego wys│ania, tytu│, etc...

A oto przyk│ad takiego nag│≤wka:

Path: galaxy.uci.agh.edu.pl!uw.edu.pl!news.nask.pl!usenet
From: Hubert Janczak 
Newsgroups: pl.comp.ogonki,pl.comp.www,pl.comp.sys.pc-unix.linux
Subject: Re: Znowu te cholerne ogonki...
Date: Wed, 17 Jul 1996 14:39:30 +0200
Lines: 19
Jak widaµ ka┐da linijka nag│≤wka zawiera s│owo kluczowe zako±czone dwukropkiem (From:, Subject:, etc...), okre╢laj▒ce co zawiera dana linijka, oraz w│a╢ciwe dane (adres nadawcy, tytu│...).

Koniec nag│≤wka oznaczany jest przez pust▒ linijkΩ, pozosta│a czΩ╢µ dokumentu zawiera jego w│a╢ciw▒ tre╢µ.

W nag│≤wku, w╢r≤d wielu informacji, mo┐e w szczeg≤lno╢ci pojawiµ siΩ taka linijka:

MIME-Version: 1.0
Oznacza to, ┐e dokument jest zgodny ze standardem MIME (1.0 oznacza numer wersji - jak na razie istnieje tylko jedna wersja tego standardu, w│a╢nie 1.0). W przypadku pojawienia siΩ takiej linijki, pojawiaj▒ siΩ najczΩ╢ciej tak┐e dwie dodatkowe. Pierwsza z nich to:
Content-type:
Linijka taka okre╢la zawarto╢µ pliku, oraz - co bardzo wa┐ne - zestaw znak≤w stosowanych w tym pliku (je┐eli jest to plik tekstowy). Zawarto╢µ pliku jest okre╢lana przez parΩ s│≤w kluczowych - pierwsze okre╢la typ, czyli np. tekst, grafika, d╝wiΩk, drugie s│owo podaje konkretny format (np. text/plain - czyli zwyk│y tekst, text/html - tekst w formacie HTML, image/jpg - obrazek w formacie JPeg, itp...).

Zestaw znak≤w okre╢la siΩ po ╢redniku, pisz▒c charset=xxx. Og≤lnie, najczΩ╢ciej wystΩpuj▒cym i interesuj▒cym dla nas przypadkiem jest:

Content-type: text/plain; charset=ISO-8859-2
Oznacza to czysty tekst, ze znakami ze standardu ISO-8859-2, kt≤ry to zawiera znaki stosowane w Europie ╢rodkowej i wschodniej (za wyj▒tkiem cyrylicy), w szczeg≤lno╢ci litery polskie, czeskie, s│owackie, wΩgierskie itp...

Druga informacja wystΩpuj▒ca bardzo czΩsto w nag│≤wku MIME, to:

Content-transfer-encoding:
Okre╢la ona w jaki spos≤b przesy│ane s▒ znaki o kodach >127. Jest to o tyle wa┐ne, ┐e pocz▒tkowo Internet nie by│o mo┐liwo╢ci przesy│ania znak≤w o kodach >127, dlatego wiele program≤w ci▒gle nie pr≤buje przesy│aµ takich znak≤w. Dlatego czΩsto zachodzi konieczno╢µ specjalnego zakodowania znak≤w z tzw. g≤rnej po│≤wki zestawu znak≤w za pomoc▒ znak≤w z dolnej czΩ╢ci, czyli ze standardowego ASCII.

Zasadniczo stosowane s▒ dwa sposoby kodowania:

Content-transfer-encoding: quoted-printable
Stosuje siΩ go tam, gdzie dane zawieraj▒ niewiele znak≤w spoza standardowego ASCII, czyli np. w│a╢nie do przesy│ania tekst≤w z polskimi znakami. Znaki o kodach wiΩkszych ni┐ 127 s▒ zamieniane na trzy znaki. Najpierw jest znak r≤wno╢ci a potem dwie liczby heksadecymalne tworz▒ce liczbΩ szesnastkow▒ odpowiadaj▒c▒ kodowi znaku. Przyk│adowo znak ≤, zapisywany w standardzie ISO-8859-2 jako 243, zostanie przes│any jako ci▒g znak≤w =F3 (liczba 243 to F3 szesnastkowo). Dodatkowo znak r≤wno╢ci jest zapisywany jako =3D (3D to szesnastkowy kod znaku '=' wg standardu ASCII).

W kodowaniu tym stosowane jest jeszcze kilka dodatkowych regu│, szczeg≤│y we wspomnianym ju┐ RFC1521.

Drugi spos≤b kodowania, stosowany raczej do plik≤w binarnych (grafika, d╝wiΩk), ale mo┐liwy do zastosowania tak┐e dla zwyk│ego tekstu, to:

Content-transfer-encoding: base64
Dane przeznaczone do zakodowania standardem `base64' s▒ grupowane po trzy bajty, a nastΩpnie ka┐da z takich tr≤jek jest dzielona na cztery liczby 6-bitowe. Z kolei liczby 6-bitowe zapisywane s▒ w prosty spos≤b - 0 to A, 1 to B, ..., 25 - Z, 26 - a, 27 - b, ..., 51 - z, 52 - 0, 53 - 1, ..., 61 - 9, 62 - +, 63 - / Powstaje ci▒g znak≤w - liter, cyfr i znak≤w + i /. Taki ci▒g jest jeszcze tylko dzielony na wiersze i powstaje co╢ zupe│nie nieczytelnego dla cz│owieka, ale za to │atwe do przes│ania przez praktycznie ka┐dy program rozumiej▒cy MIME. Ten spos≤b kodowania tak┐e jest opisany dok│adnie w RFC1521.

Trzecim sposobem przes│ania znak≤w o kodzach >127, najprostszym z mo┐liwych, jest po prostu wys│anie ich w postaci 8-bitowej. List zawiera wtedy w nag│≤wku informacjΩ:

Content-transfer-encoding: 8bit
a dane tak zapisane nie wymagaj▒ ┐adnej konwersji.

Polskie literki w nag│≤wkach, czyli co to znaczy =?ISO-8859-2?Q?Pi=EA=E6?=

Wszystko opisane powy┐ej odnosi siΩ do kodowania polskich literek w tre╢ci listu. Czasami jednak potrzeba umie╢ciµ takie znaki w samym nag│≤wku, np. w tytule list, albo we w│asnym nazwisku w polu From:. Tak▒ sytuacjΩ r≤wnie┐ opisuje MIME, a dok│adniej to RFC1522.

M≤wi▒c w du┐ym skr≤cie, fragment zawieraj▒cy znaki ze specjalnego zestawu znak≤w (np. ISO-8859-2) zapisywany jest w formacie:

=?charset?encoding?encoded_text?=
gdzie: Tutaj jednak - jak w przypadku wszystkich innych opcji MIME - poprawny program powinien takie - dziwnie na pierwszy rzut oka wygl▒daj▒ce - ci▒gi znak≤w automatycznie zamieniµ na postaµ czyteln▒ dla u┐ytkownika (i w przypadku wymienionego w podtytule =?ISO-8859-2?Q?Pi=EA=E6?= wy╢wietliµ po prostu "PiΩµ").


Mo┐na tak┐e obejrzeµ inny dokument o MIME.


Piotr Pi▒tkowski, <kompas@uci.agh.edu.pl>