[Tutorial PHP]Expedierea mesajelor de posta electronica

#1
Nume Tutorial:Expedierea mesajelor de posta electronica
Descriere:Expedierea mesajelor de posta electronica
Download:Nu necesita
Autor:Anonim
Sursa (Link-ul oficial):
tutorialeonline
Propria parere:Util.
Tutorialul:
În articolul Transmiterea mesajelor prin e-mail folosind PHP şi PEAR am mai discutat depre funcţia mail() şi cum se transmite un mesaj cu ajutorul acestei funcţii. În acest articol o să încerc să aprofundez mai detaliat expedierea şi recepţionarea mesajelor de e-mail.
Configuraţia PHP standard acceptă expedierea mesajelor de e-mail prin intermediul SMTP (abreviere de la Simple Mail Transfer Protocol). Acesta este protocolul standard folosit pentru transferul mesajelor de e-mail de la un sistem la altul prin internet. Mesajele de e-mail sunt alcătuite din două părţi: o serie de antete de mesaj şi un corp. Antetele de mesaj indică adresa destinatarului şi subiectul mesajului, precum şi alte informaţii. Corpul conţine mesajul în sine. Un exemplu de trimitere a unui mesaj prin intermediul funcţiei mail:

mail (destinatar, subiect, corp, antete)

unde destinatar indică adresa de e-mail a destinatarului, subiect specifică antetul de e-mail care conţine subiectul mesajului, corp este corpul mesajului şi antete specifică adresele de e-mail suplimentare, precum antetul from sau alte antete...
Exemplu:

mail ("adresa_mea@server.ro", "Mesaj de test", "Corpul mesajului", "From: adresa_mea@server.ro");

Puteţi specifica mai mulţi destinatari prin separarea fiecărui destinatar de următorul prin intermediul unei virgule:

mail ("adresa1@server1.ro, adresa2@server2.ro, adresa3@server3.ro", "Mesaj de test", "Corpul mesajului", "From: adresa_mea@server.ro");

Funcţia mail() returnează TRUE dacă serverul SMTP acceptă mesajul; în caz contrar, returnează FALSE. Reţineţi că acceptarea de către serverul SMTP nu garantează transmiterea către destinatar a mesajului dvs. Nu există nici o modalitate 100% sigură de a verifica faptul că mesajul a fost trimis, aşa cum nu există nici o modalitate absolut sigură de a garanta că destinatarul a citit mesajul, l-a înţeles şi că a fost de acord cu el.
Unele servere SMTP refuză să accepte adrese şi antete care conţin spaţii albe la sfârşit. Pentru aceasta folosiţi funcţia trim() înainte de a trimite mesajul.

Recepţionarea mesajelor de e-mail

Recepţionarea mesajelor de e-mail este un proces oarecum mai complex decât expedierea lor. Deşi SMTP face parte din configuraţia PHP standard, IMAP (protocolul de recepţionare a mesajelor Interim Mail Access Protocol) nu este o componentă a acestei configuraţii. Dacă administratorul serverului nu a configurat serverul PHP astfel încât să lucreze cu IMAP, exemplele următoare nu vor funcţiona.
Un server IMAP este accesibil în acelaşi mod ca şi un fişier oarecare. Mai întâi, trebuie deschisă o conexiune cu serverul, apoi se pot trimite cereri serverului şi se pot primi răspunsuri de la acesta. După terminarea utilizării serverului, trebuie închisă conexiunea. Pentru a deschide o conexiune cu un server IMAP, folosiţi funcţia imap_open():

imap_open (cutie_postala, identificator_utilizator, parola)

Argumentul cutie_postala specifică patru elemente:
- Numele gazdei sau adresa IP a serverului IMAP
- Protocolul care va fi utilizat (IMAP)
- Portul care se va folosi pentru conectarea serverului (în general 143)
- Cutia poştală care va fi deschisă (în general INBOX)
Argumentul foloseste numeroşi delimitatori pentru a separa un element de altul. Iată o valoare caracteristică a argumentului:

{localhost/imap:143}INBOX

