Elaborarea Sistemului Mail Client Orientat Spre Internet
Cuprins
introducere
Creatorii serviciilor care oferă posibilitatea comunicării prin rețea s-au inspirat din modul în care oamenii comunică unii cu alții în viața de zi cu zi. Așa a apărut poșta electronică, precum și alte servicii care fac posibilă schimbarea de mesaje între oameni prin intermediul calculatoarelor. Deși se aseamănă foarte mult cu poșta obișnuită, poșta electronică are în plus câteva trăsături caracteristice mediului prin care este distribuită, precum și utilizării calculatoarelor pentru a trimite și primi mesaje.
Poșta electronică oferă posibilitatea de a:
păstra legătura cu persoane din întreaga lume la un preț mult mai mic decât cel al unei convorbiri telefonice obișnuite sau al unei scrisori expediate prin poșta obișnuităș
discuta subiecte importante și/sau interesante în orice domeniu cu persoane avizate, colaboratori, indiferent de situarea geografică a acestora;
scrie și trimite mesaje (scrisori) care vor ajunge la destinație uneori în doar câteva secunde, alteori în câteva minute, dar în orice caz cu mult mai repede decât scrisorile obișnuite;
primi mesaje din întreaga lume, a le citi, a le tipări pe hârtie pentru a le utiliza pe urmă în diferite moduri, a răspunde la scrisori incluzând chiar mesajul primit în scrisoarea de răspuns;
atașa la o scrisoare diferite documente (create tot pe calculator) și a primi documente atașate la scrisori;
trimite aceeași scrisoare la mai multe persoane în același timp, fără a fi necesară scrierea acesteia pentru fiecare destinatar separat;
specifica subiectul mesajului pentru a atrage atenția destinatarului asupra importanței pe care trebuie să o acorde scrisorii respective, cu posibilitatea de a cunoaște subiectul unei scrisori primite fără a fi mai nevoie să fie parcursă în întregime.
Un mesaj trimis prin poștă electronică se poate rătăci întocmai ca o scrisoare obișnuită sau se poate întoarce înapoi atunci când destinatarul ei nu a fost specificat corect. Un mesaj de poștă electronică poate fi șters din greșeală întocmai cum se poate pierde o scrisoare obișnuită, care nu va mai fi regăsită niciodată.
Utilizând comparații cu modul de utilizare a poștei obișnuite, vor fi descrise principalele operații care pot fi efectuate cu poșta electronică. Această prezentare va fi făcută la modul general, evitându-se cât mai mult posibil referiri la servicii particulare concepute pentru utilizarea poștei electronice.
1 HTTP – protocolul Web de bază
În timpului călătoriei prin Web browser-ul face schimb de informație cu serverul Web, folosind protocolul HTTP. În fiece dată, când se efectuiază trecerea prin hyperlegături de la un resurs la altul, browser-ul se adresează la HTTP pentru acces la server, care păstrează informația necesară. Informația se păstrează pe server în diferite forme, cum ar fi fișiere textuale, imagini, clipuri video, fotografii, audio etc. Transmiterea acestor multimedia-date e descrisă de o specificație tehnică, numită MIME. MIME determină formatul fișierelor grafice, de sunet, binare, video etc. Folosind MIME, se poate de determinat formatul fișierelor și de le folosit în cadrul lucrului cu serverul Web (cu condiția că serverul poate lucra cu formatul dat.
1.1 Principiul de lucru HTTP
Spre deosebire de așa protocoale ca FTP, ce asigură legătura până când nu va apărea vreo greșală sau nu va veni semnalul de închidere a legăturii, HTTP are alt principiu de lucru. Pentru fiecare operație HTTP browser-ul și server-ul fac o legătură, apoi o întrerupt. De exemplu, când se dace legătura cu nodul Web, browser-ul și server-ul fac legătură, ce permite serverului să transmită pagina HTML din nodul dat browserului. După ce browserul primește fișierul, serverul întrerupe legătura.
Fig.1 Comunicarea Clientului și Serverului
O operație HTTP de multe ori e numită tranzacție. HTTP folosește legătutra TCP/IP, ce se stabilește pentru perioada de tranzacție.Nici browserul, nici serverul nu păstrează informația chiar despre ultima conexiune. În așa fel, călătoria prin Web prezintă niște tranzacții HTTP consecutive. După ce documentul a fost transmis clientului, serverul singur întrerupe legătura,fapt care permite serverului să deservească mai rapid clientul următor și mărește eficacitatea lucrului.
Fig.2 Comunicrea multiplă de clienți și serverii
1.2 Trei operații de bază HTTP
Folosind HTTP, aplicațiile îndeplinesc trei operații de bază: căutarea, extragerea și controlul. În timpul căutării obiectului programul Web folosește HTTP pentru indicarea URL-ului obiectului pe server. Dacă obiectul există, aplicația folosește HTTP pentru primirea lui. După terminarea operației date HTTP anunță despre statutul ei. Cu alte cuvinte, HTTP transmite programului informația despre faptul: au fost cu succes sau fără succes îndeplinite operațiile de căutare/extragere a datelor.
1.3 Căutarea informației
HTTP e bazat pe operațiile de interpelare(cerere) a clientului și de răspuns a serverului.Clientul instalează legătura TCP/IP cu serverul, trimițând mesajul despre interpelare la legătură prin Internet la server. Dacă serverul e accesibil el primește acest mesaj de la client și instalează legătura . În timpul folosirii browserului pentru căutarea informației în Web, el transmite cererea la server, unde se păstrează informația căutată. După ce serverul și clientul instalează legătura, browserul transmite un mesaj-cerere,în care se conține informația despre metoda de interpelare(cerere),URI(Uniform Resourse Identifier), versiunea protocolului și mesajul MIME. În mesajul MIME se indică parametrii interpelării, informația despre client și corpul obiectului.
1.4 Extragerea informației
După ce browserul a instalat legătura cu serverul și a făcut cerere, se începe procesul de extragere a informației. Serverul răspunde cu mesajul, unde sunt indicate versiunea lui de protocol, codul erorii sau a legăturii cu succes și deasemenea un mesaj de tipul MIME, în care este prezentă informația despre server, titlul obiectului și conținutul corpului obiectului. Vezi figura 3.
Fig.3 O tranzacție simplă
O tranzacție a serverului poate fi mai complicată decît este arătată în figura 3. O tranzacție cu o imagine poate fi văzută în figura 4.
Fig.4 O tranzacție simplă cu o imagine inclusă
1.5 Informația despre statutul legăturii.
În timpul instalării legătutii cu serverul, în fereastra statutului legăturii se poate de urmărit după toate fazele procesului. Mesajele despre statutul obiectului permit determinarea volumului informației și începutul procesul de extragere a datelor.
Folosind această informație, e posibil, în caz de necisitate, de a întrerupe acest proces de copiere. În afară de aceasta, e accesibilă o informație mai amplă despre încercările căutării informației. Codurile statutului sunt indicate în fereastra corespunzătoare a browserului.
1.6 Patru etape ale unei tranzacții HTTP
Înainte de procesul de schimb a informație între server și client, e necesară instalarea legăturii între ei. În Internet aceasta se face cu ajutorul TCP/IP. Apoi clientul cere datele de la server, iar serverul trimite răspunsul. Clienții și serverele folosesc HTTP pentru efectuarea acestei operații. În afară de aceasta, astfel de legătură se instalează numai pentru o singură tranzacție și apoi este închisă de server după finisarea ei. Toate etapele unei tranzacții sunt descrise mai jos. Structura generală ale unei tranzacții este aratată pe figura 5.
Fig.5 Structura generală cererilor HTTP
1.6.1 Pasul 1: Instalarea legăturii
În Internet TCP/IP se folosesc pentru organizarea interacțiunii între calculatoare. Pentru a deosebi protocoalele, aplicațiile folosesc pentru fiecare din ei numere unice. Protocoalele comune;așa ca FTP și HTTP, folosesc numere de porturi bine cunoscute. Valoarea standard pentru portul HTTP este 80, dar e posibilă legătura și prin intermediul altui port.
1.6.2 Pasul 2: Cererea clientului
Fiecare cerere a clientului se începe cu metoda, după care vine URL-ul obiectului.
Clientul completează această informație cu versiunea HTTP, apoi urmează simbolul de trecere în alt rând, după care pot urma datele. La sfârșit browserul mai adaogă un simbol de trecere în alt rând. Metoda HTTP prezintă o comandă a clientului, ce indică la scopul cererii către server. Așa metodă corespunde resurselor Web. Clientul deasemenea indică versia proprie a protocolului HTTP. Toate aceste componente: metoda, URL-ul și versiunea HTTP – sunt părți componente a rândului de cerere (Request-Line).Vezi figura 6. Clientul folosește câmpul titlului cererii pentru indicarea informației despre cerere și despre sine.
Fig.6 Structura cererii al clientului
1.6.3 Pasul 3: Răspunsul serverului
După ce serverul Web a primit și a prelucrat mesajul-cerere, el răspunde cu un mesaj-răspuns HTTP. Așa mesaj se începe cu versiunea HTTP, apoi urmează codul statutului și tema răspunsului(3 cifre), simbolul de trecere în alt rând și informație adăugătoare cu titlul respectiv. La sfârșit se mai adaogă simbolul de trecere în alt rând, după care urmează corpul obiectului. Codul statutului prezintă un număr de trei cifre, ce descrie, poate oare serverul să primească și să satisfacă cererea clientului. Tema răspunsului – este o descriere textuală scurtă a codului statutului. Versiunea HTTP, codul statutului și tema răspunsului împreună formează rândul statutului(status line). Titlul răspunsului poate conține informație despre resursul cerut și determinările MIME corespunzătoare. Când serverul trimite titlul răspunsului clientului, de obicei el coincide cu titlul, primit de la client, vezi figura 7.
Fig 7. Structura răspunsului de la server
1.6.4 Pasul 4: Întreruperea legăturii de către server
Prerogativa serverului este întreruperea legăturii TCP/IP cu clientul după prelucrarea cererii lui. Însă la fel ca și serverul, clientul trebuie să urmărească întreruperile neplanificate a legăturii . Cu alte cuvinte, dacă se clichează butonul Stop al browserului, atunci el trebuie să întrerupă legătura. În caz de deteriorare în hardul unui din calculatoare, celălalt trebuie să determine aceasta și să întrerupă legătura. În orice caz, întreruperea legăturii duce întotdeauna la întreruperea tranzacției curente, independent de statutul ei.
1.7 Metodele HTTP
Metode HTTP se numesc comenzile HTTP. Metoda HTTP anunță serverul, ce trebuie de făcut cu resursul URI. Lista metodelor pentru un resurs concret se poate schimba dinamic. Din codul statutului și rândul statutului răspunsului serverului browserul află despre faptul: poate oare serverul să execute metodele concrete asupra resursului dat. Serverul, în caz că metoda nu-i cunoscută sau nu-i executabilă, întoarce codul 501. Mai jos urmează descrierea completului metodelor de bază HTTP (GET,HEAD și POST).
1.7.1 Metoda GET
Metoda GET a protocolului HTTP trimite cerere-întrebare serverului despre existența informației,determinate de URI. Serverul o primește, folosind adresa URI din cererea clientului. Metoda GET se numește decondiție, dacă în titlul cererii clientului se întîlnește câmpul If-Modified-Since. În acest caz serverul propune clientului informația, dacă ea a fost schimbată după data, indicată în titlul cererii. Dacă clientul deja a primit aceste date și le-a păstrat, nu-i necesitate de le trimis încă o dată, vezi figura 8.
Fig.8 O tranzacție de tip GET
1.7.2 Metoda HEAD
Metoda HEAD este aproape identică cu GET cu o difirență: serverul nu întoarce ca răspuns la cerere corpul obiectului. Aplicațiile folosesc această metodă pentru a primi informație despre resursul dat, neîncărcând-ul pe calculator. Această informație (metainformație) trebuie să fie identică cu titlul răspunsului la cerere cu metoda GET. Programele folosesc metoda HEAD pentru controlul legăturilor hypertextuale (ancore) cu scopul de a afla corectitudinea, aeccesibilitatea și schimbările. Mai există o diferență între metoda HEAD și GET: pentru metoda HEAD nu există conceptul de condiție. Amplasînd câmpul If-Modified-Since în cererea HEAD, atunEAD, atunci rezultatul nu se va schimba (acest câmp va fi ignorat), vezi figura 9.
Fig.9 O tranzacție de tip HEAD
1.7.3 Metoda POST
Metoda POST a protocolului HTTP trimite cerere la server despre existența obiectului, adresa căruia e indicată în URI-ul cererii. Cu alte cuvinte, folosind această metodă, clientul îi dă indicații serverului precum că acesta este un resurs nou și e necesar de-l folosit cu URI-ul trimis de el. În majoritatea cazurilor metoda POST crează sau înscrie deasupra informației existente pe cea nouă, legată cu URI-ul din cerere. Din această cauză operația cu metoda POST poate să nu ducă în rezultat la apăriția resursului cu URI-ul dat. În acest caz serverul va întoarce codul statutului în forma 200 (OK) sau 204 (nu ezistă conținut), în dependență de faptul conține oare mesajul-răspuns al serverului obiectul, indicat în cerere.
În afară de metodele GET, POST și HEAD protocolul HTTP mai conține câteva metode mai puțin folosite: CHECKIN, CHECKOUT, DELETE, LINK, PUT, SEARCH, SHOW-METOD, STACEJUMP, TEXTSEARCH și UNLINK. Însă nu toate serverele susțin aceste metode.
1.7.4 Metoda TRACE
Metoda TRACE dă posibilitatea utilizatorului de a vedia cum se schimbă mesajul clientului ce trece prin o serie de serverii-roxy. Un recipient a metodei TRACE afișiază (se efectuiază un echo) headerele al cererilor HTTP înapoi la client. Cînd metoda TRACE este folosită cu Max-Forwards , clientu poate să determine un lanț de servere-proxy intermediare dintre clientul inițial (original) și a serverului Web. Structura a unei tanzacții de tip TRACE urmăriți pe figura 10.
Fig.10 O tanzacție de tip TRACE
1.8 HTML – limbajul de marcaj
HTML nu este un limbaj de programare iar un document HTML nu este un program de computer. În timp ce un program de computer înseamnă o serie de proceduri si instructiuni care se aplică unor date, un document HTML reprezintă chiar datele. Limbajul HTML specifică gramatica si sintaxa tag-urilor (etichetelor) care, inserate în date (de pildă text), spun browserului cum anume să citească documentul HTML. Din punct de vedere tehnic, HTML este un subset al SGML iar un document HTML este o instantă a unui document SGML.
SGML s-a născut sub numele GML (General Markup Language) la IBM, spre sfîrșitul anilor 60, într-o tentativă de a rezolva problemele ivite la transportul documentelor între diferite computere. Numele markup vine din lumea publiciștilor unde se referă la instructiunile codate inserate de editor în manuscris privind tipul caracterelor. SGML este generalizat (generalized) prin faptul că în loc să specifice exact cum anume trebuie prezentat un document el descrie tipuri de documente împreună cu modalitatea de marcare pentru formatarea si prezentarea instantelor fiecărui tip. GML a devenit SGML cînd a fost acceptat ca standard de către International Standards Organization (ISO) la Geneva (ISO 8879; 1986).
Un document SGML are trei părti. Prima descrie setul de caractere si, lucrul cel mai important, care sunt caracterele care vor fi folosite pentru a diferenția textul de tag-uri (etichete). Cea de a doua parte declară tipul documentului (Document Type Definition – DTD) si care tag-uri sunt considerate legale. A treia parte se numește instanta documentului și conține textul si tag-urile. Cele trei părți nu trebuie să se găsească în același fișier fizic, lucru fericit deoarece permite să se"uite" de SGML și să se lucreze numai cu HTML.
Toate browserele HTML presupun aceeași informație legată de setul de caractere și declarațiile legate de tipul documentului așa încît avem de a face doar cu instanțele HTML ale documentului, simple fișiere text. Setul de caractere de bază al unui document HTML este ISO 8859/1, cunoscut ca Latin-1. Este un alfabet pe 8 biti cuprinzînd caractere pentru cele mai multe limbi americane și europene. ISO 646, cunoscut ca ASCII pe 7 biti, este subset al setului Latin-1. Nu există nici o obligație pentru a utiliza într-un document HTML mai mult decît cele 128 de caractere ASCII standard.
Folosirea HTML s-a început în anul 1990, când Tim Bernes-Li și Daniel W.Connoli au creat HTML. Folosind SGML în calitate de prototip, Bernes-Li a creat HTML, iar Connoli a scris pentru el DTD (Document Type Definition). HTML DTD este o descriere formală a sintaxei HTML în termeni SGML. HTML versiunea 2.0 deasemenea este standard. HTML este un sistem de formatare standardă, ce se folosește în Web. Ca și fiecare standard, HTML a avut mai multe versiuni, fiecare din ele având un număr mai mare decât cea precedentă. În timpul de față majoritatea browserelor folosesc versiunea 2.0. Însă deacum există versiunea 3.2 versiunea 3.0 a fost folosită foarte slab.Principalul element al HTML este <tag-ul>.
HTML de nivelul 0 a fost primul standard, care se folosea în Web. El conținea teg-uri de marcare a documentelor și determinările de marcare pentru tag-urile de ancoră (de legătură). Însă numărul de tag-uri și posibilitățile HTML erau destul de mici.
HTML 1.0 conținea toate posibilitățile versiunei 0 și adăugator susținea imaginile și marcarea lor și posibilitățile de formatare a simbolurulor. Acest nivel avea mari posibilități de formatare a textului.
HTML 2.0 este un standard mai comun pentru formatarea documentelor. Aici sunt prezente toate posibilitățile nivelurilor 0 și 1.0 și adăugător se asigură lucrul cu formele, care permit serverului interacțiunea cu utilizatorul. Anume folosind formele există posibilitatea de schimb dinamic de date între client și server.
În timpul de față versiunea HTML 3.2 e propusă în calitate de standard al Internetului, înlocuind versiunea 3.0. În HTML3.0 sunt prezente toate posibilitățile versiunilor precedente și sunt adăugate extinderile pentru figurile geometrice , tabele și elemente de conducere în forme.Nivelul 3.2 adăugător conține posibilități pentru alcătuire de aplete, scripte, instalarea ganei de culori ș.a. În timpul de față se duc lucrări asupra unei versiuni mai sofisticate HTML 3.5.
Deci, elementul principal în HTML este tag-ul. Folosind tag-urile se poate de alcătuit un document HTML.
Tag-urile HTML sînt delimitate de paranteze unghiulare < si >. Ele apar fie singular, cum este de pildă <P> care indică un paragraf nou în text fie în perechi marcînd începutul si sfîrșitul textului asupra căruia au efect. De pildă <B> Atentie!</B> reprezintă etichetarea cuvîntului pentru a fi afișat îngroșat pe ecran. Există tag-uri pentru formatare, pentru specificarea legăturilor, pentru includerea fișierelor grafice, video sau sunet precum și tag-uri pentru definirea unor cîmpuri de editare, interactive.
Numărul tag-urilor si al caracterelor entități creste în continuu făcînd necesară redefinirea periodică a HTML.
Cel mai simplu document HTML este alcătuit din următoarele tag-uri: <html>și</html>,<head>și</head>,<title>și</title>,<body>și</body>. Aceste tag-uri se folosesc în felul următor:
<HTML>
<HEAD>
<TITLE>Titlul documentului</TITLE>
<HEAD>
<BODY>
Aici urmează a fi corpul documentului
</HEAD>
</HTML>
Tag-ul <HTML> indică clienților că documentul dat e alcătuit cu ajutorul HTML. El este totdeauna amplasat la începutul documentului.
</HTML> se numește stop-tag și limitează acțiunea standardelor HTML.Adică indică sfârșitul documentului HTML.
Elementul <HEAD> aflat la începutul oricărui document HTML înseamnă titlul sau partea întroductivă.În titlu se poate de întrodus diferită informație, așa ca o adnotare a documentului. Stop-tag-ul înseamnă sfârșitul titlului.
Elementul <TITLE> e folosit pentru indicarea denumirii documentului, adică a titlului.
Informația aflată între tag-urile <TITLE> și </TITLE> este afișată de către browser în partea de sus a ferestrei și indică denumirea documentului dat.
Elementul <BODY> indică începutul textului de bază a documentului. De obicei între tag-urile <BODY> și </BODY> se află alteelemente HTML așa cum cele de formatare a textului, descriere a tabelelor, a formelor, a listelor și alte elemente HTML.
Formele în HTML au o însemnătate deosebită. Aplicând formele HTML se poate face o interfață de dialogare a clientului cu serverul Web. O formă HTML conține diferite obiecte de dirijare, câmpuri de redactare, comutatoare, liste și alte elemente, cu ajutorul cărora clientul trimite serverului o informație oarecare,care ajungând la server este analizată și prelucrată de un program special numit script, după ce este trimis răspunsul clientului în dependență de informația trimisă prin formă.
2 Descrieria generală a interfeței CGI.
Pentru ca serverul Web să fie întradevăr interactiv, el trebuie să realizeze schimb de informație cu clientul, dar nu numai să ofere posibilitatea de a călători prin ancore. Folosind programele Common Gateway Interface (CGI – scripturi), e posibilă realizarea paginilor Web active, a datelor dinamice. Folosind scritpul CGI, serverul poate primi cereri și răspunde la ele. E posibilă chiar și generarea paginilor aleatoare, astfel ca fiecare utilizator ce vizitează serverul să primească cu totul altă pagină ca precedentul său, în (ensu designului paginii). Browserul interacționează cu serverul prin intermediul unei tranzacții HTTP, care constă din patru pași. Scriptul CGI se află pe server faptul, ce asigură o legătură directă dintre program și server. Acest proces permite scriptului CGI să primească datele dinamic și să le trimită serverului, vezi figura 11.
Fig.11 Diagrama simplă CGI
După cum s-a vorbit mai sus, pentru a trimite informație serverului Web, se folosesc formele HTML, care conțin elemente de conducere și diferite tipuri de elemente interogătoare. Când utilizatorul completează forma și clichează butonul de tipul Submit, datele din câmpurile acestei forme sunt transmise navigatorului Web împreună cu denumirile acestor câmpuri. În rândul său, serverul analizează aceste date și lansează programul CGI, calea către care este indicat în operatorul <FORM> de descriere a formei. Înainte de lansarea programului CGI serverul Web alege, în dependență de valoarea parametrului METHOD a operatorului <FORM>, una din două metode de transmitere a datelor primite pentru prelucrare. Aceste două metode sunt : GET și POST.
Web Gateways sunt programe sau scripturi folosite pentru a accesa informație ce nu este disponibilă la utilizator. O schemă de utilizare a unui Gateway la o bază de date este prezentată pe figura 12.
Fig.12 Un Gateway spre o baza de date
2.1 Metoda GET
Metoda GET presupune transmiterea datelor programei CGI prin intermediul variabilelor mediului (environment variables). Serverul Web crează pentru programul CGI destul de multe variabile ale mediului. Numele și valoarea fiecărei din ele se poate ușor de aflet în cadrul unei programe CGI. Dar cea mai importantă variabilă a mediului pentru iden- tificarea datelor primite de la utilizator este variabila QUERY_STRING. Anume aici nimeresc datele din câmpurile formei. Aceste date se află în următorul format:
nume1=valoare1&nume2=valoare2& nume3=valoare&3
Aici în calitate de nume se folosesc valorile parametrilor NAME, care indică numele câmpurilor formei. Ca valori se trimit datele din câmpurile respective. Scanând conținutul rândului textual al variabilei mediului QUERY_STRING, programul CGI poate găsi în ea numele oricărui câmp necesar și corespunzător acestul nume valoarea câmpului. Adresa rândului dat al variabilei mediului se poate ușor de aflat în cadrul programului alcătuit în limbajul Perl, cu ajutorul heshului special ”ENV”:
$QUERY_STRING = $ENV{"QUERY_STRING"};
În cazul necesității modificării rândului variabilei mediului, e necesar de o copiat în buferul intern. Sistemul operațional al serverului Web poate să nu permită redactarea directă a blocului de memorie, în care se conțin varia- bilile mediului. Rândul transmis în variabila mediului QUERY_STRING este codificat cu ajutorul așanumitei codificări URL. În această codificare toate simbolurile de probel se înlocuiesc cu simbolul "+". În afară de aceasta, pentru prezntarea codurilor simbolurilor de conducere și a altor simboluri se folosește o consecutivitate de simboluri de tipul: %xx, unde simbolurile xx prezintă un cod hexazecimal al simbolului în formă de două simboluri ASCII.
2.2 Metoda POST
În cazul folosirii metodei POST programul CGI primește datele prin șirul standard de intrare STDIN. Dacă programul CGI e alcătuită în limbajul C, atunci pentru a primi datele se poate de folosit funcțiile fread sau scanf.
Ceea ce privește volumul în baiți ale datelor, pe care trebuie de-l citit din șirul standard de intrare, această informație se transmite programului CGI prin variabila mediului cu numele CONTENT_LENGHT. Iată un mic exemplu:
$Size = $ENV{"CONTENT_LENGHT"};
(Variabilele în limbajul Perl sunt convertate spre tipul anumit automat).
Iar datele de intrare pot fi primite, după aceasta, în felul următor:
read (STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
(aici funcției read i se transmit adresa buferului pentru înscrierea datelor primite,volumul datelor, numărul de bufere necesare de citit și șirul stdin.
2.3 Diferența între metodele GET și POST
Diferența esențială între aceste două metode este volumul formei HTML de prelucrat. Metoda GET de obicei se folosește pentru prelucrarea formelor nu prea mari, din cauza că navigatoarele impun restricții pentru volumul datelor ce se transmit prin variabila mediului QUERY_STRING.
Iar metoda POST nu impune restricții asupra volumului datelor transmise.
Din acest punct de vedere metoda POST are avantaje în comparație cu metoda GET.
În lucrarea dată, după cum se va vedea mai departe, se folosește o formă HTML nu prea mare, ce conține cîteva elemente. Din această cauză e preferabil de folosit metoda GET. Pe figura 13 poate fi văzut procesarea a unei forme HTML.
Fig.13 Interacțiunea formei cu CGI
2.4 Transmiterea răspunsului din programul CGI
În dependență de metoda folosită de transmitere a datelor (GET sau POST) rezultatul lucrului său programul CGI trebuie să transmită în șirul standard de ieșire STDOUT. Dacă programul este scris în limbajul C, atunci aceasta se poate ușor de făcut cu ajutorul funcțiilor printf sau fwrite.
În majoritatea cazurilor programele CGI se folosesc pentru crearea documentelor HTML dinamice pe baza datelor primite din forme. În acest caz primul rând, necesar de întrodus în șirul standard de ieșire STDOUT trebiue să fie următorul rând al titlului HTTP.
Content-type: text/html
Imediat după acest rând trebuie de întrodus încă un rând gol ce va despărți titlul HTTP și datele documentului HTML. Mai jos e prezentat un exemplu, în care programul CGI formează un document HTML dinamic și îl scoate în șirul standard de ieșire STDOUT:
print("Content-type: text/html\n\n");
print("<!DOCTYPE HTML PUBLIC\"-//W3C//DTD HTML3.2//EN\">");
print("<HTML><HEAD><TITLE>Exemplu</TITLE></HEAD>
<BODY BGCOLOR=#FFFFFF>");
print("<Rezultatul prelucrării formei"); …..
print("</BODY></HTML>");
2.4.1 Redirecție
CGI programe au posibilitate de a instructa pe serverul de a obține un document existent și de a fi transferat acolo, după ce datele au fost prelucrate. Acest mehanism se numește redireție. Să presupunem că noi avem un document numit thanks.html pe care dorim să afișem după ce am prelucrat datele a unei forme.
<HTML>
<HEAD><TITLE>Thank You!</TITLE></HEAD>
<BODY>
<H1>Thank You!</H1>
Thank You for filling out this form. We will be using your input to improve our products.Thanks again,WWW Software, Inc.
</BODY>
</HTML>
Pentru a efectua um mecanism de redirecție se folosește următorul program:
#!/usr/local/bin/perl
# Prelucrarea a informație noastre
…………
print "Location: /thanks.html", "\n\n";
exit (0);
Acest mecanism poate fi urmărit pe figura 14.
Fig.14 O Redirecție a serverului
2.4.2 Mecanismul SSI
SSI (Server Side Includes) sunt derictive ce pot fi puse în pagina HTML pentru a fi executate alte programe. Cel mai important faptul că acest mecanism dă posibilitate de a include în pagina HTML CGI referințe unde după un proces de generare a paginei noi vom obține o pagină construită cît din informație ce a fost pusă inițial în pagină atît și cea generată de scriptul CGI. Lucrul al acestui mecanism poate fi văzut pe figura 15.
Fig.15 Server Side Includes
2.5 Variabilile mediului programei CGI
Variabilile mediul au o însemnătate deosebită în cadrul serviciului distant- dialogat în Internet. Prin in termediul acestor variabile se transmite nu numai rezultatul îndeplinirii formei HTML, dar și alte date destul de importante. Mai jos sunt descrise variabilile valorile cărora sunt atribuite de către server în timpul îndeplinirii scriptului:
Variabila AUTH_TYPE. Este folosită de către script pentru identificarea utilizatorului, care încearcă să primească acces la script. În cazul configurării serverului ca să accepte identificarea utilizatorului, acesta din urmă trebuie să indice numele și parola.
Variabila CONTENT_LENGHT. E folosită pentru determinarea numărului precis de baiți ce se conțin în informația aderată.
Variabila CONTENT_TYPE. E folosită pentru interpelări, care conțin informația aderată. Așa tip de interpelare este și operația-HTTP POST. Informația ce se conține în această variabila indică tipul datelor aderate (MIME-tip/subtip).
Variabila GATEWAY_INTERFACE. E folosită pentru determinarea versiunea, numărul de fabricare a specificației CGI, care satisface serverul Web. Formatul numărului fabricării al specificației CGI este: CGI/număr.
Această variabila are caracteristică comună cu variabilile SERVER_SOFTWARE și SERVER_NAME în privința faptului că ele nu sunt o specificare pentru ointerpelare orecare și se instalează pentru toate interpelările odată. Variabilile următoare sunt specifice pentru fiecare interpelare, executată de script.
Variabila PATH_INFO. Se folosește pentru determinarea căilor asigurate pentru client. Cu alte cuvinte, server se poate adresa către script folosind calea virtuală către script, după care se află informație adăugătoare despre cale. Programa serverului trebuie să decodifice această informație adăugătoare, dacă ea a venit de la un URL oarecare, înainte ca serverul să o transmită scriptului. De obicei această informație indică resursul, pe care scriptul trebuie să-l întoarcă în caz de executare cu succes a cererii. Calea se scrie în formă relativă,unde ca bază se ia catalogul rădăcină a serverului.
Variabila PATH_TRANSLATED. Se folosește pentru primirea informației finale, viabile ce ține de cale. Serverul traduce informația acestei variabili prin modificările necesare așle căii.
Variabila QUERY_STRING. Se folosește pentru primirea informației în formă textuală, care e amplasată în partea dreaptă de la URL-ul, transmis de la utilizator scriptului pentru prelucrare. Acest rând textual conține intrare pentru scrupt. Apoi serverul înlocuiește în cadrul acestul rând fiecare probel cu semnul +, iar toate simbolurile tipărite cu simbolul %dd, unde d este bază pentru sistema zecimală de numerație. Scriptul trebuie să conțină un cod pentru descifrarea acestui rând textual. Transmițând această informație scriptului, serverul nu trebuie s-o analizeze, nici s-o descifreze. Acest lucru este realizat de script.
Variabila REMOTE_ADDR. Se folosește pentru determinarea adresei IP a calculatorului (browserului) distanțiat, ce efectuiază interpelarea către server.
Variabila REMOTE_HOST. E folosită pentru determinarea numelui nodului de la care se efectuiază interpelarea. În cazul, când serverul nu știe numele nodului dat, el trebuie să atribuie variabilei REMOTE_ADDR o valoare și să nu-i atribuie variabilei REMOTE_HOST nici o valoare.
Variabila REMOTE_IDENT. Se folosește pentru identificarea numelui utilizatorului distanțiat, care face interpelarea. Scriptul folosește această variabilă pentru înregistrarea utilizatorului.
Variabila REMOTE_USER. E folosită pentru identificarea numelui utilizatorului distanțiat fără numele nodului dat. Dacă serverul susține identificarea utilizatorului și scriptul este apărat, atunci serverul va determina numele utilizatorului distanțiat și-l va atribui acestei variabile .
Variabila REQUEST_METHOD. Se folosește pentru determinarea tipului cererii HTTP (GET,POST,HEAD), care a fost trimis de către browser la server și e folosit pentru chemarea scriptului.
Variabila SCRIPT_NAME. E folosită pentru determinarea căii virtuale către script, care va fi lansat de către server.
Variabila SERVER_NAME. Se folosește pentru determinarea numelui domenului sau a adresei IP a calculatorului pe care e instalat serverul Web.
Variabila SERVER_PORT. E folosită pentru determinarea numărului portului, care e folosit de către client pentru legătura cu serverul Web. Dacă se folosește portul HTTP tacit, atunci el are valoarea 80.
Variabila SERVER_PROTOCOL. Se folosește numele și numărul protocolului, folosit de către client pentru a trimite cerere către server. Analizând conținutul acestei variabile, scriptul poate identifica numele și numărul protocolului, care va fi folosit în timpul transmiterii datelor către server. Formatul numelui și numărului protocolului este următor: protocol/număr.
Variabila HTTP_ACCEPT. E folosită pentru determinarea tipurilor MIME, care pot fi folosite de către browser. Ele sunt determinate în titlurile HTTP, trimise serverului de către browser. Tipul MIME se identifică în felul următor: tip/extensie. Dacă sunt trezente mai multe tipuri, atunci ele se despart prin virgulă.
Variabila HTTP_USER_AGENT. E folosită pentru identificarea tipului browserului, care trimite cerere serverului.
Programul serverului, care cheamă scriptul, poate determina și alte variabile ale mediului. Aceste variabile sunt descrise în documentația serverului Web corespunzător.
2.6 Opțiunile rândului de comenzi CGI
De obicei scriptele CGI folosesc rândul de comandă în calitate de intrare cu scopul executării cererii ISINDEX, care permite adăugarea căutării interactive cu ajutorul cuvintelor cheie în documentul HTML. Programa serverului poate identifica rândul comandă de intrare, determinând faptul dacă a folosit browserul metoda-HTTP GET și conține oare rândul-comandă simboluri URI uuencoded=. Dacă browserul folosește metoda GET și rândul de căutare URI nu conține simbolurile uuencoded=, atunci interpelarea se face în formă de rând-comandă. Înainte de chemare de către server a scriptului CGI corespunză-tor, programa de server trebuie să împărțească rândul-comandă folosind semnul + pentru despărțirea parametrilor. Apoi serverul îndeplinește o decodificare adăugatoare(în caz de necisitate) pentru fiecare parametru, trimis în rândul URI de căutare și păstrează fiecare parametru-rând într-un masiv numit argv.
Decodificarea adăugătoare, îndeplinită de server, constă în despărțirea unor rânduri diferite, folosind ampersandul (&) în calitate de despărțitor. Apoi serverul desparte fiecare din aceste din aceste rânduri din nou, folosind simbolul (=) pentru despărțirea numelui variabilei, care se amplasează la stânga de la semnalul (=), de la valoarea variabilei, care e amplasată în dreapta semnalului (=). Serverul păstrează numărul elementelor, ce se conțin în masivul argc.
Dacă serverul a găsit semnalul de egalitate în componența rândului QUERY_STRING al variabilei mediului, atunci el nu va trimite un rând-comandă în calitate de intrare în scriptul CGI. Deasemenea, dacă dintr-o cauză oarecare programul serverului nu poate trimite masivul argv scriptului CGI, el asigură informație necodificată a cererii în variabila mediului QUERY_STRING.
2.7 Intrarea standardă (STDIN)
Când browserul interpelează la server (de exemplu, folosind metoda-HTTP POST), informația primită de scriptul CGI, vine din descriptorul intrării STDIN. Programul de server trimite scriptului CGI variabila mediului CONTENT_LENGHT. Această variabilă conține numărul de baiți trimiși de către server scriptului prin acest descriptor. Scriptul CGI poate folosi valoarea variabilei CONTENT_LENGHT pentru determinarea volumului de date care trebuie să intre din intrarea standardă stdin. Serverul, deasemenea oferă scriptului variabila CONTENT_TYPE, care ajută scriptului să determine cum anume să prelucreze datele venite. La sfârșitul acestui șir de date serverul poate trimite (sau nu) marcatorul de sfârșit de fișier. Însă anume scriptul trebuie să determine volumul de date necesare de citit folosind variabila mediului CONTENT_LENGHT.2.8 Ieșirea standardă (STDOUT)
După ce scriptul termină prelucrarea datelor primite de la server, el trebuie să trimită răspunsul său către server. Pentru aceasta el pur și simplu trimite răspunsul descriptorului de fișier al ieșirii standarde STDOUT. În caz general datele trimise de script serverului prezintă un răspuns HTTP, care include în sine titlul, după care urmează un rând gol și după el – cealaltă parte a răspunsului. De obicei ca ieșire de la script este un document HTML format de însăși scriptul.
2.8 Răspunsul direct al scriptului CGI browserului
De obicei scriptul CGI trimite răspunsul, care este interpretat de către server și trimis înapoi browserului. Un avantaj al trimiterii datelor de ieșirii de la script serverului este faptul, că scriptul, în acest caz, nu-i obligat să trimită titlul complet HTTP pentru fiecare interpelare. Însă există scripturi, care ușurează lucrul serverului și trimite datele direct browserului. Pentru a deosebi aceste scripturi de la cele care trimit datele browserului prin server, protocolul CGI cere ca numele scripturilor, ce efectuiază trimiterea directă a răspunsurilor către browser, să încapă cu literele nph- (care indică serverului Not to Parse the Header – nu analiza titlul). Dacă numele scriptului CGI se începe cu nph-, atunci serverul nu va include titlul în datele scriptului. În așa caz răspunderea pentru un răspuns HTTP corect browserului cade pe script.
2.9 Titluri CGI
Datele de intrtare ale scriptului CGI se încep cu titlu. Acest titlu constă din rândul textual în acelaș format ca și titlul HTTP, terminându-se cu un rând gol. Dacă datele de ieșire ale scriptului CGI conțin titluri, ce nu sunt nuște directive către server, atunci serverul trimite aceste titluri nemijlocit browserului în răspuns la cererea lui. Specificarea curentă CGI determină trei directive serverului :
Content – type;
Location;
Status.
Câmpul Content-type în titlul CGI determină tipul/extensia datelor MIME, care sunt trimise de către script înapoi browserului. De obicei scriptul CGI trimite la ieșire un document HTML. În acest caz titlul CGI Content-type are valoarea :
Content-type: text/html
Câmpul Location al titlului CGI indică la document. De obicei scriptul folosește câmpul Location pentru a indica amplasarea documentului. În caz dacă documentul se află nu pe server și valoarea câmpului Location este URL, serverul indică browserului nodul Web corespunzător. Iar dacă documentul se află pe server și câmpul Location prezintă o cale virtuală, serverul trimite acest document browserului.
Câmpul Status al titlului CGI conține valoarea statutului HTTP, care este trimis de către server la browser de la script. Serverul, care cheamă scriptul CGI, folosește diferite coduri de statut HTTP.
3 LimbajUL de programare “Perl”
Există o mulțime de limbaje de programare, care sunt folosite la proiectatrea interfeței CGI. De exemplu: C/C++, Pyton, PHP, TCL, CFML ș.a. În această lucrare am ales limbajul Perl, care împreună cu limbajul JavaScript dă o posibilitate de a programa toate necesitățiile care există în lumia CGI.
3.1 Noțiuni generale
Limbajul de programare Perl a fost elaborat de către Larry Wall în anul 1986 pentru efectuarea dărilor de seamă despre conținutul mulțimii de fișiere în mediul UNIX. Deoarece pe atunci nu existau instrumente pentru rezolvarea astfel de probleme, Wall a elaborat un instrument nou. Denumirea Perl provine de la : Practical Extraction and Report Language.
Cu timpul Wall a perfecționat limbajul și el a fost accesibil tuturor. Structura limbajului Perl este foarte asemănătoare cu limbajul C, în care lipsește instrumentul de prelucrare a fișierelor și informației textuale ce se conține în fișiere. Necătând la faptul că limbajul C este compilator, limbajul Perl este un interpretator. Limbajul Perl este foarte simplu în utilizare, ceea ce-i atribuie avantaje în fața altor limbaje.
3.2 Structuri de date in limbajul Perl
In Perl exista trei tipuri de variabile :
scalare;
tablouri de scalari;
tablouri asociative.
Datele scalare includ numere si siruri de caractere. Unei aceleiasi variabile scalare i se poate atribui atat o valoare numerica, cît și un șir de caractere : $a = 45;
…$a = 'some text';
Numerele pot fi reprezentate prin șiruri de caractere, in maniera :
$p = '9';
Se pot face chiar operații aritmetice cu numere astfel reprezentate. Operatorii aritmetici sunt cei cunoscuți din C; pentru ridicarea la putere, avem operatorul "**" :
$a = 9 ** 3;
Pentru siruri de caractere, dispunem de operații de concatenare si multiplicare :
$a = $b . $c; # concateneaza $b cu $c
$a = $b x $c; # $b repetat de $c ori
Despre tablouri asociative se va vorbi intr-un paragraf ulterior. Variabilele scalare se pot recunoaște prin faptul ca numele lor este prefixat cu '$'. Deci, variabila "a" va fi "$a". Elementele tablourilor sunt scalare, deci ele vor fi referite tot prefixate cu '$'.
Operatori asupra tablourilor.
Tablourile sunt in Perl indexate incepand cu 0, similar C-ului. Astfel, primul element dintr-un tablou este referit ca : $v[0]; in vreme ce ultimului ii corespunde referinta : $v[$#v];
Adaugarea unui element la un tablou se poate face cu functia push(): push(@a, $val);
Se permite de asemenea si adaugarea unui tablou la un alt tablou : push(@a, @b);
Extragerea unui element dintr-un tablou este rezultatul apelului functiei pop() : $elm = pop(@a);
Contexte:
Contextul determină modul in care este interpretată o operație sau o valoare in Perl. Exista doua contexte majore : contextul scalar si contextul de listă. O operatie de atribuire de forma : L = R; comporta o discutie asupra contextului in care este executată. Astfel, daca L are context scalar, atunci expresia R este de asemenea evaluată intr-un context scalar. Daca L insă are context de listă, expresia R este evaluată intr-un context de listă. Spre exemplu, ($a, $b) = @f;
va pune in $a elementul $f[0], iar in $b elementul $f[1]. Daca scriem insă : ($a, @r) = @f;
in $a se va găsi $f[0], restul vectorului @f, incepând cu $f[1], urmând a se gasi in tabloul @r. In fine, atribuirea :
(@r, $a) = @f;
va pune in @r tot vectorul @f (deci tablourile in Perl "inghit" tot ce este posibil), in timp ce $a va rămâne nedefinit.
Intr-un context scalar, un tablou se evaluează la lungimea sa. Deci, predicatul :
scalar(@v) == $#v + 1
este intotdeauna adevărat.
Fișiere.
Fisierele sunt in Perl reprezentate prin variabile denumite cu litere mari. In exemplul următor, se va deschide un fisier și se va stoca intr-un tablou informația din el :
$f = '/export/home/bogdan/foo.txt';
open(HANDLE, $f); # deschiderea fisierului
@v = <HANDLE>; # citirea efectiva din fisier in tablou
close(HANDLE);
print @v; # tipărirea conținutului tabloului
Programul de mai sus are deci efectul comenzii UNIX "cat".
Este posibila specificarea modului in care fisierul este deschis :
pentru intrare : open(HANDLE, $f);
pentru ieșire : open(HANDLE, ">$f");
pentru adaugare la sfârsșt : open(HANDLE, ">>$f");
Dupa deschiderea pentru scriere, scrierea efectivă într-un fișier se poate face cu : print HANDLE "Written directly into file\n";
Fișierele de intrare și ieșire standard pot fi deschise prin : open(INHANDLE, '-');
open(OUTHANDLE, '>-');
In exemplul de mai sus, se vor citi toate liniile din fișier, datorita faptului ca variabila @v este un tablou. Utilizarea unei variabile scalare $v ar fi condus la citirea unei singure linii, terminate printr-un caracter '\n' (newline).
3.2.1 Structuri de control in limbajul Perl
1) Foreach
Această structură este destinată prelucrărilor linie cu linie pentru tablouri sau orice structuri de listă. Forma generală a instructiunii foreach este : foreach $item (@list)
{
…
}
Variabila $item este pe rand legată la fiecare element al listei @list, efectuându-se prelucrările din corpul ciclului foreach. Foreach va executa deci un numar de iteratii egal cu numarul de elemente din listă. În cazul în care lista este vida, corpul ciclului nu este executat niciodată.
2) Condiții
Condițiile sunt expresii de un tip aparte : tipul logic sau boolean. Pentru formarea condițiilor, exista operatorii relaționali si cei logici. Valorile de adevăr sunt reprezentate in Perl de o maniera similara C-ului, adica :
"true" este reprezentat prin orice numar nenul sau orice sir de caractere nevid;
"false" se reprezintă prin numarul zero, un șir de caractere vid, sau șirul de caractere "0";
Operatori relaționali
$a == $b comparație de egalitate
$a != $b comparație de ne-egalitate
$a eq $b comparație de egalitate între string-uri
$a ne $b comparație de ne-egalitate între string-uri
(mnemonicile de "eq" si "ne" vin tocmai din "negura" FORTRAN-ului !)
Operatori logici
($a && $b) operația de conjuncție ("SI" logic)
($a || $b) operația de disjuncție ("SAU" logic)
!($a) operația de negație logică
3) Ciclul "for"
Ciclul "for" din Perl este similar cu instructiunea "for" din C :
for(expr1; expr2; expr3)
{
instrucțiuni;
}
Aceasta structură este echivalentă cu secvența :
expr1;
while(expr2) {
instrucțiuni;
expr3;
}
Expresia expr2 este logica (booleană). Cât timp aceasta este adevarată, se execută instrucțiunile din corpul ciclului, apoi secvența expr3.
4) Ciclurile "while" si "until"
Acestea sunt de forma :
while(expr) {
instrucțiuni;
}
until(expr) {
instrucțiuni;
}
Diferența dintre cele doua instrucțiuni constă în modul în care condiția este pusă : la while, corpul ciclului este executat cât timp condiția este adevarată, in timp ce la until,indeplinirea condiției atrage părăsirea ciclului.
Ciclurile "while" si "until" se pot transforma în cicluri cu test final prin includerea particulei "do" :
do {
instrucțiuni;
} while(expr);
Ciclurile cu test final asigură cel puțin o execuție a corpului lor.
5) Instrucțiunea "if"
Aceasta are in Perl doua forme. Prima este adecvată deciziei simple
if(expr) {
secvența;
}
else {
secvența;
}
Cea de-a doua forma se folosește pentru decizii multiple :
if(expr) {
…
}
elsif(expr) {
…
}
else {
…
}
3.2.2 Tablouri asociative. Subrutine
1) Tablouri asociative
Tablourile obișnuite permit accesul la elementele lor prin specificarea unui index numeric. Spre exemplu, primul element din tabloul @v este referit prin $v[0]. Spre deosebire de alte limbaje (C, Pascal etc.), in Perl se pot crea tablouri indexate dupa șiruri de caractere. Acestea se numesc tablouri asociative. In scriere, ele apar prefixate cu semnul "%" in loc de "@".
Operatori caracteristici tablourilor asociative
Tablourile asociative nu au o relatie prestabilita de ordine a elementelor. Se pot accesa pe rând
1.cheile de cautare, utilizand funcția keys() :
foreach $key (keys %a) {
# prelucrare specifica fiecărei chei
}
2.valorile stocate in tablou, cu ajutorul funcției values() :
foreach $val (values %a) {
# prelucrare specifica fiecărei valori
}
Ordinea in care keys si values întorc elementele tabloului nu are nimic de-a face cu ordinea in care acestea au fost întroduse.
Un alt operator util este each(), care intoarce o lista cu doua elemente : o cheie din tablou și valoarea asociată acesteia. La fiecare apel, each() întoarce o alta pereche, pana când parcurge întreg tabloul :
while(($country, $capital) = each(%capitals))
{
print "The capital of $country is $capital\n";
}
2) Variabile de mediu
La rularea unui program într-un sistem de operare (UNIX) există un numar de parametri setați. Acești parametri sunt variabilele de mediu. Un program Perl iși gaseste variabilele de mediu in tabloul asociativ %ENV. Spre exemplu, codul :
while(($var, $val) = each(%ENV))
{
print "$var = $val\n";
}
listeaza toate setările de variabile de mediu existente.
3) Subprograme
Ca orice limbaj de nivel inalt, Perl permite programatorului să-și definească subprograme. Acestea pot fi plasate oriunde în textul programului; pentru claritate, este de preferat sa fie toate la început, sau toate la sfarsit. Definitia unei proceduri are forma :
sub nume_subprogram { … cod specific}
A se remarca o diferența fundamentală față de alte limbaje de programare : absența parametrilor formali. Astfel, apelurile :
&p
&p($_);
&p(1+2, $_);
sunt toate trei potențial corecte, ceea ce nu se intâmpla in alte limbaje, unde compilatoarele verifică strict numarul parametrilor de apel și tipul acestora.
Parametrii actuali (de apel) ai unei proceduri se gasesc in variabila speciala @_. Fiecare din parametri poate fi regasit pe baza poziției sale, prin referințe de genul $_[0], $_[1], … . De notat că nu trebuie făcute confuzii între parametrii procedurilor ($_[0], $_[1], …) și variabila speciala $_.
O procedura intoarce intotdeauna ceea ce evaluează ultima dată (aceasta este o modalitate preluată din limbajele de programare functională, gen LISP, Scheme etc.).
Prelucrări de șiruri de caractere in Perl
Operațiile asupra șirurilor de caractere in Perl au la baza mecansimul de expresii regulate (ER), existent in sistemele UNIX.
1) Expresii regulate
Acestea sunt incluse între slash-uri. Operatorul de potrivire de expresii (pattern matching) este "=~". Spre exemplu, instrucțiunea :
if($sentence =~ /the/) { … }
testeaza daca variabila $sentence conține subșirul "the". Expresiile regulate sunt case-sensitive, ca de altfel in majoritatea limbajelor de programare (C, Java etc.)
Operatorul "!~" întoarce true dacă detectează o nepotrivire, fiind negația logică a lui "=~"
2) Variabila speciala "$_"
Testele de genul celui de mai sus apar foarte frecvent in programele care conțin prelucrari de șiruri de caractere. Pentru a simplifica forma acestui test, in Perl s-a întrodus o variabilă scalară specială, "$_", Acesteia i se atribuie șirul care trebuie comparat, după care comparația se face mai simplu :
$_ = $sentence;
if(/the/) {…}
Variabila "$_" este implicit utilizată pentru multe operatii in Perl. Se tinde catre o folosire foarte frecventă a ei, datorită simplificărilor pe care le aduce in scrierea codului.
3) Construcția expresiilor regulate
Expresiile regulate complexe conțin o groaza de caractere speciale, care de care mai ciudate la o prima privire. Majoritatea acestora provin din UNIX. Iata cateva dintre cele mai frecvent întâlnite :
. Orice caracter, mai puțin "newline";
^ Inceputul unei linii sau al unui șir de caractere;
$ Sfârșitul unei linii/unui șir de caractere;
* Zero sau mai multe apariții ale ultimului caracter din expresie;
+ Una sau mai multe apariții ale ultimului caracter;
? Ultimul caracter sau nimic;
[qwe] Orice caracter din cele din paranteze;
[^qwe] Orice caracter diferit de cele din paranteze;
[a-r] Orice caracter cuprins între 'a' și 'r';
[^A-R] Nici unul dintre caracterele dintre 'A' si 'R';
a|b a sau b
(ab)+ ab, abab, ababab, …
\n newline;
\t tab;
\s caracter "whitespace" : newline, tab etc;
\b margine de cuvânt;
\B un caracter care nu este o margine de cuvânt;
\| bara verticală;
\) paranteza inchisă;
4) Substituții și translații
Funcția de substituție "s" funcționeaza similar cu substituția din editoarele binecunoscute UNIX "vi" si "sed". Și operatia de substituție utilizează implicit variabila speciala "$_" daca operatorul "=~" este omis. Astfel, în loc să scriem :
$sentence =~ s/sir1/sir2/;
se poate scrie mai simplu :
$_ = $sentence;
s/sir1/sir2/;
În acest mod, se substituie numai prima apariție a șirului șir1 în șirul $sentence. Pentru o substituție globală (a tuturor aparițiilor), se utilizează flag-ul "g" dupa ultimul slash :
s/sir1/sir2/g;
Daca dorim o substituție care să ignore diferențele dintre literele mari si mici (case-insensitive), se folosește flagul "i" :
s/șir1/șir2/gi;
De multe ori, apare ca necesară memorarea pattern-urilor care s-au potrivit, in scopul refolosirii ulterioare. Modelele respective sunt memorate in variabile speciale, numerotate $1, $2, …, $9. În cadrul expresiei regulate (sau substituției) aceste modele pot fi referite ca \1, \2, …, \9. Iată un exemplu :
$_ = "The Last Time I Cried";
s/([A-Z])/:\1:/g; print "$_\n";
Se vor înlocui aparițiile literelor mari din șir cu acele litere, inconjurate de caracterul ':'.
OBSERVATIE. Variabilele $1, …, $9 sunt read-only; ele nu pot fi modificate pur și simplu de către utilizator.
Exemplul urmator determină cuvinte care se repetă într-un text :
if(/(\b.+\b) \1/) { print "Found $1 repeated\n";}
în timp ce următorul schimbă primul caracter cu ultimul în variabila $_ :
s/^(.)(.*)(.)$/\3\2\1/;
Variabilele speciale $` ($ si backquote), $& si $' ($ si quote) au semnificația de :
$` – șirul de caractere dinaintea unei potriviri;
$& – șirul de caractere care se potrivește;
$' – șirul care apare după potrivire.
Astfel, pentru exemplul :
$_ = "Something Else Again"; /thi/;
urmatoarele afirmații sunt adevarate :
$` eq "Some";
$& eq "thi";
$' eq "ng Else Again";
Între slash-urile unui test de potrivire sau ale unei substituții, se face expandarea variabilelor. Astfel, se poate scrie ceva de genul :
$x = "the";
s/${x}re/here/g;
exemplu care face înlocuirea cuvintelor "there" cu "here" intr-un text.
Funcția de translație "tr" permite translația caracter cu caracter. Spre exemplu, dacă dorim să înlocuim simultan caracterele 'a' cu 'e', 'b' cu 'd' și 'c' cu 'x' intr-un text este mai comod să scriem $sentence =~ tr/abc/edx/;
În cadrul funcției de translație, majoritatea caracterelor speciale din expresiile regulate nu pot fi folosite. O exceptie o constituie liniuța '-' care iși pastrează semnificația de delimitător al unui domeniu. Spre exemplu, conversia la litere mari se poate face cu : tr/a-z/A-Z/;
4 principiile de organizare A sistemelor e-mail client/server.
Pentru a începe proiectarea sistemului poștal-electrinc e necesar de a studia o mulțime de principii de organizare al acestor sisteme. De ales protocoale necesare la construirea sistemului. Deci în lucrarea dată vom analiza părțile principale necesare pentru a a efectua un așa sistem ca să fie lucrat cum este arătat pe figura 16.
Fig.16 Schema de baza al procesului de trimiterea mesajelor
Figura 1 arată o schema generală al procesului de trimiterea-obținerea mesajului poștal. O scrisoare trimisă sau primită prin intermediul poștei electronice este alcătuită asemănător unei scrisori obișnuite dintr-un "plic", care conține adresele expeditorului și destinatarului (precum și alte informații caracteristice numai poștei electronice) și corpul scrisorii. Corpul unei scrisori, conținând mesajul propriu-zis care urmează să fie trimis, este asemănător cu cel conținut într-o scrisoare obișnuită. Informațiile corespunzătoare celor scrise pe plic sunt grupate în cazul mesajului electronic la începutul scrisorii, sub forma unui antet (header în limba engleză). Aceste informații sunt utile în primul rând serviciului de trimitere a mesajului pentru a ști cum să-l manevreze astfel încât acesta să ajungă la destinație. O parte din aceste informații trebuie completate de către expeditor; altele sunt adăugate automat de către serviciul folosit în momentul trimiterii mesajului sau pe parcursul procesului de distribuire a mesajului. Multe din ele nu interesează nici expeditorul, nici destinatarul. Se vor descrie în cele ce urmează câteva din aceste informații care sunt utile destinatarului, pentru a afla numele și adresa expeditorului alături de alte elemente ce caracterizează un anumit mesaj primit, precum și informații pe care trebuie să le furnizeze expeditorul la trimiterea unui mesaj.
4.1 Adrese poștale
Vom considera o rețea care este reprezentată pe figura 17. Ea este construită din trei situri (trei noruri), care sunt interconectate prin linii de înaltă viteză (linii groși). Fiecare din situri reprezintă un DNS domen, construit dintr-o mulțime de calculatoare individuale. Fiecre domen este setat diferit, cum va fi arătat mai jos, dar din punct de vedere al utilizatorului, procesul de trimitere poștei dintr-o mașină intr-un domen la alta mașină in alt domen este asemănător în toate cazurile.
Fig.17 Domene într-o rețea
Numele domenului se citește de la stînga la driapta. De exemplu com în acme ne spune că acme este o parte din domenul de nivel superior com (pentru comerție).
Un domen poate fi construit din mai multe calculatoare, fiecare mașină în interiorul domenului are un nume domen unicală, care este construit din hostname , punct, și apoi numele domenului. În principiu nu contează dacă numele este scris cu litere mari sau mici, dar iarăși, se recomandă folosirea constantă a unei singure scrieri.
4.1.1 Domenul dc.gov
Pe figura 18 este arătat domen din interior. El este construit din trei mașini, care sunt conectate intr-o rețea privată pentru securitatea. (linii îngoșate). Numai o mașină este conectată spre inferior (Outside World) fbi.dc.gov . Poșta din inferior întotdeauna vine mai întîi spre fbi.dc.gov și de aici mesajul vine spre reția internă la o mașină apropiată. De exemplu un utilizator George întotdeauna primește poșta la mașina lui (wash.dc.gov) , dar numai după ce acest mesaj va trimis prin fbi.dc.gov
Fig.18 dc.gov domen este accesibil numai prin fbi.dc.gov
fbi.dc.gov este numită gateway deoarece el formiază o poartă dintre reția interioară și cea inferioară prin care tot trafic al rețelei este necesar să triacă prin el. Mesajul ce va fi adresat spre domen (dc.gov în loc de o mașină specifică ca de exemplu wash.dc.gov) va fi trimis spre mașina gateway. Din neplăcere în cazul nostru gateway nu știe despre celelalte utilizatorii în domen și deci mesajul de exemplu ([anonimizat]) nu va vi primit nici de un utilizator și va fi pierdut.
4.1.2 Domenul acme.com
Pe figura 19 este arătat acme.com domen. El se diferă de .dc.gov prin aceea că toate mașine sunt conectate spre exterior și între dănșii.
Fig.19 Toate mașine în acme.com sunt conectate spre exterior
Toate mașinile pot direct să primesc mesajele din exterior. De exemplu utilizatorul tim primește și citește mesajul lui pe calculatorul boss.acme.com, dar totuși în această schemă lipsește gateway.
Ca și în fbi.dc.gov , calculatorul sec.acme.com va primi toate adresele poștale la domenul acme.com . Dar acme.com spre deosibire de fbi.dc.gov știe despre toate utilizatorii în domen. Deci mesajul la [anonimizat] va fi corect retremisă la tim spre boss.acme.com.
4.1.3 Domenul us.edu
Pe figura 20 este aratată calea a treilia la setarea domenului.În acest domen toate mesajele sunt trimise spre mail.us.edu .Spre deosebire de celelalte modele în această schemă nici un mesaj nu este trimis spre calculator. Dar în loc de aceasta mesajele sunt trimise intr-un directoriu master spool pe mail.us.edu .Și toate mașinele pot să fac mount la acest directoriu și deci toate calculatoarele pot citi poșta.
Fig.20 Numai mail.us.edu primește poșta în domenul us.edu
Folosind aceast system , fiecare adresa trebuie să conțină numai nume recipientului local, o @, și numele domenului (de exemplu [anonimizat]). Așa organizare dă posibilitatea de a nu știe numele specific al mașinei.
4.2 Descrierea Protocoalelor utilizate în procesarea poștei electronice
Există o serie de protocoale elaborate special pentru managering de mesaje. Unii servesc numai cu un scop de a trimite mesaje protocol SMTP, alții pentru citirea informației din boxul poștal de exemplu POP, IMAP. Deoarece proectul a fost elaborat cu referința a protocoalelor SMTP și POP3, aceste vor vi descriși mai departe.
4.2.1 Protocolul SMTP
Scopul principal al protocolului Simple Mail Transfer Protocol (RFC-821 ,-822) este asigurarea transportării sigure si eficiente a mesajelor poștei electronice. SMTP prezintă un subsistem foarte independent, ce necesită numai un canal bun de legătură. În terminologie modelului OSI protocolul SMTP deși se află la nivelul de aplicații, are posibilitatea să comunică numai cu TCP/IP ce sunt aflate pa al patrulia nivel de transport, vezi figura 21.
Fig.21 Nivelul protocolului SMTP în modelul OSI
Protocolul SMTP se baziază pe următorul model de cominicare: ca răspunsul la cerere utilizatorului programul poștal – expiditor stabilește o legătură dublă cu programul poștal – recipient (TCP, portul 25). Expeditor poate fi un utilizator intermediar sau direct (principal). SMTP comanda să generiază de către expeditor șă se trimite la destinatar. Pentru fiecare comandă e necesar să fie răspuns.
Cînd canalul este organizat, expeditor trimite comandă MAIL, identificîndu-se. Dacă destinatarul este gata la obținerea scrisorii, el trimite un răspuns pozitiv. Mai departe expeditorul trimite comanda RCPT, astfel identificîndu-l pe destinatarul al mesajului poștal. Dacă destinatarul poate primi mesajul pentru destinătarul principal, el încă-o dată trimite un răspuns pozitiv. În caz contrar el refuză primirea mesajului pentru destinatarul dat, dar nu pentru toată trimitere. Acțiunea reciprocă cu serverul poștal poate fi făcută și în regim dialogat, de exemplu:
Serverele SMTP poate întreține un dialog cu mai multe destinatarii. Fiecare mesaj poștal se sfîrșește cu o serie de simboluri speciali. Dacă destinatarul a terminat procedeu de primire cu succes el trimite un răspuns pozitiv.
Protocol SMTP asigură transmiterea mesajului poștal direct spre utilizatorul principal, cănd ei sunt legați între sine. În caz contrar procesul de transmitere poate fi efectuat prin mai multe ”stații poștale” intermediare. Pentru rezolvarea problemei date serverul-SMTP trebuie să știe numele utilizătorului principal și denumirea boxului poștal al locului de destinație. Ca argumentul comenzii MAIL este adresa expeditorului (adresa de întoarcere), argumentul comenzii RCPT- adresa destinatorului. Adresa de întoarcere se folosește în cazul erorii.
Toate răspunsurile au coduri numerice. Comenenzi, răspunsuri și nume calculatoarelor nu sunt sensibile la registru. Aceasta nu se referă la scrierea numelor și adreselor destinatarului.
Mulți de sisteme poștale lucrează numai cu coduri ASCII. Dacă canalul de transport lucrează numai cu octeți, codurile de 7 biți vor fi completate cu bitul al optulia. Pentru transportarea fișierilor prin SMTP ca standart se folosește procedura de transformare a datelor UUCODE/UUDECODE, care transformă fișierul binar intr-un masiv de simboluri, acceptabili pentru transferul prin SMTP.
Cum a fost spus, procedura de trimitere al mesajului poștal se începe cu comanda MAIL, ce are următorul format:
MAIL <SP> FROM:<reverce-path><CRLF>, unde
<SP> – spațiu, <CRLF> – combinația de coduri de întoarcere cursorului și a liniei noi (#015#012), dar <reverce-path> – adresa de întoarcere.
Aceasta comanda spune, că startează o procedura nouă și este necesar de pus la zero toate tabelele de status, buferele ș.a. Dacă o comandă s-a dus pozitiv, destinatarul reacționează prin răspunsul: 250 OK.
Argumentul <reverse-path> poate conține nu numai adresa boxului poștal: <reverce-path> în cazul de bază este o listă de adrese serverilor, prin care a fost dus mesajul dat, incluzînd, desigur, și adresa boxului poștal al expeditorului. În primul loc în lista <reverce-path> stă adresa expeditorului. După comanda MAIL se trimite comanda:
RCPT <SP> TO:<forward-path><CRLF>.
Aceasta comanda arată adresa destinatarului <forward-path>. Dacă comanda s-a dus pozitiv destinatarul trimite codul răspunsului 250 OK și memorează adresa obținută. Dacă destinatarul este necunoscut, serverul SMTP va trimite răspunsul 550 Failure reply. Comanda RCPT poate să repete o mulțime de ori, dacă destinatarul nu este unic.
Argumentul <forward-path> poate să conține nu numai adresa boxului poștal, dar și o lista de marșrute căilor spre dînsu. La primul loc în această lista trebuie să staie numele calculatorului, ce a obținut pe aceasta comanda. La sfîrșire a acestui etap se trimite mesajul propriu-zis.
DATA <CRLF>
Dacă aceasta comanda a fost primită corect serverul-SMTP reacționează prin trimiterea răspunsului 354 Intermediate reply (răspunsul intermediar) și reacționează la toate rîndurile următoare ca un text poștal. La obținerea codului de sfîrșitul textului se trimite răspunsul: 250 OK.
Ca semnul de sfîrșire al mesajului poștal este un punct la începutul rîndului, după care merge combinșia <CRLF>.
În anumite cazuri adresa punctului de destinație poate să conține o eroare, dar destinatarul știe adresa corectă. Atunci sunt posibile două variante al răspunsului:
251 User not local; will forward to <forward-path> (destinatarul ie responsabilitate, la obținerea mesajului. Aceasta poate să întîmplă cînd destinatarul, de exemplu, a migrat în alta subreția în limitele zonei de acțiune a acestui server);
551 User not local; please try <forward-path> (destinatarul știe adresa corectă și propune expeditorului de readresat mesajul după adresa <forward-path>).
SMTP are comenzi pentru verificarea corectitudinii numelui destinatarului (VRFY) și a extensiei listei de adrese. Ambii comenzi în calitate de argumenți se folosesc rînduri de simboluri (în cîteva cazuri aceste doi comenzi după funcționalitatea sunt identice). Pentru comanda VRFY ca paramentru servește numele utilizatorului, iar răspunsul poate să conține numele lui și adresa boxului poștal.
Ca reacție spre o comanda VRFY depinde de argumentul. Deci, dacă dintre clienții serverului poștal sunt doi utilizatori cu numele Ivaniv, răspunsul la comanda ”VRFY Ivanov” va fi "553 User ambiguous". În cazul de bază aceasta comanda poate obține în calitate de răspunsuri următorii răspunsuri:
250 Vasja lvanov <[anonimizat]>;
251 User not local; will forward to <[anonimizat]>;
550 String does not match anything (acest rînd n-are nici un sens);
551 User not local; please try <[anonimizat]>;
VRFY Chtozachertovchina 553 User ambiguous (numele nu există).
În cazul listei de adrese răspunsul va ocupa cîteva rînduri, de exemplu:
EXPN Example-People 250-Juri Semenov <[anonimizat]> 250-Alexey Sher <[anonimizat]> 250-Andrey Bobyshev <[anonimizat]> 250-lgor uursky <[anonimizat]>.
Pentru deschiderea și închiderea canalului comunicațional sunt folosite următorii comenzi:
HELO <SP> <domain> <CRLF>, где <domain> -numele domenului cerut, QUIT <CRLF>.
Expresie <forward-path> poate fi un marșrut, ce are forma ”@ONE,@TWO:VANJA@THREE”, une ONE,TWO,THREE sunt numele calculatorului.
4.2.2 Protocolul POP3
Prescurtarea POP provine de la denumirea protocolului în limba engleză – Post Office Protocol. De fapt, pînă acum am pus în discutie protocolul SMTP care permite trimiterea mesajelor electronice prin sistemul de postă al Internetului. Protocolul despre care vom discuta în continuare permite citirea mesajelor sosite în mailbox, de pe orice calculator din Internet.
Practic, POP lucrează în acelasi fel si după aceleasi principii ca si SMTP. Cu diferenta introdusă prin cele cîteva comenzi pe care un client le utilizează, operatiile POP sînt identice cu cele ale SMTP. Un server POP se situează între agentul utilizator (PINE) si căsutele de postă electronică.
În prezent există două versiuni ale acestui protocol, POP2 si POP3, care nu au nici o legătură între ele – nu sînt compatibile. Altfel spus, POP3 nu reprezintă o dezvoltare a lui POP2. POP2 se apropie foarte mult de SMTP. POP3, în schimb, încearcă să rezolve probleme legate de accesul de la distantă.
În trecut, în cazul multor retele, sistemul de postă electronică trimitea scrisorile pe o anumită statie de lucru. Acest fapt se întîmpla în ideea că un utilizator folosea întotdeauna acelasi calculator. Problema apare atunci cînd utilizatorul schimbă frecvent statiile de lucru sau partajează statia de lucru cu alti colegi.
4.2.3 Principiul de lucru al protocolului POP3
Modelul care stă la baza protocolului POP3 constă într-o statie de lucru aflată la distantă care actionează strict ca si un client al sistemului de transport al mesajelor. În cadrul acestui model, POP este utilizat pentru citirea scrisorilor din cutia postală pe cînd SMTP este utilizat pentru trimiterea postei. Cu alte cuvinte, PC-ul utilizează doi agenti pentru interfatarea cu sistemul de transport al mesajelor. Proiectantul protocolului POP3 se referă la acest model utilizînd sintagma split-User Agent.
Această versiune a protocolului POP, defineste trei faze ale unei sesiuni: autorizarea, tranzactionarea si actualizarea. După ce se stabileste conexiunea între clientul POP3 si serverul POP3, sesiunea întră în faza de autorizare. În această fază, clientul se prezintă serverului. Dacă faza se termină cu succes, serverul deschide cutia postală si sesiunea intră în faza de tranzactionare. În această fază, clientul poate cere serverului POP3 anumite informatii (ca de exemplu listarea scrisorilor existente în cutie) sau executarea unor actiuni (precum preluarea unui anumit mesaj). Desi POP3 defineste cîteva comenzi, el contine doar un număr de două replici. Replica +OK reprezintă un indicator pozitiv si semnifică faptul că actiunea s-a terminat cu succes. Textul -ERR este un indicator negativ reprezentînd faptul că actiunea initiată n-a putut fi terminată.
Autorizarea unui utilizator începe prin transmiterea comenzii USER avînd ca parametru numele. Dacă serverul transmite replica +OK atunci comanda următoare trebuie să fie PASS, avînd ca parametru o parolă.
Se pot folosi parole, prin care clienții POP se autentificâ la se/ver-ele POP. Din păcate însă, mai mulți clienți folosesc aceeași parolă, ceea ce-i sporește vulnerabilitatea. Fiind transmise frecvent și spre același port, parolele pot face obiectul unor interceptări prin "ascultarea" pachetelor corespunzătoare. De exemplu, atunci când un client se conectează la un server POP3, server-ul trimite un șir care conține, între paranteze ascuțite, o marcă de timp:
+OK POP3 server ready <[anonimizat]>
Programul client trimite numele și parola:
+OK POP3 server ready <[anonimizat]>
CLIENT: USER iiacob
SERVER: +OK
CLIENT: PASS parola
SERVER: +OK iiacob’s maildrop has 14 messages (14 336 octets) …
Se poate folosi opțiunea APOP, ceea ce permite o autentificare de tip întrebare/raspuns, protocol numit și POP3. în acest caz, programul client nu va mai trimite comenzile user și pass. în schimb, se va trimite comanda APOP – care conține numele și un șir hexa de 128 de biți, care reprezintâ prelucrarea cu funcția MD5 a adresei (inclusiv parantezele ascuțite) – și a unei fraze cunoscute atât de clientul autentic cât și de server. Dacă, de exemplu, această frază-parolă este brasov, atunci programul client va trebui să calculeze valoarea MD5 a șirului:
<[anonimizat]>brasov
care este:
13cd45fe65da458afa527645fa6e8f9b
Ca urmare, mesajul APOP trimis către server va fi:
CLIENT: APOP iiacob 13cd45fe65da458afa527645fa6e8f9b
SERVER: +OK iiacob’s maildrop has 14 messages (14 336 octets) …
După ce serverul autentifică utilizatorul, sesiunea intră în faza de tranzactionare. Comanda STAT cere serverului să transmită numărul mesajelor din cutia postală si spatiul ocupat de acestea.
CLIENT: STAT
SERVER: +OK 14 14336
Comanda LIST (fără parametri) listează identificatorii mesajelor si, în dreptul acestor identificatori, spatiul ocupat de fiecare mesaj. Dacă LIST primeste un parametru atunci listează informatii despre mesajul specificat.
CLIENT: LIST
SERVER: +OK 14 messages (14 336 octets)
SERVER: 1 1024
SERVER: 2 2048
SERVER: 3 512
SERVER: …………
Există comanda TOP msg n , după care utilizatorul poate să obține primele n rînduri al mesajului msg. De exemplu:
СLIENT: ТОР 1 10
SERVER: +OK
SERVER: <header>
SERVER: <blank>
SERVER: <message body>
SERVER: .
Următorul exemplu arată modul în care se initiază o actiune. Comanda RETR aduce mesajul specificat într-un buffer local alocat de către program (agentul utilizator).
CLIENT: RETR 1
SERVER: +OK 1024 octets
SERVER: <serverul POP3 trimite întregul mesaj aici>
SERVER: .
După obținerea mesajului acest poate fi marcat la ștergerea din boxul poștal prin comanda DELE msg, unde msg numărul mesajului. De exemplu:
СLIENT: DELE 1
SERVER: +ОК message 1 deleted
Sau:
СLIENT: DELE 2
SERVER: -ERR message 2 already deleted
Comanda QUIT este utilizată de către client la terminarea tranzactionării, reprezentînd semnalul că transmisia s-a încheiat.
4.2.4 Exemplu de script de conversație prin protocolul POP3
SERVER: <wait for connection on TCP port 110>
CLIENT: <open connection>
SERVER: +OK РОРЗ server ready
СLIENT: USER mrose
SERVER: +OK mrose is a real hoopy frood
СLIENT: PASS secret
SERVER: +OK mrose's maildrop has 2 messages (320 octets)
СLIENT: STAT
SERVER: +OK 2 320
СLIENT: LIST
SERVER: +OK 2 messages (320 octets)
SERVER: 1 120
SERVER: 2 200
SERVER: .
СLIENT: RETR 1
SERVER: +OK 120 octets
SERVER: <the РОРЗ server sends message 1>
SERVER: .
СLIENT: DELE 1
SERVER: +OK message 1 deleted
СLIENT: RETR 2
SERVER: +OK 200 octets
SERVER: <the РОРЗ server sends message 2>
SERVER: .
СLIENT: DELE 2
SERVER: +OK message 2 deleted
СLIENT: QUIT
SERVER: +OK dewey РОРЗ server signing off (maildrop empty)
СLIENT: <close connection>
SERVER: <wait for next connection>
4.3 Standartul poștal MIME
Standartul MIME reprezintă descrierea de transmitere a fișierilor grafice, audio, de tip aplicație ș.a.
4.3.1 Descrierea generală standartului MIME
În cadrul documentului RFC 1521 (Borenstein si Bellcore, 1993) se defineste asa zisa extensie MIME, care aduce unele dintre cele mai interesante completări pentru sistemul de postă electronică. De fapt, această extensie a apărut ca urmare a necesitătii de a transmite pe Internet unele informatii de natură diferită (imagini grafice, fisiere video, fisiere audio, aplicatii) respectîndu-se restrictiile impuse de NVT – coduri pe 7 biti. De asemenea, atunci cînd se transmit texte care contin caractere din setul ASCII extins (cu codul mai mare decît 127, caractere cu diacrit ice) este nevoie de o metodă care prezervă bitul al optulea – iarăsi din cauza limitării impuse de NVT.
Extensia MIME adaugă cinci noi cîmpuri header-ului mesajelor de e-mail: versiunea MIME, tipul continutului, metoda de codificare a continutului, identificator continut, descrierea continutului.
Pe măsură ce MIME evoluează, se schimbă si numărul versiunii. Cîmpul versiunea MIME specifică versiunea extensiei suportată de agent. Prin identificarea versiunii MIME folosite la generarea mesajului, cîmpul previne agentii utilizator să interpreteze gresit mesajele prin utilizarea unei versiuni MIME incompatibile. Structura acestui cîmp va fi următoarea:
MIME-Version: 1.0
Deoarece în viitor acest standart poate fi extins formula generală pentru acest rînd se va scrie în felul următor:
versiunea := ”MIME-Version” ”:” 1*DIGIT ”.” 1*DIGIT
Următorul cîmp, denumit tipul continutului (Content-Type), identifică tipul datelor incluse în mesaj: text, mesaj electronic, aplicatie, imagine, audio, video.
Structura generală cîmpului Content-type:
conținutul := "Content-Type" ":" tip "/" subtip *(";" parametru)
;insensibil la registru cît tip atît și subtip
tip := "application" / "audio"
/ "image" / "message"
/ "multipart" / "text"
/ "video" /tipul nestandart
;toate valorile sunt insensibile la registru
tip nestandart := x- / iana-
iana- := <extensie, registrată la aplicația "E" RFC 1521>
x- := <Două simboluri succesive "X-" sau "x-", fără spațiu
sau un alt simbol între dînșii>
subtip := cuvînt ;insensibil la registru
parametru := atribut "=" valoarea
atribut := cuvînt
valoarea := cuvît /rînd în acoloade
cuvînt := orce simboluri ASCII în afara de spațiu, Ctrl-succesiunilor și simbolurilor speciale
simboluri speciale:= "(" / ")" / "<" / ">" / "@"
/ "," / ";" / ":" / "\" / <">
/ "/" / "[" / "]" / "?" / "="
Cîmpurile identificator continut si descrierea continutului sînt optionale. Identificator continut poate fi folosit de către agentii utilizator pentru identificarea entitătilor MIME. Descriere continut este un cîmp ce poate contine o descriere generală a mesajului.
Cîmpul denumit metoda de codificare a continutului (Content-Transfer-Encoding), indică una din tehnicile MIME utilizate pentru codificarea datelor mesajului.
Structura cîmpului Content-Transfer-Encoding:
codificarea := "Content-Transfer-Encoding" ":" mecanizm
mecanizm := / "7bit" ;
/ "quoted-printable" ;
/ "base64" ;
/ "8bit" ;
/ "binary" ;
/ x-token;
Toate mecanisme de coificare, determinate în standartul MIME codific datele în orice formă simbolică. Așa de exemplu dacă corpul scrisorii are următoare formă:
Content-Type: text/plain; charset=ISO-8859-1
Content-transfer-encoding: base64
Această însemnă că corpul scrisorii reprezintă din sine codul ASCII al datelor codate în Base64, care în reprezentarea normală au codarea ISO-8859-1, și vor fi în această formă după decodarea.
4.3.2 Scheme de codificare MIME
Quoted printable este o metodă de codificare eficientă pentru cazul în care există o cantitate mică de date ce utilizează si al optulea bit. Această codificare, transmite fiecare caracter ca pe o secventă de trei octeti. Secventa de trei octeti începe cu semnul = (egal). Imediat după aceea, se transmit doi octeti care reprezintă cifrele codului hexazecimal al caracterului.
Desi caracterele din sirul COMPUTER PRESS AGORA nu prezintă al optulea bit setat, ele pot fi folosite pentru exemplificarea acestei metode de codificare. Aici, am reprezentat sirul cu ajutorul codurilor hexazecimale, care codifică șirul COMPUTER PRESS AGORA utilizînd metoda quoted-printable a extensiei MIME:
=43=4F=4D=50=55=54=45=52=50=52=45=55=55=41=47=4F=52=41
Să facem o analiză. Primul caracter al sirului, este vorba de C, are codul hexazecimal 0x43. Codul caracterului O este 0x4F si asa mai departe. În cazul literei C, cu ajutorul acestei scheme de codificare, se transmit trei caractere în loc de unul. Primul cod este cel al semnului = (egal)- 0x3D, pe a doua pozitie se va transmite codul cifrei 4 în final apărînd codul cifrei 3.
După cum se vede, această schemă este usor de folosit dar prezintă marele dezavantaj că triplează mărimea mesajului electronic. Din această cauză, schema de codificare quoted-printable este indicat a se folosi doar pentru mesaje de mărime mică, în care caracterele ASCII extinse (pe 8 biti) trebuie transmise tinînd cont de restrictia NVT.
Pentru limba germană sau limba franceză este foarte folositor să se utilizeze caractere ASCII extinse. De exemplu, dacă expeditorul doreste să încheie scrisoarea cu o formulă ce cuprinde si numele său atunci, în cazul în care numele include caractere ASCII extinse (ca Ö, Ü, Ä etc.) se poate utiliza schema de codificare quoted-printable.
Numele codificat H. Sh=94enburg va putea fi înteles de un agent utilizator care cunoaste MIME si să fie afisat ca H. Schöenburg.
Base-64 encoding. Folosind această schemă, fiecare secventă de trei octeti este interpretată ca o combinatie de 4 valori pe 6 biti (din nou 6×4 = 24 biti în total). Programul care va utiliza această schemă, va transmite fiecare valoare pe 6 biti, folosind tabela de caractere ASCII.
În comparatie cu metoda de codificare quoted-printable, această metodă produce o crestere a mărimii mesajului doar cu o treime. Este foarte important de subliniat faptul că datele se transmit în blocuri de cîte trei octeti. Să presupunem că dorim codificarea numelui ION. Acesta fiind un grup de trei octeti, este OK din punct de vedere al codificării. Dacă vom dori codificarea numelui POPA atunci, dat fiind faptul că nu este format dintr-un număr de octeti multiplu de 3, va trebui să-l completăm cu doi octeti (două semne egal), în final obtinîndu-se un număr de sase octeti:
UE9QQQ== – codificarea cuvîntului POPA
4.3.3 Implementarea codificării Base 64
Pentru întelegerea implementării algoritmului de codificare Base 64, vom considera numele ION. Este format din trei octeti si nu pune probleme suplimentare.
Varianta în limbajul C:
/*———————————————————————————————————
Program pentru demonstrarea codificarii MIME cu ajutorul tehnicii Base64
————————————————————————————————————*/
#include <stdio.h>
unsigned char date[] = {0x41,0x4F,0x45};
unsigned char rezultat[4];
unsigned char temp1,temp2;
void main()
{
printf("\ndate[0] date[1] date[2]\n %d %d %d\n", date[0], date[1], date[2]);
rezultat[0] = date[0] >> 2;
printf("rezultat[0] %d\n", rezultat[0]);
temp1 = (date[0] & 3) << 4;
temp2 = date[1] >> 4;
rezultat[1] = temp1+temp2;
printf("rezultat[1] %d\n", rezultat[1]);
temp1 = (date[1] & 15) << 2;
temp2 = date[2] >> 6;
rezultat[2] = temp1+temp2;
printf("rezultat[2] %d\n", rezultat[2]);
rezultat[3] = date[2] & 63;
printf("rezultat[3] %d\n", rezultat[3]);
}
Prima valoare pe sase biti se obtine din cei sase biti ai literei I, situati pe pozitia high. Desi vorbim despre valori pe sase biti, fiecare din aceste valori va fi stocată pe un octet. Revenind la problema deschisă, pentru a obtine prima valoare pe sase biti, asupra codului primei litere se aplică o operatie de deplasare la stînga cu doi biti. Valoarea obtinută se stochează în variabila rezultat[0].
Pentru obtinerea următoarei valori pe 6 biti (ce se va stoca în variabila rezultat[1]) avem nevoie de cei doi biti low ai codului literei I si de 4 biti ai codului literei O (cei situati pe pozitia high). În scopul obtinerii celor doi biti ai literei I, aplicăm o mască (cu ajutorul functiei SI) a cărei valoare este trei. Acum va trebui să transpunem acesti biti pe pozitiile lor finale – este vorba despre 5 si 6. Pentru aceasta vom efectua o deplasare la stînga cu 4 biti. Bitii de pe pozitiile low ale rezultatului final îi vom obtine prin deplasarea la dreapta a bitilor codului literei O.
În acelasi mod se procedează si în continuare – se aplică măsti pentru obtinerea valorilor anumitor biti si apoi se aplică deplasări pentru ocuparea pozitiei corecte. În final obtinem cele patru valori pe sase biti: 18, 20, 61, 14.
Varianta în limbajul Perl:
sub encode_base64
{
my($str) = shift;
my($mmji);
pos($str) = 0;
while($str =~ /(.{1,45})/gs)
{
$mmji .= substr(pack('u', $1), 1); chop($mmji);
}
$mmji =~ tr/` -_/AA-Za-z0-9+\//;
my($mmjj) = (3 – length($str) % 3) % 3;
$mmji =~ s/.{$mmjj}$/'=' x $mmjj/e if $mmjj;
$mmji =~ s/.{$mmjj}$/'=' x $mmjj/e if $mmjj;
$mmji;
}
5 Descrierea programului ”WebMail”
Programul “WebMail” este construit pe baza tehnologiei CGI (Common Gateway Interface, vezi cap.1). Ideia principală a programului constă în efectuarea a unei interfețe Web, asupra protocoalelor SMTP, POP3 și standartului MIME (rfc -1521).
Interfața web a fost scrisă cu ajutorul limbajului HTML, utilizînd performanțele limbajului JavaScript, care descrie formatarea rezultatelor la browserul utilizatorului. Ca nucleul programului, servesc scripturi CGI, care dirijiază de toate procesele ale proiectului.
Programul constă din zece CGI scripturi principali, care răspund la întregul proces de gestiune a datelor. Și un script de instalare a proiectului. Pentru ca proiectul să lucreze în mod stabilit este necesar de instalat seturi de module proiectate ce au scop de descriere a tuturor funcțiilor de transport.
5.1 Instalarea proiectului
Scriptul de instalare install.pl admite utilizatorului să efectuieze instalarea și setarea întregului după cîteva pași de răspunsuri la întrebări. Pentru ca programul să fie instalat corect e necesar de lansat scriptul ./install.pl. După ce vor aparea o serie de întrebări:
>Installation
>Introduceti numele serverului POP3 E-Mail.
> Examplu: pop3.mail.com
>POP3 Server: pop3.mail.ru
>Introduceti adresa reply-to care va aparea dupa username.
> Examplu: mail.com
>Adresa Reply-To: mail.ru
……………
Întreg fișier de configurare este reprezentat în anexa 5.
5.2 Întrare în sistem
Întrarea în sistemul ”WebMail” se efectuiază prin întroducerea adresei URL spre fișierul login.cgi. Scriptul dat generează o formă de întrare (log in), cu următorii parametri al formei:
SessionID – o sesiune nouă pentru user, sesiune care se generează prin lansarea procedurii wvars.cgi/sessionid, care este necesar pentru identificarea utilizatorului.
Action – spre /inbox.cgi ce înseamnă că după introducerea datelor utilizatorul va fi transferat la executarea următorului script inbox.cgi.
Reprezentarea formei login este aratată figura 22:
Fig.22 Forma de întrare ”Login”
După apăsarea tastei ”Login” procesul se transmite spre scriptul inbox.cgi.
Acest mai întîi încearcă să verifică dacă utilizatorul dat este în sistem. În cazul cînd utilizatorul întră în sistem pentru prima dată, pentru dînsu va apărea o forma de setare al utilizatorului ce este chemată prin procedura wvars.cgi/preferences. Vezi fugura 23.
Fig.23 Preferințele utilizatorului
unde,
Numele : numele utilizatorului care vor fi arătată în procesul de afișare a email listei, și va fi trimisă în headerul mesajuluiîn cîmpul From.
Adresa Reply –To : Adresa, care va fi întrodusă în headerul mesahului în cîmpul Reply-To.
Signatura: Va fi întrodusă la sfîrșitul fiecărui mesaj trimis de utililizator.
Numărul de mesaje pe o pagină: Reprezintă numărul de mesajele noi, care vor fi arătate pe o pagină. Celelalte pot fi mai departe alese.
Culori: sunt culori specifice pentru rănduri de sus și jos al fiecărui tabel în project.
5.3 Vizualizarea boxului poștal al utilizatorului
După ce preferințele ale utilizatorului au fost setate scriptul inbox.cgi trece la o altă treaptă și anume la vizualizarea mesajelor noi. Această lista este vizualizată pe figura 24.
Fig.24 Lista de mesaje noi al utilizatorului Igori Komarnitski
Lista de mesaje întotdeauna este sortată în după dată în descreșterea. Fiecare mesaj (rîndul în lista de mesaje) are cîteva proprietăți.
Dacă mesajul are un semn ”*” de culoare roșie lîngă checkboxul această înseamnă că mesajul are o înaltă prioritate sau cu alte cuvinte este urgent.
Fiecare mesaj are un cîmp From unde se arată adresa expeditorului lîngă care se află un link de adăugare al acestui mesaj spre carte de adrese.
La fiecare mesaj poate da un răspuns apăsîndu-l pe linkul Reply sau poate fi efectuat un forward la o altă adresă.
Citirea mesajului anumit se efectuiază prin apăsarea linkului în cîmpul From. Rezultatul al acestei operții poate fi văzut pe figura 25.
Fig.25 Citirea mesajului
La citirea mesajului se arată informația detaliată . Aici se poate afla Data cînd a fost primit mesaj, de văzut pe mesajul propriu-zis. Dacă mesajul conține niște fișiere atașate atunci programul crează un link special apăsîndu-l se poate de văzut pe acest fișier detaliat. Dacă fișierul are un format image atunci el poate fi văzut deodată.
Dacă mesajul conține un mesaj inclus acest va apărea ca un attachment inline cu un link spre dînsu.
5.4 Crearea unui mesaj nou
Pentru a crea un mesaj nou e necesar de apăsat pe butonul ”Compose” care va chema pe scriptul compose.cgi. Acest va genera o pagină cu o forma pentru a crea un mesaj nou. Acest va lua ca adresa și numele trimițătorului din fișierul info al utilizatorului. Forma ce apare la construirea unui mesaj nou este prezentată pe figura 26.
Fig.26 Crearea unui mesaj nou
Recipient: reprezintă adresa destinatului. Acest cîmp poate conține nu numai o adresă ci o lista de adrese separate prin virgulă.
Cîmpul CC este destinat pentru a trimite o copie a mesajului la o altă adresa. Are o proprietate de lista de adrese ca și cîmpul Recipient.
Cîmpul Subject reprezintă un subiect (Tema) a mesajului.
Cîmpurile Attachment1 și Attachment2 sunt destinate pentru a atașa un fișier la mesajul creaet.
Cîmpul Message reprezintă textul mesajului propriu zis.
5.5 Cartea de adrese
O carte de adrese reprezintă un mecanism destul de flexibil pentru sistemele de tip mail client. Acesta reprezintă o mică baza de date ce poate păstra o mulțime de adrese, care în procesul de creare a noului mesaj pur și simplu pot fi adăugate spre lista de destinatarii.
Cartea de adrese este lansată prin chemarea scriptului addressbook.cgi acest va genera o formă cu întreg list de adrese al utilizatorului. Tot aici se poate de adăugat o nouă adresă. Cartea de adrese poate fi văzută pe figura 27.
Fig.27 Cartea de adrese
Adăugarea unui cntact nou se efectuiază prin întroducerea în cîmpurile Contact Name a numelui adresatului și în cîmpul E-Mail Address adresa poștală a lui și se apasă pe butonul Add Contact.
6. Partea economică a proiectului.
6.1. Planificarea rețea pentru elaborarea SI “Web Mail”
Proiectele tehnologice contemporane sunt caracterizate de următoarele particularități:
tehnica nouă utilizată este foarte complexă și este construită utilizând ultimele elaborări științifice.
accelerării vitezei de elaborare a proiectelor.
proiectele referitoare la complexele tehnicii de calcul și softului sunt supuse uzurii morale foarte rapide.
necesitatea proiectării de sistemă la elaborarea softului și sistemelor tehnice.
Toate acestea au dus la necesitatea de creare a noi metode de planificare. Una din aceste metode prezintă modelarea procesului de elaborare, adică prezentarea legăturilor și caracteristicilor lucrărilor în procesul elaborării proiectului.
Metodele tradiționale de planificare presupun utilizarea celor mai simple modele de construirea a diagramelor de tip consecutive și ciclice.
Dar în asemenea diagrame nu este posibil de a prezenta legăturile dintre niște lucrări, de unde rezultă imposibilitatea de a afla cât de importantă este lucrarea dată pentru executarea scopului final. Pot apărea diferite întârzieri în timp, ce apar pe porțiuni de interconectare a lucrărilor, care sunt complicat de prezentat în diagrame. De obicei, în procesul dirijării se culege informația despre lucrările efectuate și aproape nu se culege și nu se prezintă informația referitor la prognoza finisării lucrărilor viitoare, de aceia este imposibil de a prognoza rezultatele diferitor variante de soluționare la modificările planului inițial de lucru. Este de asemenea complicat de a reflecta și dinamica lucrărilor, de a corecta toată diagrama în legătură cu schimbarea termenilor de efectuare a unei lucrări, ce este necesar de a efectua ca să nu schimbăm termenul de efectuare a întregului complex de lucrări.
Aceasta este doar o parte mică din neajunsurile metodelor utilizate în prezent pentru planificarea și prezentarea grafică a planurilor de pregătire a producerii. Aceste neajunsuri în mare pare sunt excluse de către sistemele de planificare și dirijare în rețea utilizate în prezent.
Sistemele de planificare și gestiune în rețea prezintă un complex de metode grafice și de calcul, metode de control și de organizare, care asigură modelarea, analiza și reconstruirea dinamică a planului de executare a proiectelor complexe.
Sistemele de planificare și gestiune în rețea este o metodă cibernetică creată pentru gestiunea cu sisteme dinamice complexe cu scopul asigurării condiției de optim pentru careva indicatori. Așa indicatori, în dependență de condițiile concrete, pot fi:
timpul minim pentru elaborarea întregului complex de lucrări;
costul minim al elaborării proiectului;
economia maximală a resurselor.
Particularitățile sistemului de planificare și gestiune în rețea în general sunt următoarele:
se realizează metoda proiectării de sistem la rezolvarea problemelor de organizare a gestiunii proceselor;
se utilizează modelul informațional-dinamic special (graful-rețea) pentru descrierea matematico-logică a procesului și calculul automat (conform algoritmului) a parametrilor acestui proces (durata, costul, forțele de muncă, etc.);
se utilizează sisteme de calcul pentru prelucrarea datelor operative pentru calculul indicatorilor și primirea rapoartelor analitice și statistice necesare.
Documentul de bază în sistemul de planificare și gestiune în rețea este graful-rețea (modelul rețea), care prezintă modelul informațional-dinamic, în care sunt prezentate legăturile și rezultatele tuturor lucrărilor, necesare pentru atingerea scopului final.
Fig.13 Structura grafului-rețea.
unde:
cercul – un eveniment;
săgeata – o lucrare;
tij – durata lucrului ij;
Rlij – rezerva liberă de timp a lucrului ij;
Rdij – rezerva deplină de timp a lucrului ij;
Tdi – timpul devreme de începere a evenimentului i;
Tti – timpul târziu de terminare a evenimentului i;
Ri – rezerva liberă de timp a evenimentului i;
Ni – numărul evenimentului i;
Tdj – timpul devreme de începere a evenimentului j;
Ttj – timpul târziu de terminare a evenimentului j;
Rj – rezerva liberă de timp a evenimentului j;
Nj – numărul evenimentului j.
La construirea grafului-rețea se face următoarele calcule:
,
, ,
, .
În legătură cu lucru efectuat în tabelul 1 este prezentată distribuirea timpului a unei lucrări concrete după numărul de zile efectuării ei.
Tab.1
Distribuirea timpului cheltuit la elaborarea proiectului
(continuare) Tab.1
În dependență de etapele de lucru fiecare colaborator a proiectului participă la diferite etape după cum este reprezentat în tabelul 2:
Tab.2
Timpul de participare fiecarui collaborator în proiectul
(continuare) Tab.2
(continuare) Tab.2
Drumurile critice vor fi
1 – 2 – 6 – 7 – 10 – 11 – 12 – 13 – 14 – 16 – 17 – 18 – 19 – 20 – 21 – 22 – 23
1 – 2 – 6 – 8 – 10 – 11 – 12 – 13 – 14 – 16 – 17 – 18 – 19 – 20 – 21 – 22 – 23
1 – 2 – 6 – 9 – 10 – 11 – 12 – 13 – 14 – 16 – 17 – 18 – 19 – 20 – 21 – 22 – 23.
Graful poate fi văzut în anexa 2.
6.2 Calcularea rentabilității programului.
Rentabilitatea – index principal al eficacității, ce caracterizează profitabilitatea lucrării interprinderii. În principiu de bază rentabilitatea se calculiază ca raport dintre profit și sinecostul și se exprimă în procente.
În lucrarea noastră rentabilitatea a produsului va fi calculată după următoarea formulă:
, unde
Pr – profit;
S – sinecostul.
Pentru calcularea sinecostului în întrgime e necesar de efectuat clasificarea cheltuielilor legate cu elaborarea programei.
În esența economică toate cheltuielile se clasifică în:
Cheltuieli materiale;
Cheltuieli pentru achitarea salariului;
Defalcări în Fondul Social;
Amortizarea;
Alte cheltuieli.
La cheltuieli materiale se referă:
Cheltuieli directe (materiale de consum ș.a.);
Cheltuieli indirecte (energia electrică, energia termică ș.a.).
Defalcări în fondul social corepunde la 31% de la fundul de salriu al tuturor lucrătorilor.
Amortizarea – în cazul nostru corespunde la uzura calculatorului.
Alte cheltuieli în cazul nostru le corespund cu cheltuieli legate cu transport ș.a.
Cheltuieli materiale.
(a). Cheltuieli materiale directe de elaborare a proiectului.
Cheltuieli materialelor de consum și prețul lor corespunzător sunt prezentate în tabelul 3:
Tab.3
Cheltuieli materialelor de consum și prețul lor
(continuare) Tab.3
(b). Cheltuieli materiale indirecte de elaborare a proiectului.
Cheltuieli indirecte și costul lor sunt prezentate în tabelul 4:
Tab.4
Cheltuieli indirecte
Efectuarea calculelor s-au efectuat conform următoarelor date:
Energia electrică – 0,65 bănuți pentru 1 kW: 1 calculator timp de 166 zile cîte 8 ore, care consumă 200w pe oră = 172,64 lei;
Energie termică – aproximativ 250 pentru 1 Gcal;
Bibliografia;
Servicii de telecomunicații, telefon – 6 lei pe lună;
Cheltuieli de reparații = 5% din costul ei = 475 lei;
Paza = 200 lei * 6 luni = 1200 lei.
Cheltuieli pentru achitarea salariului.
Salariile tuturor lucrătorilor care au participat la elaborarea proiectului sunt prezentate în tabelul 5:
Tab.5
Salariile
Salariul de bază se calculează din considerația a 22 zile lucrătoare pe lună și 8 ore pe zi. Salariul suplimentar constituie 20% din salariul de bază.
Defalcări în fondul social.
Contribuții pentru asigurări sociale se ia 31% din salariul de bază și cel suplimentar.
Ca = Sl * 0.31 = 4404 * 0.31 = 1365,24 Lei, unde
Sl – Salariu total al tuturor lucrătorilor care au participat la elaborarea proiectului.
Amortizarea.
Elaborarea proiectului a fost efectuată pe calculatorul Ip 150/64Mb/1Gb/CD-ROM Asus 45x/SB Yamaha 724/14”, costul inițial 770 USD (la data de cumpărare – anul 1998) = 7700 Lei. Durata eficace al cărui este 4 ani. Soldul la anul 3 (anul 2001) este 320 USD = 3840 Lei. Amortizarea calculatorului va fi calculată după metoda de amortizare rapidă metoda cumulativă . Alegerea metodei se aliasă din punct de vedere că calculatorul se referă la obiecte de ”Înaltă calitate”, de ce foarte rapid se uziază moral și deci se pierde eficacitatea economică.
Folosind de metoda cumulativă vom avia:
, unde
U – suma anuală de uzură;
CI – costul inițial;
CR- costul rămas;
T- suma anilor continue;
t – numărul anilor ce separă anul de calculare la uzură de la anul de savîrșire a exploatării. (În cazul nostru un an).
Am obținut că amortizarea anuală la anul 3 de expluatare este 386 Lei.
Alte cheltuieli.
Alte cheltuieli vor fi cheltuieli legate cu arenda clădirii de lucru. Arenda în cazul nostru este de 65 lei/m2.
Deoarece lucrurile legate cu programarea și culegerea informației asupra proiectului a durat ~90 zile, și ieșind din 4m2 putem calcula plata la arenda ce va fi întrodusă la sinecostul proiectului.
Ap = Ap1+Ap2+Ap3 +Ap4, unde
Ap1 – plata la arenda în luna februarie;
Ap2 – plata la arenda în luna martie;
Ap3 – plata la arenda în luna aprilie;
Ap4 – plata la arenda în luna mai.
Ap1 = Ap2 = Ap3 = S * C, unde
S- aria pentru calcularea;
C- costul metrului pătrat într-o lună.
Ap4 = ( S*C*Nz ) / N, unde
Nz – numărul de zile ce au fost necesare pentru elaborarea proiectului;
N – numărul de zile într-o lună.
Ap1 = Ap2 = Ap3 = 4m2 * 65lei/m2 = 260 lei.
Ap4 = (4m2 * 65lei/m2 * 7zile)/22zile = 82,7 lei
Ap = 3*260lei + 82,7lei = 862,7lei;
Sinecostul = Cheltuieli materiale directe + cheltuieli materiale indirecte + Salarii + Amortizarea + Alte cheltuieli = 18360lei + 2168,84lei + 4404lei + 1365,24lei + 386 + 862,7lei = 27546,78 lei.
Beneficiu planificat (25%) = 27546,78lei * 0,25 = 6886,7 lei.
Prețul de livrare angro = Sinecostul + Profit = 27546,78lei + 6886,7lei = 34433,48 lei.
Prețul de livrare = Prețul de livrare angro +TVA(20%) = 41320,2 lei
Rentabilitatea
R = ( 6886,7lei / 27546,78lei ) * 100 % = 25%
7 Protecția muncii și sanitarie de producere
Proiectul de diplomă prezintă elaborarea unui set de programe pentru culegerea și prelucrarea informației. Rezultă problema protecției muncii atât a persoanelor care elaborează programele, cât și a utilizatorilor ei. Lucrările în sistemul menționat vor fi efectuate utilizând calculatoare personale, adică prezintă lucrul programatorilor și a operatorilor tehnicii de calcul, e necesar de a precauta cerințele pentru protecția muncii la lucrul cu tehnica de calcul, în special a calculatoarelor personale cu diferite sisteme periferice, utilizate de către personalul centrului de calcul (CC) în procesul activității vitale. Evident, integrarea și utilizarea pe larg a calculatoarelor electronice pe lângă factorii pozitivi mai are și nuanțe negative asupra persoanelor care le exploatează.
Lucrul operatorilor tehnicii de calcul necesită o atenție mare, posibilitatea de a rezolva în timp limitat probleme complexe, responsabilitatea față de acțiunile întreprinse ce duce la o tensionare emoțională și stres.
Operatorii tehnicii de calcul, programatorii, și alți colaboratori ai CC sunt supuși unor factori nocivi și periculoși cum ar fi:
nivelul ridicat de zgomot;
insuficiența iluminatului natural;
insuficiența iluminatului locurilor de muncă;
temperatura ridicată a mediului ambiant;
diferite forme de iradieri, etc.
Acțiunea factorilor indicați duce la micșorarea capacității de muncă, ca rezultat al obosirii. Apariția și dezvoltarea obosirii este legată de schimbările, ce apar în procesul muncii în sistemul nervos central, cu procese de încetinire în creier. De exemplu, zgomotul mare conduce la dificultăți în perceperea semnalelor colore, micșorează viteza de percepție a culorilor, adaptarea vizuală, micșorează capacitatea de a acționa rapid și efectiv, micșorează cu 5-12% capacitatea de muncă și duce la deteriorarea auzului.
Aflarea îndelungată a persoanei într-un mediu în care acționează mai mulți factori nocivi poate duce la o îmbolnăvire profesională.
Pentru crearea condițiilor de lucru prielnice e necesar de a lua în considerare particularitățile psiho-fiziologice ale oamenilor, plus starea igienică generală. Un rol important îl are amplasarea postului de lucru, economia energiei electrice și timpului operatorului, utilizarea rațională a suprafețelor utilizate, comodității utilizării tehnicii de calcul, respectarea regulilor de protecție a muncii.
7.1. Zgomotul
Zgomotul este unul din factori care influențează omul când el lucrează cu CE, aceasta este condiționat de funcționarea dispozitivelor ce sunt necesare în CC.
Sursele principale de zgomot în încăperi amenajate cu tehnica de calcul sunt imprimantele, tastatura, instalații pentru condiționarea aerului, dar în CE – ventilatoarele sistemelor de refrigerare și transformatoare.
La influența zgomotului pe un timp îndelungat la colaboratorii CC se observă micșorarea atenției, dureri de cap, se micșorează capacitatea de muncă. În documente de însoțire a utilajului ce produc zgomot se aduc normele timpului de lucru la acest utilaj.
În conformitate cu STAS 12.1.003-91 “Zgomot. Cerințele generale de protecție” caracteristica de normă a zgomotului locurilor de muncă sunt nivelurile presiunii de sonor (zgomot). Nivelurile accesibile a zgomotului, lucrând cu CE, sunt prezentate în tabelul 1:
Tab.6
Nivelurile admisibile a zgomotului
(continuare) Tab.6
Pentru micșorarea zgomotului la locurile de muncă se efectuează următoarele acțiuni:
Arhitectural-planificative. Clădirile se proiectează și se construiesc în așa mod ca la locurile de muncă să nu fie depășit nivelului admisibil. Întrucât sistemul va fi utilizat la CC existent aici se poate de obținut micșorarea zgomotului amplasând în încăperi vecine utilajului cu zgomot ridicat.
Tehnico-organizatorice. Pentru micșorarea zgomotului la CC se efectuează reparația și ungerea utilajului (imprimantelor). Se poate de aranjat utilajul în așa fel ca el să facă mai puțin zgomot.
Acustice. În CC se instalează podele tehnologice și poduri fixate în balamale. Distanța între podul de bază și podul fixat în balamale 0,5-0,8 m, iar înălțimea podelei tehnologice 0,2-0,6 m.
7.2. Securitatea electrică
Utilajul CE este foarte periculos pentru operatori, deoarece lucrând la acest utilaj operatorul poate să atingă unele părți care sunt sub tensiune. Trecând prin om curentul electric efectuează influența optică, biologică termică, ce poate aduce la traumă electrică (STAS 12.1.009-91).
O importanță mare pentru emiterea cazurilor neplăcute și periculoase are organizarea corectă a exploatării utilajului electric, efectuarea lucrărilor de montare și profilactică.
Legarea la nul este o măsură de protejare de electrocutare prin deconectarea strictă și în viteză a rețelei în caz de apariție a tensiunii pe carcasă, sau în cazul străpungerii izolării. Deconectarea strictă se efectuează, dacă curentul de scurt circuit format prin faza și firul nul este destul de mare ca declanșatorul să lucreze corect.
Scopul calculării este determinarea secțiunii firului nul, care satisface condiția funcționării protecției maximale de curent. Valoarea protecției se determină după puterea instalației electrice proiectate.
Curentul de scurtcircuit trebuie să fie mai mare de trei ori decât curentul nominal a siguranței Is.c. ≥ 3In
7.3. Condiționarea aerului
Condiționarea aerului în încăperi se face cu scopul de a întreține în ele următoarele condiții:
Condițiile mediului aierian, prevăzute de norme.
Condițiile climaterice artificiale în corespundere cu cerințele tehnice în interiorul încăperilor.
Condițiile igienice optimale a mediului aierian în încăperile de producere, în caz dacă aceasta este argumentat cu mărirea productivității muncii.
Condițiile optimale ale mediului aierian în încăperile clădirilor publice și de locuit.
Condiționarea aierului, care se face cu scopul de a întreține condițiile optimale sau admisibile a mediului aierian, poartă denumirea de confortabilă, dar ceea ce se face cu scopul de a întreține condițiile artificiale a mediului aierian în corespundere cu cerințele tehnologice – tehnologică.
Sistemele de condiționare a aierului (SCA) trebuie să asigure parametrii meteorologici normați și puritatea aierului înăuntrul încăperilor cu parametrii aierului exterior, pentru perioadele caldă și rece a anului, după СНиП II-33-75. Pentru satisfacerea cerințelor tehnologice sau în cazul argumentărilor tehnico-economice se permite calcularea sistemelor de condiționare pentru parametrii aierului extern.
Condițiomarea aierului se efectuiază cu un complex de aparate tehnice ce se numește sistem de condiționare a aierului (SCA). În componența SCA intră aparate tehnice pentru pregătirea, deplasarea și distribuirea aierului, pregătirea aierului rece și deasemenea aparate tehnice pentru alimentare cu căldură și aier rece, automatică, conducere distanționată și control.
Aceste aparate tehnice se asamblează complet sau parțial în aparate aparte ce se numesc condiționere și deasemenea în noduri, ce port denumirea de calorifere de încălzire locală, aparate de mărire a umedității ș.a.
Conform standardului ASHRAE 55-56 (SUA) confortul termic se determină ca starea omului satisfăcut de condițiile mediului ambiant, care nu știe dorește oare el să schimbe condițiile mediului ambiant astfel ca ele să fie mai calde sau mai reci, sau nu. Parametrii mediului aierian, de care sunt satisfăcuți 80 % de oameni sănătoși, normal îmbrăcați, ce au un lucru ușor și-l îndeplinesc șezând, după standardul de mai sus sunt următorii:
temperatura după termometrul uscat 23-25 grade celsius.
temperatura medie de iradiere 21-27 grade celsius.
umeditatea relativă 20-60 %.
viteza mișcării aierului 0.05-00.23 m/s.
Cu îndeplinirea condiției că pentru încăperea dată variațiile maximale a temperaturei după termometrul uscat se află între limitele de 1 grad celsius, a temperaturii de iradiere – 0.8 grade celsius și a umidității- 10%.
Sistemele de condiționare a aierului sunt de câteva feluri:
centrale cu un canal și o zonă, ce deservesc una sau mai multe încăperi fără împărțirea sistemelor în zone.
centrale cu un canal și cu mai multe zone, ce deservesc mai multe zone într-o încăpere sau câteva încăperi cu repartizerea aierului prin țevi pentru fiecare zonă sau încăpere.
centrale cu două canale și mai multe zone, ce deservesc câteva zone într-o încăpere sau mai multe încăperi cu distribuirea aierului prin două țevi- cu aier rece și încălzit- în fiecare zonă sau încăpere.
sisteme locale compuse, ca regulă, din condiționere asamblate cu productivitatea de până la 20 mii m3/oră, ce deservesc una sau mai multe încăperi și în fiecare din ele sunt instalate unul sau mai multe condiționere, ce saigură reglarea locală a temperaturii sau a temperaturii și a umidității relative a aierului.
sisteme combinate ce lucrează în comun cu sisteme de încălzire și răcire, de umezire adăugătoare locală și cu alte dispozitive.
Parametrii necesari ai microclimei în încăperile de producție se asigură prin diferite metode.Pentru menținerea normelor aflării substanțelor dăunătoare în aer la locu de lucru se iau măsuri spre izolarea izvoarelor de substanțe dăunătoare,limitarea timpului de aflare a oamenilor în încăperile cu conținutul atmosferic dăunătoare în aer ș.a.
Una din tehnicile folosite în procesul de producție pentru eliminarea substanțelor dăunătoare din aerul zonei de lucru este ventilarea. Sistemele de ventilare asigură parametrii necesari ai microclimei în aerul zonei de lucru. Ventilarea este divizată în dou categorii în depndență de natura aceasta: ventilare naturală și artficială.
La ventilarea artificială schimbul de aier se efctuază cu ajutorul ventilatorului pri sistemele de canale cu aer. Reeșind din principiul de lucru a ventilatorului, ventilarea artificială se clasifică în următoarele categorii : de refulare ,de aspiratie, combinata.În sistemele de ventilare artificială aerul tras în încăperea de lucru poate fi uscat ,umezit ,răcit.Adică parametrii aerului tras, la ventilare artficială pot fi schimbați.
În prezent asigurarea normativelor de ventilare a aerului zonei de lucru sunt folosite dispozitive de condiționare a aerului. Cu ajutorul dispozitivului de condiționare aerului poate fi uscat ,umezit, ozonat ,dezodorat răcit sau încălzit.
Conform normativelor sanitar-igienice fiecărui lucrător trebue de asigurat de la 20m3 /h pînă la 30m3/h. Raportul între volumul încaperii și numărul de persoane care lucrează în această încăpere nu trebue să fie mai mic decît 20m 3. În lipsa substanțelor dăunătoare în încăpere , dacă volumul de aer pentru un lucrător e mai mare de 40m3 , normativele de ventilare nu sunt reglamentate.
Deoarece incaperea in care a fost elaborata lucrarea data întră în categoria I-raportul volumului de aer din laborator și numărul de persoane care se află în laborator în timpul lucrărilor este mai mic decît 20m3 pentru o persoană, aerul zonei laboratorului trbuie ventilat.Volumul de aer care trebue să fie tras trebue să fie în diapazonul de la 20m3/h pentru o persoană la 30m3/h. E de mentionat faptul, ca in incaperea susnumita sunt amplasate 3 locuri de munca.Deci trebuie de ales un așa tip de dispozitiv de condiționare care ar asigura cerințele expuse mai sus.
Un așa tip de aparat poate servi dispozitivul de tip BK-2500, care are următoruii parametri tehnici:
Volumul de aier extras – 1000 m3/h;
Tensiunea de alimentare – 220V , 50Hz;
Schema de lucru a unui dispozitiv de condiționare tipic este arătată pe figura 28.
Fig.28 Schema tipica de lucru a conditionerului BK-2500
canalul aerului din afară;
canalul aerului recirculant;
filtrul;
încălzitor de aer;
injectoare;
separator de picături;
încălzitor de aer;
aierul condiționat.
Date din pașapotul tehnic a condiționerului BK 2500
Date tehnice:
Instalația de condiționare – BK 2500
Productivitatea de aer rece , kcal/h – 2500
Substanța folosită pentru răcire – freon
Puterea consumată (de la sursa de curent alternativ) W, – 1650
Tensiunea, V – 220
Frecvența curentului, Hz – 50
Nivelul de zgomot, dB – 60
Curentul de lucru, A – 8
Dimensiunele, mm
Înălțimea – 460
Lățimea – 660
Adîncimea – 615
Greutatea, kg – 65
7.4. Securitatea antiincendiară
Focul este o forță gigantică. Oamenii antici vedeau în el o sursă a vieții și în prezent el încălzește și hrănește doar cu acea diferență că pentru contemporanul nostru la nivelul actual de dezvoltare a condițiilor sociale că această întrebare a scăzut cu mult. Însă acest fapt nu ne permite să neglijăm focul, doar o mică neatenție și marea lui forță poate aduce o nenorocire. Iată de ce e atât de important rolul securității antiincendiare în organizarea protecției muncii la întreprinderi și în încăperi administrative.
Incendiul se numește arderea necontrolată în afara unui focar special care aduce pierderi materiale. Dacă această ardere nu cauzează pierderi materiale, atunci ea se numește inflamare. Explozia este o transformare chimică momentană, caracterizată prin degajarea de energie și crearea de gaze comprimate.
După gradul de ardere (oxidare însoțită de degajarea unei cantități mari de căldură) materialele de construcție se împart în următoarele tipuri: nearzătoare – sub acțiunea focului nu se inflamează, nu se corodează; greu inflamabile – sub acțiunea focului se inflamează, se carbonizează doar în prezența sursei de inflamare, iar după lichidarea ei arderea sau carbonizarea încetează (materialele se gips sau beton, materiale din argilă); inflamabile – sub acțiunea focului se inflamează și se carbonizează și continuă acest proces și după lichidarea sursei de inflamare (toate materialele organice, ce nu corespund cerințelor indicate anterior).
Materialele, ce posedă capacități ridicate de inflamabilitate se numesc periculoase din punct de vedere incendiar, iar capabile de explozii și detonare fără participarea oxigenului.
Cauzele incendiilor și exploziilor după caracter pot fi electrice și neelectrice. La categoria electrice se referă: scânteia în aparatele electrice, descărcările electrostatice, fulgerele ș.a.
Cauzele incendiilor și exploziilor cu caracter neelectric pot fi: exploatarea incorectă a aparatului de sudură cu gaz, pistoalele de lipit, dereglarea dispozitivelor de încălzire, a echipamentului de producție, încălcarea procesului tehnologic ș.a.
În dependență de procesele tehnologice și proprietățile materialelor după gradul de pericol incendiar și exploziv încăperile și clădirile se împart în cinci categorii A, B, V, G, D în conformitate cu normele proiectării tehnologice.
Aceste categorii sînt stabilite și aprobate de către ministerele ramurilor corespunzătoare. Majoritatea clădirilor industriei radioelectronice se referă la categoria V.
Clădirile și edificiile se împart după gradul de stabilitate antiincendiară (SNIP 201.02-85), care se determină de limitele minimale de stabilitate incendiară ale construcțiilor de bază și limitele maximale de răspândire în ele a focului. Aceste limite se determină în baza testării probelor în cuptoare speciale.
Protecția antiincendiară a obiectelor naționale este reglementată de STAS 12.11.033-81 “Cerințe generale”, normelor și regulilor constructive, regulilor protecției antiincendiare a ramurii.
Factorii principali pentru viața omului ce apar în timpul incendiului sunt: focul deschis, temperatura ridicată a aerului și a obiectelor, produsele toxice ce ard, fumul, micșorarea concentrației de oxigen în aer, distrugerea încăperilor, echipamentului și explozia.
Pentru prevenirea incendiului trebuie luate următoarele măsuri:
excluderea apariției mediului arzător;
excluderea apariției în mediul arzător a surselor de inflamare;
menținerea temperaturii și presiunii mediului arzător mai jos de nivelul maxim admisibil de ardere.
Pentru prevenirea incendiului sunt aplicate un șir de măsuri. Barajele antiincendiare din clădiri și edificii la care se referă pereții antiincendiari, barajele și acoperirile antiincendiare, ușile și altele trebuie să fie executate din materiale neinflamabile și de asemenea să fie prevăzută autoînchiderea lor. Ferestrele antiincendiare nu trebuie să aibă posibilitate de deschidere.
Pentru anunțul incendiului se utilizează legăturile radio și telefonice, sirenele, traductoare de semnalizare a incendiului. Fiecare unitate economică trebuie să dispună de mijloace de legătură pentru chemarea urgentă a pompierilor. Toate mijloacele de legătură antiincendiare trebuie să aibă acces deschis în orice timp.
Cel mai răspândit și ieftin mijloc de stingere a incendiului este apa care permite consumarea efectivă a căldurii aruncate de focarele de incendiu. Totodată apa nu poate fi folosită pentru stingerea lichidelor ușor inflamabile (benzină, gazul lampant, uleiuri minerale) și a materialelor care în contact cu ea elimină substanțe inflamabile (carbonatul de calciu).
În încăperile închise pentru lichidarea incendiului se recomandă utilizarea vaporilor de apă atât pentru stingerea materialelor solide cît și a substanțelor lichide.
În condițiile de laborator pentru stingerea incendiului poate fi folosit instinctorul cu volumul de șapte litri ce conține 97% etil bromic și 3% soluție de oxid carbonic. Componența aflată sub presiune în timpul utilizării se elimină sub formă de spumă. Durata funcționării este de circa 40s, distanța de aplicare – 4- 5 metri. El se utilizează la stingerea instalațiilor electrice aflate sub tensiune, deoarece brom etilul nu conduce curentul electric. Pentru protecția oamenilor de produsele toxice ale arderii și de fum se utilizează ventilatoarele și canalele de ventilare.
O metodă mai răspândită și mai fiabilă de semnalizare antiincendiară este sistemul electric de semnalizare care constă din patru părți principale:
dispozitiv de prevenire, care se instalează la locurile de munca și se pun în funcțiune manual sau automat;
dispozitiv static de recepție, care recepționează semnale de la dispozitivul de prevenire și care le transmite în incăperea echipei de salvare antiincendiare;
sistemul de conductoare, care unește dispozitivul de prevenire cu stația de recepție;
acumulatoare sau sistemul de alimentare electrică.
Sistemele de prevenire antiincendiară trebuie să fie elaborate pentru fiecare obiect in parte, reieșind din probabilitatea apariției incendiului nu mai mare de 0.000001 în an referită la un nod (element) al obiectului dat.
Semnalizarea electrică antiincendiară în dependență de schema de legatură cu stația de recepție se divizeaza in:
schema cu raze;
schema inelară.
Fig.29 Schemele de legătură cu stația de recepție antiincendiară
În cazul schemei cu raze, de la stația de recepție la fiecare dispozitiv de prevenire se trage un conductor separat, numit rază. Raza constă din două conductoare independente – direct si indirect.
În cazul schemei inelare toate dispozitivele de prevenire se instaleaza in serie pe un cablu comun, ambele capete ale căruia sunt introduse în dispozitivul de recepție. La întreprinderile mari de obicei sunt conectate cîteva conductoare independente, iar pe fiecare conductor pot fi conectate pînă la 50 de dispozitive de prevenire.
Dispozitivele de prevenire pot fi manuale si automate. Cele manuale se construiesc in formă de butoane și se instaleaza in holuri sau pe scări. Cele automate în dependență de fenomenul fizic la care reacționează traductoarele se divizează în dispozitive de prevenire de fum, de căldură și de lumină.
Dispozitivele de prevenire care reacționează la fum reacționează la apariția fumului, de căldură – la mărirea temperaturii aerului în incăpere și cele de lumină – la apariția focului deschis.
Dispozitivele de prevenire de căldură automate în dependență de tipul elementului sensibil folosit se împart in: bimetalice, semiconductoare si termocupluri.
Se mai folosesc dispozitive de prevenire automate combinate care reacționează la fum și căldură. Își găsesc aplicație și dispozitivele de prevenire cu ultrasunet, care reacționează la schimbarea câmpului de ultrasunet în timpul incendiului.
Dispozitivele de prevenire antiincendiară automate se caracterizează prin sensibilitate, inerție și zone de acțune.
7.5. Radiație
Intensitatea radiației Roentgen de energie joasă se controlează la locuri de muncă cu monitoare, care lucrează sub tensiunea la cinescop 15 kV și mai mult. Norma nivelului de radiație roentgen este 100 mcP/oră, dar în timpul de azi se utilizează mai mult monitoare cu nivelul radiație mai mică, ce aduce la micșorarea influenței factorilor dăunători asupra programatorului sau operatorului. La efectuarea tezei de licență a fost utilizat monitorul cu tensiunea la cinescop mult mai mică de 15 kV, și de aceea acest factor nu a fost înregistrat de dispozitiv, adică a fost mai puțin de normă.
Încă se măsoară și se normează intensitatea radiației ultraviolete (la lungimea de undă 336 nm) și infraroșie (la lungimea de undă 700 – 1050 nm) ce influențează asupra omului, nu trebuie să depășească 10 W/m2.
Radiația electromagnetică se normează după componente electrice (50 V/m) și magnetice (50 A/m) de aflare în această zonă de radiere în timp de 8 ore. Tensiunea înaltă a câmpului electric între monitorul și operatorul aduce la efecte neplăcute. La distanța de 5 – 30 cm de la monitor tensiunea nu trebuie să depășească nivelul admisibil după norme, ce sunt stabilite în dependența de timpul aflării la locul de muncă. Niveluri admisibile de tensiune sunt prezentate în tabelul 7.
Tab.7
Niveluri admisibile de tensiune
Controlul radiației de toate tipurile se efectuează în conformitate cu regulile ce sunt expuse în îndrumare speciale.
7.6 Cerințele ergonomice la locul de lucru
Conform SSSM pentru fiecare tip de utilaj nou, proces tehnologic nou se elaborează capitolul "Cerințele securității în condițiile tehnice". Din acest capitol fac parte și cerintele ergonomice, care constau în crearea unui mediu confortabil de lucru. Mediul de lucru in laborator pentru utilizator este calculatorul.
Cerintele ergonomice in Centrul Republican de Informatică depind de mai mulți factori din mediul de lucru al utilizatorului, care determină dacă el lucreaza eficient si într-un mod care îi asigură sănătate și siguranță. Modul în care este aranjată mobila, utilajul laboratorului, iluminarea și alte condiții de lucru pot influiența faptul cum se simte utilizatorul și cât de eficient lucreaza.
În timpul instalării calculatorului se evalueaza mediul în care se va lucra. Cu cât se minimalizeaza oboseala și disconfortul, cu atât se creeaza un mediu mai confortabil, mai sănătos și mai eficient pentru lucrul utilizatorului.
Este în interesul utilizatorului să-și aranjeze locul de muncă confortabil din punct de vedere al sănătații. Cazul contrar ar putea duce la disconfort și ar afecta serios sănătatea lui.
Sugestiile date aici sunt planificate pentru a ajuta selectarea căilor care ar asigura lucrul mai efectiv și mai confortabil, însă numai utilizatorul este persoana, care poate determina și aranja mediul cel mai bun de lucru.
7.6.1 Mobila și amplasarea ei.
Mobilierul trebuie aranjat în așa fel, ca să satisfacă cerințele pentru a obține o atmosferă de confort. Dacă masa de la locul de lucru este ajustabilă, atunci se ajustează înălțimea potrivită, in caz contrar se aranjează scaunul în modul care ar satisface necesitățile. Ajustarea corectă a scaunului poate adăuga confort prin asigurarea unei poziții bune. Atunci când se selecteaza și se aranjează scaunul este necesar de reținut următoarele: fiți siguri dacă scaunul D-tră este de înălțimea potrivită. Poziția corectă ar fi aceea, care V-ar da posibilitatea să Vă mențineți poziția propriei mâini și să plasați picioarele pe podea. Genunchii trebuie să fie la același nivel cu șoldurile, ori puțin mai sus. Utilizați un suport pentru picioare în cazul când scaunul D-tră este prea înalt și picioarele nu ajung până la podea.
Ca recomandații individuale pot servi următoarele:
Atunci când ședeți, evitați presiunea de-a lungul coapsei și părții din jos a picioarelor. Genunchii trebuie să fie puțin mai sus decât șoldurile.
Așezați-vă așa ca partea de jos a spatelui să se sprigine atunci când ședeti la locul de lucru.
Ocupați o poziție de lucru naturală, dreaptă și relaxantă și lăsați scaunul să vă sprigine. Evitați pozitia aplecată atât înainte, cât și în urmă.
Variați sarcinile D-tră pentru a nu vă afla în aceiași poziție în decursul a câtorva ore.
Faceți întreruperi periodice atunci când lucrați la calculator timp îndelungat (câteva ore). Vă veți putea convinge că întreruperile scurte, dar frecvente vor fi mai benefice decât întreruperile mai lungi și rare.
Ridicați-vă și întindeți-vă câteva minute și faceți exerciții de câteva ori pe zi.
Schimbați frecvent poziția atunci când ședeți, pentru a reduce oboseala muschilor.
Faceți ca materialele de lucru să vă fie la îndemână.
7.6.2 Așezarea monitorului.
Dacă monitorul e plasat în poziția corespunzătoare și la înaltimea corectă, atunci se reduce încordarea ochilor, cât și oboseala mușchilor gâtului și a umerilor. La plasarea monitorului e binevenit să fie urmate următoarele recomandații:
Așezați monitorul direct în fața D-tră la o distanță de vedere potrivita.
Atunci când ședeți la locul de lucru asigurați-vă că partea de sus a monitorului nu este mai sus decât nivelul ochilor.
Așezați monitorul în așa mod, pentru a evita strălucirile, ori alte reflecții strălucitoare.
Dacă monitorul are caracteristicile de înclinare și cuplaj, utilizați-le pentru a găsi cea mai bună poziție a lui. Este posibil ca să doriți să înclinați puțin monitorul pe spate pentru ca ecranul să vă satisfaca privirea.
Utilizați lumina monitorului și punctele de control ale monitorului pentru a îmbunătăți caracterul și calitatea imaginii.
Dacă utilizați un suport pentru documente, apoi trebuie să-l localizati la același nivel și distanță de vedere ca și monitorul.
7.6.3 Parametrii vizuali a imaginii
Efectuând controlul asupra condițiilor de lucru la locuri de muncă cu monitoare trebuie să fie măsurate și evaluate următorii parametri a imaginii:
deformarea imaginii;
contrastul de strălucire a imaginii;
variația strălucirii elementelor simbolului;
lungimea, lățimea, raportul lățimii la lungimea;
lățimea liniei de contur a simbolului;
modulație de strălucire a rasterului;
distanța între cuvinte, rânduri;
vibrația și fugă (licărire) imaginilor.
Prezența sau lipsa licăririi imaginii se stabilește după metode experimentale sau de calcul. Metoda experimentală permite de evaluat și vibrarea imaginii. Prezența vibrării se determină prin metodă măsurărilor directe. Celelalte caracteristici a ecranului se stabilesc după rezultatele măsurărilor directe și indirecte. După control, parametrii se compară cu recomandațiile prezentate în tabelul 8.
Tab.8
Parametrii monitorului
(continuare) Tab.8
Totodată o importanță mare are rezoluția ecranului, care se determină de tipul adaptorului grafic (CGA, EGA, VGA, SVGA), adică cât mai mare este rezoluția ecranului atât mai bună este imaginea.
7.6.4 Așezarea tastaturii, soricelului, și a altor dispozitive.
Tastatura și celelalte dispozitive, ca de exemplu, șoricelul, trebuie să fie situate în așa poziție, încât brațele și palmele să se afle într-o poziție naturală, confortabilă și relaxantă. Tastatura se așează în poziția confortabila pentru utilizator. Ca recomandații pot servi următoarele:
Alegeți o suprafață de lucru destul de încăpătoare unde să țineți utilajul pentru calculator și celelalte articole auxiliare necesare pentru lucrul D-tră.
Așezați tastatura exact în fața D-tră. Aceasta vă dă posibilitate să tapați astfel ca umerii să rămână relaxați și brațele să atârne liber în părți.
Ajustați înălțimea scaunului sau a suprafeței de lucru în așa mod, ca antebrațul să formeze un unghi drept cu brațul.
Minimalizați îndoirea palmelor și țineți coatele aproape de corp.
Evitați taparea îndelungată, îndeosebi dacă este forțată.
Dacă utilizați șoarecele, asigurați loc destul pentru mișcări libere, nestingherite.
Atunci când țineți șoarecele, lăsați palma pe masă. Apucați șoarecele ușurel. Lăsați degetul arătător pe un buton și al doilea deget pe altul.
7.6.5 Asigurarea iluminării și protecția vederii.
Iluminarea corectă adaugă eficacitate și confort în lucrul utilizatorului. Iluminarea trebuie să fie aranjata astfel, ca să ajute la efectuarea tipului de lucru cel mai des efectuat de caăre el. De exemplu, dacă cea mai mare parte a lucrului este efectuată în fața calculatorului, atunci trebuie să luați în considerație următorii factori:
Dacă este posibil, aranjați utilajul ori sursa de iluminare astfel ca reflecțiile strălucitoare de pe ecran să fie minimalizate.
Dacă încăperea are geamuri, atunci se recomandă utilizarea jaluzelelor, obloanelor ori draperiilor pentru a dirija cantitatea de lumină din încăpere. Încercați să plasați monitorul astfel ca părțile lui să fie situate spre geam. Aceasta poate reduce strălucirea pe ecran.
Așezați monitorul între rândurile luminilor de sus pentru a evita strălucirea.
Combinați iluminarea generala cu cea specială (a sarcinii date) pentru necesitățile de iluminare, însă evitați sursele de lumină strălucitoare din câmpul vederii.
Utilizați iluminarea directă pentru a evita petele strălucitoare pe ecran.
Atunci când se lucrează la calculator o perioadă mai îndelungată de timp, ochii pot deveni iritați și obosiți. De aceea trebuie acordată o atenție specială protecției vederii:
Faceți întreruperi frecvente și odihniți ochii.
Mentineți ochelarii, lentilele de contact și ecranul calculatorului în curățenie.
Dacă utilizați filtrul de strălucire, curătați-l conform instrucțiunilor.
Examinați-vă regulat ochii la medicul oculist.
Dacă se vor urma toate recomandările menționate parametrii ergonomici ai mediului de lucru pot fi considerate satisfăcătoare.
7.7. Iluminatul
La lucrul cu CE o importanță mare are crearea mediului de iluminare optimal, adică organizarea rațională a iluminatului natural și artificial în încăperi și la locuri de muncă, deoarece lucrând la CE încărcarea în general cade pe organe de vedere. Dacă omul lucrează mai mult de o jumătate a zilei de lucru la CE la el se observă înrăutățirea vederii, ce constituie 62-94%. Aceasta în primul rând este oboseala ochilor, dureri foarte mari și simțul de nisip în ochi, mâncărime și senzație de usturare în ochi. Totodată senzațiile dureroase în ochi apar în general la sfârșitul zilei de lucru. Din această cauză toate locurile de muncă cu CE se amplasează în locuri ce sunt protejate de căderea luminii difuzate pe ecranul terminalului. Pentru aceasta se utilizează încăperi cu iluminarea unilaterală (într-o singură direcție), totodată ferestrele trebuie să fie cu storuri sau jaluzele pentru excluderea efectului de orbire și strălucirea ecranului terminalului.
Iluminarea artificială a locului de muncă se efectuează în felul următor, nivelul iluminării trebuie să corespundă caracterului de lucru vizual, iluminarea încăperii să nu depindă de timpul de afară, fluxurile de lumină să aibă direcția optimală și utilajul trebuie să fie economic, inofensiv, durabil și simplu în exploatare.
La instalarea iluminatului artificial se fac următoarele măsurări:
iluminarea la locuri de muncă;
caracterul de strălucire a ecranului, mesei;
strălucirea petelor reflectate în ecran.
Se efectuează măsurări de control a iluminării și strălucirii la locuri de muncă cu diferite terminale, care sunt în încăperi și care se află în diferite condiții de iluminare, acolo unde sunt plângeri ale personalului. Măsurarea iluminatului se efectuează în timpul întuneric a zilei.
Punctele de control pentru măsurările iluminatului la locuri de muncă se amplasează:
în centrul ecranului;
pe tastatură;
pe document în planul amplasării lui;
pe masă în zona de lucru.
Efectuarea măsurărilor se efectuează în conformitate cu STAS 2.4.940-91. Măsurarea caracterului de strălucire a ecranului se efectuează la strălucirea ecranului nu mai puțin de 35 c/m2. Iluminarea locului de muncă se normează după SniP II-4-91 și depinde de caracterul lucrului vizual, contrastul obiectului, fonului și tipul fonului.
7.8. Calcularea iluminatului artificial a încăperii.
Pentru organizarea activității normale a omului o mare însemnătate are crearea condițiilor normale de iluminare naturală și artificială la locul de muncă.
Iluminarea de producție, corect proiectată și îndeplinită, aduce la rezolvarea următoarelor probleme:
ea îmbunătățește condițiile de muncă, micșorează oboseala, contribuie la creșterea productivității muncii și a calității producției, acționează binefăcător asupra mediului de producere, acționează pozitiv din punct de vedere psihologic asupra lucrătorului, ridică securitatea muncii și micșorează traumatismul în producție.
Analizatorul vizual percepe, ca lumină, oscilațiile electromagnetice cu lungimea de undă 380-770 nm.
Iluminarea optimă se alege în dependență de particularitățile (coeficientul de reflecție) suprafeței de lucru și detaliile ce sunt analizate pe ea (lungimea perioadei de lucru vizual, precizia, caracterul procesului de lucru).
O cerință importantă este menținerea regimului de iluminare. La iluminarea artificială devierile în rețea nu trebuie să depășească + 2.5 – 3 %.
Prin norme sunt introduse valorile minimale a iluminării care permit realizarea cu succes a lucrului vizual.
În dependență de sursa de lumină, iluminarea de producere poate fi de două tipuri: naturală (lumina de zi) și artificială, generată de lămpile electrice.
Iluminatul artificial poate fi de lucru, de pază, de serviciu, de evacuare, de avarii.
Iluminatul de lucru poate fi local, total și combinat.
Este interzis de a folosi la întreprinderile mari iluminatul local, deoarece el trebuie să constituie nu mai puțin de 10 % din iluminatul total.
Normarea iluminatului artificial se efectuează de SNiP-II-4-79.
La fel se normează iluminarea locurilor de muncă în funcție de :
1. categoria lucrului vizual
a) precizie înaltă E =5000 lx
b) fără precizie E =30 lx
2. în dependență de tipul de iluminat-adică total sau local.
3. în dependență de fon.
4. în dependență de contrast.
Raportul dintre fon și contrast indică subcategoria (a,b,c,d).
Iluminatul artificial există datorită becurilor incadiscente și fluoriscente.
Deci după cum știm, iluminatul natural este schimbător în timp sau chiar poate să nu existe, de aceia se folosește iluminatul artificial, iar pentru instalarea corectă a iluminatului artificial se fac careva calcule.
Calcularea iluminatului artificial se face conform metodei randamentului de flux de lumină.
După această metodă se găsește fluxul de lumină a becurilor care asigură iluminarea locurilor de muncă, normarea
unde:
Sp – suprafața podelei
En – iluminarea normată minimală, 500 lx (precizie mijlocie)
z – coeficientul iluminării neuniforme, Z=1.1-1.2
Kr – coeficientul de rezervă, se ține cont de tipul de becuri și de tipul de încăpere.
N – numărul de instalații de iluminat
n – numărul de becuri într-o instalație
Huf- coeficientul utilizării de către lampele radiante a fluxului de lumina pe
suprafața calculată.
Se determină în dependență de tipul becului, coeficientului de reflectare a podelei, pereților, tavanului, indicile încăperii:
unde
A,B – dimensiunile încăperii
h – înălțimea suspensiei lămpilor de aspra suprafeței de lucru.
Kum – coeficientul de umbrire, se introduce pentru încăperile cu poziția fixă a lucrătorilor, și este egal cu 0.8-0.9.
Înălțimea lampei asupra ariei de iluminare se calculează după formula:
Hc=H-Hl-Ht;
unde
H – înălțimea încăperii 4,00 m.
Hl- distanța de la pod până la partea de jos a lampei, 0,5 m
Ht- distanța de la podea până la suprafața iluminată, 0,75 m
Hc=4,00 – 0,10 – 0,75 = 3,15 m
Calculăm i,
Având coeficientul de reflectare a tavanului și pereților egal cu 0.7 și după indicile calculat i, coeficientul de folosire a fluxului de lumină din tabel egal =0,30
Calculăm
Pentru iluminare utilizăm 10 instalații a câte 2 becuri fiecare. Alegem cea mai apropiată lampă de tipul EA-80 cu fluxul de lumină 5220 lm care asigură pe deplin iluminarea centrului de calcul.
7.9 Analiza condițiilor de muncă
Efectuarea lucrărilor de programare se efectuiază într-o încăpere separată a Centrului Republican de Informatică. Este necesar de efectuat analiza condiîiilor de muncă în încăperea respectivă. Condițiile de muncă în timpul efectuării practicii de diplomă, de pe poziții de protecție, se apreciază în primul rând vizual aplicând noțiunile "normal" (n) și periculos (p). Analiza factorilor ce acționează asupra omului la locul de muncă e prezentat în forma de tabel (Tabelul 9 Caracteristicile condițiilor sanitar-igienice, factorii de producție dăunatori și periculoși):
Tab.9
Caracteristica condițiilor sanitaro – igienice și ale factorilor de producție dăunatori și periculoși
(continuare) Tab.9
(continuare) Tab.9
(continuare) Tab.9
Încheiere
Programul WebMail, care reprezintă proiectul de diplomă, este foarte flexibil și ușor în utilizare pentru orice tip de utiliazator. Datorită unui script install.pl acest sistem poate fi instalat sub orice sistem de operare în prezența limbajului Perl. Configurarea se efectuiază rapid.
Aici utilizator are posibilitatea de a face setarea culorilor pentru interfața pentru fiecare utilizator aparte.
Datele necesare sunt păstrate în fișiere de tip text și datorită faptului că datele nu sunt în maștab de milione de înregistrări aceste poate fi ușor găsite de program.
Aici fiecare utilizator are posibilitate de a crea o proprie carte de adrese ceea ce duce la sporirea eficacității lucrului și micșorarea timpului de a afla o mulțime de adrese. Tot în acest subsistem în cartea de adrese există un mecanism de import al bazei de adrese din sistemele ”Outlook Express” și ”Netscape”.
Fiecare utilizator are posibilitate de a efectua un răspuns la orice scrisoare sau un forward.
Există o tehnică de securitate a datelor utilizatorului unde pentru fiecare se crează un derictoriu anumit, în unde este stocată sesia curentă a lui. Și numai dacă numărul sesiei este corect atunci se verifică parola lui după sesie. În caz dacă una din aceste informații este greșită, nici un utilizator n-are posibilitate de a lucra la acest sistem.
În sfîrșit aș dori să spun că proiectul de diplomă descrie unii din principiale noutăți, care sunt actuale acuma în tehnologii informaționale din punct de vedere Internetului.
Bibliografie
Крис Джамса. Программирование в Web для профессионалов. Попурри. Минск 1997.
Фролов. Сервер Web своими руками Москва. ДИАЛОГ-МИФИ. 1997.
Пол Дж. Перри. Секреты World Wide Web. Киев. Диалектика. 1996.
Билл Игер. Работа в Internet Москва. Бином. 1996
Ресурсы Microsoft Windows NT Server 4.0 .Руководство для профессионалов. BHV-Санкт-Петербург 1997.
Н.И.Баклашов и.др. Охрана труда и окружающей среды. Москва.Радио и связь. 1989.
Sriram Srinivasan. Advanced Perl Programming. 1st Edition August 1997.
http://www.apache.org/lybrary
http://www.softlab.ntua.gr/www/httpd.html
http://www.w3/pub/WWW/Protocols/
http://www.microsoft.com/workshop/author/layout/layout.htm
http://www.shareware.com
http://www.ast.ac.uk
http://www.website.ora.com
http://www.w3.nsc.ru
http://www.visti.net
http://www.virtuoso-net.com/perlhouse/CGI_Scripts
http://opensource.activestate.com/authors/jandubois/Perl
http://perl.artil.ru:8101/
ANEXE
Anexa 1 Codul sursă a programului “inbox.cgi”
#!/usr/local/bin/perl
use MIME::Base64;
use Mail::POP3Client;
use CGI qw/:standard/;
use CGI::Carp qw(fatalsToBrowser);
require 'wmail.conf';
require 'wvars.cgi';
&initPage;
&createSession;
if ($form->param('folder')) {
$folder = $form->param('folder');
} else {
$folder = "inbox";
}
print qq~
<script language="JavaScript">
<!– Hide this script from old browsers
agent = navigator.userAgent;
browserOk = 0;
if (navigator.appName == "Netscape" && navigator.appVersion.substring(0,1) >= 2) {
browserOk = 1
} else {
if (navigator.appName == "Microsoft Internet Explorer" && navigator.appVersion.substring(0,1) >= 3) {
browserOk = 1
}
}
function checkorUncheck(foo) {
if (browserOk) {
for (i = 0; i < document.forms["deleteForm"].length; i++) {
document.forms["deleteForm"].elements[i].checked = foo
}
}
}
function OpenAddressbook() {
var addressWindow = window.open("addressbook.cgi?mailserv=$mailserv&user=$user&SessionID=$SessionID&edit=yes","AddressBook","width=600,height=450,resizable=yes,scrollbars=yes");
}
function addContact(contact, email_address) {
var addressWindow = window.open("addressbook.cgi?func=precontact&contact_name=" + contact + "&email_address=" + email_address + "&mailserv=$mailserv&user=$user&SessionID=$SessionID&edit=yes","AddressBook","width=600,height=450,resizable=yes,scrollbars=yes");
}
function wstatus(txt) {
window.status = txt;
return true;
}
// – End hiding here –>
</script>
~;
if ($folder eq "inbox") {
# Return number of Messages on server.
$messages = $pop->Count();
$block = $form->param('block');
if ($block) {
$topmsg = $block;
} else {
$topmsg = $messages;
}
# Check for messages, if none exist die, if exist then display them…
if ($messages eq "0") {
$replyto =~ s/(\\\@)/@/g;
print qq~
<div align="center">
<table border="0" cellpadding="1" cellspacing="0" bgcolor="#000000" width="95%">
<tr bgcolor="#FFFFFF">
<td width="50%" align="left" valign="bottom"><img src="$imageshttp/title_inbox.gif" width="68" height="19" border="0" alt="Preferences"></td>
<td width="50%" align="right" valign="bottom"><font face="Geneva, Arial, Helvetica"> ($replyto)</font></td>
</tr>
<tr>
<td colspan="2">
<table width="100%" border="0" cellspacing="1" cellpadding="10">
<tr>
<td bgcolor="$table_head">
<font face="Geneva, Arial, Helvetica" size="+1">You have no messages.</font>
</td>
</tr>
<tr bgcolor="$table_bg">
<td colspan="1" valign="middle">
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tr>
<td width="50%" align="left" valign="top">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td valign="top">
<form method="post" action="$cgidir/compose.cgi">$const_vars
<img src="$imageshttp/dot_clear.gif" width="10" height="1" border="0"><input type="image" name="Compose" value="Compose Message" src="$imageshttp/msg_new.gif" width="23" height="20" border="0" alt="Compose New Message" onMouseOver="return wstatus('Compose New Message')" onMouseOut="window.status='';return true">
</form>
</td>
<td valign="top">
<form method="post" action="$cgidir/inbox.cgi">$const_vars
<img src="$imageshttp/dot_clear.gif" width="10" height="1" border="0"><input type="image" name="Check mail" value="Check Mail" src="$imageshttp/checkmail.gif" width="23" height="20" border="0" alt="Check Mail" onMouseOver="return wstatus('Check Mail')" onMouseOut="window.status='';return true">
</form>
</td>
<td align=right valign=bottom>
<form method="post" action="$cgidir/inbox.cgi">$const_vars<nobr><font> Folder:</font>
<select name="folder">
~;
open (INPUT, "<$datadir/$mailserv/$user/folders");
while (<INPUT>) {
my @folders = split(/\,/, $_);
my $f_name = @folders[1];
chomp $f_name;
if (!$folder) {
$folder = "inbox";
}
if ($f_name eq $folder) {
print "<option value=$f_name selected>";
} else {
print "<option value=$f_name>";
}
print @folders[0];
}
close (INPUT);
print qq~
</select>
<input type="submit" value="Go!">
</nobr>
</form>
</td>
</tr>
</table>
</td>
<td width="50%" align="right" valign="top">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td valign="top"><a href="javascript:OpenAddressbook()"><img src="$imageshttp/addressbook.gif" width="23" height="20" border="0" alt="Open Addressbook" onMouseOver="return wstatus('Open Addressbook')" onMouseOut="window.status='';return true"></td>
</form>
<form method="post" action="$cgidir/prefs.cgi">$const_vars
<input type="hidden" name="func" value="modify">
<td valign="top"><img src="$imageshttp/dot_clear.gif" width="10" height="1" border="0"><input type="image" name="preferences" value="Preferences" src="$imageshttp/prefs.gif" width="23" height="20" border="0" alt="Modify your Preferences" onMouseOver="return wstatus('Modify your Preferences')" onMouseOut="window.status='';return true"></td>
</form>
<form method="post" action="$cgidir/logout.cgi">$const_vars
<td valign="top"><img src="$imageshttp/dot_clear.gif" width="10" height="1" border="0"><input type="image" name="logout" value="Logout" src="$imageshttp/logout.gif" width="23" height="20" border="0" alt="Logout" onMouseOver="return wstatus('Logout')" onMouseOut="window.status='';return true"><img src="$imageshttp/dot_clear.gif" width="10" height="1" border="0"></form></td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</div>
~;
&printTail;
close;
}
$td_color = $bg_dark;
# Display list of Messages
if ($msgnum <= 0) {
$inboxsize = ($pop->Size);
print qq~
<div align="center">
<table border="0" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF" width="97%">
<tr bgcolor="#FFFFFF">
<td width="68" align="left" valign="bottom"><img src="$imageshttp/title_inbox.gif" width="68" height="19" border="0" alt="Inbox"></td>
~;
&welcome;
print qq~
<td width="25%" align="right" valign="bottom">
~;
if ($messages > $show_messages) {
print qq~
<form method="post" action="$cgidir/inbox.cgi">$const_vars<font>Messages:</font><br><select name="block">
~;
$x = $messages;
$msgblock = $messages;
while ($x >= 1) {
$x = $x – $show_messages;
$bottom_msg = $x + 1;
if ($bottom_msg < 1) {
$bottom_msg = 1;
}
if ($topmsg eq $msgblock) {
print qq~<option value="$msgblock" selected><font face="Geneva, Arial, Helvetica">$msgblock to $bottom_msg</font>~;
} else {
print qq~<option value="$msgblock">$msgblock to $bottom_msg</font>~;
}
$msgblock = $msgblock – $show_messages;
}
print qq~</select><input type="submit" value="Go!"></form></td>
</tr>
</table>
~;
} else {
print qq~</td></tr></table>~;
}
print qq~
<div align="center">
<table border="0" cellpadding="1" cellspacing="0" bgcolor="#000000" width="97%">
<tr>
<td>
<table width="100%" border="0" cellspacing="1" cellpadding="3">
<tr bgcolor="$table_head">
<td colspan="2" width="75"><img src="$imageshttp/dot_clear.gif" width="1" height="1"></td>
<td width=30%><font><b>Mail From:</b></font></td>
<td width=40%><font><b>Subject:</b></font></td>
<td colspan="2" width=45><img src="$imageshttp/dot_clear.gif" width="1" height="1"></td>
<td><font><b>Size:</b></font></td>
<td width=60><font><b>Date:</b></font></td>
</tr>
<form method="post" name="deleteForm" action="$cgidir/delete.cgi">
<input type="hidden" name="mailserv" value="$mailserv">
<input type="hidden" name="user" value="$user">
<input type="hidden" name="SessionID" value="$SessionID">
<input type="hidden" name="func" value="delete">
</tr>
~;
$bottommsg = $topmsg – $show_messages;
if (($topmsg – $show_messages) < 0) {
$bottommsg = 0;
}
for ($i = $topmsg; $i > $bottommsg; $i– ) {
my ($from, $subject, $date, $read);
foreach( $pop->Head($i)) {
if (/^From:\s+/i) {
s/(From:\s)//i;
s/(<)/</g;
s/(>)/>/g;
s/(")//g;
s/(\w)(<)/$1 </g;
$from = $_;
}
if ($from eq "") {
$from = "(No Sender)";
}
if ($from) {
$contact = $from;
$contact =~ s/\s(<)([a-zA-Z0-9.\-_]+@[a-zA-Z0-9.\-_]+)(>)//g;
$email_address = $2;
$contact =~ s/(")//g;
$contact1 = $contact;
$contact1 =~ s/(\s)/%20/g;
}
if (!$email_address) {
$email_address = $contact;
}
if (/^Subject:\s+/i) {
s/(Subject:\s)//i;
$subject = $_;
}
if (/^Date:\s+/i) {
s/(Date:\s)//i;
$date = $_;
}
if (/^Status:\s/i) {
s/(Status:\s)//i;
$status = $_;
chomp $status;
if ($status eq "U") {
$read = "<font color=\"red\"><b>*</b></font>";
}
}
}
# Parse subject to pass on to reply form
$subject2 = $subject;
$subject2 =~ s/(Subject:\s)//i;
$subject2 =~ s/(\s)/%20/g;
# Parse from to pass on to reply as recipient
$rcpt = $from;
$rcpt =~ s/(\s)//g;
$rcpt =~ s/(<)/ </g;
$rcpt =~ s/(>)/>/g;
$rcpt =~ s/(\S+\s)//g;
$rcpt =~ s/(<|>)//g;
if ( $td_color eq $bg_dark ) {
$td_color = $bg_light;
} else {
$td_color = $bg_dark;
}
if (! length($subject) ) {
$subject = '(No Subject)';
}
print qq~
<tr valign="top" bgcolor="$td_color">
<td width="52">
<nobr>
<font>$i.</font>
<input type="checkbox" name="msgnum" value="$i">$read
</nobr>
</td>
<td valign="top" width="23">
<a href="javascript:addContact('$contact1','$email_address')" onMouseOver="return wstatus('Add $contact to your Address Book')" onMouseOut="window.status='';return true"><img src="$imageshttp/add_address.gif" width="23" height="20" border="0" alt="add contact"></a>
</td>
<td valign="top" width="30%">
<font>
<a href="$cgidir/showmessage.cgi?msgnum=$i&mailserv=$mailserv&user=$user&SessionID=$SessionID" onMouseOver="return wstatus('Read message from $from')" onMouseOut="window.status='';return true">
$contact
</a>
</font>
</td>
<td valign="top" width="40%">
<font>
$subject
</font>
</td>
<td valign="top" width="23">
<a href="$cgidir/compose.cgi?mailserv=$mailserv&replynum=Re$i&user=$user&SessionID=$SessionID" onMouseOver="return wstatus('Reply to message from $from')" onMouseOut="window.status='';return true">
<img src="$imageshttp/msg_reply.gif" width="23" height="20" border="0" alt="Reply to Message">
</a>
</td>
<td valign="top" width="23">
<a href="$cgidir/compose.cgi?mailserv=$mailserv&replynum=Fwd$i&user=$user&SessionID=$SessionID" onMouseOver="return wstatus('Forward message from $from')" onMouseOut="window.status='';return true">
<img src="$imageshttp/msg_forward.gif" width="23" height="20" border="0" alt="Forward Message">
</a>
</td>
<td valign="top">
<font><nobr>
~;
&message_size($i);
print qq~
</nobr></font>
</td>
<td valign="top">
<font>
~;
&parse_date($date);
print qq~
</font>
</td>
<tr>
~;
}
&inboxBar;
}
}
if ($folder eq "outbox") {
print qq~
<div align="center">
<table border="0" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF" width="97%">
<tr bgcolor="#FFFFFF">
<td width="68" align="left" valign="bottom"><h2>Outbox</h2></td>
~;
print qq~
</td><td width="20%"> </td></tr></table>
<table border="0" cellpadding="1" cellspacing="0" bgcolor="#000000" width="97%">
<tr>
<td>
<table width="100%" border="0" cellspacing="1" cellpadding="3">
<tr bgcolor="$table_head">
<td width=10%><img src="$imageshttp/dot_clear.gif" width="1" height="1"></td>
<td width=36%><font><b>Recipient:</b></font></td>
<td width=40%><font><b>Subject:</b></font></td>
<td width=14%><font><b>Date:</b></font></td>
</tr></tr>
~;
open (ITEMS, "<$datadir/$mailserv/$user/outbox/items");
$td_color = $bg_dark;
while (<ITEMS>) {
@item = split(/\,/, $_);
my $message = @item[0];
my $subject = @item[1];
my $rcpt = @item[2];
my $from = @item[3];
my $cc = @item[4];
my $bcc = @item[5];
my $date = @item[6];
if ($td_color eq $bg_dark) {
$td_color = $bg_light;
} else {
$td_color = $bg_dark;
}
if ($rcpt) {
print qq~
$const_vars
<input type=hidden name=folder value=outbox>
<tr valign="top" bgcolor="$td_color">
<td width=25><form method="post" name="deleteForm" action="$cgidir/delete.cgi">$const_vars<input type=hidden name=msgnum value=$message><input type=hidden name=folder value=outbox><input type="submit" value="Delete"></form></td>
<td valign="top">
<font>
<a href="$cgidir/showmessage.cgi?&mailserv=$mailserv&user=$user&SessionID=$SessionID&msgnum=$message&folder=outbox" onMouseOver="return wstatus('Read message from $from')" onMouseOut="window.status='';return true">
$rcpt
</a>
</font>
</td>
<td valign="top">
<font>
$subject
</font>
</td>
<td valign="top">
<font>
~;
&parse_date($date);
print qq~
</font>
</td>
<tr>
~;
} else {
print "<tr><td colspan=4 bgcolor=\"white\">You have no messages in your outbox</td></tr>";
}
}
print qq~
<tr bgcolor="$table_bg">
<td colspan="4" valign="middle">
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tr>
<td width="50%" align="left" valign="top">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td valign="top">
<form method="post" action="$cgidir/compose.cgi">$const_vars
<img src="$imageshttp/dot_clear.gif" width="10" height="1" border="0"><input type="image" name="Compose" value="Compose Message" src="$imageshttp/msg_new.gif" width="23" height="20" border="0" alt="Compose New Message" onMouseOver="return wstatus('Compose New Message')" onMouseOut="window.status='';return true">
</form>
</td>
<td valign="top">
<form method="post" action="$cgidir/inbox.cgi">$const_vars
<img src="$imageshttp/dot_clear.gif" width="10" height="1" border="0"><input type="image" name="Check mail" value="Check Mail" src="$imageshttp/checkmail.gif" width="23" height="20" border="0" alt="Check Mail" onMouseOver="return wstatus('Check Mail')" onMouseOut="window.status='';return true">
</form>
</td>
<td align=right valign=bottom>
<form method="post" action="$cgidir/inbox.cgi">$const_vars<nobr><font> Folder:</font>
<select name="folder">
~;
open (INPUT, "<$datadir/$mailserv/$user/folders");
while (<INPUT>) {
my @folders = split(/\,/, $_);
my $f_name = @folders[1];
chomp $f_name;
if (!$folder) {
$folder = "inbox";
}
if ($f_name eq $folder) {
print "<option value=$f_name selected>";
} else {
print "<option value=$f_name>";
}
print @folders[0];
}
close (INPUT);
print qq~
</select>
<input type="submit" value="Go!">
</nobr>
</form>
</td>
</tr>
</table>
</td>
<td width="50%" align="right" valign="top">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td valign="top"><a href="javascript:OpenAddressbook()"><img src="$imageshttp/addressbook.gif" width="23" height="20" border="0" alt="Open Addressbook" onMouseOver="return wstatus('Open Addressbook')" onMouseOut="window.status='';return true"></td>
</form>
<form method="post" action="$cgidir/prefs.cgi">$const_vars
<input type="hidden" name="func" value="modify">
<td valign="top"><img src="$imageshttp/dot_clear.gif" width="10" height="1" border="0"><input type="image" name="preferences" value="Preferences" src="$imageshttp/prefs.gif" width="23" height="20" border="0" alt="Modify your Preferences" onMouseOver="return wstatus('Modify your Preferences')" onMouseOut="window.status='';return true"></td>
</form>
<form method="post" action="$cgidir/logout.cgi">$const_vars
<td valign="top"><img src="$imageshttp/dot_clear.gif" width="10" height="1" border="0"><input type="image" name="logout" value="Logout" src="$imageshttp/logout.gif" width="23" height="20" border="0" alt="Logout" onMouseOver="return wstatus('Logout')" onMouseOut="window.status='';return true"><img src="$imageshttp/dot_clear.gif" width="10" height="1" border="0"></form></td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td></tr></table>
</div>
~;
}
$pop->Close();
&printTail;
Anexa 2 Codul sursă a programului “sendmessage.cgi”
#!/usr/local/bin/perl
use MIME::Base64;
use CGI qw/:standard/;
use CGI::Carp qw (fatalsToBrowser);
use Text::Wrap qw(wrap $columns);
use Mail::POP3Client;
use Time::Local;
require 'wmail.conf';
require 'wvars.cgi';
&initPage;
&createSession;
use Mail::Sender;
require "$datadir/$mailserv/$user/info";
$preview = $form->param('preview');
if (!$preview) {
$sendpreview = $form->param('funct');
if (!$sendpreview) {
$cc = $form->param('cc');
$bcc = $form->param('bcc');
$subject = $form->param('subject');
$data = $form->param('data');
if (!$replyto) {
$from = "$name <$user\@$mailserv_replyto>";
} else {
$from = "$name <$replyto>";
}
$rcpt = $form->param('rcpt');
$attach1 = $form->param('attach1');
$attach2 = $form->param('attach2');
$attach1 =~ s/^.*\\([^\\]+)$/$1/;
$attach2 =~ s/^.*\\([^\\]+)$/$1/;
$huge = 'wrap'; #Used for Text::Wrap
$wrappeddata = wrap('','',$data);
} else {
if(-e "$datadir/$mailserv/$user/preview") {
require "$datadir/$mailserv/$user/preview";
$huge = 'wrap'; #Used for Text::Wrap
$wrappeddata = wrap('','',$data);
system ("$system_rm $datadir/$mailserv/$user/preview");
} else {
print "Error – could not open preview";
&printTail;
exit;
}
}
if ($attach1) {
# Begin Patch by Yuri / Mods by hardware
$FH_ONE = $form->param('attach1');
open (MYFILEONE,">$mimedir/$attach1");
binmode (MYFILEONE);
binmode ($FH_ONE);
while ($bytesread = read($FH_ONE, $buffer, 1024)) {
print MYFILEONE $buffer;
}
close(MYFILEONE);
$attachment1 = "$mimedir/$attach1";
$smtp = new Mail::Sender
{smtp => $smtpserv, from => $from};
if ($attach2) {
$FH_TWO = $form->param('attach2');
open (MYFILETWO,">$mimedir/$attach2");
binmode (MYFILETWO);
binmode ($FH_TWO);
while ($bytesread = read($FH_TWO, $buffer, 1024)) {
print MYFILETWO $buffer;
}
close(MYFILETWO);
$attachment2 = "$mimedir/$attach2";
$smtp->OpenMultipart({to => $rcpt, cc => $cc, bcc => $bcc, subject => $subject});
$smtp->Body(0,0,"text/plain");
$smtp->SendLine($wrappeddata);
filename=*", encoding => "Base64", file => "$attachment1"});
filename=*", encoding => "Base64", file => "$attachment2"});
$smtp->SendFile({file => "$attachment1"});
$smtp->SendFile({file => "$attachment2"});
unlink ("$mimedir/$attach1");
unlink ("$mimedir/$attach2");
} else {
$smtp->OpenMultipart({to => $rcpt, cc => $cc, bcc => $bcc, subject => $subject});
$smtp->Body(0,0,"text/plain");
$smtp->SendLine($wrappeddata);
filename=*", encoding => "Base64", file => "$attachment1"});
$smtp->SendFile({file => "$attachment1"});
unlink ("$mimedir/$attach1");
}
} else {
$smtp = new Mail::Sender
{smtp => $smtpserv, from => $from};
$smtp->Open({to => $rcpt, cc => $cc, bcc => $bcc, subject => $subject});
$smtp->SendLine($wrappeddata);
}
die "Can't open user directory" if (!opendir(USERDIR, "$datadir/$mailserv/$user") );
require "$datadir/$mailserv/$user/info";
$pass = decode_base64($encpass);
$metatag = qq~<meta HTTP-EQUIV="refresh" content="5; URL=$cgidir/inbox.cgi?mailserv=$mailserv&user=$user&SessionID=$SessionID">~;
if ($smtp->Close eq "1") {
$var1 = $smtp->Close;
$message = "Message successfully sent.";
open(ITEMS, "<$datadir/$mailserv/$user/outbox/items");
while (<ITEMS>) {
my @line = split(/\,/, $_);
$i = @line[0];
}
close(ITEMS);
open(ITEMS, ">>$datadir/$mailserv/$user/outbox/items") || die "Cannot open $datadir/$mailserv/$user/outbox/items for output";
if (!$i) {
$i = 0;
}
my $item = $i+1;
my $date = `date +"%a %d %b %Y %T"`;
chomp $date;
print ITEMS "$item,$subject,$rcpt,$from,$cc,$bcc,$date\n";
close(ITEMS);
open(SENT, ">$datadir/$mailserv/$user/outbox/$item.msg") || die "Cannot open $datadir/$mailserv/$outbox/ for output";
$cc =~ s/(@)/\\@/g;
$bcc =~ s/(@)/\\@/g;
$from =~ s/(@)/\\@/g;
$rcpt =~ s/(@)/\\@/g;
$wrappeddata =~ s/(@)/\\@/g;
$subject =~ s/(@)/\\@/g;
print SENT "\$cc = \"$cc\"\;\n";
print SENT "\$bcc = \"$bcc\"\;\n";
print SENT "\$subject = \"$subject\"\;\n";
print SENT "\$data = \"$wrappeddata\"\;\n";
print SENT "\$from = \"$from\"\;\n";
print SENT "\$rcpt = \"$rcpt\"\;\n";
print SENT "\$date = \"$date\"\;\n";
print SENT "\$attach1 = \"$attachment1\"\;\n";
print SENT "\$attach2 = \"$attachment2\"\;\n";
print SENT "1\;\n";
close(SENT);
} else {
$message = "Error: Message was not successfully sent.";
}
&generateMessage;
}
elsif ($preview or $form->param('rcpt') !~ /^[\w-.]+\@[\w-]+\.[\w]+$/ or $form->param('cc') !~ /^[\w-.]+\@[\w-]+\.[\w]+$/ or $form->param('bcc') !~ /^[\w-.]+\@[\w-]+\.[\w]+$/) {
$SendID = $form->param('SessionID');
$cc = $form->param('cc');
$bcc = $form->param('bcc');
$subject = $form->param('subject');
$data = $form->param('data');
if (!$replyto) {
$from = "$name <$user\@$mailserv_replyto>";
} else {
$from = "$name <$replyto>";
}
$rcpt = $form->param('rcpt');
$attach1 = $form->param('attach1');
$attach2 = $form->param('attach2');
$huge = 'wrap'; #Used for Text::Wrap
$wrappeddata = wrap('','',$data);
$cc2 = $cc;
$cc2 =~ s/\\/\\\\/g;
$cc2 =~ s/@/\\@/g;
$cc2 =~ s/"/\\"/g;
$bcc2 = $bcc;
$bcc2 =~ s/\\/\\\\/g;
$bcc2 =~ s/@/\\@/g;
$bcc2 =~ s/"/\\"/g;
$subject2 = $subject;
$subject2 =~ s/\\/\\\\/g;
$subject2 =~ s/@/\\@/g;
$subject2 =~ s/"/\\"/g;
$data2 = $data;
$data2 =~ s/\\/\\\\/g;
$data2 =~ s/@/\\@/g;
$data2 =~ s/"/\\"/g;
$from2 = $from;
$from2 =~ s/\\/\\\\/g;
$from2 =~ s/@/\\@/g;
$from2 =~ s/"/\\"/g;
$rcpt2 = $rcpt;
$rcpt2 =~ s/\\/\\\\/g;
$rcpt2 =~ s/@/\\@/g;
$rcpt2 =~ s/"/\\"/g;
$attach12 = $attach1;
$attach12 =~ s/\\/\\\\/g;
$attach12 =~ s/@/\\@/g;
$attach12 =~ s/"/\\"/g;
$attach22 = $attach2;
$attach22 =~ s/\\/\\\\/g;
$attach22 =~ s/@/\\@/g;
$attach22 =~ s/"/\\"/g;
open(PREVIEW, ">$datadir/$mailserv/$user/preview") || die "Cannot open file for output";
print PREVIEW "\$mailserv = \"$mailserv\"\;\n";
print PREVIEW "\$user = \"$user\"\;\n";
print PREVIEW "\$SessionID = \"$SendID\"\;\n";
print PREVIEW "\$cc = \"$cc2\"\;\n";
print PREVIEW "\$bcc = \"$bcc2\"\;\n";
print PREVIEW "\$subject = \"$subject2\"\;\n";
print PREVIEW "\$data = \"$data2\"\;\n";
print PREVIEW "\$from = \"$from2\"\;\n";
print PREVIEW "\$rcpt = \"$rcpt2\"\;\n";
print PREVIEW "\$attach1 = \"$attach12\"\;\n";
print PREVIEW "\$attach2 = \"$attach22\"\;\n";
print PREVIEW "1\;\n";
close(PREVIEW);
print qq~
<div align="center">
<table border="0" cellpadding="1" cellspacing="0" bgcolor="#000000" width="95%">
<tr bgcolor="#FFFFFF">
<td width="50%" align="left" valign="bottom"><img src="$imageshttp/title_preview.gif" width="104" height="19" border="0" alt="Preview"></td>
<td width="50%" align="right" valign="bottom"><font face="Geneva, Arial, Helvetica"> ($replyto)</font></td>
</tr>
<tr>
<td colspan="2">
<table width="100%" border="0" cellspacing="1" cellpadding="3">
<tr><td bgcolor="$bg_dark" width="15%"><font face="Geneva, Arial, Helvetica" size="-1"><b>From:</b></font></td><td bgcolor="$bg_light"><font face="Geneva, Arial, Helvetica">$from</font></td></tr>
<tr><td bgcolor="$bg_dark"><font face="Geneva, Arial, Helvetica" size="-1"><b>Subject:</b></font></td><td bgcolor="$bg_light"><font face="Geneva, Arial, Helvetica">$subject</font></td></tr>
<tr><td bgcolor="$bg_dark"><font face="Geneva, Arial, Helvetica" size="-1"><b>To:</b></font></td><td bgcolor="$bg_light"><font face="Geneva, Arial, Helvetica">$rcpt</font></td></tr>
~;
unless ($cc eq "") {
print qq~ <tr><td bgcolor="$bg_dark"><font face="Geneva, Arial, Helvetica" size="-1"><b>Cc:</b></font></td><td bgcolor="$bg_light"><font face="Geneva, Arial, Helvetica">$cc</font></td></tr>\n~;
}
unless ($bcc eq "") {
print qq~ <tr><td bgcolor="$bg_dark"><font face="Geneva, Arial, Helvetica" size="-1"><b>Bcc:</b></font></td><td bgcolor="$bg_light"><font face="Geneva, Arial, Helvetica">$bcc</font></td></tr>~;
}
print qq~
<tr>
<td bgcolor="$bg_light" colspan="2">
<xmp>
~;
print "$wrappeddata";
print qq~
</xmp>
</td>
</tr>
<tr>
<td colspan="2" bgcolor="$bg_light">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
~;
#if ($rcpt =~ /^[\w-.]+\@[\w-]+\.[\w]+$/ && ($cc =~ /^[\w-.]+\@[\w-]+\.[\w]+$/ or $cc eq "") && ($bcc =~ /^[\w-.]+\@[\w-]+\.[\w]+$/ or $bcc eq "")) {
print qq~
<td valign="bottom">
<form method="post" action="sendmessage.cgi" name="editmsg" ENCTYPE="multipart/form-data">
<input type="hidden" name="funct" value="sendpreview">
<input type="hidden" name="mailserv" value="$mailserv">
<input type="hidden" name="user" value="$user">
<input type="hidden" name="SessionID" value="$SessionID">
<input type="submit" value="Send Message">
</form>
</td>
~;
#}
print qq~<td valign="bottom">~;
print qq~
<form method="post" action="$cgidir/compose.cgi">
<input type="hidden" name="funct" value="changepreview">
<input type="hidden" name="mailserv" value="$mailserv">
<input type="hidden" name="user" value="$user">
<input type="hidden" name="SessionID" value="$SessionID">
<input type="submit" value="Change Message">
</form>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</div>
~;
&printTail;
}
Anexa 3 Codul sursă a modulului “MAIL::POP3Client.pm”
package Mail::POP3Client;
use strict;
use Carp;
use IO::Socket;
use Config;
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
require Exporter;
@ISA = qw(Exporter AutoLoader);
@EXPORT = qw(
);
my $ID =q( $Id: POP3Client.pm,v 2.6 2000/02/17 13:47:35 ssd Exp $ );
$VERSION = substr q$Revision: 2.6 $, 10;
sub new
{
my $classname = shift;
my $self = {
DEBUG => 0,
SERVER => "pop3",
PORT => 110,
COUNT => -1,
SIZE => -1,
ADDR => "",
STATE => 'DEAD',
MESG => 'OK',
BANNER => '',
MESG_ID => '',
AUTH_MODE => 'APOP',
EOL => "\015\012",
TIMEOUT => 60,
STRIPCR => 0,
};
$Config{osname} =~ /MacOS/i && ($self->{STRIPCR} = 1);
bless( $self, $classname );
$self->_init( @_ );
if ( $self->User() && $self->Pass() )
{
$self->Connect();
}
return $self;
}
sub _init {
my $self = shift;
if ( @_ && (scalar( @_ ) % 2 == 0) )
{
# … and smells like a hash…
my %hashargs = @_;
if ( ( defined($hashargs{USER}) &&
defined($hashargs{PASSWORD}) ) ||
defined($hashargs{HOST})
)
{
foreach my $key ( keys %hashargs )
{
$self->{$key} = $hashargs{$key};
}
}
else {$self->_initOldStyle( @_ );}
}
else {$self->_initOldStyle( @_ );}
}
sub _initOldStyle {
my $self = shift;
$self->User( shift );
$self->Pass( shift );
my $host = shift;
$host && $self->Host( $host );
my $port = shift;
$port && $self->Port( $port );
my $debug = shift;
$debug && $self->Debug( $debug );
my $auth_mode = shift;
$auth_mode && ($self->{AUTH_MODE} = $auth_mode);
}
sub Version {
return $VERSION;
}
sub Alive
{
my $me = shift;
$me->State =~ /^AUTHORIZATION$|^TRANSACTION$/i;
} # end Alive
sub State
{
my $me = shift;
my $stat = shift or return $me->{STATE};
$me->{STATE} = $stat;
} # end Stat
sub Message
{
my $me = shift;
my $msg = shift or return $me->{MESG};
$me->{MESG} = $msg;
} # end Message
sub Debug
{
my $me = shift;
my $debug = shift or return $me->{DEBUG};
$me->{DEBUG} = $debug;
} # end Debug
sub Port
{
my $me = shift;
my $port = shift or return $me->{PORT};
$me->{PORT} = $port;
} # end port
sub User
{
my $me = shift;
my $user = shift or return $me->{USER};
$me->{USER} = $user;
} # end User
sub Pass
{
my $me = shift;
my $pass = shift or return $me->{PASSWORD};
$me->{PASSWORD} = $pass;
} # end Pass
sub Count
{
my $me = shift;
my $c = shift;
if (defined $c and length($c) > 0) {
$me->{COUNT} = $c;
} else {
return $me->{COUNT};
}
} # end Count
sub Size
{
my $me = shift;
my $c = shift;
if (defined $c and length($c) > 0) {
$me->{SIZE} = $c;
} else {
return $me->{SIZE};
}
} # end Size
sub EOL {
my $me = shift;
return $me->{'EOL'};
}
sub Close
{
my $me = shift;
if ($me->Alive()) {
my $s = $me->Socket();
$me->_sockprint( "QUIT", $me->EOL );
close( $me->Socket() ) or $me->Message("close failed: $!") and return 0;
$me->State('DEAD');
}
1;
} # end Close
sub DESTROY
{
my $me = shift;
$me->Close;
} # end DESTROY
sub Connect
{
my ($me, $host, $port) = @_;
$host and $me->Host($host);
$port and $me->Port($port);
$me->Close();
my $s = IO::Socket::INET->new( PeerAddr => $me->Host(),
PeerPort => $me->Port(),
Proto => "tcp",
Type => SOCK_STREAM,
Timeout => $me->{TIMEOUT} )
or
$me->Message( "could not connect socket [$me->{HOST}, $me->{PORT}]: $!" )
and
return 0;
$me->{SOCKET} = $s;
$s->autoflush( 1 );
defined(my $msg = $me->_sockread()) or $me->Message("Could not read") and return 0;
chomp $msg;
$me->{BANNER}= $msg;
$me->{MESG_ID}= $1 if ($msg =~ /(<[\w\d\-\.]+\@[\w\d\-\.]+>)/);
$me->Message($msg);
$me->State('AUTHORIZATION');
$me->User() and $me->Pass() and $me->Login();
} # end Connect
sub Login
{
my $me= shift;
if ($me->{AUTH_MODE} eq 'APOP' && $me->{MESG_ID}) { $me->Login_APOP(); }
else { $me->Login_Pass(); }
}
sub Login_APOP
{
require MD5;
my $me = shift;
my $s = $me->Socket();
my $hash= MD5->hexhash ($me->{MESG_ID} . $me->Pass);
$me->_sockprint( "APOP " , $me->User , ' ', $hash, $me->EOL );
my $line = $me->_sockread();
chomp $line;
$me->Message($line);
$line =~ /^\+OK/ or $me->Message("APOP failed: $line") and $me->State('AUTHORIZATION')
and return 0;
$me->State('TRANSACTION');
$me->POPStat() or return 0;
}
sub Login_Pass
{
my $me = shift;
my $s = $me->Socket();
$me->_sockprint( "USER " , $me->User() , $me->EOL );
my $line = $me->_sockread();
chomp $line;
$me->Message($line);
$line =~ /^\+/ or $me->Message("USER failed: $line") and $me->State('AUTHORIZATION')
and return 0;
$me->_sockprint( "PASS " , $me->Pass() , $me->EOL );
$line = $me->_sockread();
chomp $line;
$me->Message($line);
$line =~ /^\+OK/ or $me->Message("PASS failed: $line") and $me->State('AUTHORIZATION')
and return 0;
$me->State('TRANSACTION');
$me->POPStat() or return 0;
} # end Login
sub Head
{
my $me = shift;
my $num = shift;
my $lines = shift;
$lines ||= 0;
$lines =~ /\d+/ || ($lines = 0);
my $header = '';
my $s = $me->Socket();
$me->_sockprint( "TOP $num $lines", $me->EOL );
my $line = $me->_sockread();
chomp $line;
$line =~ /^\+OK/ or $me->Message("Bad return from TOP: $line") and return;
$line =~ /^\+OK (\d+) / and my $buflen = $1;
while (1) {
$line = $me->_sockread();
last if $line =~ /^\.\s*$/;
$line =~ s/^\.\././;
$header .= $line;
}
return wantarray ? split(/\r?\n/, $header) : $header;
} # end Head
sub HeadAndBody
{
my $me = shift;
my $num = shift;
my $mandb = '';
my $s = $me->Socket();
$me->_sockprint( "RETR $num", $me->EOL );
my $line = $me->_sockread();
chomp $line;
$line =~ /^\+OK/ or $me->Message("Bad return from RETR: $line") and return;
$line =~ /^\+OK (\d+) / and my $buflen = $1;
while (1) {
$line = $me->_sockread();
last if $line =~ /^\.\s*$/;
# convert any '..' at the start of a line to '.'
$line =~ s/^\.\././;
$mandb .= $line;
}
return wantarray ? split(/\r?\n/, $mandb) : $mandb;
} # end HeadAndBody
sub Body
{
my $me = shift;
my $num = shift;
my $body = '';
my $s = $me->Socket();
$me->_sockprint( "RETR $num", $me->EOL );
my $line = $me->_sockread();
chomp $line;
$line =~ /^\+OK/ or $me->Message("Bad return from RETR: $line") and return;
$line =~ /^\+OK (\d+) / and my $buflen = $1;
# skip the header
do {
$line = $me->_sockread();
} until $line =~ /^\s*$/;
while (1) {
$line = $me->_sockread();
last if $line =~ /^\.\s*$/;
# convert any '..' at the start of a line to '.'
$line =~ s/^\.\././;
$body .= $line;
}
return wantarray ? split(/\r?\n/, $body) : $body;
} # end Body
sub POPStat {
my $me = shift;
my $s = $me->Socket();
$me->_sockprint( "STAT", $me->EOL );
my $line = $me->_sockread();
$line =~ /^\+OK/ or $me->Message("STAT failed: $line") and return -1;
$line =~ /^\+OK (\d+) (\d+)/ and $me->Count($1), $me->Size($2);
return $me->Count();
}
sub List {
my $me = shift;
my $num = shift || '';
my $CMD = shift || 'LIST';
$CMD=~ tr/a-z/A-Z/;
my $s = $me->Socket();
$me->Alive() or return;
my @retarray = ();
my $ret = '';
$me->_sockprint( "$CMD $num", $me->EOL );
my $line = $me->_sockread();
$line =~ /^\+OK/ or $me->Message("$line") and return;
if ($num) {
$line =~ s/^\+OK\s*//;
return $line;
}
while( defined( $line = $me->_sockread() ) ) {
$line =~ /^\.\s*$/ and last;
$ret .= $line;
chomp $line;
push(@retarray, $line);
}
if ($ret) {
return wantarray ? @retarray : $ret;
}
}
sub ListArray {
my $me = shift;
my $num = shift || '';
my $CMD = shift || 'LIST';
$CMD=~ tr/a-z/A-Z/;
my $s = $me->Socket();
$me->Alive() or return;
my @retarray = ();
my $ret = '';
$me->_sockprint( "$CMD $num", $me->EOL );
my $line = $me->_sockread();
$line =~ /^\+OK/ or $me->Message("$line") and return;
if ($num) {
$line =~ s/^\+OK\s*//;
return $line;
}
while( defined( $line = $me->_sockread() ) ) {
$line =~ /^\.\s*$/ and last;
$ret .= $line;
chomp $line;
my ($num, $uidl) = split ' ', $line;
$retarray[$num] = $uidl;
}
if ($ret) {
return wantarray ? @retarray : $ret;
}
}
sub Retrieve {
return HeadAndBody( @_ );
}
sub Last {
my $me = shift;
my $s = $me->Socket();
$me->_sockprint( "LAST", $me->EOL );
my $line = $me->_sockread();
$line =~ /\+OK (\d+)\D*$/ and return $1;
}
sub Reset {
my $me = shift;
my $s = $me->Socket();
$me->_sockprint( "RSET", $me->EOL );
my $line = $me->_sockread();
$line =~ /^\+OK/ and return 1;
return 0;
}
sub Delete {
my $me = shift;
my $num = shift || return;
my $s = $me->Socket();
$me->_sockprint( "DELE $num", $me->EOL );
my $line = $me->_sockread();
$me->Message($line);
$line =~ /^\+OK/ && return 1;
return 0;
}
sub Uidl {
my $me = shift;
my $num = shift || '';
my $s = $me->Socket();
$me->Alive() or return;
my @retarray = ();
my $ret = '';
$me->_sockprint( "UIDL $num", $me->EOL );
my $line = $me->_sockread();
$line =~ /^\+OK/ or $me->Message($line) and return;
if ($num) {
$line =~ s/^\+OK\s*//;
return $line;
}
while( defined( $line = $me->_sockread() ) ) {
$line =~ /^\.\s*$/ and last;
$ret .= $line;
chomp $line;
my ($num, $uidl) = split ' ', $line;
$retarray[$num] = $uidl;
}
if ($ret) {
return wantarray ? @retarray : $ret;
}
}
sub _sockprint
{
my $me = shift;
my $s = $me->Socket();
$me->Debug and carp "POP3 -> ", @_;
print $s @_;
}
sub _sockread
{
my $me = shift;
my $line = $me->Socket()->getline();
$me->{STRIPCR} && ($line =~ s/^[\r]+//);
$me->Debug and carp "POP3 <- ", $line;
return $line;
}
1;
__END__
Anexa 4 Graf-reția pentru elaborarea sistemului ”WebMail”
Anexa 5 Fișierul de configurare ”wmail.conf”
@mailservers = ("pop3.mail.ru","localhost");
@mailserver_replyto = ("mail.ru","localhost");
$smtpserv = "cni.md";
$cgidir = "/cgi-bin/wm";
$mimedir = "/usr/local/apache/htdocs/html/mime";
$mimehttp = "/mime";
$imageshttp = "/images";
$homepage = "http://www.md";
$datadir = "/usr/local/apache/cgi-bin/wm/data";
$tail = "<hr size=1><a href=http://www.cpan.org/>WMail</a>v1.0.2<br> ";
$adminuser = "admin";
$adminpass = " b1JnYXNtOTk=";
$bgcolor = "#F0F8F0";
$link = "#ccddee";
$vlink = "#ccddee";
$alink = "#ff0000";
$hover = "#ccddee";
$table_head = "#006600";
$table_bg = "#ffff88";
$bg_dark = "#c0d3ff";
$bg_light = "#fff9f9";
$show_messages = "10";
$def_signature = "This email was sent using wmail.";
$adminEmail = "sinus\@moldova.md";
$columns = "75";
$post_max = "950";
$maxpost = "100";
Anexa 6 Structura generală cererilor HTTP
Anexa 7 Interacțiunea CGI
Diagrama simplă CGI
Interacțiunea formei ci CGI
Anexa 8 Structura bazei de date “WebMail”
Anexa 9 Schema funcțională a parserului de mesaje
Schema principală
Mesajul de tip Multipart
Anexa 10 Schema funcțională a programului ”WebMail”
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Elaborarea Sistemului Mail Client Orientat Spre Internet (ID: 148776)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
