<titlu>Expedierea si receptionarea mesajelor de posta electronica</titlu>
<titlu>Scopuri</titlu> u2x17xh
• invatati sa expediati mesaje de e-mail prin intermediu»
proto¬colului SMTP
• invatati sa obtineti accesul la mesajele de e-mail rezidente pe
un server IMAP
• invatati sa manipulati mesajele si dosarele IMAP
In cadrul acestui modul, este explicat modul de utilizare a limbajului
PHP pentru a expedia, respectiv pentru a receptiona mesaje de e-mail. Pentru
ca functionalitatile prezentate in acest modul sa fie utilizabile, serverul
dumneavoastra PHP trebuie configurat astfel incat sa accepte IMAP.
Mai mult, scripturile dumneavoastra PHP trebuie sa fie capabile de a obtine
accesul la serviciile SMTP (Simple Mail Transfer Protocol) si IMAP (Interim
Mail Access Protocol). Asadar, consultati-va cu adminis¬tratorul dumneavoastra
de sistem inainte de a investi timp in depanarea exemplelor; problema
o poate constitui serverul PHP, nu dumneavoastra sau exemplul prezentat.
<titlu>Expedierea mesajelor de posta electronica</titlu>
Configuratia PHP standard accepta expedierea mesajelor de e-mail prin intermediul
SMTP (abreviere de la Simple Mail Transfer Protocol). Acesta este proto¬colul
standard folosit pentru transferul mesajelor de e-mail de la un sistem la altul,
prin intermediul Internetului.
Mesajele de e-mail sunt alcatuite din doua parti: o serie de antete de mesaj
si un corp. Antetele de mesaj indica adresa destinatarului si subiectul mesajului,
precum si alte informatii. Corpul contine mesajul in sine.
Pentru a expedia un mesaj de e-mail prin intermediul SMTP, invocati functia
mail(), care are urmatoarea forma:
mail(destinatar, subiect, corp)
unde destinatar indica adresa de e-mail a destinatarului, subiect specifica
antetul de e-mail care contine subiectul mesajului, iar corp este corpul mesajului.
Se obisnu¬ieste ca adresele de e-mail sa includa si adresa de e-mail a expeditorului.
Pentru a include adresa de e-mail a expeditorului, folositi urmatoarea forma
a functiei mail:
mail(destinatar, subiect, corp, antete)
unde antete specifica adresele de e-mail suplimentare, precum antetul from:.
Iata un exemplu care prezinta modul de expediere a unui mesaj de e-mail, care
contine un antet ce include adresa de e-mail a expeditorului:
mail(bill@osborne.com,
„Acesta este subiectul mesajului”,
„Acesta este corpul unui mesaj foarte scurt”,
„From: expeditor@osborne.com”)
Puteti specifica mai multi destinatari prin separarea fiecarui destinatar de
urmatorul prin intermediul unei virgule:
mail(bill@osborne.com, bob@osborne.com,
„Acesta este subiectul mesajului”,
„Acesta este corpul unui mesaj foarte scurt”,
„From: expeditor@osborne.com”)
Functia mail() returneaza true daca serverul SMTP accepta mesajul; in
caz contrar, returneaza false. Retineti ca acceptarea de catre serverul SMTP
nu garan¬teaza transmiterea catre destinatar a mesajului dumneavoastra de
e-mail. Nu exista nici o modalitate 100% sigura de a verifica faptul ca mesajul
dumneavoastra a fost transmis, asa cum nu exista nici o modalitate absolut sigura
de a garanta ca desti¬natarul a citit mesajul, la inteles si a fost
de acord cu el.
Unele servere SMTP refuza sa accepte adrese si antete care contin spatii albe
la sfarsit.Daca scriptul dumneavoastra presupune ca utilizatorul va introduce
aceste valori trebuie sa invocati functia trim() avand valorile respective
ca argument. De exemplu:
mail(trim($destinatar), trim($subiect), $corp,
„From: „ . trim($expeditor))
<Test „la minut">
• Care este functia PHP care trimite mesaje de posta electronica prin
intermediul serviciului SMTP?
• Cand expediati mesaje de e-mail folosind PHP, care este caracterul
folosit pentru a separa intre ele adresele mai multor destinatari? </Test
„la minut">
<titlu>Proiect 12-1: Un script de trimitere a formularelor</titlu>
In cadrul acestui proiect, veti construi un script care aduna date dintr-un
formular HTML si le trimite unui utilizator specificat, prin intermediul postei
electronice. Scriptul este scris de asa maniera incat poate fi controlat
folosind variabile de formular HTML. Puteti crea o diversitate de formulare
HTML care folosesc scriptul, fara a fi necesara revizuirea scriptului.
<Nota>
Raspunsuri la test:
• mail()
• o virgula</Nota>
<Sfatul specialistului>
Intrebare: Este posibila utilizarea limbajului PHP pentru expedierea mesajelor
de posta electronica in care sunt incluse fisiere atasate?
Raspuns: Da, dar biblioteca PHP nu include functii care faciliteaza aceasta
operatie. Daca fisierul atasat nu este un fisier de tip text simplu, trebuie
sa-1 codificati folosind formatul MIME (Multipurpose Internet Mail Extensions).
Apoi, puteti incorpora in antete speciale datele codificate in
format MIME. Diferiti programatori si autori au scris functii si clase PHP destinate
a simplifica acest proces. Pentru a invata mai multe despre fisiere atasate
si MIME, vizitati adresa https://wvwv.phpbuilder.com. </Sfatul specialistului>
<titlu>Scopurile proiectului</titlu>
• Prezentarea modului de expediere a mesajelor de posta electronica folosind
PHP
• Prezentarea modului de creare a unui script reutilizabil care prelucreaza
datele din formularul HTML
<titlu>Pas cu pas</titlu>
1. Plasati urmatorul script PHP intr-un fisier denumit mailform.php si
incarcati acest fisier in serverul dumneavoastra PHP:
<?php
$corp = „”; foreach ($http_POST_VARS as $nume=>$valoare)
A
$corp = $corp . „$nume=>$valoare\n”;
S mail($mailform_destinatar,$mailform_subiect, $corp,
„From: „ . $mailform_expeditor); header(„Location: $mailform_adresa”);
?>
2. Alocati un timp studiului scriptului PHP. Scriptul obtine acces la valorile
campurilor din formular prin intermediul tabloului asociativ $HTTP_POST_VARS.
Apoi, scriptul coma¬seaza valorile tuturor campurilor in variabila
sir $corp, care este folosita pentru a stabili valoarea corpului mesajului de
e-mail.
De asemenea, remarcati si celelalte variabile din formular, si anume $mailform_destinatar,
$mailform_expeditor si $mailform_subiect. Stabilind valorile controalelor asociate
ale formularului, puteti specifica adresa de e-mail a expeditorului si a destinatarului,
precum si linia de subiect a mesajului de e-mail.
Observati ca scriptul foloseste functia PHP header(), care trimite browserului
un antet HTTP. Antetul Location (locatie) determina browserul sa preia si sa
afiseze documentul asociat cu adresa URL specificata. Adresa URL in sine
este specificata de un camp ascuns al formularului HTML care trimite date
scriptului. Prin stabilirea valorii acestui camp, puteti specifica pagina
pe care o vede utilizatorul dupa ce datele din formular au fost prelucrate,
in mod caracteristic, veti trimite utilizatorul la o pagina in care
acestuia i se multumeste pentru datele introduse sau pentru tranzactie.
3. Plasati urmatoarea pagina HTML intr-un fisier denumit mailfrm1.html
si incarcati acest fisier in serverul dumneavoastra, inserandu-l
in acelasi catalog ca si fisierul mailform.php;
<HTML>
<HEAD>
<TITLE>mailfrm1.html</TITLE>
</HEAD>
<BODY>
<FORM METHOD=”POST” ACTION=”mailform.php”>
<H2>Formular de trimitere a datelor pentru e-mail</H2>
Introduceti aici datele dumneavoastra:
<BR>
<INPUT TYPE=”TEXT” NAME=”data” SIZE=”24”>
<BR><BR>
<INPUT TYPE=”SUBMIT” VALUE=”Trimite”>
<INPUT TYPE=”HIDDEN” NAME=”mailform_destinatar”
VALUE=bmccarty@apu.edu>
<INPUT TYPE=”HIDDEN” NAME=”mailform_expeditor”
VALUE=bmccarty@apu.edu>
<INPUT TYPE=”HIDDEN” NAME=”mailform_subiect”
VALUE=”Subiectul”>
<INPUT TYPE=”HIDDEN” NAME=”mailform_adresa”
VALUE=”mailfrm2.html”>
</FORM>
</BODY>
</HTML> HYPERLINK
4. Observati ca formularul HTML are un singur camp pentru introducerea
datelor de catre utilizator, denumit data. Cu toate acestea, scriptul va prelucra
toate campurile pe care doriti sa le definiti.
5. Plasati urmatoarea pagina HTML intr-un fisier numit mailfrm2.html si
incarcati acest fisier in serverul dumneavoastra, inserandu-l
in acelasi catalog ca si fisierul mailform.php:
<HTML>
<HEAD>
<TITLE>mailfrm2.html</TITLE>
</HEAD>
<BODY>
<H2>Mesaj receptionat</H2>
Multumim! Datele dumneavoastra au fost trimise!
</BODY>
</HTML>
6. Orientati un browser Web catre adresa URL a scriptului mailfrm1.html. Browserul
afiseaza urmatorul ecran:
<ecran>
Email Data Subtnission Form
<camp>
Eoter your data here:
</camp>
<buton>
Submit
</buton>
</ecran>
7. Introduceti datele aferente formularului si executati clic pe butonul de
trimitere. Browserul afiseaza ecranul alaturat:
<ecran>
Email Receipt
Thanks! Your data has been sent on its way!
</ecran>
8. Mesajul primit de destinatar este similar cu urmatorul listing:
Data: Sun, 15 Apr 2005 16:27:11 -;0700
Expeditor: bill@osborne.com
Destinatar: bill@osborne.com
Subiect: Subiectul
data=Acestea sunt datele pe care le-am introdus. mailform_destinatar=bill@osborne.com mailform_expeditor=bill@osborne.com mailform_subiect=Subiectul mailform_adresa=mailfrm2.html
<titlu>Receptionarea mesajelor de e-mail</titlu>
Aceasta sectiune trateaza elementele fundamentale ale procesului de receptionare
prin intermediul IMAP, protocolul Interim Mail Access Protocol. Din pacate,
recep¬tionarea mesajelor de e-mail este un proces oarecum mai complex decat
expedierea lor; ca atare, aceasta sectiune este semnificativ mai lunga decat
precedenta.
Mai mult, desi SMTP face parte din configuratia PHP standard, IMAP nu este o
componenta a acestei configuratii. Deci, daca administratorul dumneavoastra
PHP nu a configurat PHP astfel incat sa lucreze cu IMAP, exemplele
din aceasta sectiune nu vor functiona.
<titlu>Deschiderea unei cutii postale</titlu>
Un server IMAP este accesibil in acelasi mod ca si un fisier oarecare.
Mai intai, trebuie sa deschideti o conexiune cu serverul. Apoi,
puteti trimite cereri serverului si puteti primi raspunsuri de la acesta. Cand
ati terminat de utilizat serverul, trebuie sa inchideti conexiunea.
Pentru a deschide o conexiune cu un server IMAP, folositi functia imap_open(),
care are urmatoarea forma:
imap_open(cutie_postala, identificator_utilizator, parola)
Argumentul numit cutie_postala specifica patru elemente informationale:
• Numele gazdei sau adresa IP a serverului IMAP
• Protocolul care va fi utilizat (IMAP)
• Portul care se va folosi pentru contactarea serverului (in general
143)
• Cutia postala care va fi deschisa (in general INBOX)
Argumentul foloseste numerosi delimitatori pentru a separa un element de altul.
Iata o valoare caracteristica a argumentului:
Alocalhost/imap:143SINBOX
In cadrul acestui exemplu, numele gazdei este specificat sub forma localhost;
acest lucru este posibil cand un server PHP si un server IMAP ruleaza
pe acelasi sistem gazda. In caz contrar, trebuie sa specificati numele
gazdei care ruleaza serverul IMAP. De exemplu:
Amail.osborne.com/imap:143SINBOX
Celelalte argumente ale functiei imap_open(), identificator_utilizator si parola,
specifica identificatorul de utilizator si parola folosite pentru a obtine accesul
la serverul IMAP. Asa cum functia fopen() returneaza un identificator pe care
il puteti folosi pentru a obtine accesul la un fisier, functia imap_open()
returneaza un identifi¬cator pe care il puteti folosi pentru a obtine
accesul la serverul IMAP. Daca PHP nu poate deschide o conexiune cu serverul
IMAP, functia imap_open() returneaza false.
<Sugestie>
Daca un script se incheie cu mesajul „Call to undefined function*:
imap_open", aceasta arata ca PHP nu a fost configurat pentru a folosi IMAP.
Luati legatura cu administratorul dumneavoastra de sistem, pentru a beneficia
de asistenta in rezolvarea acestei probleme.
Iata un exemplu care prezinta modul de invocare a functiei imap_open() si testarea
rezultatului returnat de functie:
function open_mailbox**($server, $identificator_utilizator, $parola)
A echo “\n\n”; echo ”<H4>Deschide conexiunea IMAP cu $server.</H4>”;
$identificator = imap_open($server . “INBOX”,
$identificator_utilizator, $parola); if ($identificator === false)
A echo “Nu s-a putut deschide cutia postala IMAP INBOX.”; print_error_stack(); die();
S return $identificator;
S
Exemplul este prezentat sub forma unei functii definite de utilizator, denumita
open_mailbox(). Puteti folosi aceasta functie in propriile dumneavoastra
scripturi PHP. Functia open_mailbox() genereaza date de iesire care va vor ajuta
sa fiti la
<nota>
*In traducere apel la o functie nedefinita-N.T.
**In traducere deschide cutia postala - N.T. </nota>
curent cu actiunile programului dumneavoastra. De asemenea, se executa o verifi¬care
a aparitiei erorilor. Veti economisi un oarecare volum de munca daca apelati
functia open_mailbox() in loc sa apelati direct functia imap_open(). Desigur,
daca datele generate de functia open_mailbox() sau modalitatea de verificare
a aparitiei erorilor nu va satisfac, le puteti modifica, va puteti scrie propria
dumneavoastra functie definita de utilizator sau apelati direct functia imap_open().
<Sugestie >
Daca nu va mai amintiti foarte exact de functiile PHP definite de utilizator,
trebuie sa treceti din nou in revista Modulul 7. </Sugestie >
Observati ca functia open_mailbox() apeleaza functia print_error_stack*() daca
apelul la functia imap_open() esueaza. Functia print_error_stack() este o alta
functie definita de utilizator. Iata care este definitia acesteia:
function print_error_stack()
A echo “\n\n”; echo “<H4>Stiva de erori IMAP</H4>”;
$erori = imap_errors(); if $(erori)
A
foreach ($erori as $cheie=>$valoare)
A echo “\n$cheie: $valoare”;
S
S
S
Functia apeleaza functia de biblioteca IMAP imap_errors(), care returneaza
un tablou care contine mesaje de eroare. Apoi, functia parcurge iterativ tabloul,
folo¬sind o instructiune foreach, care afiseaza fiecare eroare.
<titlu>Comutarea intre dosare</titlu>
In afara de dosarul INBOX standard, IMAP permite unui utilizator sa defineasca
dosare, care pot fi folosite de acesta din urma pentru stocarea si organizarea
mesa¬jelor primite, in orice moment, un dosar IMAP - INBOX sau un
alt dosar - este considerat ca fiind dosarul curent. Dupa ce ati stabilit o
conexiune cu un server IMAP, puteti cere serverului sa desemneze alt dosar ca
dosar curent. Iata o functie definita de utilizator care va permite sa procedati
astfel:
function switch_to_folder**($identificator, $server, $prefix, $dosar)
A if ($dosar = = „INBOX”)
<nota>
*In traducere afiteasp stiva cu erori - N.T.
**In traducere comuta la dosar— N.T. </nota>
A
$dosar = $server . „INBOX”;
S else
A
$dosar = $server . $prefix . „INBOX.” . $dosar;
S echo „\n\n”; echo „<H4>Comuta in dosarul $dosar</H4>”;
$ok = imap_reopen($identificator, $dosar); if ($ok === false)
A echo „\nNu a putut deschide dosarul specificat.”; print_error_stack();
S
S
Functia definita de utilizator invoca functia IMAP imap_reopen(), care preia
doua argumente: identificatorul returnat de functia imap_open() (sau de catre
functia definita de utilizator open_mailbox(), care apeleaza functia imap_open())
si numele dosarului care urmeaza a fi deschis. Functia definita de utilizator
preia, in afara de identificator, numeroase alte argumente, pe care le
foloseste pentru a alcatui numele dosarului. Puteti apela functia switch_to_folder()
astfel:
switch_to_folder(„Alocalhost/imap:143S”, “I/mail/”,”dosarul”)
<Remarca>
De obicei, numele dosarelor IMAP sunt obtinute prin prefixarea numelui dosarului
cu particula "-/mail/" si "INBOX", asa cum o presupune functia
switch_to_folder() si invocarea data ca exemplu. Cu toate acestea, un administrator
de sistem poate configura o alta politica de atribuire a numelor. Daca aveti
o problema cu utilizarea functiei switch_to_folder(), luati legatura cu administratorul
dumneavoastra de sistem, pentru a determina politica adecvata de denumire a
dosarelor. </Remarca>
<titlu>Inchiderea unei cutii postale</titlu>
Cand ati terminat de utilizat un server IMAP, trebuie sa il inchideti,
asa cum inchideti un fisier atunci cand ati finalizat utilizarea
acestuia. Iata o functie definita de utilizator pentru inchiderea unei
conexiuni IMAP:
function close_mailbox($identificator)
A echo „\n\n”; echo „<H4>Inchide conexiunea IMAP</H4>”;
$ok = imap_close($identificator); if ($ok === false)
A echo „\nNu a reusit sa inchida cutia postala.”; print_error_stack();
S
S
Functia foloseste functia din biblioteca IMAP imap_close() si functia definita
de utilizator print_error_stack() care a fost prezentata anterior.
<titlu>Obtinerea informatiilor referitoare la o cutie postala</titlu>
Dupa deschiderea unei conexiuni IMAP, puteti obtine acces la informatii care
descriu cutia postala curenta. De exemplu, iata o functie definita de utilizator
care returneaza numarul mesajelor din cutia postala curenta:
function get_message_count*($identificator)
A return imap_num_msg($identificator);
S
Functia definita de utilizator nu face decat sa apeleze functia din biblioteca
IMAP imap_num_msg (). Totusi, puteti adauga linii de program suplimentare la
functia definita de utilizator; de exemplu, puteti adauga o instructiune care
afiseaza numarul de mesaje.
Iata o functie definita de utilizator mai complexa, care afiseaza o varietate
de informatii referitoare la cutia postala curenta:
function print_mailbox_status**($identificator)
A echo „\n\n”; echo „<H4>Starea cutiei postale</H4>”;
$n = imap_num_msg($identificator); echo „\nCutia postala contine $n mesaje.”;
$n = imap_num_recent($identificator); echo „\nCutia postala contine $n mesaje.”;
echo „\n\n”;
$obiect_cutie_postala = imap_mailboxmsginfo($identificator); if ($obiect_cutie_postala)
A
$tablou_cutie_postala = get_object_vars($obiect_cutie_postala); foreach ($obiect_cutie_postala as $cheie=>$valoare)
A echo „\n$cheie: $valoare”;
S
S
S
Aceasta functie afiseaza numarul mesajelor si pe acela al mesajelor recente
din cutia postala. Apoi, functia afiseaza o varietate de informatii, inclusiv:
• Data ultimei modificari a cutiei postale
• Numele cutiei postale
<Nota>
*In traducere obtine numarul de mesaje - N.T.
** In traducere afiseaza starea cutiei postale - N.T.
• Numarul mesajelor din cutia postala
• Numarul mesajelor recente din cutia postala
• Numarul mesajelor necitite din cutia postala
• Numarul mesajelor sterse din cutia postala
• Dimensiunea cutiei postale, in octeti
Observati functia de biblioteca IMAP imap_mailboxmsginfo(), care returneaza
o valoare atribuita obiectului $obiect_cutie_postala. Aceasta valoare este de
tip obiect. Modulul 15 va aborda obiectele si modul de utilizare a acestora.
Totusi, nu trebuie sa cunoasteti modul de lucru cu obiectele pentru a folosi
aceasta valoare. Prin transferul valorii ca argument al functiei get_object_vars(),
aceasta returneaza un tablou asociativ care contine datele obiectului. Functia
definita de utilizator print_mailbox_status() foloseste aceasta tehnica pentru
a obtine si a afisa informatii referitoare la starea cutiei postale.
Iata un rezultat caracteristic al functiei print_mailbox_status():
Starea cutiei postale
INBOX contine 3 mesaje
INBOX contine 0 mesaje recente
Unread: 0
Deleted: 0
Nmsgs: 3
Size: 1078
Date: Fri, 25 May 2001 08:57:53 -;0700 (PDT)
Driver: imap
Mailbox: Alocalhost.localdomain:143/imap/user=”bmccarty”SINBOX
Recent: 0
Functia definita de utilizator dump_mailbox_status() prezinta o alta metoda
de abordare a functiei imap_mailboxmsginfo():
function dump_mailbox_status($identificator)
A echo „\n\n”; echo „<H4>Afisarea starii cutiei postale</H4>”; echo „\n\n”;
$obiect_cutie_postala = imap_mailboxmsginfo($identificator); print_r($obiect_cutie_postala);
S
Functia PHP print_r() afiseaza valoarea unui obiect. Aceasta metoda este cu
mult mai simpla decat cea folosita de functia print_mailbox_status(),
dar formatul datelor de iesire este cu mult mai putin inteligibil:
Afisarea starii cutiei postale stdClass 0object
(
aUnreadi => 0
aDeletedi => 0
aNmsgsi => 3
aSizei => 1078
aDatei => Fri, 25 May 2001 08:57:53 -;0700 (PDT)
aDriveri => imap
aMailboxi => Alocalhost.localdomain:143/imap/user=”bmccarty”SINBOX
aRecenti => 0
)
<Sugestie>
Motivul pentru care prezentam functiile IMAP in asociere cu functiile
definite de utiliza¬tor este acela ca functiile definite de utilizator servesc
drept instrumente de constructie a unui program IMAP. Functiile definite de
utilizator genereaza date de iesire si mesaje de eroare care va ajuta sa stabiliti
o logica adecvata a programului dumneavoastra. Dupa ce, in esenta, programul
a ajuns sa realizeze ceea ce doriti dumneavoastra, puteti ajusta functiile definite
de utilizator pentru a elimina datele de iesire, pentru a le re-formata sau
orice altceva. O modificare pe care trebuie sa o aveti in vedere consta
in prefixarea apelurilor de functii cu un caracter @, pentru ca mesajele
de eroare prestabilite sa nu va „strice" paginile in cazul
aparitiei unor probleme. </Sugestie>
<titlu>Obtinerea unei liste de mesaje</titlu>
Iata o functie definita de utilizator care afiseaza o lista de mesaje in
dosarul curent:
function list_messages($identificator)
A echo „\n\n”; echo „<H4>Antete de mesaje in cutia postala curenta</H4>”;
$antete = imap_headers($identificator); if ($antete == false)
A echo „\nNu a reusit sa afiseze mesajele.”; print_error_stack();
S else
A foreach ($antete as $cheie=>$valoare)
A echo „\n$valoare”;
S
S
S
Functia definita de utilizator apeleaza functia IMAP imap_headers(), care returneaza
un tablou unde fiecare element descrie un mesaj din dosarul curent.
<Nota>
In traducere ofiseaza mesaje - N.T. </Nota>
<titlu>Lucrul cu identificatori de mesaje</titlu>
O ciudatenie a serviciului IMAP consta in aceea ca fiecare mesaj dintr-un
dosar are atat un numar, cat si un identificator. Numarul reprezinta
pozitia mesajului in dosarul respectiv; aceasta valoare se poate modifica
la adaugarea mesajelor, respec¬tiv la stergerea mesajelor din dosar. Pe
de alta parte, identificatorul unui mesaj nu se modifica niciodata.
IMAP furnizeaza functii care va permit sa determinati identificatorul unui mesaj
daca este dat numarul sau si invers. Iata functiile definite de utilizator care
invoca functiile de biblioteca IMAP conexe:
function get_message_id*($identificator, $numar)
A return imap_uid($identificator, numar)
S function get_message_num**($identificator, $id)
A return imap_msgno($identificator, $id)
S
<titlu>Obtinerea de informatii referitoare la un mesaj</titlu>
O limitare a functiei imap_headers(), folosita in functia definita de
utilizator list_messages(), este aceea ca nu separa fiecare caracteristica a
mesajului in campuri distincte, astfel incat acestea
sa fie usor accesibile pentru un script. Functia de biblioteca IMAP imap_fetch_overview()
returneaza un tablou asociativ care descrie un mesaj. Iata o functie definita
de utilizator, care foloseste functia imap_fetch_overview() pentru a afisa informatiile
despre mesaje:
function print_overview***($identificator, $numar)
A echo „\n\n”; echo „<H4>Mesaj $n: Vedere de ansamblu</H4>”;
$nr_mesaj = „” . $numar;
$mesaje = imap_fetch_overview($identificator, $nr_mesaj, 0); foreach ($mesaje as $mesaj)
A
$n = $mesaj->msgno; foreach ($mesaj as $proprietate=>$valoare)
A echo „\n$proprietate: $valoare;”
S
S
S
<Nota>
*In traducere obtine identificatorul mesajului - N.T.
**In traducere obtine numarul mesajului - N.T.
***In traducere afiseaza vederea de ansamblu - N.T. </Nota>
Al doilea argument al functiei imap_fetch_overview() va permite sa specificati
o lista sau un domeniu de mesaje pentru care functia returneaza vederi de ansamblu.
Functia definita de utilizator print_overview() alcatuieste o lista cu un singur
membru si transmite lista functiei imap_fetch_overview().
Datele de iesire contin urmatoarele informatii:
• Subiectul mesajului
• Numele si adresa de e-mail ale expeditorului
• Data la care a fost trimis mesajul
• Numarul mesajului
• Identificatorul mesajului
• Dimensiunea mesajului (in octeti)
• Indicatoare care precizeaza daca:
- Mesajul este recent
- Mesajul a fost citit
- Mesajul a primit un raspuns
- Mesajul a fost marcat in vederea stergerii
- Mesajul este o ciorna
- Mesajul este o ciorna
<titlu>Obtinerea corpului unui mesaj</titlu>
Corpul unui mesaj include continutul efectiv al mesajului. Iata o pereche de
functii definite de utilizator care afiseaza corpul mesajului:
function print_body_by_num*($identificator, $numar)
A
$id = get_message_id($identificator, $numar); print_body_id($identificator, $id);
S function print_body_by_id**($identificator, $numar)
A echo „\n\n”;
$numar = get_message_num($identificator, $id);
$echo „<H4>Message ID $id(Number $numar) Body</H4>”;
$s = imap_body($identificator, $id, FT_UID); echo „\n$s”;
S
Una dintre functii va permite sa specificati mesajul in functie de numarul
mesajului, iar cealalta va permite sa specificati mesajul in functie de
identificatorul acestuia. Remarcati modul de implementare a functiei print_body_by_num().
Aceasta converteste numarul mesajului intr-un identificator de mesaj si
apoi apeleaza functia sa geamana, in speta print_body_by_id(), care la
randul sau apeleaza functia IMAP imap_body().
<nota>
* In traducere afiseaza corpul in functie de numar - N.T.
** In traducere afiseaza corpul in functie de identificator - N.T.
</nota>
<titlu>Obtinerea antetelor de mesaj</titlu>
Antetele de mesaj contin informatii importante, care in general nu apar
in corpul mesajului, precum data si subiectul mesajului. Iata o functie
definita de utilizator care afiseaza antetele unui mesaj, daca este dat numarul
mesajului:
function print_headers*($identificator, $numar)
A echo „\n\n”; echo „<H4>Mesaj $n: Antete</H4>”;
$obiect_antet = imap_headerinfo($identificator, $numar);
$antete = get_object_vars($obiect_antet); foreach ($antete as $proprietate=>$valoare)
A if (!is_array($valoare))
A echo "\n$proprietate: $valoare”;
S else
A foreach ($valoare as $sub_valoare)
A echo "\n$proprietate: ”;
$sub_valori = get_object_vars($sub_valoare); foreach ($sub_valoare as $articol=>$valoare_articol)
A echo „\n $articol=>$valoare_articol”;
S
S
S
S
S
Similar functiei definite de utilizator print_mailbox_status(), functia print_headers()
foloseste functia get_object_vars() pentru a converti un obiect intr-un
tablou asociativ. Obiectul returnat de functia de biblioteca IMAP imap_headerinfo()
include urmatoarele informatii:
• Data expedierii mesajului
• Subiectul mesajului
• Identificatorul mesajului la care s-a raspuns prin acest mesaj, daca
exista
• Indicatoare de mesaj, cum sunt cele returnate de functia imap_fetch_overview()
• Numele si adresa de e-mail ale:
- Expeditorului
- Persoanei care primeste raspunsul, daca este specificata
- Destinatarilor
- Destinatarilor eventualelor copii (cc:)
- Destinatarilor eventualelor copii la indigo necunoscute (bcc:), daca informatiile
respective sunt disponibile
<nota>
*In traducere afiseaza antetele — N.T. </nota>
Numeroase elemente ale tabloului asociativ au valori de tip tablou. Pentru
parcur¬gerea iterativa si afisarea valorii acestor elemente se foloseste
o bucla imbricata.
Pentru aplicatii mai putin pretentioase, functia dump_headers() formateaza aceleasi
date de iesire ca si print_headers(), dar foloseste pentru aceasta functia print_r(),
generand astfel date de iesire mai putin inteligibile:
function dump_headers($identificator, $numar)
A
$antete = imap_headerinfo($identificator, $numar); echo „\n\n”; echo „<H4>Mesaj $n: Afisare antete</H4>”; print_r($antete);
S
<titlu>Marcarea unui mesaj in vederea stergerii</titlu>
Pentru a sterge un mesaj IMAP, mai intai il marcati in
vederea stergerii si apoi il eliminati. Mesajele marcate pentru stergere,
dar care nu au fost inca eliminate, sunt numai semnalate ca sterse si
sunt in continuare accesibile.
Iata diferite functii definite de utilizator care va permit sa stergeti un mesaj
prin specificarea numarului sau a identificatorului mesajului:
function delete_message_by_num*($identificator, $numar)
A
$id = get_message_id($identificator, $numar); delete_message_by_id**($identificator, $id);
S function delete_message_by_id($identificator, $id)
A echo „\n\n”;
$numar = get_message_num($identificator, $id); echo „<H4>Marking Message ID $id(Numar $numar) for deletion</H4>”;
$ok = imap_delete($identificator, $id, FT_UID); if ($ok == false)
A echo „\nNu s-a reusit stergerea mesajului.”; print_error_stack();
S
S
Pentru a elimina mesajele sterse, invocati urmatoarea functie definita de utilizator:
function expunge_messages***($identificator)
A echo „\n\n”; echo „<H4>Elimina mesajele sterse</H4>”;
$ok = imap_expunge($identificator); if ($ok == false)
<nota>
* In traducere sterge mesajul in functie de numar - N .T.
** in traducere sterge mesajul in functie de identificator - N.T.
***in traducere elimina mesaje — N.T. </nota>
A echo „\nNu s-a reusit eliminarea mesajelor.”; print_error_stack();
S
S
<Sfatul specialistului>
Intrebare:Furnizorul meu de servicii Internet dispune de un server POP,
nu de un server IMAP. Pot avea acces la cutia mea postala POP cu ajutorul sistemului
PHP?
Raspuns:Da. De fapt, puteti avea acces la cutia postala folosind biblioteca
IMAP. Pur si simplu deschideti o conexiune cu serverul POP specificand
o cutie postala POP, astfel:
$mbox = imap_open("Alocalhost/pop3:110SINBOX", $identificator_utilizator,
$parola);
Numele gazdei, protocolul si numarul portului sunt asemanatoare cu valorile
similare folosite pentru conectarea la un server IMAP. Ca si in cazul
unui server IMAP, poate ca este necesara modificarea numelui cutiei postale,
pentru ca acesta sa se conformeze politicilor stabilite de catre administratorul
de sistem.
De asemenea, puteti folosi biblioteca IMAP pentru a va conecta la un server
de informatii folosind NNTP (Network News Transfer Protocol). Pentru aceasta,
deschideti o conexiune astfel:
$nntp = imap_open(nAlocalhost/nntp:119Scoinp.test", „”, „”);
Consultati manualul PHP pe suport electronic la adresa https://www.php.net pentru
mai multe informatii despre utilizarea functiilor din biblioteca IMAP pentru
a obtine accesul la un server POP sau la un server de informatii. </Sfatul
specialistului>
<Test „la minut">
• Ce trebuie sa faceti inainte de a obtine accesul la o cutie postala
IMAP?
• Cand sunt marcate pentru stergere, mesajele IMAP dispar sau nu?
• Care din cei doi identificatori este mai durabil: un numar de mesaj
IMAP sau un identificator de mesaj?
• Care sunt informatiile incluse intr-un antet de mesaj e-mail?
</Test „la minut">
<nota>
Raspunsuri la test:
• Deschideti o conexiune cu serverul IMAP.
• Nu. Mesajele IMAP raman in dosar pana cand sunt
eliminate.
• Identificatorul de mesaj este mai durabil.
• Data la care a fost trimis mesajul, subiectul mesajului, identificatorul
mesajului la care s-a ras¬puns prin mesajul curent (daca exista), indicatoare
(flag) de mesaj, respectiv numele si adresele de e-mail ale persoanelor vizate
de mesajul e-mail, si anume expeditorul si destinatarul. </nota>
<titlu>Proiect 12-2: Un program de navigare pentru posta electronica</titlu>
In cadrul acestui proiect, veti construi un script care va permite sa
parcur¬geti un dosar IMAP.
<titlu>Scopurile proiectului</titlu>
• Prezentarea modului de invocare a functiilor IMAP prin intermediul functiilor
definite de utilizator amintite in acest modul
• Prezentarea modului de acces la dosarele si mesajele IMAP
<titlu>Pas cu pas</titlu>
1. Plasati urmatorul script PHP intr-un fisier denumit cititor.php si
incarcati acest fisier in serverul dumneavoastra PHP:
<?php require("cititor.inc");
echo "<PRE>";
$server = "A" . $gazda . "/imap:143S";
$imap = open_mailbox($server, $id_utilizator, $parola); list_messages($imap);
$n = get_message_count($imap); for ($i = 1; $i <= $n; $i++)
A print_headers($imap, $i); print_body_by_num($imap, $i);
S close_mailbox($imap);
echo "</PRE>";
2. Plasati urmatorul script PHP (cam lung) intr-un fisier denumit cititor.inc
si incarcati acest fisier in serverul dumneavoastra, inserandu-l
in acelasi catalog ca si fisierul cititor.php:
function open_mailbox ($server, $identificator_utilizator, $parola)
A echo “\n\n”; echo ”<H4>Deschide conexiunea IMAP cu $server.</H4>”;
$identificator = imap_open($server . “INBOX”, $identificator_utilizator,
$parola); if ($identificator === false)
A echo “Nu s-a putut deschide cutia postala IMAP INBOX.”; print_error_stack(); die();
S return $identificator;
S
function print_error_stack()
A echo “\n\n”; echo “<H4>Stiva de erori IMAP</H4>”;
$erori = imap_errors(); if $(erori)
A foreach ($erori as $cheie=>$valoare)
A echo “\n$cheie: $valoare”;
S
S
S
function list_messages($identificator)
A echo „\n\n”; echo „<H4>Antete de mesaje in cutia postala curenta</H4>”;
$antete = imap_headers($identificator); if ($antete == false)
A echo „\nNu a reusit sa afiseze mesajele.”; print_error_stack();
S else
A foreach ($antete as $cheie=>$valoare)
A echo „\n$valoare”;
S
S
S
function get_message_count($identificator)
A return imap_num_msg($identificator);
S
function print_headers($identificator, $numar)
A echo „\n\n”; echo „<H4>Mesaj $n: Antete</H4>”;
$obiect_antet = imap_headerinfo($identificator, $numar);
$antete = get_object_vars($obiect_antet); foreach ($antete as $proprietate=>$valoare)
A if (!is_array($valoare))
A echo "\n$proprietate: $valoare”;
S else
A foreach ($valoare as $sub_valoare)
A echo "\n$proprietate: ”;
$sub_valori = get_object_vars($sub_valoare); foreach ($sub_valoare as $articol=>$valoare_articol)
A echo „\n $articol=>$valoare_articol”;
S
S
S
S
S
function print_body_by_num ($identificator, $numar)
A
$id = get_message_id($identificator, $numar); print_body_id($identificator, $id);
S
function print_body_by_id ($identificator, $numar)
A echo „\n\n”;
$numar = get_message_num ($identificator, $id);
$echo „<H4>Message ID $id(Number $numar) Body</H4>”;
$s = imap_body($identificator, $id, FT_UID); echo „\n$s”;
S
function get_message_id ($identificator, $numar)
A return imap_uid($identificator, numar)
S
function get_message_num ($identificator, $id)
A return imap_msgno($identificator, $id)
S
function close_mailbox($identificator)
A echo „\n\n”; echo „<H4>Inchide conexiunea IMAP</H4>”;
$ok = imap_close($identificator); if ($ok === false)
A echo „\nNu a reusit sa inchida cutia postala.”; print_error_stack();
S
S
3.Plasati urmatoarea pagina HTML intr-un fisier numit cititor.html si
incarcati acest fisier in serverul dumneavoastra PHP, inseranddu-l
in acelasi catalog ca si scriptul cititor.php si cititor.inc:
<HTML>
<HEAD>
<TITLE>cititor.html</TITLE>
</HEAD>
<BODY>
<FORM METHOD =”POST” ACTION=”cititor.php”>
<H2>Formular de acces la cutia postala IMAP</H2>
Identificator de utilizator:
<BR>
<INPUT TYPE=”TEXT” NAME=”idutilizator” SIZE=”24”>
<BR>
Parola:
<BR>
<INPUT TYPE=”PASSWORD” NAME=”parola” SIZE=”24”>
<BR>
Server:
<BR>
<INPUT TYPE=”TEXT” NAME=”gazda” SIZE=”24”
VLUE=”localhost”>
<BR><BR>
<INPUT TYPE=”SUBMIT” VALUE=”trimite”>
</FORM>
</BODY>
</HTML>
4. Alocati un timp studiului paginii HTML cititor.html. Observati ca utilizatorului
ii este permis sa specifice informatiile minime necesare pentru a obtine
accesul la o cutie postala IMAP: numele gazdei serverului IMAP, precum si identificatorul
de utilizator si parola utilizatorului.
5. Alocati un timp studiului scriptului PHP cititor.php. Remarcati simplitatea
scriptului. Acesta:
• Deschide o conexiune cu serverul IMAP
• Afiseaza mesajele din dosarul prestabilit
• Obtine numarul mesajelor din dosarul prestabilit
• Afiseaza antetul si corpul fiecarui mesaj
• Inchide conexiunea cu serverul IMAP
Observati ca scriptul foloseste o instructiune require pentru a incorpora
continutul fisierului cititor.inc.
6. Alocati un timp studiului scriptului PHP cititor.inc. Observati ca acest
script este alcatuit numai dintr-o colectie de functii definite de utilizator,
prezentate anterior in cadrul capitolului de fata. Nici una dintre functii
nu a suferit modificari. Daca stiti care este utilitatea functiilor respective,
atunci acest script nu trebuie sa va preocupe prea mult; puteti intelege
aplicatia studiind scriptul cititor.php.
Ca ajutor pentru redactarea propriilor dumneavoastra scripturi de e-mail, situl
Web aferent acestei carti include fisierul imap.inc, care contine toate functiile
definite de utilizator date in acest modul. Pur si simplu inserati o copie
a acestui fisier in catalogul dumneavoastra de scripturi, scrieti o instructiune
require prin care incorporati acest script in propriul dumneavoastra
script, dupa care apelati functiile definite de utilizator pe care le defineste
scriptul.
7. Orientati un browser Web spre adresa URL a paginii Web cititor.html. Browserul
va afisa un ecran similar cu ilustratia alaturata:
<ecran>
IMAP Mailbox Access Form
<campuri>
UserID:mccartyb
Password:*********
Server: localhost
</campuri>
<buton>
Submit
</buton>
</ecran>
8. Introduceti informatiile adecvate pentru serverul dumneavoastra IMAP si
executati clic pe butonul „Trimite". Scriptul trebuie sa aiba acces
la cutia dumneavoastra postala IMAP si trebuie sa-i afiseze caracterele. Rezultatul
trebuie sa fie asemanator cu datele prezentate in ilustratia urmatoare:
<ecran>
Opening IMAP connection to Alocalhost:143S.
Message Headers in INBOX
1) 14-Apr-2001 Bill McCatty test l (370 chars)
D 2) 15-Apr-2001 Bill McCarty test 16 (354 Chats)
D 3) 15-Apr-2001 Bill McCarty test 17 (354 chars)
Message : Headers
date: Sat, 14 Apr 2001 09:20:52 -0700
Date: Sat, 14 Apr 2001 09:20:52 -0700 subject: test l
Subject: test l message_id: 200104141620.JAA20319@linux.dtc.apu.edu
</ecran>
<titlu>Manipularea dosarelor</titlu>
Dincolo de accesul la dosare si mesaje, puteti manipula dosare prin utilizarea
bibliotecii IMAP. In aceasta sectiune veti afla cum trebuie sa procedati.
<titlu>Afisarea dosarelor existente</titlu>
Iata o functie definita de utilizator care afiseaza dosarele IMAP disponibile:
function list_folders* ($identificator, $server, $prefix)
A echo „\n\n”; echo „<H4>Lista dosarelor</H4>”; echo „\nserver=$server, prefix=$prefix”;
$dosare = imap_listmailbox($identificator, $server, $prefix, „*”);
if ($dosare == false)
A echo „\nFunctia imap_listmailbox() a esuat.”
S else
A foreach ($dosare as $cheie=>$valoare)
A echo „\n$cheie=>$valoare”;
S
S
S
Puteti apela aceasta functie folosind argumente asemanatoare cu urmatorul:
list_folders($identificator, „Alocalhost/imap:143S”, „I/mail/”)
<nota>
*In traducere afiseaza dosarele — N.T. </nota>
Argumentul $identificator este, desigur, valoarea returnata de functia care
a deschis conexiunea IMAP. Asa cum s-a explicat anterior in acest modul,
valoarea argumentului $prefix trebuie sa se conformeze politicii de denumire
a dosarelor stabilite de administratorul IMAP.
<titlu>Crearea unui dosar</titlu>
Iata cum se poate crea un nou dosar IMAP:
function create_folder*($identificator, $server, $prefix, $dosar);
A
$dosar = $server . $prefix . „INBOX.” . $dosar; echo „\n\n”; echo „<H4>Creeaza dosarul $dosar</H4>”;
$ok = imap_createmailbox($identificator, $dosar); if ($ok === false)
A echo „\nNu s-a putut crea dosarul.”; print_error_stack();
S
S
Cel de-al patrulea argument al acestei functii specifica numele dosarului care
va fi creat.
<Sugestie>
Numele unui dosar IMAP trebuie sa contina numai litere, cifre si caractere de
subliniere. Daca doriti sa creati un sub-dosar, puteti proceda astfel incluzand
un punct in numele dosarului. Punctul se comporta ca separator de cale,
analog caracterului slash folosit in caile din cadrul sistemului de fisiere.
</Sugestie>
<titlu>Modificarea numelui unui dosar</titlu>
Iata o functie definita de utilizator care modifica numele unui dosar:
function rename_folder**($identificator, $server, $prefix, $dosar_vechi, $dosar_nou);
A
$dosar_vechi = $server . $prefix . „INBOX.” . $dosar_vechi;
$dosar_nou = $server . $prefix . „INBOX.” . $dosar_nou; echo „\n\n”; echo „<H4>Modifica numele $dosar_vechi in $dosar_nou</H4>”;
$ok = imap_renamemailbox($identificator, $dosar_vechi, $dosar_nou); if ($ok === false)
A echo „\nNu a reusit sa modifice numele dosarului.”; print_error_stack();
S
S
<nota>
*In traducere creeaza dosarul- N.T.
**In traducere modifica numele dosarului — N.T. </nota>
Asa cum s-a explicat anterior, poate fi necesara ajustarea modului de construire
a numelui dosarului din numele gazdei serverului si din prefixul cutiei postale.
<titlu>Stergerea unui dosar</titlu>
Iata o functie care sterge un dosar IMAP:
function delete_folder*($identificator, $server, $prefix, $dosar);
A
$dosar = $server . $prefix . „INBOX.” . $dosar; echo „\n\n”; echo „<H4>Sterge dosarul $dosar</H4>”;
$ok = imap_deletemailbox($identificator, $dosar); if ($ok === false)
A echo „\nNu s-a putut sterge dosarul.”; print_error_stack();
S
S
<Atentie>
Spre deosebire de mesajele IMAP, care raman in cutia postala pana
cand le stergeti, un dosar IMAP sters este eliminat imediat si in
mod irevocabil. Fiti atent atunci cand scrieti programe care sterg dosare
sau atunci cand folositi scripturi care contin asemenea programe. </Atentie>
<titlu>Copierea mesajelor intr-un dosar</titlu>
IMAP poate copia un mesaj din dosarul curent intr-un alt dosar. Iata o
functie definita de utilizator care executa aceasta operatie, daca se cunoaste
numarul mesa¬jului IMAP si dosarul destinatie:
function copy_message**($identificator, $prefix, $numar, $dosar);
A
$dosar = $prefix . „INBOX.” . $dosar; echo „\n\n”; echo „<H4>Copiaza mesajul $numar in dosarul $dosar</H4>”;
$nr_mesaje = „” . $numar;
$ok = imap_mail_copy($identificator, $nr_mesaje, $dosar); if ($ok === false)
A echo „\nNu a fost copiat mesajul in dosarul specificat.”; print_error_stack();
S
S
Remarcati ca aceasta functie nu preia un argument care specifica numele gazdei
serverului. Deoarece serverele IMAP nu coopereaza la copierea unui mesaj de
la un
<nota>
*In traducere sterge dosarul- N.T.
** In traducere copiata mesajul— N.T. </nota>
server la altul, nu este necesar - sau posibil - sa se specifice numele gazdei
serve¬rului la copierea mesajelor IMAP.
<titlu>Mutarea mesajelor intr-un dosar</titlu>
Iata o functie definita de utilizator care muta un mesaj IMAP din dosarul curent
intr-un alt dosar, fiind date numarul IMAP al mesajului si dosarul destinatie:
function move_message* ($identificator, $prefix, $numar, $dosar);
A
$dosar = $prefix . „INBOX.” . $dosar; echo „\n\n”; echo „<H4>Muta mesajul $numar in dosarul $dosar</H4>”;
$nr_mesaj = „” . $numar; if ($ok === false)
A echo „\nMesajul nu a fost mutat in dosarul specificat.”; print_error_stack();
S
S
Mesajele originale sunt doar marcate in vederea stergerii si raman
in cutia postala pana la eliminarea efectiva.
<Sfatul specialistului>
Intrebare: Acest modul a explicat modul de utilizare a nume¬roase
functii IMAP, dar exista si alte functii IMAP care mi-ar putea fi de folos?
Raspuns: Biblioteca IMAP furnizeaza multe alte functii in afara celor
descrise in acest modul. De exemplu, functiile imap_search() si imap_scanmailbox()
va permit sa cautati mesaje care satisfac criterii specificate. De exemplu,
puteti cauta mesaje al caror corp contine anumite texte. De asemenea, functiile
IMAP folosite in acest modul furnizeaza frecvent optiuni si caracteristici
care nu au fost explicate in totalitate. Pentru mai multe informatii privind
biblioteca IMAP PHP, consultati manualul PHP pe suport electronic, la adresa
www.php.net.
</Sfatul specialistului>
<Test de evaluare>
1. Care este protocolul folosit pentru expedierea mesajelor prin Internet?
2. In ce mod contribuie functiile definite de utilizator la simplificarea activitatii
de programare?
3. Folosind functia definita de utilizator adecvata descrisa in acest
modul, scrieti o instructiune care copiaza mesajul IMAP cu numarul 101 din dosarul
curent
<nota>
*In traducere muta mesajul- N.T. </nota>
in dosarul "test". Se presupune ca variabila $mb contine identificatorul
asociat cu o conexiune IMAP deschisa, precum si ca variabila $pfx contine prefixul
cutiei postale IMAP.
4. Folosind functia definita de utilizator adecvata descrisa in acest
modul, scrieti o instructiune care modifica numele dosarului "test1"
in "test2". Se presu¬pune ca variabila $mb contine identificatorul
asociat cu o conexiune IMAP deschisa, ca variabila $server contine sirul server
IMAP (care include paran¬tezele acolade, numele gazdei serverului, protocolul
si numarul portului), ca variabila $pfx contine prefixul cutiei postale IMAP,
precum si ca variabilele $vechi, respectiv $nou contin numele dosarului.
5. Folosind functia definita de utilizator adecvata descrisa in acest
modul, scrieti o instructiune care afiseaza antetele asociate mesajului IMAP
al carui numar este dat de valoarea variabilei $n. Se va presupune ca variabila
$nb contine identificatorul asociat cu o conexiune IMAP deschisa. </Test
de evaluare>