în cadrul acestui exemplu, numele gazdei este localhost; acest lucru este posibil când un server PHP şi un server IMAP rulează pe acelaşi sistem gazdă. În caz contrar, trebuie să specificaţi numele gazdei care rulează sistemul IMAP:



Celelalte argumente ale funcţiei imap_open(), identificator_utilizator şi parola, specifică identificatorul de utilizator şi parola folosite pentru a obţine accesul la serverul IMAP. Aşa cum funcţia fopen() returnează un identificator pe care îl puteţi folosi pentru a obţine accesul la un fişier, la fel şi funcţia imap_open() returnează un identificator pe care îl puteţi folosi pentru a obţine accesul la serverul IMAP. Dacă PHP nu poate deschide o conexiune cu serverul IMAP, funcţia imap_open() returnează FALSE.
Dacă un script se încheie cu mesajul "Call to undefined function: imap_open", aceasta arată că PHP nu a fost configurat pentru a folosi IMAP.
Exemplu:

Cod:

Cod: Selectaţi tot

 $server = "{mail.as.ro/imap:143}"; 
 $utilizator = "php4"; 
 $parola = "parola"; 
 $identificator = imap_open($server."INBOX", $utilizator, $parola); 
 if ($identificator === false)   { 
    echo "Nu se poate deschide cutia poatala"; 
 } 
 ?>
În afară de directorul INBOX standard, IMAP permite unui utilizator să definească directoare, care pot fi folosite pentru stocarea şi organizarea mesajelor primite. În orice moment, un director IMAP - INBOX sau un alt director - este considerat ca fiind directorul curent. După ce aţi stabilit o conexiune cu un server IMAP, puteţi cere serverului să desemneze alt dosar ca dosar curent:

Cod:

Cod: Selectaţi tot

 $server = "{mail.as.ro/imap:143}"; 
 $utilizator = "php4"; 
 $parola = "parola"; 
 $identificator = imap_open($server."INBOX", $utilizator, $parola); 
 if ($identificator === false) { 
    echo "Nu se poate deschide cutia poatala"; 
 } 
 else { 
    // se schimba directorul curent 
    $prefix = "~/mail/";  
    $director = $server.$prefix."INBOX"."nume_director"; 
    $schimba = imap_reopen($identificator, $director); 
    if ($schimba === false) {
       echo "Nu se poate deschide directorul specificat"; 
    } 
 }  
 ?>
De obicei, numele directoarelor IMAP sunt obţinute prin prefixarea numelui dosarului cu particula "~/mail/" şi "INBOX", aşa cum am arătat în exemplu. Cu toate acestea, un administrator de sistem poate configura o altă politică de atribuire a numelor.
Dacă doriţi să afişati directoarele existente în căsuţa de mail puteţi folosi următorul script:

Cod:

Cod: Selectaţi tot

 echo "Lista directoarelor"; 
 $directoare = imap_listmailbox($identificator, $server, $prefix, "*"); 
 if ($directoare == false) { 
    echo "A aparut o eroare la afisarea directoarelor"; 
 } 
 else { 
    foreach ($directoare as $cheie=>$valoare) { 
       echo "\n $cheie=>$valoare"; 
    } 
 } 
 ?>
Dacă doriţi să creaţi un director nou folosiţi funcţia imap_createmailbox() astfel:

Cod:

Cod: Selectaţi tot

 $director = "diverse";  
 $director = $server.$prefix."INBOX.".$director; 
 $creare = imap_createmailbox($identificator, $director); 
 if ($creare === false) { 
    echo "Nu s-a putut crea directorul"; 
 } 
 ?>
Numele unui director IMAP trebuie să conţină numai litere, cifre şi caractere de subliniere. Dacă doriţi să creaţi un subdirector, puteţi proceda astfel incluzând un punct în numele directorului. Punctul se comportă ca separator de cale, analog caracterului slash folosit în căile din cadrul sistemului de fişiere.
Pentru modificarea numelui unui director din căsuţa de email folosiţi funcţia imap_renamemailbox() astfel:

Cod:

