Curechi Adrian SI-111.docx

42
MINISTERUL EDUCAȚIEI al REPUBLICII MOLDOVA UNIVERSITATEA TEHNICĂ a MOLDOVEI FACULTATEA CALCULATOARE, INFORMATICĂ și MICROELECTRONICĂ CATEDRA AUTOMATICĂ și TEHNOLOGII INFORMAȚIONALE Proiect de curs Disciplina: APPOO Tema: Elaborarea și proiectarea unui Mail Client

Transcript of Curechi Adrian SI-111.docx

Curechi Adrian SI-111

MINISTERUL EDUCAIEI al REPUBLICII MOLDOVAUNIVERSITATEA TEHNIC a MOLDOVEIFACULTATEA CALCULATOARE, INFORMATIC i MICROELECTRONICCATEDRA AUTOMATIC i TEHNOLOGII INFORMAIONALE

Proiect de curs

Disciplina: APPOO

Tema: Elaborarea i proiectarea unui Mail Client

A efectuat: st. gr. SI-111 Curechi AdrianA verificat: lect.sup. Postaru A.

Chiinu 2014CuprinsIntroducere.31.Sarcina tehnic a sistemului42.Elaborarea diagramelor UML52.1.Elaborarea diagramelor cazurilor de utilizare52.2.Elaborarea diagramelor de clas82.3.Elaborarea diagramelor de secven92.4.Elaborarea diagramelor de activiti122.5.Elaborarea diagramelor de stri132.6.Elaborarea diagramelor de componente143.Interfaa sistemului15Concluzie18Bibliografie19Anexa A SMTPClient.cs20Anexa B IMAPClient.cs22Anexa C Tools.cs26Anexa D Form1.cs29

