Zadanie #2 - pop3


(Terminem "piątkowym" dla zadania są trzecie zajęcia laboratoryjne)

1. Zarys opisu protokołu POP3

Serwer POP3 zwyczajowo nasłuchuje na porcie 110. Komunikacja z serwerem odbywa się poprzez wysyłanie mu jednowierszowych (zakończonych parą znaków CRLF) poleceń z ewentualnymi parametrami. W odpowiedzi na polecenie serwer odsyła komunikat zawsze rozpoczynający się jednym z poniższych ciągów znaków:

+OK

w przypadku poprawnego wykonania polecenia lub

-ERR

w przypadku wystąpienia błędu. Dodatkowo serwer może odesłać dokładniejszy opis błędu. Jeśli odpowiedź serwera złożona jest z więcej niż jednej linii, ostatnia z nich zawiera tylko i wyłącznie znak '.' (kropka).

UWAGA!
Źródłowe RFC podaje, że jeśli:
to kropka taka powinna zostać przez klienta usunięta.

Poniżej zostanie przedstawiony przebieg komunikacji z serwerem POP3.

2. Polecenie USER

Po odebraniu połączenia od klienta serwer odeśle notkę powitalną i przejdzie w tryb autentykacji. W tym trybie należy przesłać do serwera polecenie USER o składni:

USER nazwa_użytkownika

Praktyka pokazuje, że po poleceniu USER serwer zawsze odpowiada +OK.

3. Polecenie PASS

Hasło przesyła się jako parametr polecenia PASS o składni:

PASS hasło

Po poprawnym rozpoznaniu hasła serwer przechodzi do trybu transakcyjnego

4. Polecenie LIST

Polecenie LIST wymusza na serwerze odesłanie informacji o listach oczekujących na odebranie.
Informacja ma postać (przykładowo):

+OK
1 m1
2 m2
.

gdzie n jest liczbą oczekujących wiadomości a m ich łącznym rozmiarem w bajtach. Następnie w kolejnych liniach podawane są:
- numer kolejny wiadomości
- rozmiar wiadomości w bajtach (tu m1 i m2)
Lista kończy się wierszem zawierającym kropkę.

5. Polecenie TOP

Polecenie TOP o składni

TOP n m

spowoduje odesłanie m pierwszych linii wiadomości o numerzem n (jeśli taka wiadomość istnieje).
Ostatnia odesłana linia będzie zawierać kropkę.

6. Polecenie RETR

Polecenie RETR o składni

RETR n

spowoduje odesłanie całej wiadomości o numerze n (jeśli taka wiadomość istnieje).
Ostatnia odesłana linia będzie zawierać kropkę.

7. Polecenie DELE

Polecenie DELE o składni

DELE n

spowoduje usunięcie wiadomości o numerze n (jeśli taka wiadomość istnieje).
Uwaga - pozostałe wiadomości zachowują swoje dotychczasowe numery!

8. Polecenie QUIT

Bezparametrowe polecenia QUIT kończy połączenie z serwerem.

9. RFC 1939

Powyższy dokument zawiera tylko najważniejsze elementy protokołu POP3. Pełny opis protokołu zawiera RFC 1939 dostępne pod adresem http://www.ietf.org/rfc/rfc1939.txt?number=1939

10. Zadanie

Na bazie kodu omówionego na wykładzie napisz w języku C/C++ program wykonujący zadania prostego klienta POP3. Wolno ci wykorzystać wyłącznie bazowe funkcje oferowane przez bibliotekę języka C.

Program powinien być uruchamiany linią poleceń postaci:

mypop3 adres_serwera nazwa_konta

np.

mypop3 poczta.o2.pl pop.three

Po nawiązaniu połączenia z serwerem klient powinien zapytać użytkownika o hasło (pożądane jest, aby hasło było wprowadzane w sposób niewidoczny).
Po poprawnej autentykacji klient powinien ściągnąć z serwera wszystkie przechowywane na nim wiadomości i każdą z nich zapisać w oddzielnym pliku o nazwie:

mail_nnn.eml

W pliku ma zostać umieszczona cała odebrana wiadomość i nic poza nią - w szczególności nie mogą się tam znaleźć komunikaty od serwera i kończąca kropka. Klient musi poprawnie obsługiwać pojawienie się linii zaczynającej się od kropki lub kropek.
Wymagana jest skromna (ale rzeczowa) diagnostyka błędów.

PS
konto: pop.box
hasło: pop.box.11