Cod: Selectaţi tot

 $director_vechi = $server.$prefix."INBOX.".$director_vechi; 
 $director_nou = $server.$prefix."INBOX.".$director_nou; 
 $modificare = imap_renamemailbox($identificator, $dosar_vechi, $dosar_nou); 
 if ($modificare === false) { 
    echo "A aparut o eroare la modificarea numelui directorului"; 
 } 
 ?>
Pentru ştergerea unui director folosiţi funcţia imap_deletemailbox():

Cod:

Cod: Selectaţi tot

 $director = $server.$prefix."INBOX.".$director; 
 $stergere = imap_deletemailbox($identificator, $director); 
 if ($stergere === false) { 
    echo "A aparut o eroare la stergerea directorului"; 
 } 
 ?>
Spre deosebire de mesajele IMAP care rămân în cutia poştală până când le ştergeţi, un director IMAP şters este eliminat imediat şi în mod irevocabil. Fiţi atenţi atunci când scrieţi programe care şterg directoare sau atunci când folosiţi scripturi care conţin asemenea programe.
După deschiderea unei conexiuni IMAP, puteţi obţine acces la informaţii care descriu cutia poştală curentă. De exemplu, pentru a afla câte mesaje sunt în cutia poştala se invocă funcţia imap_num_msg():

imap_num_msg($identificator)

În continuare este o variantă prin care puteţi obţine diferite informaţii despre conţinutul cutiei poştale:

Cod:

Cod: Selectaţi tot

$nr_mesaje = imap_num_msg($identificator);  
 echo "Cutia postala contine $nr_mesaje mesaje"; 
 $nr_mesaje_recente = imap_num_recent($identificator); 
 echo "Cutia postala contine $nr_mesaje_recente mesaje recente"; 
 $obiect_cutie_postala = imap_mailboxmsginfo($identificator); 
 if ($obiect_cutie_postala) { 
    $tablou_cutie_postala =&;nbsp;get_object_vars($obiect_cutie_postala); 
    foreach ($obiect_cutie_postala as $cheie=>$valoare) { 
       echo "\n $cheie: $valoare"; 
    } 
 } 
 ?>
Rezultatul de ieşire al scriptului va fi:

Citat:
Cutia postala contine x mesaje
Cutia postala contine y mesaje recente
Unread: 0
Deleted: 0
Nmsgs: x
Size: dimensiunea in octeti a mesajelor
Date: data
Driver: imap
Mailbox: numele cutiei postale
Recent: y
Se mai poate utiliza şi varianta următoare:
Cod:

Cod: Selectaţi tot

 echo "Afisarea starii cutiei postale"; 
 $obiect_cutie_postala = imap_mailboxmsginfo($identificator); 
 print_r($obiect_cutie_postala); 
 ?>
Funcţia PHP print_r() afişează valoarea unui obiect. Această metodă este cu mult mai simplă decât cea folosită anterior, dar formatul datelor de ieşire este cu mult mai puţin inteligibil.
În continuare este un exemplu care afişează o listă de mesaje din directorul curent:

Cod:

Cod: Selectaţi tot

 echo "Antete de mesaje in cutia postala curenta:" 
 $antete = imap_headers($identificator); 
 if ($antete == false) { 
    echo "A aparut o eroare la afisarea mesajelor";  
 } 
 else { 
    foreach ($antete as $cheie=>$valoare) { 
       echo "\n $valoare";  
    } 
 } 
 ?>
Funcţia imap_headers() returnează un tablou unde fiecare element descrie un mesaj din directorul curent.
O chestie ciudată a serviciului IMAP constă în aceea că fiecare mesaj dintr-un director are atât un număr, cât şi un identificator. Numărul reprezintă poziţa mesajului în directorul respectiv; această valoare se poate modifica la adăugarea mesajelor, respectiv la ştergerea mesajelor din dosar. Pe de altă parte, identificatorul unui mesaj nu se modifică niciodată. IMAP furnizează funcţii care vă permit să determinaţi identificatorul unui mesaj dacă este dat numărul său şi invers. Iată funcţiile descrise mai jos:

