Documente Academic
Documente Profesional
Documente Cultură
Proiect de curs
Disciplina: APPOO
Tema: Elaborarea i proiectarea unui Mail Client
A efectuat:
A verificat:
lect.sup.
Postaru A.
Chiinu 2014
Cuprins
Introducere.............................................................................................................................3
1. Sarcina tehnic a sistemului............................................................................................4
2. Elaborarea diagramelor UML.........................................................................................5
2.1.
2.2.
2.3.
2.4.
2.5.
2.6.
3. Interfaa sistemului........................................................................................................15
Concluzie.............................................................................................................................18
Bibliografie..........................................................................................................................19
Anexa A SMTPClient.cs...................................................................................................20
Anexa B IMAPClient.cs...................................................................................................22
Anexa C Tools.cs..............................................................................................................26
Anexa D Form1.cs............................................................................................................29
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.
3
10
11
12
13
14
15
16
3. Interfaa sistemului
18
19
Concluzie
Paradigma 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 ac iunile
care trebuie numaidect executate. Pentru a reprezenta destinaia funcional a sistemului
am elaborat diagrama cazurilor de utilizare, iar pentru a reprezenta interac iunea 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 via a,
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.
20
Bibliografie
1. 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/rfc5321
4. STANDARD FOR THE FORMAT OF ARPA INTERNET TEXT MESSAGES
[Resurs electronic] - https://tools.ietf.org/html/rfc822
5. UML 2 Tutorial [Resurs electronic] http://www.sparxsystems.com.au/resources/uml2_tutorial/
21
Anexa A SMTPClient.cs
using
using
using
using
System;
System.IO;
System.Net.Security;
System.Text;
namespace AppooProjectClasses
{
public class SMTPClient : System.Net.Sockets.TcpClient
{
private SslStream sslStream;
private StreamWriter writer;
private StreamReader reader;
public
public
public
public
public
public
public
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);
}
22
23
24
Anexa B IMAPClient.cs
using
using
using
using
using
using
using
System;
System.Collections.Generic;
System.IO;
System.Net.Security;
System.Net.Sockets;
System.Text;
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-TransferEncoding)])", 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
25
26
}
default:
{
mail.Body = mailBody;
break;
}
}
return mail;
27
28
Anexa C Tools.cs
using
using
using
using
System;
System.Collections.Generic;
System.Text;
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:(?<subject>(\\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)
{
29
30
}
else
{
decodedString += DecodeQP(encodedText, charset);
}
}
return decodedString;
}
31
Anexa D Form1.cs
using
using
using
using
using
using
AppooProjectClasses;
System;
System.Collections.Generic;
System.ComponentModel;
System.Threading;
System.Windows.Forms;
namespace AppooProjectInterface
{
public partial class MyMailClient : Form
{
IMAPClient imapClient;
String email;
String password;
List<MyMail> myMails;
Int32 count;
String currentFolder;
public MyMailClient()
{
InitializeComponent();
imapClient = new IMAPClient();
myMails = new List<MyMail>();
mailFolders.SelectedIndexChanged += mailFolders_SelectedIndexChanged;
mailsTable.CellClick += mailsTable_CellContentClick;
mailLoader.DoWork += mailLoader_DoWork;
mailLoader.ProgressChanged += mailLoader_ProgressChanged;
mailLoader.RunWorkerCompleted += mailLoader_RunWorkerCompleted;
mailSender.DoWork += mailSender_DoWork;
mailSender.RunWorkerCompleted += mailSender_RunWorkerCompleted;
mailSender.WorkerSupportsCancellation = true;
mailsTable.MouseHover += (sender, evnt) =>
{
(sender as DataGridView).Focus();
};
this.Disposed += (sender, evnt) =>
{
if (mailLoader.IsBusy)
{
mailLoader.CancelAsync();
}
if (mailSender.IsBusy)
{
mailSender.CancelAsync();
}
imapClient.Dispose();
};
}
void mailLoader_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
mailFolders.Enabled = true;
}
void mailLoader_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
if ((sender as BackgroundWorker).CancellationPending == true)
{
return;
32
33
34
35