Introducere.Programarea orientat pe obiecte (OOP Object Oriented Programming) este tehnica cea mai utilizat ncepnd cu nceputul anilor 90, cnd paradigmele sale principale au fost adoptate i dezvoltate i de cele mai utilizate limbaje ale perioadei respective: C++, Pascal, Basic, Ada, Java, etc. Conceptele de baz ale OOP au fost totui dezvoltate nc din anii 60, odat cu proiectarea limbajului Simula67.Programarea orientat pe obiect (Programare Orientat Obiectual) este unul din cei mai importani pai fcui n evoluia limbajelor de programare spre o mai puternic abstractizare n implementarea programelor. Ea a aprut din necesitatea exprimrii problemei ntr-un mod mai natural fiinei umane. Astfel unitile care alctuiesc un program se apropie mai mult de modul nostru de a gndi dect modul de lucru al calculatorului. Pn la apariia programrii orientate pe obiect programele erau implementate n limbaje de programare procedurale (C, Pascal) sau n limbaje care nici mcar nu ofereau o modalitate de grupare a instruciunilor n uniti logice (funcii, proceduri) cum este cazul limbajului de asamblare (assembler). Altfel spus o problem preluat din natur trebuia fragmentat n repetate rnduri astfel nct s se identifice elementele distincte, implementabile ntr-un limbaj de programare. O mare problem a programrii procedurale era separarea datelor de unitile care prelucrau datele (subrutinele), ceea ce fcea foarte dificil extinderea i ntreinerea unui program. Astfel s-a pus problema ca aceste dou entiti (date i subrutine) s fie grupate ntr-un anumit mod, astfel nct subrutinele s "tie" n permanen ce date prelucreaz i, mai mult dect att, ele s formeze un modul, adic o unitate care separ implementarea de interfa, ceea ce implic posibilitatea refolosirii codului. Conceptele de baz ale programrii orientate pe obiecte: obiectul: o instanta a unei clase; abstractizarea: Este posibilitatea ca un program s ignore unele aspecte ale informaiei pe care o manipuleaz, adic posibilitatea de a se concentra asupra esenialului. Este procesul prin care se identific i se rein numai caracteristicile eseniale ale realitii modelate. Cel mai des, abstractizarea este ntlnit atunci cnd obiectele cu aceleai atribute i acelai comportament sunt grupate n tipuri abstracte numite clase. Clasele sunt reprezentri (modele) abstracte, conceptuale ale unor entiti; clasa: descriere a unei multitudini de obiecte cu aceleasi atribute si metode; ncapsularea (ascunderea de informaii); motenirea: extinderea unei clase ; polimorfismul: Este abilitatea de a procesa obiectele n mod diferit, n funcie de tipul sau de clasa lor. Mai exact, este abilitatea de a redefini metode pentru clasele derivate. persistena: descrie durata de via a unui obiect n raport cu aplicaia ce l-a creat.1. Sarcina tehnic a sistemuluiAplicaia va fi implementat folosing platforma .Net, i anume limbajul C#. Pentru transmiterea email-urilor se va crea o clas SMTP Client, n aceast clas se va face o conexiune, folosind protocolul TCP(prin intermediul clasei TcpClient), la server, i folosind comenzile protocolului SMTP, se va crea i se va transmite un email nou. Pentru extragerea email-urilor de pe server se va folosi protocolul IMAP, de asemeni se va crea o clas de genul IMAP Client, care tot se va conecta la server folosind protocolul TCP. Toate conexiunile dintre aplicaie i server vor fi securizate, folosind protocolul SSL, pentru aceasta se va folosi clasa SslStream, care primind stream-ul conexiunii TCP, l nlocuiete cu unul securizat.Interfaa aplicaiei va fi fcut folosind Windows Forms. La pornirea aplicaiei, va fi o fereastr, n care se va cere utilizatorului s se introduc setarile serverului(host-ul serverului i port-ul acestuia), i credenialele(email-ul i password-ul). Dup introducerea tuturor datelor, utiliatorului i se va afia lista tuturor email-urilor. Apsnd pe subiectul unui email, se va deschide coninutul acestuia(coninutul email-ului se va afia ori ntr-o fereastr nou, ori ntr-un tab nou, ori n acceai fereastr dar cu apariia unui buton pentru nchiderea email-ului si ntoarcerea la lista email-urilor). Forma pentru trimiterea unui email nou va ntr-un alt tab, sau pe fereastra princial va fi un buton, care va deschide o fereast nou cu aceast form.Programul va fi format din 2 proiecte:1. Un proiect de clase, n care vor fi clasele SMTP Client, IMAP Client, i alte clase auxiliare.2. Un proiect Windows Forms, care va conine interfaa aplicaiei, i totul ce rivete interaciunea cu utilizatorul. Acest proiect va folosi clasele din primul proiect.

2. Elaborarea diagramelor UMLElaborarea diagramelor UML au ca scop reprezentarea sistemulu ntr-o form att neleas de utilziatori ct i de developeri, din toate aspectele , att funcional ct i structural. Diagramele le-am elaborat cu ajutorul instrumentului Enterprise Architect.2.1. Elaborarea diagramelor cazurilor de utilizare

Figura 1. Diagrama caz de utilizare pentru configurareAplicaia Mail Client nu va fi valabila doar pentru un animit serviciu email, ci pentru oricare serviciu dorete utilizatorul s foloseasc. Pentru aceasta, la pornirea aplicaiei, utilizatorului i se va cere sa introduc setrile necesare pentru conectarea la serverul potei electronice, aa cum este artat n fig.1. Pentru a se conecta la serverul serviciului email, utilizatorul trebuie s introduc host-ul seriviului IMAP i portul acestui serviciu, date ca vor fi folosite la extragerea email-urilor de pe server. De asemeni utilizatorul trebuie s introduc si host-ul serviciul SMTP i portul pentru acest serviuciu, pentru a putea transmite email-uri din aplicaie.Utilizatorul, pe lng introducerea setrilor necesare, trebuie s introduc i credenialele sale (email-ul i parola), pentru a putea folosi protocoale IMAP i SMTP, acest lucru este reprezentat n diagrama cazurilor de utilizare din fig.2.

Figura 2. Diagrama caz de utilizare pentru autentificare

