Usługi

Internet Message Access Protocol (IMAP)

Protokół dostępu do skrzynek i zarządzania wiadomościami na serwerze.

1. Czym jest IMAP?

Protokół Dostępu do Wiadomości Internetowych, znany jako IMAP, służy do uzyskiwania dostępu do poczty na zdalnym serwerze i zarządzania jej stanem. POP3 często pobiera wiadomości do klienta i może usuwać kopie z serwera. IMAP przechowuje stan skrzynki na serwerze, dzięki czemu wiele klientów może pracować na tych samych folderach.

IMAP traktuje serwer jako źródło stanu skrzynki. Klient pocztowy (MUA) na komputerze, telefonie lub tablecie wyświetla stan uzyskany z serwera. Odczytanie wiadomości, ustawienie flagi, przeniesienie lub usunięcie powoduje wysłanie polecenia, a wynik może zostać odzwierciedlony w innych klientach. Dotyczy to między innymi flag, hierarchii folderów, wiadomości wysłanych i wersji roboczych. Aktualną rewizją protokołu jest IMAP4rev2 zdefiniowana w RFC 9051 z 2021 roku. Dokument zastąpił RFC 3501 opisujący IMAP4rev1, który nadal występuje we wdrożonych serwerach i klientach. Klient może utrzymywać kilka sesji, lecz każda sesja ma własny stan wybranej skrzynki i musi reagować na aktualizacje serwera.

2. Kluczowe cechy IMAP

IMAP zapewnia dostęp do skrzynki i zarządzanie jej stanem po stronie serwera. Najważniejsze cechy tego modelu obejmują:

  • Przechowywanie na serwerze i synchronizacja

    Serwer przechowuje wiadomości i ich stan, a MUA pobiera oraz aktualizuje te informacje. Zakres synchronizacji zależy od uprawnień i konfiguracji serwera. Może obejmować między innymi:

    • Stan wiadomości: Flagi przeczytania i odpowiedzi są przechowywane na serwerze. Po synchronizacji odczytanie wiadomości na jednym urządzeniu może zostać pokazane na pozostałych.
    • Hierarchia folderów: Użytkownik może tworzyć, usuwać i zmieniać nazwy folderów, nazywanych w IMAP skrzynkami pocztowymi, jeśli ma odpowiednie uprawnienia. Klienci odczytują tę hierarchię z serwera.
    • Elementy wysłane i wersje robocze: Foldery Wysłane i Wersje robocze mogą być współdzielone przez klientów, jeśli serwer i konfiguracja klienta używają tych samych skrzynek. Wiadomość zapisana jako wersja robocza może wtedy być kontynuowana na innym urządzeniu.
    • Usunięcia: Usunięcie zwykle ustawia flagę Deleted\\Deleted. Wiadomość pozostaje w skrzynce do czasu wykonania EXPUNGE lub zamknięcia skrzynki poleceniem CLOSE.
  • Połączenie stanowe i zarządzanie sesją

    Sesja IMAP ma stan. Po uwierzytelnieniu klient może pozostać połączony i wybrać skrzynkę. Po SELECT serwer przekazuje między innymi liczbę wiadomości, flagi i informacje o aktualizacjach. Rozszerzenie IDLE pozwala serwerowi przekazywać nieoczekiwane informacje o nowych wiadomościach lub zmianach. Klient kończy IDLE poleceniem DONE, a następnie może wysłać kolejne polecenie. Protokół śledzi między innymi wybraną skrzynkę i jej stan.

  • Częściowe pobieranie

    Klient nie musi pobierać całej wiadomości, aby ją wyświetlić lub sklasyfikować. Może żądać określonych części wiadomości, korzystając z częściowego pobierania. W efekcie nagłówki, strukturę MIME i treść można pobierać oddzielnie, co ogranicza transfer załączników. Element BODY.PEEK pozwala pobrać treść bez ustawiania flagi \Seen. Na przykład może:

    • Pobierać tylko nagłówki nowych wiadomości ('ENVELOPE' lub 'BODY[HEADER]'), aby szybko wyświetlić nadawcę, temat i datę.
    • Pobierać strukturę wiadomości ('BODYSTRUCTURE'), aby zobaczyć, że zawiera ona np. część tekstową i załącznik PDF o rozmiarze 5 MB, bez pobierania załącznika.
    • Pobierać tylko część tekstową wiadomości wieloczęściowej ('BODY[1]'), ignorując wersję HTML lub załączniki.
    • Ta możliwość selektywnego pobierania zwiększa wydajność przez ograniczenie transferu na urządzeniach mobilnych oraz przy wolnych lub limitowanych połączeniach internetowych.
  • Flagi wiadomości

    IMAP definiuje system flag do śledzenia stanu wiadomości. Serwer je przechowuje, a klienci mogą je odczytywać lub modyfikować. Flaga \\Deleted oznacza usunięcie odroczone. Wiadomość pozostaje dostępna do czasu EXPUNGE lub CLOSE. EXPUNGE usuwa oznaczone wiadomości z wybranej skrzynki, a po tej operacji numery sekwencyjne mogą się zmienić. Do podstawowych flag systemowych należą:

    • Seen\\Seen: Wiadomość została przeczytana.
    • Answered\\Answered: Na wiadomość odpowiedziano.
    • Flagged\\Flagged: Wiadomość została oznaczona jako ważna (często wyświetlana jako gwiazdka lub flaga).
    • Deleted\\Deleted: Wiadomość została oznaczona do usunięcia, ale nie została jeszcze trwale usunięta.
    • Draft\\Draft: Wiadomość jest wersją roboczą.
    • Starsza rewizja definiowała także flagę Recent\\Recent. W IMAP4rev2 jest ona przestarzała. Serwery mogą obsługiwać niestandardowe słowa kluczowe zdefiniowane przez użytkownika. Flagi systemowe mają ustalone znaczenie, natomiast słowa kluczowe mogą zależeć od serwera. Klient może dodawać słowa kluczowe, jeśli serwer ogłasza ich obsługę.
  • Porty komunikacyjne

    IMAP korzysta z określonych portów sieciowych:

    • Port 143: Port IMAP używany do połączenia bez TLS oraz do rozpoczęcia negocjacji STARTTLS. Klient wymaga polityki bezpieczeństwa, która blokuje dalszą transmisję jawnym tekstem, jeśli ochrona jest konieczna. STARTTLS powinno zostać wykonane przed uwierzytelnieniem, gdy wymagane jest szyfrowanie.
    • Port 993: Port IMAP over TLS, znany jako IMAPS. Handshake TLS rozpoczyna się po połączeniu, przed poleceniami IMAP. RFC 8314 preferuje ten wariant w bezpiecznym dostępie do poczty. W tym trybie klient nie wysyła poleceń IMAP przed zakończeniem negocjacji TLS, a serwer musi przedstawić certyfikat do weryfikacji. Nieudana walidacja certyfikatu powinna także przerwać logowanie klienta.

