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>