Figura 3. Diagrama caz de utilizare pentru vizualizare email-urilorn fig.3 sunt reprezentate cazurile de utilizare, ce arata modul de vizualizare a listei email-urilor. Majoritatea serviciilor email, ofer posibilitatea de a mpri email-urile n mape, ncepnd cu cele standarte (Inbox, Draft, Sent, Trash etc.) i terminnd cu mape definite de utilizator. Aplicaia va permite vizualizarea listei mapelor, i ncrcarea email-urilor din mapa selectat de utilizator. Lista de email-uri va oferi aa informaii ca: subiectul email-ului, email-ul surs i email-ul destinaie(important n cazul n care se face redirecionare de pe o alt csu potal).

Figura 4. Diagrama caz de utilizare pentru aciuni asupra email-uluiDin lista cu email-uri, utilizatorul poate executa careva manipulaii cu email-ul, acestea sunt artate n fig.4. n dreptul ficrui email din list va fi cte un buton Delete, care va permite stergerea email-ului respectiv. Apsnd pe subiectul email-ului va fi afiat coninutul email-ului.Pentru a trimite o scrisoare, utilizatorul trebuie s introduc elementele principale: subiectul email-ului, coninutul acestuia i adresa destinatarului. Far unul din aceste elemente trimiterea email-ului nu va fi posibil (butonul de trimitere, nu va funciona). Cazurile de utilizare pentru acestea sunt reprezentate n fig.5.

Figura 5. Diagrama caz de utilizare pentru trimiterea unui email2.2. Elaborarea diagramelor de clas

Figura 6. Diagrama de claseAm creat doar o singur diagram de clase, deoarece proiectul nu conine multe clase, acestea sunt reprezentate de diagrama din fig.6. Clasa de baz a proiectului este MyMailClient, aceasta conine cte un obiect al claselor SMTPClient i IMAPCLient, i o colecie de obiecte de tip MyMail. De asemeni clasa MyMailClient conine i elemente de interfa a aplicaiei, care nu au fost introducse n diagrama de clase, deoarece nu joaca rol n funcionarea logic a aplicaiei.Clasa MyMail nu are metode, ci doar atribute. Aceast clas se folosete pentru stocarea datelor email-ului(subjet, body, from, to).Clasa Tools conine doar metode, ea este format dintr-o colecie funcii(codificatoare, decodificatoare, parsere) folosite de alte clase.Clasa SMTPClient este folosit pentru transmiterea email-urilor. Aceasta are doar 2 metode funcionale: conectarea la server, si transmiterea email-ului.Clasa IMAPClient ofer posibilitatea de extragere a email-urilor dintr-o map anumit. Printre funcionalitile acesteia sunt: conecatarea la server; extragerea listei de mape n csua potal; selectarea unei mape; extragerea email-urilor din mapa selectat; tergerea unui email.2.3. Elaborarea diagramelor de secven

Figura 7. Diagrama de secven pentru autentificaren fig.7 este reprezentat modul de autentificare a utilizatorului. La pornirea aplicaiei utilizatorului i se cere s introduc datele necesare pentru funcionarea acesteia, acestea sunt: adresa serverului IMAP i portul respectiv; adresa serverului SMTP i portul respectiv; login-ul i parola utilizatorului.

Figura 8. Diagrama de secven pentru afiarea email-urilorFig.8 arat cum are loc afiarea listei email-urilor. Dup autentificare, aplicaia prin intermediul clasei IMAPClient se conecteaz la server, cere lista de mape i o fieaz utilizatorului. Predefinit la pornirea aplicaiei, se selecteaz prima map din list i se extrag email-urile din acea map. Dup asta utilizatoarul poate selecta alt map, i se vor extrage email-urile deja din mapa nou aleas.Utilizatorul are posibilitatea de a terge un email, modul de tergere este reprezentat de diagrama de secven din fig.9. Dup autentificare i afiarea listei email-urilor, utilizatorul poate terge email-ul prin apsarea butonului Delete. Dup apsarea butonului, prin intermediul clasei IMAPClient, se transmite la server un mesaj pentru marcarea email-ului pentru tergere, dup care se transmite alt mesaj, pentru tergerea tuturor mesajelor marcate pentru tergere.