imap_uid($identificator, $numar)

şi

imap_msgno($identificator, $id)

O limitare a funcţiei imap_headers() este aceea că nu separă fiecare caracteristică a mesajului în câmpuri distincte, astfel încât acestea să fie uşor accesibile pentru un script. Funcţia de bibliotecă IMAP imap_fetch_overview() returnează un tablou asociativ care descrie un mesaj. Iată un exemplu care afişează informaţiile despre mesaje:

Cod:

Cod: Selectaţi tot

 $nr_mesaj = 1; 
 $mesaje = imap_fetch_overview($identificator, $nr_mesaj, 0); 
 foreach ($mesaje as $mesaj) { 
    foreach ($mesaj as $proprietate=>$valoare) { 
       echo "\n $proprietate: $valoare"; 
    } 
 } 
 ?>
Al doilea argument al funcţiei imap_fetch_overview() vă permite să specificaţi o listă sau un domeniu de mesaje pentru care funcţia returnează vederi de ansamblu. Datele de ieşire conţin următoarele informaţii:

- subiectul mesajului
- numele şi adresa de e-mail ale expeditorului
- data la care a fost trimis mesajul
- numărul mesajului
- identificatorul mesajului
- dimensiunea mesajului în octeţi
- indicatoare care precizează dacă:
= mesajul este recent
= mesajul a fost citit
= mesajul a primit un răspuns
= mesajul a fost marcat în vederea ştergerii
= mesajul este o ciornă

Pentru a obţine corpul unui mesaj (care include conţinutul efectiv al mesajului) putem utiliza scriptul de mai jos:

Cod:

Cod: Selectaţi tot

 // afisare dupa numar 
 $numar = imap_msgno($identificator, $id) 
 $corp = imap_body($identificator, $numar, FT_UID); 
 echo $corp; 
 ?>
Antetele de mesaj conţin informaţii importante, care în general nu apar în corpul mesajului, precum data şi subiectul mesajului. Mai jos este dată o variantă de afişare a acestor informaţii:

Cod:

Cod: Selectaţi tot

 $n = 0; 
 $numar = 0; 
 $obiect_antet = imap_header_info($identificator, $numar); 
 $antete = get_object_vars($obiect_antet); 
 foreach ($antete as $proprietate=>$valoare) { 
    if (!is_array($valoare)) {
       echo "\n $proprietate: $valoare"; 
    } 
    else { 
       foreach ($valoare as $sub_valoare) { 
          echo "\n $proprietate: "; 
          $sub_valori = get_object_vars($sub_valoare); 
          for_each ($sub_valoare as $articol=>$valoare_articol) { 
             echo "\n $articol=>$valoare_articol"; 
          } 
       } 
    } 
 } 
 ?>
Obiectul returnat de funcţia de biblioteca IMAP imap_headerinfo() include următoarele informaţii:

- data expedierii mesajului
- subiectul mesajului
- identificatorul mesajului la care s-a răspuns prin acest mesaj, dacă există
- indicatoare de mesaj, cum sunt cele returnate de funcţia imap_fetch_overview()
- numele şi adresa de e-mail ale:
= expeditorului
= persoanei care primeşte răspunsul, dacă este specificată
= destinatarilor
= destinatarilor eventualelor copii (cc:)
= destinatarilor eventualelor copii la indigo necunoscute (bcc:), dacă informaţiile respective sunt disponibile
Numeroase elemente ale tabloului asociativ au valori de tip tablou. Pentru parcurgerea iterativă şi afişarea valorii acestor elemente se foloseşte o buclă îmbricată.
Pentru aplicaţii mai puţin pretenţioase se poate utiliza exemplul următor:

Cod:

Cod: Selectaţi tot

 $antete = imap_headerinfo($identificator, $numar); 
 print_r($antete); 
 ?>