3. Stany sesji IMAP

Sesja IMAP przechodzi przez stany, które określają dostępne polecenia. Połączenie zaczyna się w stanie nieuwierzytelnionym, następnie może przejść do uwierzytelnionego i wybranego. LOGOUT kończy sesję oraz połączenie TCP.

  1. Stan nieuwierzytelniony

    Jest to stan początkowy po nawiązaniu połączenia TCP. Klient nie jest jeszcze uwierzytelniony. Może żądać możliwości serwera (CAPABILITY), rozpocząć TLS (STARTTLS) lub uwierzytelnić się (LOGIN, AUTHENTICATE). Dostęp do danych skrzynki jest wtedy niedostępny.

  2. Stan uwierzytelniony

    Po LOGIN lub AUTHENTICATE sesja przechodzi w stan uwierzytelniony. Klient może listować skrzynki (LIST), tworzyć je (CREATE), usuwać (DELETE), zmieniać nazwy (RENAME) i subskrybować (SUBSCRIBE). Aby pracować z wiadomościami, musi wybrać skrzynkę poleceniem SELECT lub EXAMINE.

  3. Stan wybrany

    Ten stan następuje po otwarciu skrzynki poleceniem SELECT, które daje dostęp do odczytu i zapisu, lub EXAMINE, które daje dostęp tylko do odczytu. Klient może używać FETCH, STORE, COPY i SEARCH. W jednym połączeniu w danym momencie wybrana jest jedna skrzynka.

  4. Stan wylogowania

    Klient wysyła LOGOUT, aby zakończyć sesję. Serwer odsyła BYE, kończy połączenie i wykonuje wymagane czynności zamknięcia. Wiadomości oznaczone \Deleted są trwale usuwane po EXPUNGE lub CLOSE.

4. Polecenia IMAP