Figura 9. Diagrama de secven pentru stergerea unui email

Figura 10. Diagrama de secven pentru trimiterea unui emailPentru a trimite un email, utilizatorul trebuie s introduc subiectul email-ului, textul email-ului i adresa destinatarului. Dup introducerea tuturor datelor, trebuie s apese butonul Send, dac nu au fost introduse toate datele, butonul nu v-a funciona. La apsarea butonului, prin intermediul SMTPClient, se face o conexiune la server, se ncarc toate datele n SMTPClient, i se transmit la server conform protocolului. n caz c email-ul a fost transmis cu succes, utilizatorului i se va afia un mesaj despre acesta. Aceasta este reprezentat n diagrama de secven din fig.10.2.4. Elaborarea diagramelor de activiti

Figura 11. Diagrama de activitate pentru vizualizarea unui emailPentru a putea vizualiza coninutul unui email utilizatorul trebuie s execute un set de aciuni, pentru a arta aceste aciuni, am elaborat diagrama de activiti, care este prezentat de fig.11. ncepnd cu desciderea aplicaiei, utilizatorul trebuie s se auntentifice, s selecteze mapa n care se afl email-ul dorit, s-l selecteze din list, dup care poate s vizualize coninutul acestuia.Transmiterea unui email, de asemeni, necesit un set de activiti executate de utilizator. Dup deschiderea aplicaiei i logare, acesta trebuie s introduc datele email-ului, nu neaprat ntr-o ordine aumit, dar obligatoriu pe toate. Activitile date sunt reprezentate de diagrama de activiti din fig.12.

Figura 12. Diagrama de activitate pentru trimiterea unui email2.5. Elaborarea diagramelor de stri

Figura 13. Diagrama de stari: stergerea unui emailn cadrul execuiei, sistemul trece prin mai multe stri. Fig.13 arat strile prin care trece sitemul n timpul stergerii unui email. Dup pornirea aplicaiei, se ateapt ca utilizatorul s introduc datele de autentificare, dup aceasta se conecteaz la server i se afl n starea respectiv. Dup ce ncarc lista mapelor, sistemul ateapt ca utilizatorul s selecteze mapa dorit. Cnd email-urile sunt afiate, sistemul se afl n ateptarea selectarii email-ului de ctre utilizator. La selectarea email-ului se trimite comanda la server, pentru a-l terge. Dup ce email-ul a fost ters, sistemul se ntoarce la starea cnd este afiat lista cu email-uri, i ateapt ori selectarea altui email, ori nchiderea aplicaiei.2.6. Elaborarea diagramelor de componente

Figura 14. Diagrama de componente a sistemuluiDiagrama de componente reprezentat n fig.14 arat cum este organizat sistemul. Sistemul este format din 2 proiecte: AppInterface: interfaa aplicaiei i toate componentele de interaciune cu utilizatorul; AppCore: clasele ce cuprind logica sistemului IMAPClient; SMTPClient; MyMail; Tools.3. Interfaa sistemului

Figura 15. Pagina de star a aplicaiei

Figura 16. Tab-ul cu lista email-urilor dintr-o map

Firgura 17. Tab-ul cu coninutul unui email

Figura 18. Tab-ul cu lista mapelor

Figura 19. Tab-ul n care se scrie un email nou

