Protokół IMAP - techniczny opis

Wstęp

IMAP (Internet Message Access Protocol) jest protokołem warstwy aplikacji w architekturze protokołów Internetowych. Jego głównym zadaniem jest umożliwienie stacji roboczej (np. pecet w domu lub w sieci lokalnej) dostępu do listów elektronicznych znajdujących się w skrzynce pocztowej (mail box) na serwerze pocztowym. Podobny protokół POP zajmuje się tym samym problemem ale jego możliwości są znacznie mniejsze.

Podobnie jak POP, IMAP definiuje środki dostępu do listów w skrzynce, a nie środki wysyłania czy transferu listów pomiędzy serwerami pocztowymi. Tą funkcją zajmuje się odpowiedni protokół transferu poczty (np. SMTP - Simple Mail Transfer Protocol). Protokół IMAP zakłada, że ma do dyspozycji wiarygodne medium transmisji strumienia danych, takie jakie przykładowo dostarcza protokół TCP lub jakiś podobny. Gdy używany jest TCP, to program serwera IMAP "nasłuchuje" na porcie 143 czekając na zlecenia. Podsumowując pocztowy protokół dostępu IMAP odzyskuje wiadomości, może modyfikować atrybuty listów; w ogólności zarządza skrzynkami. IMAP oferuje wiele więcej możliwości w stosunku do prostego schematu "skopiuj i usuń" dostępnego w protokole POP.

Anatomia protokołu

Protokół IMAP składa się z ciągu komend klienta i odpowiedzi serwera. Dane z serwera przeplatają się z komendam klientai. Inaczej niż ma to miejsce w większości protokołów Internetowych warstwy aplikacji, komendy i odpowiedzi są etykietowane (w terminologii angielskiej: tagged). Serwer (programowy) musi być cały czas gotowy do połączenia. Powszechnie znanym numerem portu, którego używa IMAP jest 143 (można to sprawdzić przeglądając zawartość pliku /etc/services w większości instalacji unixowych). Klient rozpoczyna sesję i oczekuje na "pozdrowienie" z serwera. Generalnie pierwszą komendą klienta jest LOGIN z nazwą konta i hasłem jako parametrami: LOGIN username password. Gdy to się powiedzie, klient musi wysłać komendę SELECT aby dostać się do pożądanej skrzynki. Klient ma możliwość zmieniania pewnych danych, głównie przy pomocy specjalnych flag. Dokonuje się tego komendą STORE. Przykładowo wiadomość pocztowa może być zaznaczona do usunięcia ze skrzynki komendą STORE z ustawioną flagą \DELETED. Inne często używane komendy to: COPY, EXPUNGE, CHECK, SEARCH, LOGOUT (szczegóławy opis w dodatku A). Klient kończy sesję komendą LOGOUT, serwer zwraca BYE i OK.

Typowy scenariusz sesji IMAP widzianej od strony klienta wygląda następująco:

otwórz połączenie TCP (np. telnet host 143)
A001 LOGIN username password
A002 SELECT INBOX
A003 FETCH 1:3 ALL
A004 FETCH 2 RFC822.TEXT
A005 STORE 2 +FLAGS \DELETED
A006 EXPUNGE
A007 LOGOUT

Proszę zwrócić uwagę na kilka spraw. Po pierwsze każda komenda poprzedzona jest etykietką (tutaj A001, A002 itd.). Oczywiście można używać innych symboli np B01, B02. Po drugie nazwy komed możemy pisać małymi lub dużymi literami (a001 Login, A002 select inbox itd.) Po trzecie komendy posiadają parametry (np. FETCH 1:4 ALL) inne nie (np. EXPUNGE). Oczywiście w trakcie "prawdziwej" sesji serwer IMAP będzie wysyłał odpowiedzi z ewentualnymi danymi, które będą z kolei docierały do klienta.
Szczegółowe wyjaśnienie powyższej sesji.
Po ustanowieniu połączenia TCP z usługą identyfikowaną przez numer portu 143 (standard dla IMAP) rozpoczyna się właściwa sesja. Proszę zauważyć, że kanał komunikacyjny możemy ustanowić przy pomocy standardowego protokołu TELNET (składnia: telnet host numer_portu, np. : telnet sigma.wsb-nlu.edu.pl 143). Oczywiście zadziała to, o ile docelowy komputer obsługuje dostęp do telnetu (ze względów bezpieczeństwa może to być inny protokół, np. SSH). Gdy się to powiedzie zobaczymy "powitanie" serwera IMAP np:

* OK sigma.wsb-nlu.edu.pl IMAP4rev1 v12.250 server ready

Następnie wysyłamy polecenie: LOGIN username pasword (poprzedzone etykietą A001) aby nastąpiła weryfikacja i autoryzacja dostępu. Kolejne polecenie: SELECT INBOX jest obowiązkowe i służy do wyboru skrzynki na komputerze host, z którą będziemy od tego momentu pracować (potem, w ramach tej samej sesji, można przełączyć się na inną). Polecenie to zmusi również serwer do wysłania pewnych informacji na temat wybranej skrzynki. W szczególności są tam dane o tym ile jest listów w skrzynce, jaki jest aktualnie stan flag czy gdzie się znajduje skrzynka (pełna ścieżka dostępu). Następne polecenie: FETCH 1:3 ALL nakazuje przesłanie z serwera pocztowego do stacji roboczej podstawowych danych opisujących przesyłki 1,2 i 3. Dane te to standardowe elementy nagłówków, informacje o ustawieniu flag protokołu IMAP itp. Sama treść wiadomości nie jest wysyłana. Aby uzyskać treść listu wysyłamy polecenie: FETCH 3 RFC822.TEXT. Będzie to list numer 3, bez nagłówków (parametr RFC822.TEXT). Oprócz treści pojawi się również informacja, że flaga \Seen jest ustawiona: FLAGS (\Seen). Następna komenda: STORE 3 +Flags \Deleted nakazuje serwerowi IMAP aby ustawił flagę \Deleted dla listu numer 3. Uwaga, nie oznacza to jeszcze usunięcia tego listu ze skrzynki na serwerze, a jedynie przygotowanie go do ewentualnego usunięcia. Komenda EXPUNGE dokonuje faktycznego usunięcia listów zaznaczonych uprzednio odpowiednią komendą STORE (odpowiada ona poleceniu Compact Folders w menu File programu Netscape Messanger). Na koniec wreszcie klient zamyka sesję poleceniem LOGOUT.


Spis komend i odpowiedzi IMAP


Komendy:
tag NOOP
tag LOGIN user password
tag LOGOUT
tag SELECT mailbox
tag BBOARD bulletin_board
tag FIND MAILBXES wzorzec
tag CHECK
tag EXPUNGE
tag COPY sekwencja mailbox
tag FETCH sekwencja dane
tag STORE sekwencja dane wartości
tag SEARCH search_program

Odpowiedzi:
tag OK tekst
tag NO tekst
tag BAD tekst
* FLAGS lista_flag
* SEARCH sekwencja
* BBOARD łańcuch
* MAILBOX łańcuch
* BYE tekst
* OK tekst
* NO tekst
* BAD tekst
+tekst