Odbieranie wiadomości elektronicznych.



Podobne dokumenty
Sieci Komputerowe. Protokół POP3. Protokół IMAP4 Internet Mail Access Protocol version 4. dr Zbigniew Lipiński

Java wybrane technologie

Java Enterprise Edition spotkanie nr 1 (c.d.) JavaMail

Gniazda BSD implementacja w C#

Bezpieczeństwo poczty elektronicznej

Wysyłanie wiadomości elektronicznych. Aplikacja KlientSmtp

Budowa wiadomości SMTP. autorzy: Aleksandra Wichert Marcin Żurowski

Przykład usługi internetowej

B.B. Połączenie kończy polecenie exit.

FTP File Transfer Protocol

Architektury systemów rozproszonych LABORATORIUM. Ćwiczenie 1

Bezpieczne protokoły Materiały pomocnicze do wykładu

PROTOKOŁY OBSŁUGI POCZTY ELEKTRONICZNEJ

Programowanie Sieciowe 2 Protokoły komunikacyjne: FTP

Zarządzanie sieciami komputerowymi - wprowadzenie

Architektura typu klient serwer: uproszczony klient POP3

MeetingHelper. Aplikacja Android ułatwiająca przekazywanie materiałów pomiędzy uczestnikami spotkania. Instrukcja obsługi dla programisty

1. FTP 2. SMTP 3. POP3

Wykład 12. Programowanie serwera MS SQL 2005 w C#

Programy typu klient serwer. Programowanie w środowisku rozproszonym. Wykład 5.

Jak skonfigurować bezpieczną sieć bezprzewodową w oparciu o serwer RADIUS i urządzenia ZyXEL wspierające standard 802.1x?

Sieci komputerowe Warstwa aplikacji

Plan wykładu. 1. Poczta elektroniczna protokół SMTP, protokół POP, protokół IMAP. 2. Zdalna praca - Telnet. 3. Transfer plików usługa FTP.

Lab5 - Badanie protokołów pocztowych

Pobieranie argumentów wiersza polecenia