ConcluzieParadigma programarii orientate pe obiecte ne da posibilitatea sa divizam sistemul complex in mai multe module, independente la nivel de implementare, care interactioneaza si creaza un tot intreg. POO ne ofera mai multe nivele de abstractizare si astfel la fiecare din aceste nivele ne vom conentra atentia asupra principalului si nu a supra detaliilor, deoarece acestea vor fi ascunse de la un nivel la alt nivel de abstractizare. Mostenirea, polimorfismul si incapsularea ne ofera posibilitatea de elaborare a softurilor intr-o maniera bine structurata din punc de vedere a logicii. POO deasemenea ne pune la dispozitie o depanare mai usoara a modulelor si depistarea mai rapida a erorilor ce pot aparea la etapa de dezvoltare.Efectund acest proiect de an, am realizat diagramele caz de utilizare pentru a modela sistemul propus, Mail Client. Cu ajutorul diagramelor caz de utilizare am specificat aciunile pe care le poate executa utilizatorul asupra unui email, sau aciunile care trebuie numaidect executate. Pentru a reprezenta destinaia funcional a sistemului am elaborat diagrama cazurilor de utilizare, iar pentru a reprezenta interaciunea n timp i spaiu dintre obiectele ce particip la formarea sistemului, am elaborat diagrama de interaciune compus din diagrame de secvena. n cazul n care am descris structura intern a sistemului, am realizat diagrama claselor. Diagrama de stare am realizat-o cu scopul de a evidenia comportamentul obectelor pe parcursul ciclurilor sale de viaa, specificnd strile n care obiectele pot trece i tranziiile respective dintre aceste stri. Am reprezentat arhitectura sistemului prin deretminarea dependenelor dintre componente.In viziunea mea, limbajul UML ofera o descriere la nivel logic, conceptual si fizic a sistemului elaborat, ceea ce prmite o percepere mai clara a structurii si functionalitatilor sistemului.

Bibliografie1. MSDN-the microsoft developer network [Resurs electronic] - http://msdn.microsoft.com 2. INTERNET MESSAGE ACCESS PROTOCOL - VERSION 4rev1 [Resurs electronic] - https://tools.ietf.org/html/rfc3501 3. Simple Mail Transfer Protocol [Resurs electronic] - https://tools.ietf.org/html/rfc53214. STANDARD FOR THE FORMAT OF ARPA INTERNET TEXT MESSAGES [Resurs electronic] - https://tools.ietf.org/html/rfc8225. UML 2 Tutorial [Resurs electronic] - http://www.sparxsystems.com.au/resources/uml2_tutorial/

Anexa A SMTPClient.csusing System;using System.IO;using System.Net.Security;using System.Text;

namespace AppooProjectClasses{ public class SMTPClient : System.Net.Sockets.TcpClient { private SslStream sslStream; private StreamWriter writer; private StreamReader reader;

public String Email { get; set; } public String Password { get; set; } public String EmailTo { get; set; } public String Subject { get; set; } public String Body { get; set; } public String Host { get; set; } public Int32 Port { get; set; }

public SMTPClient() { }

public void Connect() { Connect(Host, Port); sslStream = new SslStream(GetStream()); sslStream.AuthenticateAsClient(Host); writer = new StreamWriter(sslStream); reader = new StreamReader(sslStream); String response = reader.ReadLine(); if (response.Substring(0, 3) != "220") { throw new Exception(response); } }

public void Send() { String response; writer.WriteLine("helo"); writer.Flush(); response = reader.ReadLine(); if (response.Substring(0, 3) != "250") { throw new Exception(response); }

writer.WriteLine("auth login"); writer.Flush(); response = reader.ReadLine(); if (response.Substring(0, 3) != "334") { throw new Exception(response); }

String base64Email = Tools.ToBase64(Email); writer.WriteLine(base64Email); writer.Flush(); response = reader.ReadLine(); if (response.Substring(0, 3) != "334") { throw new Exception(response); }

String base64Password = Tools.ToBase64(Password); writer.WriteLine(base64Password); writer.Flush(); response = reader.ReadLine(); if (response.Substring(0, 3) != "235") { throw new Exception(response); }

writer.WriteLine("mail from:"); writer.Flush(); response = reader.ReadLine(); if (response.Substring(0, 3) != "250") { throw new Exception(response); }

writer.WriteLine("rcpt to:"); writer.Flush(); response = reader.ReadLine(); if (response.Substring(0, 3) != "250") { throw new Exception(response); }

writer.WriteLine("data"); writer.Flush(); response = reader.ReadLine(); if (response.Substring(0, 3) != "354") { throw new Exception(response); }

writer.WriteLine("from:" + Email); writer.WriteLine("to:" + EmailTo); writer.WriteLine("subject:" + Subject); writer.WriteLine(Body); writer.WriteLine("."); writer.Flush(); response = reader.ReadLine(); if (response.Substring(0, 3) != "250") { throw new Exception(response); }

writer.WriteLine("quit"); writer.Flush(); response = reader.ReadLine(); if (response.Substring(0, 3) != "221") { throw new Exception(response); } } }}