Folosind funcţia print_r() se generează date de ieşire mai puţin inteligibile.
Pentru a şterge un mesaj IMAP, mai întâi îl marcaţi în vederea ştergerii şi apoi îl eliminaţi. Mesajele marcate pentru ştergere, dar care nu au fost încă eliminate, sunt numai semnalate ca şterse şi sunt în continuare accesibile. Iată un exemplu care vă permite să ştergeţi un mesaj prin specificarea numărului sau a identificatorului mesajului:

Cod:

Cod: Selectaţi tot

 $stergere = imap_delete($identificator, $id, FT_UID); 
 if ($stergere == false)   { 
    echo "Nu se poate sterge mesajul"; 
 } 
 ?>
Pentru a elimina mesajele şterse, testaţi următorul script:

Cod:

Cod: Selectaţi tot

 $eliminare = imap_expunge($identificator); 
 if ($eliminare == false) { 
    echo "Nu s-a reusit eliminarea mesajelor"; 
 } 
 ?>
În cazul în care doriţi să vedeţi exact ce eroare a returnat una din funcţiile bibliotecii IMAP, puteţi folosi funcţia imap_errors() astfel:

Cod:

Cod: Selectaţi tot

 $erori = imap_errors(); 
 if ($erori) { 
    foreach ($erori as $cheie=>$valoare) { 
       echo "\n $cheie: valoare"; 
    } 
 } 
 ?>
Pentru copierea unui mesaj din directorul curent într-un alt director se poate folosi funcţia imap_mail_copy() astfel:

Cod:

Cod: Selectaţi tot

 $numar = 0;  
 $director = $prefix."INBOX.".$director; 
 echo "Se copiaza mesajul $numar in directorul $director"; 
 $nr_mesaje = "".$numar; 
 $copiere = <;/span>imap_mail_copy($identificator, $nr_mesaje, $director); 
 if ($copiere === false) { 
    echo "A aparut o eroare la copierea mesajului specificat"; 
 } 
 ?>
Deoarece serverele IMAP nu cooperează la copierea unui mesaj de la un server la altul, nu este necesar - sau posibil - să se specifice numele gazdei serverului la copierea mesajelor IMAP.
Când aţi terminat de utilizat un server IMAP, trebuie să îl închideţi, aşa cum închideţi un fişier atunci când aţi terminat cu el. Iată cum se poate închide o conexiune IMAP:

Cod:

Cod: Selectaţi tot

 $inchidere = imap_close($identificator); 
 if ($inchidere === false) { 
    echo "Nu se poate inchide cutia postala"; 
 } 
 ?>
Biblioteca IMAP furnizează multe alte funcţii în afara celor descrise în acest articol. De exemplu, funcţiile imap_search() şi imap_scanmailbox() vă permit să căutaţi mesaje care satisfac criteriile specificate. De exemplu, puteţi căuta mesaje al căror corp conţine anumite texte.
În cazul în care furnizorul de servicii internet dispune de un server POP, nu de un server IMAP, puteţi avea acces la cutia poştală POP cu ajutorul sistemului PHP, folosind biblioteca IMAP. Pur şi simplu deschideţi o conexiune cu serverul POP specificând o cutie poştala POP astfel:

$mbox = imap_open("{localhost/pop3:110}INBOX", $identificator_utilizator, $parola);

Numele gazdei, protocolul şi numărul portului sunt asemănătoare cu valorile similare folosite pentru conectarea la un server IMAP. De asemenea, puteţi folosi biblioteca IMAP pentru a vă conecta la un server de informaţii folosind NNTP (Network News Transfer Protocol). Pentru aceasta, deschideţi o conexiune astfel:

$nntp = imap_open("{localhost/nntp:119}comp.test", "", "");
N-am cerut la nimeni niciodata,
Chiar de-a fost sa rabd, in viata mea.
Am dat totul fara nici o plata,
Nevoind nimic sa mi se dea.

@Virgil Carianopol
Vezi-ti de treaba si retine:
"E treaba ta sa spui ce vrei si sa nu conteze pentru nimeni".

@Kazi Ploae

Înapoi la “Tutoriale PHP”

Cine este conectat

Utilizatori răsfoind acest forum: Niciun utilizator înregistrat și 0 vizitatori