Dr Michał Tanaś(

Blok I6 Nowoczesne postaci dokumentów - tworzenie i wymiana dokumentów komputerowych

Stos TCP/IP. Warstwa aplikacji cz.2

Programowanie w Internecie

Dokumentacja SMPP API

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

ZiMSK. Konsola, TELNET, SSH 1

Laboratorium - Poznawanie FTP

OpenPoland.net API Documentation

DOKUMENTACJA TECHNICZNA SMS API MT

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

INSTRUKCJA OBSŁUGI DLA SIECI

Blok I6 Poczta elektroniczna, szyfrowanie i podpis elektroniczny

Adresy IP v.6 IP version 4 IP version 6 byte 0 byte 1 byte 2 byte 3 byte 0 byte 1 byte 2 byte 3

SOAP. Autor: Piotr Sobczak

Technologie internetowe

Architektura aplikacji sieciowych. Architektura klient-serwer

Usługi WWW. dr Zbigniew Lipiński Instytut Matematyki i Informatyki ul. Oleska Opole zlipinski@math.uni.opole.pl

Sieci komputerowe i bazy danych

Instalacja i konfiguracja rouera ASMAX AR 904u. Neostrada, Netia

WayBillsWebService. identyfikator kontrahenta, jeśli wartość zwracana jest mniejsza od zera to numer błędu.

Iteracyjny serwer TCP i aplikacja UDP

ZESZYTY ETI ZESPOŁU SZKÓŁ W TARNOBRZEGU Nr 1 Seria: Teleinformatyka 2012 POCZTA ELEKTRONICZNA PROTOKÓŁ SMTP PRZYKŁADY KOMUNIKACJI

Informacje które należy zebrać przed rozpoczęciem instalacji RelayFax.

Pomoc do programu konfiguracyjnego RFID-CS27-Reader User Guide of setup software RFID-CS27-Reader

Protokół DHCP. Patryk Czarnik. Bezpieczeństwo sieci komputerowych MSUI 2010/11. Wydział Matematyki, Informatyki i Mechaniki Uniwersytet Warszawski

Proxy (pełnomocnik) Cel: Zastosowanie: Dostarczyć zamiennik pewnego obiektu, pozwalający kontrolować dostęp do niego.

Zdalne wywołania procedur. Jarosław Kuchta Programowanie Współbieżne

Aplikacja Sieciowa wątki po stronie klienta

Komunikator internetowy w C#

1. Model klient-serwer

Rodzina protokołów TCP/IP. Aplikacja: ipconfig.

Prosta aplikacja klient - serwer na bazie protokoªu UDP. Sprawozdanie.

Programowanie Komputerów

Komponenty sterowane komunikatami

Instalacja Moodle na serwerze SBS2000/2003. Opiekun pracowni internetowej SBS

Protokół DHCP. DHCP Dynamic Host Configuration Protocol

Konfiguracja połączenia VPN w systemie Windows 7 z serwerem rozgrywki wieloosobowej gry Medal Of Honor: Wojna na Pacyfiku: Pacyfik.

SQL 4 Structured Query Lenguage

Poczta elektroniczna

Dokumentacja API sender sms

11.1 Obsługa błędów i wyjątków Polecenia try, throw, catch CLI C++, klasa Exception... 9

Wstęp. Ale po co? Implementacja

Serwer SSH. Wprowadzenie do serwera SSH Instalacja i konfiguracja Zarządzanie kluczami

Testy penetracyjne Przykłady programów

Protokoły komunikacyjne

Spis treści INTERFEJS (WEBSERVICES) - DOKUMENTACJA TECHNICZNA 1

SMS Kod Automatyczny

Protokół DHCP. DHCP Dynamic Host Configuration Protocol

Wzorce dystrybucji i wspólbieżności autonomicznej

Laboratorium 10 - Web Services

DOKUMENTACJA IMPLEMENTACJI MECHANIZMÓW OBSŁUGI AHMES SMS (soap)

Programowanie telefonów z Windows Phone 7, cz. 4

Laboratorium 3.4.3: Usługi i protokoły

Zmiany techniczne wprowadzone w wersji Comarch ERP Altum

Systemy internetowe. Wykład 5 Architektura WWW. West Pomeranian University of Technology, Szczecin; Faculty of Computer Science

Programowanie w języku Java

OSI Transport Layer. Network Fundamentals Chapter 4. Version Cisco Systems, Inc. All rights reserved. Cisco Public 1

Urzędowa Poczta Elektroniczna (UPE)

Bazy danych i usługi sieciowe

ESDI. WebService. Wersja 1.2. Strona 1

MVC w praktyce tworzymy system artykułów. cz. 1

MODEL WARSTWOWY PROTOKOŁY TCP/IP

DR INŻ. ROBERT WÓJCIK DR INŻ. JERZY DOMŻAŁ

Java programowanie w sieci. java.net RMI

Wykład 4. Metody uwierzytelniania - Bezpieczeństwo (3) wg The Java EE 5 Tutorial Autor: Zofia Kruczkiewicz

Kurs programowania. Wykład 9. Wojciech Macyna

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Qt in Education. Sieć I drukowanie

Wdrożenie modułu płatności eservice. dla systemu Zen Cart

Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton

Bazy Danych i Usługi Sieciowe

API transakcyjne BitMarket.pl

Plan wykładu. 1. Protokół FTP. 2. Protokół HTTP, usługi www, model request-response (żądanie-odpowiedź), przekazywanie argumentów, AJAX.

Politechnika Poznańska Wydział Budowy Maszyn i Zarządzania

Transkrypt:

Odbieranie wiadomości elektronicznych. Aplikacja KlientPop dr Zbigniew Lipiński Instytut Matematyki i Informatyki UO ul. Oleska 48, 50-204 Opole zlipinski@math.uni.opole.pl

Protokół POP3 POP3, (ang.) Post Office Protocol version 3. RFC 1939,J. Myers, M. Rose, Post Office Protocol - Version 3, May 1996, Obsoletes RFC 1725, Updated-By RFC 1957, RFC 2449 RFC 1957, R. Nelson, Some Observations on Implementations of the Post Office Protocol (POP3), June 1996, Updates RFC 1939, Status: INFO. RFC 2449, R. Gellens, C. Newman, L. Lundblade, POP3 Extension Mechanism, November 1998, Updates RFC 1939, Updated-By RFC 5034. Protokół służący do odbierania wiadomości email ze skrzynek pocztowych (ang. mailboxes) znajdujących się na serwerach POP3. W warstwie transportowej serwery POP3 wykorzystuje protokół TCP, port 110. Komunikaty POP mają strukturę wiadomości tekstowej w formacie 'Internet text messages, RFC 5322. RFC 5322, P. Resnick, Internet Message Format, 2008, Obsoletes RFC 2822, Status: DRAFT STANDARD 2

Obiór wiadomości z serwera POP3 Klient POP3 może połączyć sie z serwerem i pobrać wszystkie wiadomości z katalogu Inbox serwera. Sesja między klientem a serwerem POP podzielona jest na stany: stan uwierzytelnienia i autoryzacji (AUTHORIZATION state), stan transakcji (TRANSACTION state), stan uaktualniania (UPDATE state). 3

Obiór wiadomości z serwera POP3 Po nawiązaniu połączenia TCP klienta z serwerem POP3, następuje rozpoczęcie sesji POP. Proces odbioru poczty z serwera POP: nawiązanie połączenia klienta z serwerem (budowa połączenia TCP), serwer wysyła sygnał gotowości (wiadomość 'greeting ), identyfikacja klienta na serwerze (uwierzytelnienie), przyznanie praw dostępu (autoryzacja), pytanie o liczbę wiadomości do odbioru (stan transakcji), wyznaczenie wielkości każdej wiadomości do odbioru (stan transakcji), odbiór wiadomości (stan transakcji), uaktualnianie stanu konta pocztowego po otrzymaniu komendy QUIT od klienta (stan aktualniania), zamknięcie sesji przez serwer wiadomością 'goodbye', (stan uaktualniania). 4

Przykład sesji POP3 S: <wait for connection on TCP port 110>... C: <open connection> S: +OK POP3 server ready <1896.697170952@dbc.mtview.ca.us> C: APOP mrose c4c9334bac560ecc979e58001b3e22fb S: +OK mrose's maildrop has 2 messages (320 octets) C: STAT S: +OK 2 320 C: LIST S: +OK 2 messages (320 octets) S: 1 120 S: 2 200 S:. C: RETR 1 S: +OK 120 octets S: <the POP3 server sends message 1> S:. C: DELE 1 S: +OK message 1 deleted C: RETR 2 S: +OK 200 octets S: <the POP3 server sends message 2> S:. C: DELE 2 S: +OK message 2 deleted C: QUIT S: +OK deley POP3 server signing off (maildrop empty) C: <close connection> S: <wait for next connection> 5

Komendy klienta POP3 stan uwierzytelnienia Komendy klienta POP3 w stanie uwierzytelnienia: USER name - nazwa użytkownika. PASS password - hasło użytkownika (string). QUIT - koniec sesji, brak argumentów. Stan uwierzytelnienia sesji POP zaczyna się gdy serwer potwierdzi gotowość odbioru wiadomości: S: +OK POP3 server ready W stanie uwierzytelnienia sesji klient wysyła do serwera nazwę skrzynki i hasło. Przykład: Użycie komendy USER. C: USER frated S: -ERR sorry, no mailbox for frated here Przykład: Użycie komendy USER i PASS. C: USER mrose S: +OK mrose is a real hoopy frood C: PASS secret S: +OK mrose's maildrop has 2 messages (320 octets) Przykład: Użycie komendy PASS. C: PASS secret S: -ERR maildrop already locked 6

Komendy klienta POP3 stan uwierzytelnienia Przed przejściem do stanu transakcji serwer POP blokuje skrzynkę do wyłącznego użycia przez klienta POP w otwartej sesji. Do momentu przejścia do stanu uaktualniania nie jest możliwa modyfikacja lub usunięcie wiadomości ze skrzynki. Po potwierdzeniu przez serwer blokady skrzynki komenda +OK, sesja przechodzi w stan transakcji. 7

Komendy klienta POP3 stan transakcji Komendy klienta POP w stanie transakcji: STAT Pytanie o widomości, brak argumentów. Składania: STAT Odpowiedź: +OK liczbamaili wielkoscmaili LIST RETR DELE NOOP Pytanie o wszystkie wiadomości lub wiadomości o określonym numerze maila (message-id). Składania: LIST [message-id] Odpowiedź: +OK liczbamaili wielkoscmaili +OK kolejnynumermaila wielkoscmailia Polecenie wysłania wiadomości o danym identyfikatorze (id). Składania: RETR message-id Odpowiedź: +OK wielkoscmailia, przesyłane są kolejno pakiety z danymi. Polecenie usunięcia wiadomości, serwer zaznacza wiadomość jako: 'do usunięcia'. Usunięcie następuje w stanie uaktualniania. Składania: DELE message-id Odpowiedź: +OK message deleted lub -ERR no such message Oznacza brak działania serwera, brak argumentów. Po tej komendzie serwer POP3 zwraca komunikat: +OK. Składania: NOOP Odpowiedź: +OK RSET Brak argumentów, serwer usuwa status wiadomości 'do usunięcia', ostatnia wiadomość uzyskuje numer 0. Składania: RSET Odpowiedz: +OK liczbawiadomosci. LAST Brak argumentów, serwer zwraca numer ostatniej wiadomości. Składania: LAST Odpowiedz: +OK nn 8

Komendy klienta POP3 stan uaktualniania Komendy klienta POP w stanie uaktualniania: QUIT serwer usuwa odebrane wiadomości przez klienta. Składania: QUIT Odpowiedz: +OK 9

Opcjonalne komendy klienta POP3 Komendy opcjonalne w stanie uwierzytelnienia: APOP uwierzytelnienie bez wysyłania hasła, serwer przy powitaniu wysyła znacznik czasu (timestamp), np. <process-id.clock@nazwa_serwerapop>, klient POP wysyła user_id i liczbę 'digest wyliczoną ze znacznika czasu algorytmem MD5). Składania: C: APOP nazwaskrzynki digest Odpowiedź: S: +OK maildrop locked and ready lub -ERR permission denied Komendy opcjonalne w stanie transakcji: TOP serwer zwraca nagłówek wiadomości i liczbę linii wiadomości. Składania: TOP message-id n Odpowiedź: +OK, kolejne wiadomości zawierają: nagłówek, pusta linia, n linii wiadomości, lub -ERR UIDL Komenda 'unique-id listing'. Serwer zwraca identyfikatory wszystkich wiadomości lub identyfikator wiadomości o danym numerze msg. Identyfikator wiadomości to max. 70 bajtowy string (z zakresu 0x21-0x7E) nadawany przez serwer POP3 każdej wiadomości. Po komendzie UIDL wiadomości zaznaczone jako usunięte nie są zawracane przez serwer. Składania: UIDL [msg] Odpowiedź: +OK [numerwiadmosci] identyfikatory 10

Opcjonalne komendy klienta POP3 Przykład: Użycie komendy APOP. S: +OK POP3 server ready <1896.697170952@dbc.mtview.ca.us> C: APOP mrose c4c9334bac560ecc979e58001b3e22fb S: +OK maildrop has 1 message (369 octets) Przykład: Użycie komendy UIDL. C: UIDL S: +OK S: 1 whqtswo00wbw418f9t5jxywz S: 2 QhdPYR:00WBw1Ph7x7 S:.... C: UIDL 2 S: +OK 2 QhdPYR:00WBw1Ph7x7... C: UIDL 3 S: -ERR no such message, only 2 messages in maildrop 11

Rozszerzania Protokołu POP3. RFC 2449. RFC 2449 definiują rozszerzania protokołu POP3 o mechanizmy zarządzania serwerem POP. Wprowadzono nowe polecenia: SASL, RESP-CODES, LOGIN-DELAY, PIPELINING, EXPIRE, IMPLEMENTATION. SASL - Simple Authentication and Security Layer. Lista 'możliwości' serwera - capabilities list zwracana jest po komendzie CAPA. Komenda CAPA może być stosowana w stanie uwierzytelnienia i w stanie transakcji. Składania: CAPA Początkowa lista parametrów (Initial Set of Capabilities): TOP polecenie TOP jest obsługiwane przez serwer. USER polecenia USER, PASS są obsługiwane przez serwer. SASL mechanizm identyfikacji SASL jest obsługiwany. RESP-CODES informacja, że tekst odpowiedzi w nawiasach [..] jest rozszerzeniem kodu odpowiedzi., LOGIN-DELAY określa min. czas (w sekundach) między logowaniami. PIPELINING serwer akceptuje przesłanie listy komend, zamiast trybu: polecenie-odpowiedź. EXPIRE serwer informuje klienta jak długo wiadomość będzie przechowywana na serwerze. UIDL polecenie UIDL jest obsługiwane przez serwer. IMPLEMENTATION serwer zwraca informacje o implementacji. 12

Przykład listy parametrów Przykład listy parametrów zwracanych przez serwer POP: C: CAPA S: +OK Capability list follows S: TOP S: USER S: SASL CRAM-MD5 KERBEROS_V4 S: RESP-CODES S: LOGIN-DELAY 900 S: PIPELINING S: EXPIRE 60 S: UIDL S: IMPLEMENTATION Shlemazle-Plotz-v302 S:. 13

Klient POP Namespace: Microsoft.Crm.Tools.Email.Providers Assembly: Microsoft.Crm.Tools.EmailProviders.dll E-mail Provider Object Model E-mail Provider Base Classes // Provides an overview of the e-mail provider base classes. Service Logging Classes Configuration Classes // Provides an overview of the classes used to log errors. // Provides an overview of the classes used to read information from E-mail Router configuration file. 14

E-mail Provider Base Classes 15

Klient POP Microsoft.Crm.Tools.Email.Providers Classes (wybór) EmailMessage EmailProvider //Represents an e-mail message. //Provides a base class for all providers. ExchangeEmailMessage //Represents an Exchange e-mail message. MimeEmailMessage Pop3Client Pop3EmailMessage //Represents an e-mail message in MIME format. //Provides the protocol for communications with a POP3 e-mail server. //Represents a POP3 e-mail message. 16

Pop3Client class Constructors Pop3Client // Initializes a new instance of the Pop3Client class. public Pop3Client(IPAddress pop3address, int connectiontimeout); public Pop3Client(string pop3server, int connectiontimeout); public Pop3Client(IPAddress pop3address, int pop3port, int connectiontimeout); public Pop3Client(string pop3server, int pop3port, int connectiontimeout); Static method CertificateValidationCallback // Validates a server certificate. public static bool CertificateValidationCallback( Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslpolicyerrors ); 17

Pop3Client class Instance methods AuthenticateClearText AuthenticateNtlm Connect //Authenticates to the POP3 server using clear text. //Authenticates to the POP3 server using NTLM. //Connects to the POP3 server. public void Connect( bool usessl); DeleteMessage // Deletes a message. public void DeleteMessage( int messagepos); Disconnect Dispose DownloadHeaders DownloadMessage // Disconnects from the POP3 server. // Disposes the Pop3Client object instance. // Downloads message headers. // Downloads the entire message (body and header). public string DownloadMessage(int messagepos); RetrieveMessageCount // Retrieves the message count. public int RetrieveMessageCount(); 18

Pop3Client class Instance Property ConnectionState // Gets the connection state. public ConnectionState ConnectionState get; Disconnected 0, Authorization 1,Transaction 2, Update 3 Pop3Port Pop3Server WelcomeBanner // Gets the POP3 server port. // Gets the POP3 server name. // Gets the POP3 server welcome banner. 19

IPAddress Class Public property (wybór) AddressFamily IsIPv4MappedToIPv6 IsIPv6Multicast IsIPv6SiteLocal ScopeId //Gets the address family of the IP address. //Gets whether the IP address is an IPv4-mapped IPv6 address. //Gets whether the address is an IPv6 multicast global address. //Gets whether the address is an IPv6 site local address. //Gets or sets the IPv6 address scope identifier. Public methods (wybór) GetAddressBytes GetHashCode GetType GetAddressBytes MapToIPv4 ToString //Provides a copy of the IPAddress as an array of bytes. //Returns a hash value for an IP address. //Gets the Type of the current instance. //Provides a copy of the IPAddress as an array of bytes. //Maps the IPAddress object to an IPv4 address. //Converts an Internet address to its standard notation. Public methodstatic (wybór) HostToNetworkOrder(Int32) //Converts an integer value from host byte order to network byte order. NetworkToHostOrder(Int32) //Converts an integer value from network byte order to host byte order. IsLoopback //Indicates whether the specified IP address is the loopback address. Parse //Converts an IP address string to an IPAddress instance. TryParse //Determines whether a string is a valid IP address. MapToIPv4 //Maps the IPAddress object to an IPv4 address. 20

Klient POP using System; using System.Collections; using System.IO; using System.Net; using System.Net.Sockets; using System.Threading; using System.Text; using System.Text.RegularExpressions; using System.Diagnostics; namespace Pop3 public class Pop3Client private Pop3Credential m_credential; private const int m_pop3port = 110; private const int MAX_BUFFER_READ_SIZE = 256; private long m_inboxposition = 0; private long m_directposition = -1; private Socket m_socket = null; private Pop3Message m_pop3message = null; 21

public Pop3Credential UserDetails set m_credential = value; get return m_credential; public string From get return m_pop3message.from; public string To get return m_pop3message.to; public string Subject get return m_pop3message.subject; public string Body get return m_pop3message.body; public IEnumerator MultipartEnumerator get return m_pop3message.multipartenumerator; public bool IsMultipart get return m_pop3message.ismultipart; public Pop3Client(string user, string pass, string server) m_credential = new Pop3Credential(user,pass,server); 22

Klient POP private Socket GetClientSocket() Socket s = null; try IPHostEntry hostentry = null; // Get host related information. hostentry = Dns.Resolve(m_credential.Server); foreach(ipaddress address in hostentry.addresslist) IPEndPoint ipe = new IPEndPoint(address, m_pop3port); Socket tempsocket = new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp); tempsocket.connect(ipe); if(tempsocket.connected) // we have a connection return this socket s = tempsocket; break; else continue; 23

Klient POP catch(exception e) throw new Pop3ConnectException(e.ToString()); // throw exception if can't connect... if(s == null) throw new Pop3ConnectException("Error : connecting to " +m_credential.server); return s; 24

Klient POP //send the data to server private void Send(String data) if(m_socket == null) throw new Pop3MessageException("Pop3 connection is closed"); try // Convert the string data to byte data // using ASCII encoding. byte[] bytedata = Encoding.ASCII.GetBytes(data+"\r\n"); // Begin sending the data to the remote device. m_socket.send(bytedata); catch(exception e) throw new Pop3SendException(e.ToString()); 25

Klient POP private string GetPop3String() if(m_socket == null) throw new Pop3MessageException("Connection to POP3 server is closed"); byte[] buffer = new byte[max_buffer_read_size]; string line = null; try int bytecount = m_socket.receive(buffer,buffer.length,0); line = Encoding.ASCII.GetString(buffer, 0, bytecount); catch(exception e) throw new Pop3ReceiveException(e.ToString()); return line; 26

Klient POP private void LoginToInbox() string returned; // send username... Send("user "+m_credential.user); // get response... returned = GetPop3String(); if(!returned.substring(0,3).equals("+ok") ) throw new Pop3LoginException("login not excepted"); // send password... Send("pass "+m_credential.pass); // get response... returned = GetPop3String(); if(!returned.substring(0,3).equals("+ok") ) throw new Pop3LoginException("login/password not accepted"); 27

Klient POP public long MessageCount get long count = 0; if(m_socket==null) throw new Pop3MessageException("Pop3 server not connected"); Send("stat"); string returned = GetPop3String(); // if values returned... if( Regex.Match(returned, @"^.*\+OK[ ]+([0-9]+)[ ]+.*$").Success ) // get number of emails... count = long.parse( Regex.Replace(returned.Replace("\r\n",""), @"^.*\+OK[ ]+([0-9]+)[ ]+.*$","$1") ); return(count); 28

Klient POP public void CloseConnection() Send("quit"); m_socket = null; m_pop3message = null; public bool DeleteEmail() bool ret = false; Send("dele "+m_inboxposition); string returned = GetPop3String(); if( Regex.Match(returned, @"^.*\+OK.*$").Success ) return ret; ret = true; 29

public bool NextEmail(long directposition) bool ret; if( directposition >= 0 ) m_directposition = directposition; ret = NextEmail(); else throw new Pop3MessageException("Position less than zero"); return ret; public bool NextEmail() string returned; long pos; if(m_directposition == -1) if(m_inboxposition == 0) pos = 1; else pos = m_inboxposition + 1; else pos = m_directposition+1; m_directposition = -1; 30

Klient POP // send username... Send("list "+pos.tostring()); // get response... returned = GetPop3String(); // if email does not exist at this position // then return false... if( returned.substring(0,4).equals("-err") ) return false; m_inboxposition = pos; // strip out CRLF... string[] nocr = returned.split(new char[] '\r' ); // get size... string[] elements = nocr[0].split(new char[] ' ' ); long size = long.parse(elements[2]); //... else read email data m_pop3message = new Pop3Message(m_inboxPosition,size,m_socket); return true; 31

Klient POP public void OpenInbox() // get a socket... m_socket = GetClientSocket(); // get initial header from POP3 server... string header = GetPop3String(); if(!header.substring(0,3).equals("+ok") ) throw new Exception("Invalid initial POP3 response"); // send login details... LoginToInbox(); 32

33