Anexa B IMAPClient.csusing System;using System.Collections.Generic;using System.IO;using System.Net.Security;using System.Net.Sockets;using System.Text;using System.Text.RegularExpressions;

namespace AppooProjectClasses{ public class IMAPClient : IDisposable { private TcpClient client; private SslStream sslStream; private StreamReader reader; private StreamWriter writer; public String Host { get; set; } public Int32 Port { get; set; } public Int32 MailsCount { get; set; }

public MyMail GetMail(Int32 index) { MyMail mail = new MyMail(); mail.hasAttachments = false; String command = ". fetch " + (index + 1) + " (body[header.fields (to from subject)])"; Command(command); String temp; StringBuilder stringBuilder = new StringBuilder(); while (!(temp = reader.ReadLine()).StartsWith(". ")) { stringBuilder.Append(temp + "\n"); } String response = stringBuilder.ToString(); response = response.Replace("\n)", ""); mail.Subject = Tools.GetSubject(response); mail.From = Tools.GetSender(response); mail.To = Tools.GetDestination(response); command = String.Format(". fetch {0} (body[header.fields (Content-Type Content-Transfer-Encoding)])", index + 1); Command(command); stringBuilder.Clear(); temp = reader.ReadLine(); while (!(temp = reader.ReadLine()).StartsWith(". OK")) { if (temp != "" && temp != ")") { stringBuilder.Append(temp + "\n"); } } response = stringBuilder.ToString(); String contentType = Tools.GetContentType(response); if (contentType.Contains("multipart")) { if (contentType.Contains("mixed")) { command = String.Format(". fetch {0} (body[1.2.mime])", index + 1); mail.hasAttachments = true; } else { command = String.Format(". fetch {0} (body[2.mime])", index + 1); } Command(command); stringBuilder.Clear(); temp = reader.ReadLine(); while (!(temp = reader.ReadLine()).StartsWith(". OK")) { if (temp != "" && temp != ")") { stringBuilder.Append(temp + "\n"); } } response = stringBuilder.ToString(); if (contentType.Contains("mixed")) { command = String.Format(". fetch {0} (body[1.2])", index + 1); } else { command = String.Format(". fetch {0} (body[2])", index + 1); }

} else { command = String.Format(". fetch {0} (body[text])", index + 1); } Command(command); stringBuilder.Clear(); temp = reader.ReadLine(); while (!(temp = reader.ReadLine()).StartsWith(". OK")) { if (temp != "" && temp != ")") { stringBuilder.Append(temp + "\n"); } } String mailBody = stringBuilder.ToString().Trim(); if (!String.IsNullOrEmpty(mailBody) && mailBody[mailBody.Length - 1] == ')') { mailBody = mailBody.Substring(0, mailBody.Length - 1); } //Get charset Regex charsetRegex = new Regex("charset=\"?(?[^\\s\";]+)\"?;?\n?"); Match charsetMatch = charsetRegex.Match(response); String charset = charsetMatch.Groups["charset"].Value; //Get encoding Regex encodingRegex = new Regex( "Content-Transfer-Encoding: \"?(?.*)\"?\n", RegexOptions.IgnoreCase); Match encodingMatch = encodingRegex.Match(response); String encodeing = encodingMatch.Groups["encoding"].Value; switch (encodeing) { case "base64": { Byte[] base64Bytes = Convert.FromBase64String(mailBody); mail.Body = Encoding.GetEncoding(charset).GetString(base64Bytes); break; } case "quoted-printable": { mail.Body = Tools.DecodeQP(mailBody, charset); break; } default: { mail.Body = mailBody; break; } } return mail; }

public void DeleteMail(Int32 index) { String response; //Delete mail String command = String.Format(". fetch {0} uid",index + 1); Command(command); response = reader.ReadLine(); Regex uidRegex = new Regex("\\(UID\\s(?\\d+)\\)"); Match uidMatch = uidRegex.Match(response); String uid = uidMatch.Groups["uid"].Value; reader.ReadLine(); command = String.Format(". uid store {0} +flags (\\Deleted)", uid); Command(command); reader.ReadLine(); reader.ReadLine(); Command(". expunge"); while (!(response = reader.ReadLine()).StartsWith(". ")) ; }

private void Command(String command) { writer.WriteLine(command); writer.Flush(); }

public void Connect(String email, String password) { try { client = new TcpClient(); client.Connect(Host, Port); sslStream = new SslStream(client.GetStream()); sslStream.AuthenticateAsClient(Host); reader = new StreamReader(sslStream); writer = new StreamWriter(sslStream); StringBuilder stringBuilder = new StringBuilder(); String temp; while (!(temp = reader.ReadLine()).StartsWith("* OK")) { stringBuilder.Append(temp + "\n"); } stringBuilder.Append(temp); Command(". login " + email + " " + password); stringBuilder.Clear(); while ((temp = reader.ReadLine()).StartsWith("*")) { stringBuilder.Append(temp + "\n"); } if (!temp.Contains(". OK")) { throw new Exception("Invalid credential"); } } catch { CloseConnection(); throw; } }

public List GetFolders() { List folders = new List(); Command(". list \"\" \"*\""); StringBuilder stringBuilder = new StringBuilder(); String temp; while ((temp = reader.ReadLine()).StartsWith("*")) { if (!temp.Contains("Noselect")) { String[] strarr = temp.Split('"'); folders.Add(new Folder(strarr[3])); } } return folders; }

public void SelectFolder(String Folder) { Command(". select \"" + Folder + "\""); StringBuilder stringBuilder = new StringBuilder(); String temp; MailsCount = -1; while ((temp = reader.ReadLine()).StartsWith("*")) { if (temp.Contains("EXISTS")) { String[] strarr = temp.Trim().Split(' '); MailsCount = Convert.ToInt32(strarr[1]); } } }

private void CloseConnection() { //Close connection Command("logout"); reader.ReadLine(); reader.Close(); writer.Close(); sslStream.Close(); client.Close(); }

public void Dispose() { Dispose(true); GC.SuppressFinalize(this); }

protected virtual void Dispose(bool disposing) { if (disposing) { CloseConnection(); } } }}Anexa C Tools.csusing System;using System.Collections.Generic;using System.Text;using System.Text.RegularExpressions;

namespace AppooProjectClasses{ public struct MyMail { public String To; public String From; public String Subject; public String Body; public Boolean hasAttachments; }

public struct Folder { public String name; public Folder(String _name) { name = _name; } }

public class Tools { public static String ToBase64(String input) { Byte[] inputStringBytes = ASCIIEncoding.ASCII.GetBytes(input); return Convert.ToBase64String(inputStringBytes); }

#region MailHeaderInfo public static String GetSubject(String mailSourceCode) { //Find Subject Regex subjectRegex = new Regex( "[sS]ubject:(?(\\s+.+)?)\n", RegexOptions.IgnoreCase); Match subjectMatch = subjectRegex.Match(mailSourceCode); String subject = subjectMatch.Groups["subject"].Value; if (Regex.IsMatch(subject, "=\\?[^\\?]*\\?[qQbB]\\?")) { return QPorBase64ToString(subject).Trim(); } else { return subject.Trim(); } }

public static String GetSender(String mailSourceCode) { //Find Sender Regex fromRegex = new Regex( "[fF]rom:\\s(\"?(?[^\"