Każde polecenie klienta ma znacznik, na przykład A001 lub A002. Znacznik pozwala dopasować odpowiedź serwera do żądania. Odpowiedzi oznaczone tym samym znacznikiem kończą polecenie, a odpowiedzi nieoznaczone mogą przekazywać aktualizacje skrzynki. Klient może wysyłać polecenia z wyprzedzeniem tam, gdzie zezwala na to stan protokołu. Odpowiedzi zawierają znacznik, status (OK, NO lub BAD) oraz dane. Po wybraniu skrzynki serwer może asynchronicznie zgłosić nowe wiadomości lub zmianę flag, dlatego klient powinien aktualizować lokalny widok.

  • LOGIN i AUTHENTICATE: LOGIN nazwa_użytkownika hasło to prosty sposób uwierzytelnienia. AUTHENTICATE pozwala użyć mechanizmu SASL (Simple Authentication and Security Layer).
  • CAPABILITY: A001 CAPABILITY żąda listy obsługiwanych rewizji i rozszerzeń IMAP. Serwer może zgłosić IMAP4rev2, IMAP4rev1 oraz rozszerzenia takie jak IDLE i MOVE. Rozszerzenie MOVE, jeśli jest ogłoszone, pozwala przenieść wiadomości między skrzynkami w jednym poleceniu. Klient powinien sprawdzić tę listę przed użyciem poleceń rozszerzeń.
  • LIST: A002 LIST "" * żąda listy dostępnych skrzynek. Serwer zwraca nazwę, separator hierarchii i atrybuty każdej z nich, na przykład informację o podfolderach.
  • SELECT: A003 SELECT "INBOX" otwiera skrzynkę INBOX do odczytu i zapisu. Odpowiedź zawiera między innymi liczbę wiadomości (EXISTS) i dostępne flagi. Serwery zgodne także z IMAP4rev1 mogą dodatkowo zwrócić starsze dane RECENT oraz UNSEEN.
  • FETCH: Polecenie pobiera wybrane dane wiadomości. Zakres danych może obejmować nagłówki, treść i strukturę MIME. Przykłady:
    • 'A004 FETCH 1:10 (ENVELOPE)': Pobiera 'ENVELOPE' (podstawowe nagłówki jak Od, Do, Temat, Data) dla wiadomości od 1 do 10.
    • 'A005 FETCH 12 (BODY[TEXT])': Pobiera treść tekstową wiadomości numer 12.
    • 'A006 UID FETCH 4821 (BODYSTRUCTURE)': Pobiera strukturę MIME wiadomości o unikalnym ID 4821, pozwalając klientowi zobaczyć wszystkie jej części bez ich pobierania.
  • UID a numery sekwencyjne wiadomości: są licznikami (1, 2, 3...) aktualnie wybranej skrzynki. Mogą zmienić się w trakcie sesji, na przykład po usunięciu wiadomości. pozostają stabilne przy niezmienionym UIDVALIDITY, a serwer nie może ponownie użyć UID po usunięciu wiadomości w ramach tej samej wartości UIDVALIDITY. Zmiana UIDVALIDITY unieważnia zapisane identyfikatory, dlatego klient powinien wykonać pełną synchronizację i używać poleceń UID (UID FETCH, UID STORE, UID COPY), aby ograniczyć problemy synchronizacji. Zasada ta chroni klienta przed pomyleniem wiadomości po zmianie numerów sekwencyjnych. UID jest wartością protokołu, nie numerem wyświetlanym użytkownikowi.
  • STORE: To polecenie modyfikuje flagi wiadomości. 'A007 UID STORE 4822 +FLAGS (\Seen)' oznacza wiadomość o UID 4822 jako przeczytaną. 'A008 UID STORE 4823 -FLAGS (\Flagged)' usuwa status "oznaczona gwiazdką".
  • SEARCH: Umożliwia wyszukiwanie po stronie serwera. 'A009 SEARCH FROM "pomoc@firma.pl" SINCE 1-Jan-2024' prosi serwer o zwrot numerów sekwencyjnych wszystkich wiadomości od tego nadawcy otrzymanych od początku 2024 roku.
  • EXPUNGE: Wiadomości oznaczone flagą '\Deleted' nie są faktycznie usuwane, dopóki klient nie wyda polecenia 'EXPUNGE'. Ten dwuetapowy proces daje użytkownikowi szansę na "cofnięcie usunięcia" wiadomości, zanim znikną na stałe. Po usunięciu numery sekwencyjne pozostałych wiadomości mogą się zmienić, więc klient korzystający z UID musi uwzględniać UIDVALIDITY.

5. Bezpieczeństwo IMAP

Połączenie IMAP bez wynegocjowanej ochrony może przesyłać dane logowania i treść wiadomości jawnym tekstem. TLS zapewnia poufność i integralność rekordów po uzgodnieniu parametrów, a walidacja certyfikatu może uwierzytelnić serwer. Stosuje się dwa podstawowe sposoby ochrony połączenia:

  • IMAPS (IMAP przez SSL/TLS) na porcie 993

    Klient łączy się z portem 993, a TLS rozpoczyna się przed wysłaniem poleceń IMAP. Późniejsza sesja korzysta z ochrony TLS, zgodnie z konfiguracją kryptograficzną.

  • STARTTLS na porcie 143

    Klient łączy się z portem 143 i rozpoczyna negocjację w jawnym tekście, po czym wysyła STARTTLS. Jeśli serwer obsługuje rozszerzenie, strony negocjują TLS i chronią dalszą komunikację. Polityka klienta powinna wymagać pomyślnego STARTTLS, gdy połączenie ma być szyfrowane.

Model IMAP przechowuje stan skrzynki na serwerze i udostępnia go wielu klientom. Spójność widoku zależy od synchronizacji, obsługi rozszerzeń oraz konfiguracji serwera i klientów. Po ponownym połączeniu klient powinien uwzględnić zmiany wykonane podczas rozłączenia.

Powiązane artykuły